Merge "mediawiki.inspect: Guard against Object.prototype keys as module names"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 22 Jan 2015 23:48:18 +0000 (23:48 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 22 Jan 2015 23:48:18 +0000 (23:48 +0000)
1015 files changed:
.gitignore
CREDITS
Gruntfile.js [new file with mode: 0644]
HISTORY
RELEASE-NOTES-1.25
StartProfiler.sample
api.php
autoload.php
composer.json
docs/contenthandler.txt
docs/export-demo.xml
docs/extension.schema.json [new file with mode: 0644]
docs/hooks.txt
docs/kss/Makefile
docs/kss/README.txt
docs/kss/styleGuideModules.txt [new file with mode: 0644]
docs/memcached.txt
docs/mwlogger.txt
docs/skin.txt
img_auth.php
includes/AjaxDispatcher.php
includes/AutoLoader.php
includes/Block.php
includes/Category.php
includes/CategoryFinder.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Export.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Import.php
includes/Linker.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MessageBlobStore.php
includes/MimeMagic.php
includes/OutputPage.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteStats.php
includes/StreamFile.php
includes/StubObject.php
includes/Title.php
includes/User.php
includes/WatchedItem.php
includes/WebRequest.php
includes/WebStart.php
includes/WikiMap.php
includes/Xml.php
includes/actions/CreditsAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/UnwatchAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFormatWddx.php
includes/api/ApiHelp.php
includes/api/ApiHelpParamValueMessage.php [new file with mode: 0644]
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiResult.php
includes/api/ApiStashEdit.php
includes/api/ApiTokens.php
includes/api/ApiUpload.php
includes/api/i18n/ar.json
includes/api/i18n/be-tarask.json
includes/api/i18n/bs.json
includes/api/i18n/ca.json [new file with mode: 0644]
includes/api/i18n/ce.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json [new file with mode: 0644]
includes/api/i18n/fa.json
includes/api/i18n/fi.json
includes/api/i18n/fr.json
includes/api/i18n/frc.json [new file with mode: 0644]
includes/api/i18n/gl.json [new file with mode: 0644]
includes/api/i18n/he.json
includes/api/i18n/hsb.json [new file with mode: 0644]
includes/api/i18n/ia.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/mg.json
includes/api/i18n/mk.json
includes/api/i18n/ms.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/roa-tara.json [new file with mode: 0644]
includes/api/i18n/si.json
includes/api/i18n/sr-ec.json
includes/api/i18n/sr-el.json [new file with mode: 0644]
includes/api/i18n/sv.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/BacklinkCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/cache/UserCache.php
includes/cache/bloom/BloomCache.php
includes/changes/ChangesFeed.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RecentChange.php
includes/content/CodeContentHandler.php
includes/content/JsonContent.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/IORMTable.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMTable.php
includes/debug/logger/Factory.php [new file with mode: 0644]
includes/debug/logger/Logger.php
includes/debug/logger/NullSpi.php
includes/debug/logger/Spi.php
includes/debug/logger/legacy/Logger.php
includes/debug/logger/legacy/Spi.php
includes/debug/logger/monolog/Handler.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/debug/logger/monolog/SamplingHandler.php [new file with mode: 0644]
includes/debug/logger/monolog/Spi.php
includes/deferred/DeferredUpdates.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/SquidUpdate.php
includes/diff/DairikiDiff.php
includes/diff/DiffFormatter.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/exception/MWExceptionHandler.php
includes/externalstore/ExternalStore.php
includes/filebackend/FSFile.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOpBatch.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/TempFSFile.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filebackend/lockmanager/RedisLockManager.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldCloner.php
includes/htmlform/VFormHTMLForm.php [new file with mode: 0644]
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/av.json
includes/installer/i18n/az.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bg.json
includes/installer/i18n/bgn.json [new file with mode: 0644]
includes/installer/i18n/bn.json
includes/installer/i18n/bs.json
includes/installer/i18n/ca.json
includes/installer/i18n/cy.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/en.json
includes/installer/i18n/et.json
includes/installer/i18n/eu.json
includes/installer/i18n/frc.json
includes/installer/i18n/gor.json [new file with mode: 0644]
includes/installer/i18n/he.json
includes/installer/i18n/ko.json
includes/installer/i18n/ms.json
includes/installer/i18n/nap.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/si.json
includes/installer/i18n/tr.json
includes/installer/i18n/vi.json
includes/installer/i18n/yi.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobRunner.php
includes/jobqueue/aggregator/JobQueueAggregator.php
includes/jobqueue/jobs/AssembleUploadChunksJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/Cookie.php
includes/libs/DeferredStringifier.php [new file with mode: 0644]
includes/libs/MapCacheLRU.php
includes/libs/MultiHttpClient.php
includes/libs/ObjectFactory.php
includes/libs/RunningStat.php
includes/libs/ScopedCallback.php
includes/libs/UDPTransport.php [new file with mode: 0644]
includes/libs/Xhprof.php
includes/libs/composer/ComposerJson.php [new file with mode: 0644]
includes/libs/composer/ComposerLock.php [new file with mode: 0644]
includes/libs/virtualrest/ParsoidVirtualRESTService.php [new file with mode: 0644]
includes/libs/virtualrest/VirtualRESTServiceClient.php
includes/logging/LogFormatter.php
includes/logging/LogPager.php
includes/logging/MergeLogFormatter.php
includes/mail/EmailNotification.php
includes/media/BMP.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/FormatMetadata.php
includes/media/Jpeg.php
includes/media/MediaTransformOutput.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/Tiff.php
includes/media/TransformationalImageHandler.php
includes/media/XCF.php
includes/media/XMP.php
includes/normal/README
includes/objectcache/APCBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/objectcache/XCacheBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/MWTidy.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/parser/StripState.php
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/ProfileSection.php
includes/profiler/Profiler.php
includes/profiler/ProfilerFunctions.php
includes/profiler/ProfilerSectionOnly.php [new file with mode: 0755]
includes/profiler/ProfilerSimpleTrace.php [deleted file]
includes/profiler/ProfilerStandard.php [deleted file]
includes/profiler/ProfilerStub.php
includes/profiler/ProfilerXhprof.php
includes/profiler/SectionProfiler.php
includes/rcfeed/UDPRCFeedEngine.php
includes/registration/ExtensionProcessor.php [new file with mode: 0644]
includes/registration/ExtensionRegistry.php [new file with mode: 0644]
includes/registration/Processor.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchMySQL.php
includes/site/SiteListFileCache.php
includes/site/SiteSQLStore.php
includes/skins/BaseTemplate.php
includes/skins/MediaWikiI18N.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialConfirmemail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListusers.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostimages.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/title/ForeignTitle.php [new file with mode: 0644]
includes/title/ForeignTitleFactory.php [new file with mode: 0644]
includes/title/ImportTitleFactory.php [new file with mode: 0644]
includes/title/MalformedTitleException.php
includes/title/MediaWikiPageLinkRenderer.php
includes/title/MediaWikiTitleCodec.php
includes/title/NaiveForeignTitleFactory.php [new file with mode: 0644]
includes/title/NaiveImportTitleFactory.php [new file with mode: 0644]
includes/title/NamespaceAwareForeignTitleFactory.php [new file with mode: 0644]
includes/title/NamespaceImportTitleFactory.php [new file with mode: 0644]
includes/title/PageLinkRenderer.php
includes/title/SubpageImportTitleFactory.php [new file with mode: 0644]
includes/title/TitleFormatter.php
includes/title/TitleParser.php
includes/title/TitleValue.php
includes/upload/UploadBase.php
includes/utils/AutoloadGenerator.php
includes/utils/IP.php
includes/utils/MWCryptHKDF.php
includes/utils/MWCryptRand.php
includes/utils/StringUtils.php
includes/utils/UIDGenerator.php
includes/utils/ZipDirectoryReader.php
languages/ConverterRule.php
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageBe_tarask.php
languages/classes/LanguageKk.php
languages/classes/LanguageQqx.php
languages/classes/LanguageYue.php
languages/classes/LanguageZh.php
languages/classes/LanguageZh_hans.php
languages/i18n/af.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/awa.json [new file with mode: 0644]
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 [new file with mode: 0644]
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/prg.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.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/ses.json
languages/i18n/sgs.json
languages/i18n/sh.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/su.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/vro.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBgn.php [new file with mode: 0644]
languages/messages/MessagesNan.php
languages/messages/MessagesPl.php
load.php
maintenance/Maintenance.php
maintenance/archives/patch-drop-page_counter.sql [new file with mode: 0644]
maintenance/archives/patch-drop-ss_total_views.sql [new file with mode: 0644]
maintenance/checkComposerLockUpToDate.php [new file with mode: 0644]
maintenance/convertExtensionToRegistration.php [new file with mode: 0644]
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/eval.php
maintenance/fetchText.php
maintenance/jsduck/eg-iframe.html
maintenance/language/StatOutputs.php
maintenance/language/checkLanguage.php
maintenance/mssql/tables.sql
maintenance/oracle/tables.sql
maintenance/parse.php
maintenance/populateParentId.php
maintenance/populateRevisionSha1.php
maintenance/postgres/compare_schemas.pl
maintenance/postgres/tables.sql
maintenance/preprocessorFuzzTest.php
maintenance/resources/update-oojs-ui.sh
maintenance/sqlite/archives/initial-indexes.sql
maintenance/sqlite/archives/patch-drop-page_counter.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-drop-ss_admins.sql
maintenance/sqlite/archives/patch-drop-ss_total_views.sql [new file with mode: 0644]
maintenance/storage/recompressTracked.php
maintenance/tables.sql
maintenance/validateRegistrationFile.php [new file with mode: 0644]
package.json [new file with mode: 0644]
resources/Resources.php
resources/assets/file-type-icons/COPYING
resources/lib/jquery.ui/themes/smoothness/PATCHES [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css
resources/lib/jquery/jquery.js
resources/lib/jquery/jquery.qunit.css
resources/lib/jquery/jquery.qunit.js
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.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/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/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/ka.js
resources/lib/moment/locale/km.js
resources/lib/moment/locale/ko.js
resources/lib/moment/locale/lb.js
resources/lib/moment/locale/lt.js
resources/lib/moment/locale/lv.js
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/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/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/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/sv.js
resources/lib/moment/locale/ta.js
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/zh-cn.js
resources/lib/moment/locale/zh-tw.js
resources/lib/moment/moment.js
resources/lib/oojs-ui/i18n/ar.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ca.json
resources/lib/oojs-ui/i18n/el.json
resources/lib/oojs-ui/i18n/gl.json
resources/lib/oojs-ui/i18n/lb.json
resources/lib/oojs-ui/i18n/lv.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/nds-nl.json
resources/lib/oojs-ui/i18n/roa-tara.json
resources/lib/oojs-ui/i18n/sl.json
resources/lib/oojs-ui/i18n/sr-el.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/oojs-ui-apex.css [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.js [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.svg.css [deleted file]
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/apex/images/icons/add.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/add.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/advanced.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/alert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/alert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/check.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/check.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/close.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/close.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/code.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/code.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/collapse.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/comment.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/comment.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/expand.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/expand.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/help.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/help.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/info.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/info.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/link.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/link.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/menu.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/menu.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/picture.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/picture.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/remove.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/remove.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/settings.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/settings.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/tag.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/tag.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/window.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/window.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/alert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/required.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/required.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/textures/pending.gif [deleted file]
resources/lib/oojs-ui/themes/apex/images/textures/transparency.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.arrowSteps.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.footHovzer.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tabIndex.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.stash.js
resources/src/mediawiki.action/mediawiki.action.view.redirect.js
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.special/mediawiki.special.import.js
resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
resources/src/mediawiki.special/mediawiki.special.userlogin.login.css
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.ui/components/images/radio_disabled.svg
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.content.json.css
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.template.js
resources/src/mediawiki/mediawiki.userSuggest.js
resources/src/mediawiki/mediawiki.util.js
skins/.gitignore
skins/README
tests/frontend/Gruntfile.js [deleted file]
tests/frontend/package.json [deleted file]
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/Makefile
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/composer/composer.json [new file with mode: 0644]
tests/phpunit/data/composer/composer.lock [new file with mode: 0644]
tests/phpunit/data/composer/new-composer.json [new file with mode: 0644]
tests/phpunit/data/gitinfo/info-testValidJsonData.json
tests/phpunit/data/media/Soccer_ball_animated.svg
tests/phpunit/data/media/Tux.svg
tests/phpunit/includes/ArrayUtilsTest.php [deleted file]
tests/phpunit/includes/ArticleTablesTest.php [deleted file]
tests/phpunit/includes/ArticleTest.php [deleted file]
tests/phpunit/includes/ExternalStoreTest.php [deleted file]
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/ImagePage404Test.php [deleted file]
tests/phpunit/includes/ImagePageTest.php [deleted file]
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/LanguageConverterTest.php [deleted file]
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LinksUpdateTest.php [deleted file]
tests/phpunit/includes/LocalFileTest.php [deleted file]
tests/phpunit/includes/MWFunctionTest.php [deleted file]
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PasswordTest.php [deleted file]
tests/phpunit/includes/RequestContextTest.php [deleted file]
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SpecialPageTest.php [deleted file]
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WikiPageTest.php [deleted file]
tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php [deleted file]
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/XmlTypeCheckTest.php [deleted file]
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/format/ApiFormatDbgTest.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatDumpTest.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/api/format/ApiFormatNoneTest.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatTestBase.php
tests/phpunit/includes/api/format/ApiFormatTxtTest.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatWddxTest.php
tests/phpunit/includes/api/format/ApiFormatXmlTest.php [new file with mode: 0644]
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/content/JsonContentTest.php
tests/phpunit/includes/context/RequestContextTest.php [new file with mode: 0644]
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/debug/logging/legacy/LoggerTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/deferred/SearchUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/exception/MWExceptionHandlerTest.php
tests/phpunit/includes/externalstore/ExternalStoreTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/file/LocalFileTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/ArrayUtilsTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/DeferredStringifierTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/libs/HashRingTest.php
tests/phpunit/includes/libs/IEUrlExtensionTest.php
tests/phpunit/includes/libs/IPSetTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/libs/MWMessagePackTest.php
tests/phpunit/includes/libs/ProcessCacheLRUTest.php
tests/phpunit/includes/libs/RunningStatTest.php
tests/phpunit/includes/libs/XmlTypeCheckTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/composer/ComposerJsonTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/composer/ComposerLockTest.php [new file with mode: 0644]
tests/phpunit/includes/media/BitmapScalingTest.php
tests/phpunit/includes/media/MediaHandlerTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/page/ArticleTablesTest.php [new file with mode: 0644]
tests/phpunit/includes/page/ArticleTest.php [new file with mode: 0644]
tests/phpunit/includes/page/ImagePage404Test.php [new file with mode: 0644]
tests/phpunit/includes/page/ImagePageTest.php [new file with mode: 0644]
tests/phpunit/includes/page/WikiPageTest.php [new file with mode: 0644]
tests/phpunit/includes/page/WikiPageTestContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserOutputTest.php
tests/phpunit/includes/password/PasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/password/PasswordTestCase.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php [deleted file]
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchUpdateTest.php [deleted file]
tests/phpunit/includes/site/SiteListFileCacheBuilderTest.php
tests/phpunit/includes/site/SiteListFileCacheTest.php
tests/phpunit/includes/specialpage/SpecialPageTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialBooksourcesTest.php
tests/phpunit/includes/specials/SpecialMIMESearchTest.php
tests/phpunit/includes/title/ForeignTitleTest.php [new file with mode: 0644]
tests/phpunit/includes/title/NaiveForeignTitleFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/title/NaiveImportTitleFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/title/NamespaceAwareForeignTitleFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/title/NamespaceImportTitleFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/title/SubpageImportTitleFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/IPTest.php
tests/phpunit/includes/utils/MWFunctionTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/StringUtilsTest.php
tests/phpunit/includes/utils/ZipDirectoryReaderTest.php
tests/phpunit/languages/LanguageAmTest.php [deleted file]
tests/phpunit/languages/LanguageArTest.php [deleted file]
tests/phpunit/languages/LanguageArqTest.php [deleted file]
tests/phpunit/languages/LanguageBeTest.php [deleted file]
tests/phpunit/languages/LanguageBe_taraskTest.php [deleted file]
tests/phpunit/languages/LanguageBhoTest.php [deleted file]
tests/phpunit/languages/LanguageBsTest.php [deleted file]
tests/phpunit/languages/LanguageConverterTest.php [new file with mode: 0644]
tests/phpunit/languages/LanguageCsTest.php [deleted file]
tests/phpunit/languages/LanguageCuTest.php [deleted file]
tests/phpunit/languages/LanguageCyTest.php [deleted file]
tests/phpunit/languages/LanguageDsbTest.php [deleted file]
tests/phpunit/languages/LanguageFrTest.php [deleted file]
tests/phpunit/languages/LanguageGaTest.php [deleted file]
tests/phpunit/languages/LanguageGdTest.php [deleted file]
tests/phpunit/languages/LanguageGvTest.php [deleted file]
tests/phpunit/languages/LanguageHeTest.php [deleted file]
tests/phpunit/languages/LanguageHiTest.php [deleted file]
tests/phpunit/languages/LanguageHrTest.php [deleted file]
tests/phpunit/languages/LanguageHsbTest.php [deleted file]
tests/phpunit/languages/LanguageHuTest.php [deleted file]
tests/phpunit/languages/LanguageHyTest.php [deleted file]
tests/phpunit/languages/LanguageKshTest.php [deleted file]
tests/phpunit/languages/LanguageLnTest.php [deleted file]
tests/phpunit/languages/LanguageLtTest.php [deleted file]
tests/phpunit/languages/LanguageLvTest.php [deleted file]
tests/phpunit/languages/LanguageMgTest.php [deleted file]
tests/phpunit/languages/LanguageMkTest.php [deleted file]
tests/phpunit/languages/LanguageMlTest.php [deleted file]
tests/phpunit/languages/LanguageMoTest.php [deleted file]
tests/phpunit/languages/LanguageMtTest.php [deleted file]
tests/phpunit/languages/LanguageNlTest.php [deleted file]
tests/phpunit/languages/LanguageNsoTest.php [deleted file]
tests/phpunit/languages/LanguagePlTest.php [deleted file]
tests/phpunit/languages/LanguageRoTest.php [deleted file]
tests/phpunit/languages/LanguageRuTest.php [deleted file]
tests/phpunit/languages/LanguageSeTest.php [deleted file]
tests/phpunit/languages/LanguageSgsTest.php [deleted file]
tests/phpunit/languages/LanguageShTest.php [deleted file]
tests/phpunit/languages/LanguageSkTest.php [deleted file]
tests/phpunit/languages/LanguageSlTest.php [deleted file]
tests/phpunit/languages/LanguageSmaTest.php [deleted file]
tests/phpunit/languages/LanguageSrTest.php [deleted file]
tests/phpunit/languages/LanguageTiTest.php [deleted file]
tests/phpunit/languages/LanguageTlTest.php [deleted file]
tests/phpunit/languages/LanguageTrTest.php [deleted file]
tests/phpunit/languages/LanguageUkTest.php [deleted file]
tests/phpunit/languages/LanguageUzTest.php [deleted file]
tests/phpunit/languages/LanguageWaTest.php [deleted file]
tests/phpunit/languages/classes/LanguageAmTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageArTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageArqTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageBeTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageBe_taraskTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageBhoTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageBsTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageCsTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageCuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageCyTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageDsbTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageFrTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageGaTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageGdTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageGvTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageHeTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageHiTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageHrTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageHsbTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageHuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageHyTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageKshTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageLnTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageLtTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageLvTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageMgTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageMkTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageMlTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageMoTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageMtTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageNlTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageNsoTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguagePlTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageRoTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageRuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageSeTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageSgsTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageShTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageSkTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageSlTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageSmaTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageSrTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageTiTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageTlTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageTrTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageUkTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageUzTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageWaTest.php [new file with mode: 0644]
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/suite.xml
tests/phpunit/suites/ExtensionsTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/testHelpers.inc
thumb.php

index 93c429f..b1649df 100644 (file)
@@ -13,6 +13,7 @@
 .project
 cscope.files
 cscope.out
+*.orig
 ## NetBeans
 nbproject*
 project.index
@@ -47,6 +48,7 @@ node_modules/
 /vendor
 /composer.lock
 /composer.json
+/composer.local.json
 
 # MediaWiki UI documentation
 /docs/kss/static
diff --git a/CREDITS b/CREDITS
index 730e54d..f58fabb 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -20,6 +20,7 @@ following names for their contribution to the product.
 * Brad Jorsch
 * Brian Wolff
 * Brion Vibber
+* Bryan Davis
 * Bryan Tong Minh
 * Chad Horohoe
 * Charles Melbye
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644 (file)
index 0000000..9cf89d0
--- /dev/null
@@ -0,0 +1,111 @@
+/*jshint node:true */
+module.exports = function ( grunt ) {
+       grunt.loadNpmTasks( 'grunt-contrib-jshint' );
+       grunt.loadNpmTasks( 'grunt-contrib-watch' );
+       grunt.loadNpmTasks( 'grunt-banana-checker' );
+       grunt.loadNpmTasks( 'grunt-jscs' );
+       grunt.loadNpmTasks( 'grunt-jsonlint' );
+       grunt.loadNpmTasks( 'grunt-karma' );
+
+       var wgServer = process.env.MW_SERVER,
+               wgScriptPath = process.env.MW_SCRIPT_PATH;
+
+       grunt.initConfig( {
+               pkg: grunt.file.readJSON( 'package.json' ),
+               jshint: {
+                       options: {
+                               jshintrc: true
+                       },
+                       all: [
+                               '*.js',
+                               '{includes,languages,resources,skins,tests}/**/*.js'
+                       ]
+               },
+               jscs: {
+                       all: [
+                               '<%= jshint.all %>',
+                               // Auto-generated file with JSON (double quotes)
+                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js',
+                               // Skip functions are stored as script files but wrapped in a function when
+                               // executed. node-jscs trips on the would-be "Illegal return statement".
+                               '!resources/src/*-skip.js'
+
+                       // Exclude all files ignored by jshint
+                       ].concat( grunt.file.read( '.jshintignore' ).split( '\n' ).reduce( function ( patterns, pattern ) {
+                               // Filter out empty lines
+                               if ( pattern.length && pattern[0] !== '#' ) {
+                                       patterns.push( '!' + pattern );
+                               }
+                               return patterns;
+                       }, [] ) )
+               },
+               jsonlint: {
+                       all: [
+                               '.jscsrc',
+                               '{languages,maintenance,resources}/**/*.json',
+                               'package.json'
+                       ]
+               },
+               banana: {
+                       core: 'languages/i18n/',
+                       api: 'includes/api/i18n/',
+                       installer: 'includes/installer/i18n/'
+               },
+               watch: {
+                       files: [
+                               '<%= jscs.all %>',
+                               '<%= jsonlint.all %>',
+                               '.jshintignore',
+                               '.jshintrc'
+                       ],
+                       tasks: 'test'
+               },
+               karma: {
+                       options: {
+                               proxies: ( function () {
+                                       var obj = {};
+                                       // Set up a proxy for requests to relative urls inside wgScriptPath. Uses a
+                                       // property accessor instead of plain obj[wgScriptPath] assignment as throw if
+                                       // unset. Running grunt normally (e.g. npm test), should not fail over this.
+                                       // This ensures 'npm test' works out of the box, statically, on a git clone
+                                       // without MediaWiki fully installed or some environment variables set.
+                                       Object.defineProperty( obj, wgScriptPath, {
+                                               enumerable: true,
+                                               get: function () {
+                                                       if ( !wgServer ) {
+                                                               grunt.fail.fatal( 'MW_SERVER is not set' );
+                                                       }
+                                                       if ( !wgScriptPath ) {
+                                                               grunt.fail.fatal( 'MW_SCRIPT_PATH is not set' );
+                                                       }
+                                                       return wgServer + wgScriptPath;
+                                               }
+                                       } );
+                                       return obj;
+                               }() ),
+                               files: [ {
+                                       pattern: wgServer + wgScriptPath + '/index.php?title=Special:JavaScriptTest/qunit/export',
+                                       watched: false,
+                                       included: true,
+                                       served: false
+                               } ],
+                               frameworks: [ 'qunit' ],
+                               reporters: [ 'dots' ],
+                               singleRun: true,
+                               autoWatch: false
+                       },
+                       main: {
+                               browsers: [ 'Chrome' ]
+                       },
+                       more: {
+                               browsers: [ 'Chrome', 'Firefox' ]
+                       }
+               }
+       } );
+
+       grunt.registerTask( 'lint', ['jshint', 'jscs', 'jsonlint', 'banana'] );
+       grunt.registerTask( 'qunit', 'karma:main' );
+
+       grunt.registerTask( 'test', ['lint'] );
+       grunt.registerTask( 'default', 'test' );
+};
diff --git a/HISTORY b/HISTORY
index 64d409f..e5864fd 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -799,7 +799,7 @@ of files that are no longer available follows.
 * Added jquery.throttle-debounce ResourceLoader module to limit the number of
   callbacks for frequently occurring events.
 * Special:ProtectedPages shows now a table. The timestamp, the reason and
-  the protecting user is also shown.
+  the protecting user are also shown.
 * Added experimental support for using Microsoft SQL Server as the database
   backend.
 ** Added new Microsoft SQL Server-specific configuration variable
@@ -809,7 +809,7 @@ of files that are no longer available follows.
 * HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
   'radio' fields can now use message keys as labels via the 'options-messages'
   parameter, which overrides the 'options' parameter.
-* Admins can expire users users passwords manually, or on a schedule using the
+* Admins can expire users passwords manually, or on a schedule using the
   $wgPasswordExpirationDays configuration setting.
 * Add new hook SendWatchlistEmailNotification, this will be used to determine
   whether to send a watchlist email notification.
@@ -994,7 +994,7 @@ changes to languages because of Bugzilla reports.
 * (bug 52810) Preference "Justify paragraphs" was removed.
 * OutputPage::showErrorPage raises a notice if arguments are incoherent.
 * Thumbnails that keep failing to render in thumb.php will be rate-limited
-  againt further render attempts for 1 hour. $wgAttemptFailureEpoch can be
+  against further render attempts for 1 hour. $wgAttemptFailureEpoch can be
   altered to reset all rate-limited thumbnails at once.
 * (bug 56572) Builds of the OOjs and OOjs UI libraries are now available.
 * mw.loader.go and mw.loader.version have been removed.
@@ -1289,7 +1289,7 @@ This is a security and maintenance release of the MediaWiki 1.22 branch.
   HTML output is now exclusively HTML5.
 * $wgDBOracleDRCP added. True enables persistent connection with DRCP on Oracle.
 * $wgLogAutopatrol added to allow disabling logging of autopatrol edits in the logging table.
-  default for $wgLogAutopatrol is true.
+  Default for $wgLogAutopatrol is true.
 * The 'edit' right no longer allows for editing a user's own CSS and JS.
 * New rights 'editmyusercss', 'editmyuserjs', 'viewmywatchlist',
   'editmywatchlist', 'viewmyprivateinfo', 'editmyprivateinfo', and
@@ -1389,7 +1389,7 @@ This is a security and maintenance release of the MediaWiki 1.22 branch.
 * $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
   which can be cascading (previously 'sysop' was hard-coded as the only one).
 * XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
-  MediaWiki will try outputting markup acording to XHTML5 rules.
+  MediaWiki will try outputting markup according to XHTML5 rules.
 * Altered hook 'ProtectionForm::save', adding the reason page protection is
   changed as third parameter.
 * New hook 'TitleSquidURLs' for manipulating the list of URLs to be purged from
@@ -1484,7 +1484,7 @@ This is a security and maintenance release of the MediaWiki 1.22 branch.
 * Make thumb.php give HTTP redirects for file redirects
 * (bug 30607) Special:ListFiles can now show old versions of files. Additionally
   Special:AllMyUploads was introduced so the user can get a list of all things
-  they have ever uploaded, even if it was subsequently overriden.
+  they have ever uploaded, even if it was subsequently overridden.
 * Introduced Special:MyFiles and Special:AllMyFiles as an alias for Special:MyUploads
   and Special:AllMyUploads respectively.
 * IPv6 addresses in X-Forwarded-For headers are now normalised before checking
@@ -1779,7 +1779,7 @@ changes to languages because of Bugzilla reports.
   The skins/common/wikiprintable.css file no longer exists. Return value of
   Skin#commonPrintStylesheet is ignored. Please use the 'mediawiki.legacy.commonPrint'
   module instead or base your skin on SkinTemplate.
-* (bug 49629) The hook ExtractThumbParamaters has been deprecated in favour
+* (bug 49629) The hook ExtractThumbParameters has been deprecated in favour
   of media handler overriding MediaHandler::parseParamString.
 * (bug 46512) The collapsibleNav feature from the Vector extension has been moved
   to the Vector skin in core.
@@ -1899,7 +1899,7 @@ This is a maintenance release of the MediaWiki 1.21 branch.
 
 === New features in 1.21 ===
 * (bug 38110) Schema changes (adding or dropping tables, indices and
-  fields) can be now be done separately from from other changes that
+  fields) can be now be done separately from other changes that
   update.php makes.  This is useful in environments that use database
   permissions to restrict schema changes but allow the DB user that
   MediaWiki normally runs as to perform other changes that update.php
@@ -2440,7 +2440,7 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * Added $wgCopyUploadProxy global to define which proxy to use for copy
   uploads.
 * (bug 40448) mediawiki.legacy.mwsuggest has been replaced with a new module,
-  mediawiki.searchSuggest, based on SimpleSeach from Extension:Vector.
+  mediawiki.searchSuggest, based on SimpleSearch from Extension:Vector.
 
 === Known issues in 1.20.0 ===
 These are issues that we're targeting to be fixed in a later release
@@ -2492,7 +2492,7 @@ milestone in Bugzilla.
 * (bug 34735) Updated compressOld.php documentation to mention the different
   usages of -s and -n parameters depending on compression type.
 * (bug 13896) Rendering of devanagari numbers in automatic '#' number lists.
-* (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when.
+* (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when
   trying to defer foreign key for externallinks.
 * (bug 32748) Printer friendly version of article decode Unicode chars as a
   pretty IRI in footer.
@@ -2510,7 +2510,7 @@ milestone in Bugzilla.
 * (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
 * (bug 32604) Some messages needs escaping of wikitext inside username.
 * (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
-* (bug 25946) The message on the top of Special:RecentChanges is now displayed.
+* (bug 25946) The message on the top of Special:RecentChanges is now displayed
   in user language instead of content language.
 * (bug 35264) Wrong type used for <ns> in export.xsd
 * (bug 24985) Use $wgTmpDirectory as the default temp directory so that people
@@ -3010,8 +3010,8 @@ release and submitting bug reports.
   until the second was introduced in 1.17.
 * BREAKING CHANGE:  Style rules for wikitable are now more specific and prevent
   inheritance to nested tables which caused various issues (bug 30485 and bug
-  33434). If your wiki has overriden rules for ".wikitable", please revise them and
-  adjust where neccecary. For comparison, use the "table.wikitable" section in
+  33434). If your wiki has overridden rules for ".wikitable", please revise them and
+  adjust where necessary. For comparison, use the "table.wikitable" section in
   skins/common/shared.css as base.
 * $wgUploadNavigationUrl is now used for file redlinks if
   $wgUploadMissingFileUrl is not set. The former was used for this until the
@@ -3051,7 +3051,7 @@ release and submitting bug reports.
   "create account" when the user cannot create an account.
 * (bug 31818) 'usercreated' message now supports GENDER.
 * (bug 32022) Our phpunit.php script can now be executed from another directory.
-* (bug 26020) Setting $wgEmailConfirmToEdit to true no longer removes diffs.
+* (bug 26020) Setting $wgEmailConfirmToEdit to true no longer removes diffs
   from recent changes feeds.
 * (bug 30232) add current time to message wlnote on Special:Watchlist.
 * (bug 29110) $wgFeedDiffCutoff did not affect new pages.
@@ -3061,7 +3061,7 @@ release and submitting bug reports.
 * (bug 32168) Add wfAssembleUrl for use in wfExpandUrl.
 * (bug 32168) fixed - wfExpandUrl expands dot segments now.
 * (bug 31535) Upload comments now truncated properly, and don't have brackets.
-* (bug 32086) Special:PermanentLink now show an error message when no subpage
+* (bug 32086) Special:PermanentLink now shows an error message when no subpage
   was specified.
 * (bug 30368) Special:Newpages now shows the new page name for moved pages.
 * (bug 1697) The way to search blocked usernames in block log should be clearer.
@@ -3135,7 +3135,8 @@ release and submitting bug reports.
 * (bug 28936, bug 5280) Broken or invalid titles can't be removed from watchlist.
 * (bug 34600) Older skins using useHeadElement=false were broken in 1.18.
 * (bug 34604) [mw.config] wgActionPaths should be an object instead of a numeral
-  array.* (bug 12262) Indents and lists are now aligned
+  array.
+* (bug 12262) Indents and lists are now aligned
 * (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
    on Windows
 * (bug 25095) Special:Categories should also include the first relevant item
@@ -3159,7 +3160,7 @@ release and submitting bug reports.
   address blocks for list=blocks.
 * (bug 30591) Add support to only return keys in ApiAllMessages.
 * The API now respects $wgShowHostnames and won't share the hostname in
-  severedby if it's set to false.
+  servedby if it's set to false.
 * wlexcludeuser parameter added to ApiFeedWatchlist.
 * (bug 7304) Links on redirect pages no longer cause the redirect page to show
   up as a redirect to the linked page on Special:Whatlinkshere.
@@ -3277,8 +3278,8 @@ This is a maintenance release of the MediaWiki 1.18 branch.
 This is a maintenance and security release of the MediaWiki 1.18 branch.
 
 === Changes since 1.18.1 ===
-* (bug 33686) could not get a list of contributor for an article when using
- a SQLite database.
+* (bug 33686) could not get a list of contributors for an article when using
 a SQLite database.
 * (Bug 33865) Exception thrown in action=parse when attempting to use the title
   parameter without setting the text parameter.
 * UserMailer could potentially throw a fatal error when a MailAddress object had
@@ -3466,9 +3467,9 @@ Selected changes since MediaWiki 1.17 that may be of interest:
 
 === New features in 1.18 ===
 * BREAKING CHANGE: action=watch / action=unwatch now requires a token.
-* BREAKING CHANGE: Article class hierarchy split into WikiPage (backend).
+* BREAKING CHANGE: Article class hierarchy split into WikiPage (backend)
   and Article (frontend) hierarchies. Several hooks now pass a WikiPage object instead
-  of an Article object. These hooks all use an $article paramater as documented in hooks.txt.
+  of an Article object. These hooks all use an $article parameter as documented in hooks.txt.
   Extensions should be updated to account for this, though most won't require any changes.
 * (bug 27860) Minor edit after clicking 'new section' tab
   Now the "This is a minor edit" checkbox is not available when you
@@ -3598,7 +3599,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
   unicode code point is (aka pre-1.17 behavior).
 * (bug 30940) Add a hook in User:getDefaultOptions.
   To give extensions a better and more flexible way of providing default
-  values for preferences a hook has been introdiced in User:getDefaultOptions().
+  values for preferences a hook has been introduced in User:getDefaultOptions().
   Setting preferences in $wgDefaultUserOptions still work fine, but when reading
   them (i.e. with array_keys) to get a list of all preferences, then
   $wgDefaultUserOptions should no longer be used as it will contain those set via
@@ -3744,7 +3745,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
   file description page for multi-paged documents.
 * (bug 28883) Message names for different compression types commonly
   used in Tiff files.
-* When translcuding a special page, do not let it interpret url parameters.
+* When transcluding a special page, do not let it interpret url parameters.
 * (bug 28887) Special page classes are no longer re-used during 1 request.
 * (bug 28888) Searching for something starting with a # sign no longer tells
   the user a page named [[:]] already exists.
@@ -3821,7 +3822,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
   RefreshLinks::deleteLinksFromNonexistent.
 * (bug 29797) Error: "Tried to load block with invalid type" when subpages
   are disabled for user pages.
-* (bug 12205) Bidirectional names in action=credits are split and displayed.
+* (bug 12205) Bidirectional names in action=credits are split and displayed
   incorrectly when wrapped to the next line.
 * (bug 20781) Move 'mainpagetext' messages to installer's .i18n file.
 * (bug 29737) "MediaWiki:Qbsettings-directionality" should refer to script,
@@ -3831,7 +3832,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
   to the FCKEditor extension.
 * (bug 28762) Resizing to specified height broken for very thin images.
 * (bug 29959) Installer fatal when cURL and allow_url_fopen is disabled and user
-  tries to subsribe to mediawiki-announce.
+  tries to subscribe to mediawiki-announce.
 * (bug 27427) mw.util.getParamValue shouldn't return value from hash even if
   param is only present in hash.
 * Installer checked for magic_quotes_runtime instead of register_globals.
@@ -3846,7 +3847,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
 * (bug 30335) Fix for HTMLForms using GET breaking when non-friendly URLs
   are used.
 * (bug 30264) Changed installer-generated LocalSettings.php to use require_once()
instead require() for included extensions.
 instead of require() for included extensions.
 * Tracking categories are no longer shown in footer for special pages.
 * (bug 30684) Fix bad escaping in mw.message for inexistent messages (i.e. <key>).
 * $wgOverrideSiteFeed no longer double escapes urls.
@@ -3918,7 +3919,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
 * (bug 27897) list=allusers and list=users list hidden users.
 * (bug 27717) API's exturlusage module does not respect $wgMiserMode.
 * (bug 27588) list=filearchive&faprop=sha1 returns empty attribute.
-* (bug 28010) Passing a non existant user to list=users gives internal error.
+* (bug 28010) Passing a non existent user to list=users gives internal error.
 * (bug 27549) action=query&list=users&usprop=groups doesn't show implicit
   groups if a user doesn't have explicit groups.
 * (bug 27670) Ordering by timestamp (and usage of start and end) isn't as clear
@@ -4135,7 +4136,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * $wgSVGMaxSize is now applied to the smaller of width or height, making very
   wide pano/timeline/diagram SVGs renderable at saner sizes.
 * (bug 29959) Installer fatal when cURL and allow_url_fopen is disabled and user
-  tries to subsribe to mediawiki-announce.
+  tries to subscribe to mediawiki-announce.
 * Installer checked for magic_quotes_runtime instead of register_globals
 * (bug 30131) XCache with variable caching disabled no longer used for variable
   caching (CACHE_ACCEL)
@@ -4150,7 +4151,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * Fixed recentchanges FK violation on page delete and cache purge error in updater
   for Oracle DB.
 * (bug 32276) Skins were generating output using the internal page title which
-  would allow anonymous users to determine wheter a page exists, potentially
+  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 when they are not guessable.
 * (bug 32616) action=ajax requests were dispatched to the relevant internal
@@ -4299,7 +4300,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 20186) Allow filtering Special:Contributions for RevisionDeleted edits.
 * ajaxwatch now uses the API and JQuery, and can be used to animate arbitrary
   watch links, not just to watch the page the link is on.
-* (bug 20976) "searchmenu-new-nocreate" message now displayed when when there
+* (bug 20976) "searchmenu-new-nocreate" message now displayed when there
   is no title match in search and the user has no rights to create pages.
 * (bug 23429) Added new hook WatchlistEditorBuildRemoveLine.
 * (bug 22844) Added support for WinCache object caching (for IIS).
@@ -4423,7 +4424,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
   with $wgPasswordSender configurable.
 * (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
   the footers of skins.
-* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy.
+* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy
   used for the file cache. Default value is 2, which matches former behavior.
 
 === Bug fixes in 1.17 ===
@@ -4467,14 +4468,14 @@ Selected changes since MediaWiki 1.16 that may be of interest:
   language.
 * (bug 22852) "Served in" comment is now the time used to cache a single page
   when using rebuildFileCache.php
-* (bug 22496) Viewing diff of a redirect page without specifying "oldid".
+* (bug 22496) Viewing diff of a redirect page without specifying "oldid"
   parameter no longer makes the page displayed as being the redirect target.
 * (bug 22918) Feed cache keys now use $wgRenderHashAppend.
 * (bug 21916) Last-Modified header is now correct when outputting cached feed.
 * (bug 20049) Fixed PHP notice in search highlighter that occurs in some cases.
 * (bug 23017) Special:Disambiguations now list pages in content namespaces
   rather than only main namespace.
-* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all.
+* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all
   frames, and $wgMaxImageArea against the size of the first frame, rather than
   the other way around.  Both now default to 12.5 megapixels.  Also, images
   exceeding $wgMaxImageArea can still be embedded at original size.
@@ -4504,7 +4505,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
   correct link.
 * (bug 23284) Times are now rounded correctly.
 * (bug 23375) Added ogv, oga, spx as extensions for ogg files.
-* (bug 18408) All required permissions for uploading (upload, edit, create).
+* (bug 18408) All required permissions for uploading (upload, edit, create)
   are now checked when loading Special:Upload. Toolbar link for Special:Upload
   is no longer shown if the user does not have the required permissions.
 * (bug 23397) texvc in html mode renders \sim as &tilde; not &sim;
@@ -4551,7 +4552,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 19910) Headings of the form ===+\s+ are now displayed as valid headings.
 * (bug 24022) Only check file extensions on the uploadpage when needed.
 * (bug 24076) Recognize Office 2003 files with OpenXML trailers.
-* (bug 24244) Updated comments in DefaultSettings.php to reflect.
+* (bug 24244) Updated comments in DefaultSettings.php to reflect
   Image: --> File: namespace rename.
 * Make wfTimestamp recognize negative unix timestamp values.
 * (bug 24401) SimpleSearch: No button/text indicating 'Search' if image is
@@ -4591,7 +4592,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 20744) Wiki forgets about an uploaded file.
 * (bug 17913) Don't show "older edit" when no older edit available.
 * (bug 6204) TOC not properly rendered when using $wgMaxTocLevel.
-* (bug 24977) The accesskey in history page now lead directly to the diff.
+* (bug 24977) The accesskey in history page now lead directly to the diff
   instead of alternating focus between the two buttons.
 * (bug 24987) Special:ListUsers does not take external groups into account.
 * (bug 20633) update.php has mixed language output.
@@ -4631,7 +4632,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 25175) HTML file cache now honor $wgCacheDirectory if
   $wgFileCacheDirectory is not set.
 * (bug 13353) Diff3 version checks were too strict, did not detect working diff3.
-* (bug 25843) Links to special pages using link= attribute on images are now.
+* (bug 25843) Links to special pages using link= attribute on images are now
   normalised like normal links to special pages.
 * (bug 21364) External links using link= attribute on images now respect
   $wgExternalLinkTarget.
@@ -4718,7 +4719,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 27508) SVGMetadataExtractor takes too much resources on huge svgs.
 * (bug 27465) SVG thumbnail generation.
 * (bug 27467) preload can leave UNIQ.
-* (bug 27539) Allow attributes beginning with a digit in wiktext tag parameters.
+* (bug 27539) Allow attributes beginning with a digit in wikitext tag parameters.
 * (bug 27328) using relative paths in CSS imports in MediaWiki:Common.css broken
   in 1.17.
 * (bug 27333) Fix repetitive last-seen time queries on page history.
@@ -4767,7 +4768,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 22764) uselang parameter for action=parse.
 * (bug 22944) API: watchlist options are inconsistent.
 * (bug 22868) don't list infinite block expiry date as "now" in API logevents.
-* (bug 22290) prop=revisions now outputs "comment" field even when comment.
+* (bug 22290) prop=revisions now outputs "comment" field even when comment
   is empty, for consistency with list=recentchanges.
 * (bug 19721) API action=help should have a way to just list for a specific
   module.
@@ -4780,7 +4781,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 23524) Api Modules as followup to bug 14473 (Add iwlinks table to
   track inline interwiki link usage).
 * Add pltitles and tltemplates to prop=links and prop=templates respectively,
-  similar to prop=categories's clcategorie.
+  similar to prop=categories's clcategories.
 * (bug 23834) Invalid "thumbwidth" and "thumbheight" in "imageinfo" query when
   thumbnailing larger than original image.
 * (bug 23835) Need "thumbmime" result in "imageinfo" query.
@@ -4838,7 +4839,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
   current revision id, try the parser cache, and save it to it if necessary.
 * (bug 25463) Export header should not be shown if no pages were requested, to
   reduce confusion.
-* (bug 25648) API discovery information has been added as RSD link in page.
+* (bug 25648) API discovery information has been added as RSD link in page
   <head> and by providing an API module action=rsd. Added hook
   ApiRsdServiceApis for extensions to add their own service to the services
   list.
@@ -4867,7 +4868,7 @@ The following languages were added:
 
 * Moroccan Spoken Arabic (ary)
 * Banjar (bjn)
-* Kabardian (kdb)
+* Kabardian (kbd)
 * Kabardian (Cyrillic) (kbd-cyrl)
 * Latgalian (ltg)
 * Minangkabau (min)
@@ -4974,7 +4975,7 @@ Other significant changes to MediaWiki's language support:
   similarly to the category namespace.
 * $wgEnableSorbs renamed to $wgDnsBlacklistUrls ($wgEnableSorbs kept for
   backward compatibility)
-* $wgUploadNavigationUrl now also affects images inline images that do not
+* $wgUploadNavigationUrl now also affects inline images that do not
   exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
   it as appropriate.
 * If $wgLocaltimezone is null, use the server's timezone as the default for
@@ -5054,7 +5055,7 @@ Other significant changes to MediaWiki's language support:
 * Added a feature to allow per-article process pool size control for the parsing
   task, to limit resource usage when the cache for a heavily-viewed article is
   invalidated. Requires an external daemon.
-* (bug 19576) Moved the id attribues from the anchors accompanying section
+* (bug 19576) Moved the id attributes from the anchors accompanying section
   headers to the <span class="mw-headline"> elements within the section headers,
   removing the redundant anchor elements.
 * Parser::setFunctionTagHook now can be used to add a new tag which is parsed at
@@ -5269,7 +5270,7 @@ comment from another wiki.
 ** Note that this change will break some extensions which have not been adapted
    for it.
 * (bug 17020) Adding fallback encodings for Traditional and Simplified Chinese
-  languages while the the text is typed as URLs.
+  languages while the text is typed as URLs.
 * (bug 17614) Prev / Next links are not shown if all results are shown
 * (bug 18207) Strange spacing before [[irc:...]] links
 * Removed float from the user login form in RTL interface - caused display
@@ -5304,7 +5305,7 @@ comment from another wiki.
 * (bug 18943) Handle invalid titles gracefully at Special:Mostlinked
 * (bug 8873) Enable variant conversion in text on 'alt' and 'title' attributes
 * (bug 10837) Introducing the StubUserVariant class to determine the variant
-  variable instead of using this to overrules the user language preference.
+  variable instead of using this to overrule the user language preference.
 * (bug 19014) If user had deletedhistory right, but not undeleted right, then
   show "view" instead of "view/restore" on logs.
 * (bug 19017) TOC level calculation error in an odd case
@@ -5358,7 +5359,7 @@ comment from another wiki.
   are no longer recorded in the pagelinks table
 * (bug 19784) date option "ISO 8601" produced illegal id
 * (bug 19761) Removed autogenerated <meta keywords> tag with link data.
-  Keyword set was not useful, and is ignored by modern search engines anway.
+  Keyword set was not useful, and is ignored by modern search engines anyway.
 * (bug 19827) Special:SpecialPages title is "Upload file
 * (bug 19355) Added .xhtml, .xht to upload file extension blacklist
 * (bug 19287) Workaround for lag on history page in Firefox 3.5
@@ -5381,7 +5382,7 @@ comment from another wiki.
 * The display of the language list on the preferences is more comply with the
   BCP 47 standards.
 * (bug 19849) Custom X-Vary-Options header now disabled unless $wgUseXVO is set
-* (bug 19301) Duplicates entries in $wgAddGroups, $wgRemoveGroups,
+* (bug 19301) Duplicate entries in $wgAddGroups, $wgRemoveGroups,
   $wgGroupsAddToSelf and $wgGroupsRemoveFromSelf are no more displayed on
   Special:ListGroupRights
 * (bug 18799) Special:Userlogin now handles correctly the returnto parameter
@@ -5398,7 +5399,7 @@ comment from another wiki.
 * (bug 15680) Split the edit tip message of user CSS/JS subpage into
   "usercssyoucanpreview" and "userjsyoucanpreview" respectively.
 * (bug 12110) Split the rights for editing users' CSS/JS subpage from
-  "editusercssjs" into "editusercss" and edituserjs" respectively.
+  "editusercssjs" into "editusercss" and "edituserjs" respectively.
 * (bug 19394) RecentChanges feed URLs for log items with no revisions
   (eg Newuser, Userrights) are no longer broken
 * (bug 17395) Remote file descriptions use user language ($wgLang), not wiki
@@ -5440,7 +5441,7 @@ comment from another wiki.
   enabled
 * (bug 19857) maintenance/deleteRevision.php on last revision no longer breaks
   target page
-* (bug 20365) Page name with with c/g/h/j/s/u + x are now correctly handled in
+* (bug 20365) Page name with c/g/h/j/s/u + x are now correctly handled in
   Special:MovePage with Esperanto as content language
 * (bug 20364) Fixed regression in GIF metadata loading
 * (bug 20299) MediaWiki:Move-subpages and MediaWiki:Move-talk-subpages can now
@@ -5450,7 +5451,7 @@ comment from another wiki.
 * (bug 19966) MediaWiki:License-header is now used for the licensing header in
   the file description page instead of MediaWiki:License
 * (bug 20380) Links to history/deleted edits at the top of
-  Special:RevisionDelete are no more displayed when when doing log suppression
+  Special:RevisionDelete are no more displayed when doing log suppression
 * (bug 8143) Localised parser function names are now correctly case insensitive
   if they contain non-ASCII characters
 * (bug 19055) maintenance/rebuildrecentchanges.php now purges
@@ -5584,7 +5585,7 @@ comment from another wiki.
   "unknown error"
 * (bug 18762) both redirects and links get fixed one after another if
   redirects-only switch is not present
-* (bug 20159) thumbnails rerendered if older that $wgThumbnailEpoch
+* (bug 20159) thumbnails rerendered if older than $wgThumbnailEpoch
 * Fixed a bug which in some situations causes the job queue to grow forever,
   due to an infinite loop of job requeues.
 * (bug 21523) File that can have multiple pages (djvu, pdf, ...) no longer have
@@ -5595,7 +5596,7 @@ comment from another wiki.
 * (bug 21776) Interwiki urls like http://en.wikibooks.org/wiki/cs: should give
   a redirect instead of a baderror.
 * (bug 21803) Special:MyContributions now keeps the query string parameters
-* Redirecting special pages now keep query string paramters set to "0" (e.g.
+* Redirecting special pages now keep query string parameters set to "0" (e.g.
   for namespace)
 * (bug 20765) Special:ListGroupRights no longer misses addables and removables
   groups if there are duplicate entries
@@ -5608,8 +5609,8 @@ comment from another wiki.
 * refreshLinks.php now purges orphaned redirect table rows
 * (bug 2971) Swap links of hist & diff location on Special:Contributions for
   consistency with RC/WL
-* (bug 21986) Special page names were are now capitalized by content language
-* If two log type have the same description, they're now both displayed in the
+* (bug 21986) Special page names are now capitalized by content language
+* If two log types have the same description, they're now both displayed in the
   type selector on Special:Log
 * (bug 20115) Special:Userlogin title says "Log in / create account" even if the
   user can't create an account
@@ -5795,7 +5796,7 @@ changes to languages because of Bugzilla reports.
 * Added $wgNoFollowDomainExceptions to allow exempting particular domain names
   from rel="nofollow" on external links
 * (bug 12970) Brought back $wgUseImageResize.
-* Added $wgRedirectOnLogin to allow specifying a specifc page to redirect users
+* Added $wgRedirectOnLogin to allow specifying a specific page to redirect users
   to upon logging in (ex: "Main Page")
 * Add $wgExportFromNamespaces for enabling/disabling the "export all from
   namespace" option (disabled by default)
@@ -5898,7 +5899,7 @@ changes to languages because of Bugzilla reports.
   $wgRedirectOnLogin
 * Added a link to Special:UserRights on Special:Contributions for privileged users
 * (bug 10336) Added new magic word {{REVISIONUSER}}, which displays the editor
-  of the displayed revision's author user name
+  of the displayed revision
 * LinkerMakeExternalLink now has an $attribs parameter for link attributes and
   a $linkType parameter for the type of external link being made
 * (bug 17785) Dynamic dates surrounded with a <span> tag, fixing sortable tables with
@@ -6044,7 +6045,7 @@ changes to languages because of Bugzilla reports.
 * (bug 17778) MediaWiki:Catseparator can now have HTML entities
 * (bug 17676) Error on Special:ListFiles when using Postgres
 * Special:Export doesn't use raw SQL queries anymore
-* (bug 14771) Thumbnail links to individual DjVu pages have two no longer have
+* (bug 14771) Thumbnail links to individual DjVu pages no longer have
   two "page" parameters
 * (bug 17972) Special:FileDuplicateSearch form now works correctly on wikis that
   don't use PathInfo or short urls
@@ -6235,7 +6236,7 @@ The following extensions are migrated into MediaWiki 1.14:
 * Extensions can use the SkinBuildSidebar hook to modify the content of the
   sidebar and add custom portlets to it
 * Added 'MakeGlobalVariablesScript' hook for extensions to be able to add vari-
-  ables into into the output of Skin::makeVariablesScript
+  ables into the output of Skin::makeVariablesScript
 * (bug 13846) Added $wgAddGroups and $wgRemoveGroups display on
   Special:ListGroupRights
 * (bug 14377) Add a date selector to history pages
@@ -6348,7 +6349,7 @@ The following extensions are migrated into MediaWiki 1.14:
 * Dropped old Paser_OldPP class. Only new parser with preprocessor is used.
 * Moved password reset form from Special:Preferences to Special:ResetPass
 * Added Special:ChangePassword as a special page alias for Special:ResetPass
-* Added complimentary function for addHandler() called removeHandler() for removing events
+* Added complementary function for addHandler() called removeHandler() for removing events
 * Improved security of file uploads for IE clients, using a reverse-engineered
   algorithm very similar to IE's content detection algorithm.
 * Cascading protection no longer requires that both edit and move are restricted
@@ -7124,7 +7125,7 @@ Other changes in this release:
 * (bug 13705) Don't show rollback link in page history on incorrect revisions
 * (bug 13708) Don't set "Search results" title when loading Special:Search
   without query
-* (bug 13736) Don't show MediaWiki:Anontalkpagetext on non-existant IP addresses
+* (bug 13736) Don't show MediaWiki:Anontalkpagetext on non-existent IP addresses
 * (bug 13728) Don't trim initial whitespace during section edits
 * (bug 13727) Don't delete log entries from recentchanges on page deletion
 * (bug 13752) Redirects to sections now work again
@@ -7262,7 +7263,7 @@ Other changes in this release:
 * (bug 14764) Fix regression in from Article::lastModified(), failed to work
   on non-mySQL schemas.
 * (bug 14763) Child classes of Database (DatabasePostgres and DatabaseOracle)
-  had stict standards issues with setFakeSlaveLag() and setFakeMaster().
+  had strict standards issues with setFakeSlaveLag() and setFakeMaster().
 * (bug 451) Improve the phrase mappings of the Chinese converter arrays.
 * (bug 12487) Rights log is not fully internationalized
 * (bug 10837) Language variants no longer override other languages than base
@@ -7284,7 +7285,7 @@ Other changes in this release:
 * (bug 13128) Added patrolled flag to list=recentchanges
 * Implemented {bl,ei,iu}redirect (lists links through redirects as well)
 * (bug 13154) Introduced subpages flag to meta=siteinfo&siprop=namespaces
-* (bug 13157) Added ucuserprefix parameter to list=usercontibs
+* (bug 13157) Added ucuserprefix parameter to list=usercontribs
 * (bug 12394) Added rctitles parameter to list=recentchanges, making rcid
   retrieval easier
 * (bug 13218) Fix inclusion of " character in hyperlinks
@@ -8790,7 +8791,7 @@ it from source control: https://www.mediawiki.org/wiki/Download_from_SVN
 * (bug 3953) Work around poor display of parenthesis in the in other
   languages section of MonoBook skin
 * (bug 8539) Enable PLURAL option for another message of recentchanges.
-* (bug 8728) MediaWiki:Badfiletype splitted into 3 messages
+* (bug 8728) MediaWiki:Badfiletype split into 3 messages
 * (bug 9131) Allow SpecialContributions to work with Postgres
 * (bug 9155) Allow footer info to wrap in Monobook
 * (bug 8847) Strip spurious #fragments from request URI to fix redirect
@@ -9839,7 +9840,7 @@ they will be run along with the main tests by maintenance/parserTests.php
 * Fix formatting of titles on Special:Undelete
 * (bug 7026) Fix action=raw&templates=expand
 * (bug 6976) Add namespace and direction classes to classic skins
-* (bug 7144) Don't "return to main" from OutputPage::loginToUse() if the the user can't
+* (bug 7144) Don't "return to main" from OutputPage::loginToUse() if the user can't
   read the main page in the first place
 * (bug 7188) Fix minor borkage in HTMLForm
 * (bug 6675) Replaced message 'watchthis' with new message 'watchthisupload in Special:Upload
@@ -10442,7 +10443,7 @@ they will be run along with the main tests by maintenance/parserTests.php
 * (bug 6304) Show timestamp for current revision in diff pages
 * Vertically align current version with old version header in diff display
 * (bug 6174) Remove redundant "emailforlost" message
-* (bug 6189) Show an error to an unprivilleged user trying to create account
+* (bug 6189) Show an error to an unprivileged user trying to create account
 * (bug 6365) Show user information in the "old revision" navigation links
 * Introduce 'FetchChangesList' hook; see docs/hooks.txt for more information
 * (bug 6345) Update to Indonesian localisation (id) #22
@@ -10911,7 +10912,7 @@ Special Pages:
 * (bug 1956) Hide bot uploads from Special:Newimages
 * (bug 3220) Fix escaping of block URLs in Recentchanges
 * (bug 3284) Ipblocklist paging, substring search
-* Allow filtering of robot edits in Special:Watchlist by stting
+* Allow filtering of robot edits in Special:Watchlist by setting
   $wgFilterRobotsWL = true.
 * Fix interlanguage links on special pages when extra namespaces configured
 * (bug 3475) anon contrib links on Special:Newpages
@@ -11818,8 +11819,8 @@ Various bugfixes, small features, and a few experimental things:
 * Supplying a reason for a block is no longer mandatory
 * Language conversion support for category pages
 * $wgStyleSheetDirectory is no longer an alias for $wgStyleDirectory;
-* Special:Movepage can now take paramaters like Special:Movepage/Page_to_move
-  (used to just be able to take paramaters via a GET request like index.php?title=Special:Movepage&target=Page_to_move)
+* Special:Movepage can now take parameters like Special:Movepage/Page_to_move
+  (used to just be able to take parameters via a GET request like index.php?title=Special:Movepage&target=Page_to_move)
 * (bug 2151) The delete summary now includes editor name, if only one has edited the article.
 * (bug 2105) Fixed from argument to the PHP mail() function. A missing space could prevent sending mail with some versions of sendmail.
 * (bug 2228) Updated the Slovak translation
@@ -12004,7 +12005,7 @@ Various bugfixes, small features, and a few experimental things:
 * Skip sidebar entries where link text is '-'
 * Convert non-UTF-8 URL parameters even if referer is local
 * (bug 2460) <img> width & height properly filled when resizing image
-* (bug 2273) deletion log comment used user interface langage
+* (bug 2273) deletion log comment used user interface language
 * Try reading revision _text_ from master if no result on slave
 * Use content-language message cache for raw view of message pages
 * (bug 2530) Not displaying talk pages on Special:Watchlist/edit
index 339e677..f0c00f3 100644 (file)
@@ -12,6 +12,7 @@ production.
 * $wgPageShowWatchingUsers was removed.
 * $wgLocalVirtualHosts has been added to replace $wgConf->localVHosts.
 * $wgAntiLockFlags was removed.
+* $wgJavaScriptTestConfig was removed.
 * Edit tokens returned from User::getEditToken may change on every call. Token
   validity must be checked by passing the user-supplied token to
   User::matchEditToken rather than by testing for equality with a
@@ -32,6 +33,9 @@ production.
 * (T46740) The temporary option $wgIncludejQueryMigrate was removed, along
   with the jQuery Migrate library, as indicated when this option was provided in
   MediaWiki 1.24.
+* ProfilerStandard and ProfilerSimpleTrace were removed. Make sure that any
+  StartProfiler.php config is updated to reflect this. Xhprof is available
+  for zend/hhvm. Also, for hhvm, one can consider using its xenon profiler.
 
 === New features in 1.25 ===
 * (T64861) Updated plural rules to CLDR 26. Includes incompatible changes
@@ -47,7 +51,7 @@ production.
 * (T69341) SVG images will no longer be base64-encoded when being embedded
   in CSS. This results in slight size increase before gzip compression (due to
   percent-encoding), but up to 20% decrease after it.
-* Upgrade jStorage to v0.4.12.
+* Update jStorage to v0.4.12.
 * MediaWiki now natively supports page status indicators: icons (or short text
   snippets) usually displayed in the top-right corner of the page. They have
   been in use on Wikipedia for a long time, implemented using templates and CSS
@@ -61,6 +65,7 @@ production.
 * The debug logging internals have been overhauled, and are now using the
   PSR-3 interfaces.
 * Update CSSJanus to v1.1.1.
+* Update lessphp to v0.5.0.
 * Added a hook, "ApiOpenSearchSuggest", to allow extensions to provide extracts
   and images for ApiOpenSearch output. The semantics are identical to the
   "OpenSearchXml" hook provided by the OpenSearchXml extension.
@@ -68,31 +73,39 @@ production.
   this allows for pagination of prefix results. Extensions using this hook
   should implement supporting behavior. Not doing so can result in undefined
   behavior from API clients trying to continue through prefix results.
+* Update jQuery from v1.11.1 to v1.11.2.
+* External libraries installed via composer will now be displayed
+  on Special:Version in their own section. Extensions or skins that are
+  installed via composer will not be shown in this section as it is assumed
+  they will add the proper credits to the skins or extensions section.
+* Update QUnit from v1.14.0 to v1.16.0.
+* Update Moment.js from v2.8.3 to v2.8.4.
 
 ==== External libraries ====
 * MediaWiki now requires certain external libraries to be installed. In the past
-  these were bundled inside the git repository of MediaWiki core, but now they
+  these were bundled inside the Git repository of MediaWiki core, but now they
   need to be installed separately. For users using the tarball, this will be taken
-  care of and no action will be required. Users using git will either need to use
+  care of and no action will be required. Users using Git will either need to use
   composer to fetch dependencies or use the mediawiki/vendor repository which includes
   all dependencies for MediaWiki core and ones used in Wikimedia deployment. Detailed
-  instructions can be found at <https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries>.
+  instructions can be found at:
+  https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
 * The following libraries are now required:
-** psr/log 1.0.0
-*** This library provides the interfaces set by the PSR-3 standard (<http://www.php-fig.org/psr/psr-3/>)
-    which are used by MediaWiki interally by the MWLogger class.
-*** See the structured logging RfC (<https://www.mediawiki.org/wiki/Requests_for_comment/Structured_logging>)
-    for more background information.
-** cssjanus/cssjanus 1.1.1
-*** This library was formerly bundled with MediaWiki core and has now been removed. It automatically
-    flips CSS for RTL support.
-** leafo/lessphp 0.5.0
-*** This library was formerly bundled with MediaWiki core and has now been removed. It compiles LESS
-    files into CSS.
-** cdb/cdb 1.0.0
-*** This library was formerly a part of MediaWiki core, and has now been split out into a separate library.
-    It provides CDB functions which are used in the Interwiki and Localization caches. More information
-    about the library can be found at <https://www.mediawiki.org/wiki/CDB>.
+** psr/log
+   This library provides the interfaces set by the PSR-3 standard (http://www.php-fig.org/psr/psr-3/)
+   which are used by MediaWiki internally via the MWLoggerFactory class.
+   See the structured logging RfC (https://www.mediawiki.org/wiki/Requests_for_comment/Structured_logging)
+   for more background information.
+** cssjanus/cssjanus
+   This library was formerly bundled with MediaWiki core and has been removed.
+   It automatically flips CSS for RTL support.
+** leafo/lessphp
+   This library was formerly bundled with MediaWiki core and has been removed.
+   It compiles LESS files into CSS.
+** wikimedia/cdb
+   This library was formerly a part of MediaWiki core, and has been moved into a separate library.
+   It provides CDB functions which are used in the Interwiki and Localization caches.
+   More information about the library can be found at https://www.mediawiki.org/wiki/CDB.
 
 === Bug fixes in 1.25 ===
 * (T73003) No additional code will be generated to try to load CSS-embedded
@@ -102,13 +115,22 @@ production.
 * Page moving was refactored into a MovePage class. As part of that:
 ** The AbortMove hook was removed.
 ** MovePageIsValidMove is for extensions to specify whether a page
-   cannot be moved for technical reasons, and should not be overriden.
+   cannot be moved for technical reasons, and should not be overridden.
 ** MovePageCheckPermissions is for checking whether the given user is
    allowed to make the move.
 ** Title::moveNoAuth() was deprecated. Use the MovePage class instead.
 ** Title::moveTo() was deprecated. Use the MovePage class instead.
 ** Title::isValidMoveOperation() broken down into MovePage::isValidMove()
    and MovePage::checkPermissions().
+* (T18530) Multiple autocomments are now formatted in an edit summary.
+* (T70361) Autocomments containing "/*" are parsed correctly.
+* The Special:WhatLinksHere page linked from 'Number of redirects to this page'
+  on action=info about a file page does not list file links anymore.
+* (T78637) Search bar is not autofocused unless it is empty so that proper scrolling using arrow keys is possible.
+* (T50853) Database::makeList() modified to handle 'NULL' separately when building IN clause
+* (T85192) Captcha position modified in Usercreate template. As a result:
+** extrafields parameter added to Usercreate.php to insert additional data
+** 'extend' method added to QuickTemplate to append additional values to any field of data array
 
 === Action API changes in 1.25 ===
 * (T67403) XML tag highlighting is now only performed for formats
@@ -153,6 +175,15 @@ production.
 * (T76051) list=tags will now continue correctly.
 * (T76052) list=tags can now indicate whether a tag is defined.
 * (T75522) list=prefixsearch now supports continuation
+* (T78737) action=expandtemplates can now return page properties.
+* (T78690) list=allimages now accepts multiple pipe-separated values
+  for the 'aimime' parameter.
+* prop=info with inprop=protections will now return applicable protection types
+  with the 'restrictiontypes' key.
+* (T85417) When resolving redirects, ApiPageSet will now add the targets of
+  interwiki redirects to the list of interwiki titles.
+* (T85417) When outputting the list of redirect titles, a 'tointerwiki'
+  property (like the existing 'tofragment' property) will be set.
 
 === Action API internal changes in 1.25 ===
 * ApiHelp has been rewritten to support i18n and paginated HTML output.
@@ -219,7 +250,8 @@ changes to languages because of Bugzilla reports.
 * The skin autodiscovery mechanism, deprecated in MediaWiki 1.23, has been
   removed. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for
   migration guide for creators and users of custom skins that relied on it.
-* Javascript variable 'wgFileCanRotate' now only available on Special:Upload.
+* Javascript variable 'wgFileCanRotate' and 'wgFileExtensions' now only
+  available on Special:Upload.
 * (T58257) Set site logo from mediawiki.skinning.interface module instead of
   inline styles in the HTML.
 * Removed ApiQueryUsers::getAutoGroups(). (deprecated since 1.20)
@@ -243,8 +275,8 @@ changes to languages because of Bugzilla reports.
 * BREAKING CHANGE: In the XML dump format used by Special:Export and
   dumpBackup.php, the <model> and <format> tags now apprear before the <text>
   tag, instead of after the <text> and <sha1> tags.
-  The new schema version is 0.10, the new schema URI is
-  <https://www.mediawiki.org/xml/export-0.10.xsd>.
+  The new schema version is 0.10, the new schema URI is:
+  https://www.mediawiki.org/xml/export-0.10.xsd
 * MWFunction::call() and MWFunction::callArray() were removed, having being
   deprecated in 1.22.
 * Deprecated the getInternalLinkAttributes, getInternalLinkAttributesObj,
@@ -273,6 +305,21 @@ changes to languages because of Bugzilla reports.
    However, this difference is unlikely to arise in practice.
 * (T67278) RFC, PMID, and ISBN "magic links" must be surrounded by non-word
   characters on both sides.
+* The FormatAutocomments hook will now receive $pre and $post as booleans,
+  rather than as strings that must be prepended or appended to $comment.
+* (T30950, T31025) RFC, PMID, and ISBN "magic links" can no longer contain
+  newlines; but they can contain &nbsp; and other non-newline whitespace.
+* The 'mediawiki.action.edit' ResourceLoader module no longer generates the edit
+  toolbar, which has been moved to a separate 'mediawiki.toolbar' module. If you
+  relied on this behavior, update your scripts' dependencies.
+* HTMLForm's 'vform' display style has been separated to a subclass. Therefore:
+  * HTMLForm::isVForm() is now deprecated.
+  * You can no longer do this:
+      $form = new HTMLForm( … );
+      $form->setDisplayFormat( 'vform' ); // throws exception
+    Instead, do this:
+      $form = HTMLForm::factory( 'vform', … );
+* Deprecated Revision methods getRawUser(), getRawUserText() and getRawComment().
 
 == Compatibility ==
 
index d20c0e1..4721a9d 100644 (file)
@@ -1,10 +1,7 @@
 <?php
 
 /**
- * To use a profiler, copy this file to StartProfiler.php,
- * and add either:
- *  $wgProfiler['class'] = 'ProfilerStandard';
- *    or
+ * To use a profiler, copy this file to StartProfiler.php and add:
  *  $wgProfiler['class'] = 'ProfilerXhprof';
  *
  * For output, add:
@@ -22,7 +19,7 @@
  * maintenance/archives/patch-profiling.sql to your database.
  *
  * For a rudimentary sampling profiler:
- *   $wgProfiler['class'] = 'ProfilerStandard';
+ *   $wgProfiler['class'] = 'ProfilerXhprof';
  *   $wgProfiler['output'] = array( 'db' );
  *   $wgProfiler['sampling'] = 50; // one every 50 requests
  * This will use ProfilerStub for non-sampled cases.
diff --git a/api.php b/api.php
index 74ee775..d63f254 100644 (file)
--- a/api.php
+++ b/api.php
@@ -42,7 +42,6 @@ if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3
 
 require __DIR__ . '/includes/WebStart.php';
 
-wfProfileIn( 'api.php' );
 $starttime = microtime( true );
 
 // URL safety checks
@@ -72,7 +71,7 @@ try {
        // Last chance hook before executing the API
        wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
        if ( !$processor instanceof ApiMain ) {
-               throw new MWException( 'ApiBeforMain hook set $processor to a non-ApiMain class' );
+               throw new MWException( 'ApiBeforeMain hook set $processor to a non-ApiMain class' );
        }
 } catch ( Exception $e ) {
        // Crap. Try to report the exception in API format to be friendly to clients.
@@ -94,7 +93,6 @@ DeferredUpdates::doUpdates();
 
 // Log what the user did, for book-keeping purposes.
 $endtime = microtime( true );
-wfProfileOut( 'api.php' );
 
 wfLogProfilingData();
 
@@ -122,7 +120,7 @@ if ( $wgAPIRequestLog ) {
        } else {
                $items[] = "failed in ApiBeforeMain";
        }
-       wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
+       MWLoggerLegacyLogger::emit( implode( ',', $items ) . "\n", $wgAPIRequestLog );
        wfDebug( "Logged API request to $wgAPIRequestLog\n" );
 }
 
index 175ab42..11b5266 100644 (file)
@@ -44,6 +44,7 @@ $wgAutoloadLocalClasses = array(
        'ApiFormatXmlRsd' => __DIR__ . '/includes/api/ApiRsd.php',
        'ApiFormatYaml' => __DIR__ . '/includes/api/ApiFormatYaml.php',
        'ApiHelp' => __DIR__ . '/includes/api/ApiHelp.php',
+       'ApiHelpParamValueMessage' => __DIR__ . '/includes/api/ApiHelpParamValueMessage.php',
        'ApiImageRotate' => __DIR__ . '/includes/api/ApiImageRotate.php',
        'ApiImport' => __DIR__ . '/includes/api/ApiImport.php',
        'ApiImportReporter' => __DIR__ . '/includes/api/ApiImport.php',
@@ -201,6 +202,7 @@ $wgAutoloadLocalClasses = array(
        'ChangesListSpecialPage' => __DIR__ . '/includes/specialpage/ChangesListSpecialPage.php',
        'ChannelFeed' => __DIR__ . '/includes/Feed.php',
        'CheckBadRedirects' => __DIR__ . '/maintenance/checkBadRedirects.php',
+       'CheckComposerLockUpToDate' => __DIR__ . '/maintenance/checkComposerLockUpToDate.php',
        'CheckExtensionsCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
        'CheckImages' => __DIR__ . '/maintenance/checkImages.php',
        'CheckLanguageCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
@@ -228,6 +230,8 @@ $wgAutoloadLocalClasses = array(
        'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
        'CompareParsers' => __DIR__ . '/maintenance/compareParsers.php',
        'ComposerHookHandler' => __DIR__ . '/includes/composer/ComposerHookHandler.php',
+       'ComposerJson' => __DIR__ . '/includes/libs/composer/ComposerJson.php',
+       'ComposerLock' => __DIR__ . '/includes/libs/composer/ComposerLock.php',
        'ComposerPackageModifier' => __DIR__ . '/includes/composer/ComposerPackageModifier.php',
        'ComposerVersionNormalizer' => __DIR__ . '/includes/composer/ComposerVersionNormalizer.php',
        'CompressOld' => __DIR__ . '/maintenance/storage/compressOld.php',
@@ -240,6 +244,7 @@ $wgAutoloadLocalClasses = array(
        'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php',
        'ContextSource' => __DIR__ . '/includes/context/ContextSource.php',
        'ContribsPager' => __DIR__ . '/includes/specials/SpecialContributions.php',
+       'ConvertExtensionToRegistration' => __DIR__ . '/maintenance/convertExtensionToRegistration.php',
        'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
        'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
        'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
@@ -287,6 +292,7 @@ $wgAutoloadLocalClasses = array(
        'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
        'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
        'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeferredStringifier' => __DIR__ . '/includes/libs/DeferredStringifier.php',
        'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
        'DeleteAction' => __DIR__ . '/includes/actions/DeleteAction.php',
        'DeleteArchivedFiles' => __DIR__ . '/maintenance/deleteArchivedFiles.php',
@@ -369,6 +375,8 @@ $wgAutoloadLocalClasses = array(
        'ExplodeIterator' => __DIR__ . '/includes/utils/StringUtils.php',
        'ExportProgressFilter' => __DIR__ . '/maintenance/backup.inc',
        'ExtensionLanguages' => __DIR__ . '/maintenance/language/languages.inc',
+       'ExtensionProcessor' => __DIR__ . '/includes/registration/ExtensionProcessor.php',
+       'ExtensionRegistry' => __DIR__ . '/includes/registration/ExtensionRegistry.php',
        'ExternalStore' => __DIR__ . '/includes/externalstore/ExternalStore.php',
        'ExternalStoreDB' => __DIR__ . '/includes/externalstore/ExternalStoreDB.php',
        'ExternalStoreHttp' => __DIR__ . '/includes/externalstore/ExternalStoreHttp.php',
@@ -427,6 +435,8 @@ $wgAutoloadLocalClasses = array(
        'ForeignDBFile' => __DIR__ . '/includes/filerepo/file/ForeignDBFile.php',
        'ForeignDBRepo' => __DIR__ . '/includes/filerepo/ForeignDBRepo.php',
        'ForeignDBViaLBRepo' => __DIR__ . '/includes/filerepo/ForeignDBViaLBRepo.php',
+       'ForeignTitle' => __DIR__ . '/includes/title/ForeignTitle.php',
+       'ForeignTitleFactory' => __DIR__ . '/includes/title/ForeignTitleFactory.php',
        'ForkController' => __DIR__ . '/includes/ForkController.php',
        'FormAction' => __DIR__ . '/includes/actions/FormAction.php',
        'FormOptions' => __DIR__ . '/includes/FormOptions.php',
@@ -526,6 +536,7 @@ $wgAutoloadLocalClasses = array(
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
        'ImportStreamSource' => __DIR__ . '/includes/Import.php',
        'ImportStringSource' => __DIR__ . '/includes/Import.php',
+       'ImportTitleFactory' => __DIR__ . '/includes/title/ImportTitleFactory.php',
        'IncludableSpecialPage' => __DIR__ . '/includes/specialpage/IncludableSpecialPage.php',
        'IndexPager' => __DIR__ . '/includes/pager/IndexPager.php',
        'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
@@ -679,11 +690,13 @@ $wgAutoloadLocalClasses = array(
        'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
        'MWLogger' => __DIR__ . '/includes/debug/logger/Logger.php',
+       'MWLoggerFactory' => __DIR__ . '/includes/debug/logger/Factory.php',
        'MWLoggerLegacyLogger' => __DIR__ . '/includes/debug/logger/legacy/Logger.php',
        'MWLoggerLegacySpi' => __DIR__ . '/includes/debug/logger/legacy/Spi.php',
        'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/monolog/Handler.php',
        'MWLoggerMonologLegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/LegacyFormatter.php',
        'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Processor.php',
+       'MWLoggerMonologSamplingHandler' => __DIR__ . '/includes/debug/logger/monolog/SamplingHandler.php',
        'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Spi.php',
        'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Spi.php',
@@ -763,7 +776,11 @@ $wgAutoloadLocalClasses = array(
        'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
        'MysqlInstaller' => __DIR__ . '/includes/installer/MysqlInstaller.php',
        'MysqlUpdater' => __DIR__ . '/includes/installer/MysqlUpdater.php',
+       'NaiveForeignTitleFactory' => __DIR__ . '/includes/title/NaiveForeignTitleFactory.php',
+       'NaiveImportTitleFactory' => __DIR__ . '/includes/title/NaiveImportTitleFactory.php',
+       'NamespaceAwareForeignTitleFactory' => __DIR__ . '/includes/title/NamespaceAwareForeignTitleFactory.php',
        'NamespaceConflictChecker' => __DIR__ . '/maintenance/namespaceDupes.php',
+       'NamespaceImportTitleFactory' => __DIR__ . '/includes/title/NamespaceImportTitleFactory.php',
        'NewFilesPager' => __DIR__ . '/includes/specials/SpecialNewimages.php',
        'NewPagesPager' => __DIR__ . '/includes/specials/SpecialNewpages.php',
        'NewUsersLogFormatter' => __DIR__ . '/includes/logging/NewUsersLogFormatter.php',
@@ -833,6 +850,7 @@ $wgAutoloadLocalClasses = array(
        'ParserDiffTest' => __DIR__ . '/includes/parser/ParserDiffTest.php',
        'ParserOptions' => __DIR__ . '/includes/parser/ParserOptions.php',
        'ParserOutput' => __DIR__ . '/includes/parser/ParserOutput.php',
+       'ParsoidVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/ParsoidVirtualRESTService.php',
        'Password' => __DIR__ . '/includes/password/Password.php',
        'PasswordError' => __DIR__ . '/includes/password/PasswordError.php',
        'PasswordFactory' => __DIR__ . '/includes/password/PasswordFactory.php',
@@ -875,14 +893,14 @@ $wgAutoloadLocalClasses = array(
        'Preprocessor_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
        'Preprocessor_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
        'ProcessCacheLRU' => __DIR__ . '/includes/libs/ProcessCacheLRU.php',
+       'Processor' => __DIR__ . '/includes/registration/Processor.php',
        'ProfileSection' => __DIR__ . '/includes/profiler/ProfileSection.php',
        'Profiler' => __DIR__ . '/includes/profiler/Profiler.php',
        'ProfilerOutput' => __DIR__ . '/includes/profiler/output/ProfilerOutput.php',
        'ProfilerOutputDb' => __DIR__ . '/includes/profiler/output/ProfilerOutputDb.php',
        'ProfilerOutputText' => __DIR__ . '/includes/profiler/output/ProfilerOutputText.php',
        'ProfilerOutputUdp' => __DIR__ . '/includes/profiler/output/ProfilerOutputUdp.php',
-       'ProfilerSimpleTrace' => __DIR__ . '/includes/profiler/ProfilerSimpleTrace.php',
-       'ProfilerStandard' => __DIR__ . '/includes/profiler/ProfilerStandard.php',
+       'ProfilerSectionOnly' => __DIR__ . '/includes/profiler/ProfilerSectionOnly.php',
        'ProfilerStub' => __DIR__ . '/includes/profiler/ProfilerStub.php',
        'ProfilerXhprof' => __DIR__ . '/includes/profiler/ProfilerXhprof.php',
        'Protect' => __DIR__ . '/maintenance/protect.php',
@@ -1018,6 +1036,7 @@ $wgAutoloadLocalClasses = array(
        'SearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
        'SearchSqlite' => __DIR__ . '/includes/search/SearchSqlite.php',
        'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php',
+       'SectionProfileCallback' => __DIR__ . '/includes/profiler/SectionProfiler.php',
        'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php',
        'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc',
        'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php',
@@ -1141,6 +1160,7 @@ $wgAutoloadLocalClasses = array(
        'StubObject' => __DIR__ . '/includes/StubObject.php',
        'StubUserLang' => __DIR__ . '/includes/StubObject.php',
        'SubmitAction' => __DIR__ . '/includes/actions/SubmitAction.php',
+       'SubpageImportTitleFactory' => __DIR__ . '/includes/title/SubpageImportTitleFactory.php',
        'SvgHandler' => __DIR__ . '/includes/media/SVG.php',
        'SwiftFileBackend' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
        'SwiftFileBackendDirList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
@@ -1179,8 +1199,10 @@ $wgAutoloadLocalClasses = array(
        'TraditionalImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
        'TransactionProfiler' => __DIR__ . '/includes/profiler/TransactionProfiler.php',
        'TransformParameterError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'TransformTooBigImageAreaError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'TransformationalImageHandler' => __DIR__ . '/includes/media/TransformationalImageHandler.php',
        'UDPRCFeedEngine' => __DIR__ . '/includes/rcfeed/UDPRCFeedEngine.php',
+       'UDPTransport' => __DIR__ . '/includes/libs/UDPTransport.php',
        'UIDGenerator' => __DIR__ . '/includes/utils/UIDGenerator.php',
        'UcdXmlReader' => __DIR__ . '/maintenance/language/generateCollationData.php',
        'UncategorizedCategoriesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedcategories.php',
@@ -1248,6 +1270,8 @@ $wgAutoloadLocalClasses = array(
        'UsersPager' => __DIR__ . '/includes/specials/SpecialListusers.php',
        'UtfNormal' => __DIR__ . '/includes/normal/UtfNormal.php',
        'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
+       'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php',
+       'ValidateRegistrationFile' => __DIR__ . '/maintenance/validateRegistrationFile.php',
        'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
        'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
        'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
index dcb21af..1e75e6c 100644 (file)
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
+               "cssjanus/cssjanus": "1.1.1",
                "leafo/lessphp": "0.5.0",
+               "oojs/oojs-ui": "0.6.3",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
-               "cssjanus/cssjanus": "1.1.1",
-               "wikimedia/cdb": "1.0.1"
+               "wikimedia/cdb": "1.0.1",
+               "wikimedia/composer-merge-plugin": "0.5.0",
+               "zordius/lightncandy": "0.18"
        },
        "require-dev": {
+               "justinrainbow/json-schema": "~1.3",
                "phpunit/phpunit": "*"
        },
        "suggest": {
        "config": {
                "prepend-autoloader": false,
                "optimize-autoloader": true
+       },
+       "extra": {
+               "merge-plugin": {
+                       "include": [
+                               "composer.local.json"
+                       ]
+               }
        }
 }
index 3f0fca2..5f9a0b0 100644 (file)
@@ -8,6 +8,7 @@ Built-in content types are:
 
 * wikitext - wikitext, as usual
 * javascript - user provided javascript code
+* json - simple implementation for use by extensions, etc.
 * css - user provided css code
 * text - plain text
 
index e96bd6c..93b237f 100644 (file)
@@ -55,7 +55,7 @@
     <!-- if a page is deleted and recreated.                          -->
     <id>1</id>
     
-    <!-- Tag wether this article is a redirect and its target -->
+    <!-- Tag whether this article is a redirect and its target -->
     <!-- This corresponds to the page_is_redirect in the page table -->
     <redirect title="Target" />
     
diff --git a/docs/extension.schema.json b/docs/extension.schema.json
new file mode 100644 (file)
index 0000000..46f8623
--- /dev/null
@@ -0,0 +1,613 @@
+{
+       "$schema": "http://json-schema.org/schema#",
+       "description": "MediaWiki extension.json schema",
+       "type": "object",
+       "properties": {
+               "name": {
+                       "type": "string",
+                       "description": "The extension's canonical name."
+               },
+               "info-files": {
+                       "type": "array",
+                       "description": "A list of filenames that should be loaded, in addition to this one"
+               },
+               "type": {
+                       "type": "string",
+                       "description": "The extension's type, as an index to $wgExtensionCredits.",
+                       "default": "other",
+                       "enum": [
+                               "api",
+                               "antispam",
+                               "datavalues",
+                               "media",
+                               "parserhook",
+                               "semantic",
+                               "skin",
+                               "specialpage",
+                               "variable",
+                               "other"
+                       ]
+               },
+               "author": {
+                       "type": [
+                               "string",
+                               "array"
+                       ],
+                       "description": "Extension's authors.",
+                       "items": {
+                               "type": "string"
+                       },
+                       "additionalItems": false
+               },
+               "path": {
+                       "type": "string"
+               },
+               "version": {
+                       "type": "string",
+                       "description": "The version of this release of the extension."
+               },
+               "url": {
+                       "type": "string",
+                       "description": "URL to the homepage for the extension.",
+                       "format": "uri"
+               },
+               "description": {
+                       "type": "string",
+                       "description": "Raw description of the extension."
+               },
+               "descriptionmsg": {
+                       "type": "string",
+                       "description": "Message key for a i18n message describing the extension."
+               },
+               "license-name": {
+                       "type": "string",
+                       "description": "Short identifier for the license under which the extension is released.",
+                       "enum": [
+                               "AFL-1.1",
+                               "AFL-1.2",
+                               "AFL-2.0",
+                               "AFL-2.1",
+                               "AFL-3.0",
+                               "APL-1.0",
+                               "Aladdin",
+                               "ANTLR-PD",
+                               "Apache-1.0",
+                               "Apache-1.1",
+                               "Apache-2.0",
+                               "APSL-1.0",
+                               "APSL-1.1",
+                               "APSL-1.2",
+                               "APSL-2.0",
+                               "Artistic-1.0",
+                               "Artistic-1.0-cl8",
+                               "Artistic-1.0-Perl",
+                               "Artistic-2.0",
+                               "AAL",
+                               "BitTorrent-1.0",
+                               "BitTorrent-1.1",
+                               "BSL-1.0",
+                               "BSD-2-Clause",
+                               "BSD-2-Clause-FreeBSD",
+                               "BSD-2-Clause-NetBSD",
+                               "BSD-3-Clause",
+                               "BSD-3-Clause-Clear",
+                               "BSD-4-Clause",
+                               "BSD-4-Clause-UC",
+                               "CECILL-1.0",
+                               "CECILL-1.1",
+                               "CECILL-2.0",
+                               "CECILL-B",
+                               "CECILL-C",
+                               "ClArtistic",
+                               "CNRI-Python",
+                               "CNRI-Python-GPL-Compatible",
+                               "CPOL-1.02",
+                               "CDDL-1.0",
+                               "CDDL-1.1",
+                               "CPAL-1.0",
+                               "CPL-1.0",
+                               "CATOSL-1.1",
+                               "Condor-1.1",
+                               "CC-BY-1.0",
+                               "CC-BY-2.0",
+                               "CC-BY-2.5",
+                               "CC-BY-3.0",
+                               "CC-BY-ND-1.0",
+                               "CC-BY-ND-2.0",
+                               "CC-BY-ND-2.5",
+                               "CC-BY-ND-3.0",
+                               "CC-BY-NC-1.0",
+                               "CC-BY-NC-2.0",
+                               "CC-BY-NC-2.5",
+                               "CC-BY-NC-3.0",
+                               "CC-BY-NC-ND-1.0",
+                               "CC-BY-NC-ND-2.0",
+                               "CC-BY-NC-ND-2.5",
+                               "CC-BY-NC-ND-3.0",
+                               "CC-BY-NC-SA-1.0",
+                               "CC-BY-NC-SA-2.0",
+                               "CC-BY-NC-SA-2.5",
+                               "CC-BY-NC-SA-3.0",
+                               "CC-BY-SA-1.0",
+                               "CC-BY-SA-2.0",
+                               "CC-BY-SA-2.5",
+                               "CC-BY-SA-3.0",
+                               "CC0-1.0",
+                               "CUA-OPL-1.0",
+                               "D-FSL-1.0",
+                               "WTFPL",
+                               "EPL-1.0",
+                               "eCos-2.0",
+                               "ECL-1.0",
+                               "ECL-2.0",
+                               "EFL-1.0",
+                               "EFL-2.0",
+                               "Entessa",
+                               "ErlPL-1.1",
+                               "EUDatagrid",
+                               "EUPL-1.0",
+                               "EUPL-1.1",
+                               "Fair",
+                               "Frameworx-1.0",
+                               "FTL",
+                               "AGPL-1.0",
+                               "AGPL-3.0",
+                               "GFDL-1.1",
+                               "GFDL-1.2",
+                               "GFDL-1.3",
+                               "GPL-1.0",
+                               "GPL-1.0+",
+                               "GPL-2.0",
+                               "GPL-2.0+",
+                               "GPL-2.0-with-autoconf-exception",
+                               "GPL-2.0-with-bison-exception",
+                               "GPL-2.0-with-classpath-exception",
+                               "GPL-2.0-with-font-exception",
+                               "GPL-2.0-with-GCC-exception",
+                               "GPL-3.0",
+                               "GPL-3.0+",
+                               "GPL-3.0-with-autoconf-exception",
+                               "GPL-3.0-with-GCC-exception",
+                               "LGPL-2.1",
+                               "LGPL-2.1+",
+                               "LGPL-3.0",
+                               "LGPL-3.0+",
+                               "LGPL-2.0",
+                               "LGPL-2.0+",
+                               "gSOAP-1.3b",
+                               "HPND",
+                               "IBM-pibs",
+                               "IPL-1.0",
+                               "Imlib2",
+                               "IJG",
+                               "Intel",
+                               "IPA",
+                               "ISC",
+                               "JSON",
+                               "LPPL-1.3a",
+                               "LPPL-1.0",
+                               "LPPL-1.1",
+                               "LPPL-1.2",
+                               "LPPL-1.3c",
+                               "Libpng",
+                               "LPL-1.02",
+                               "LPL-1.0",
+                               "MS-PL",
+                               "MS-RL",
+                               "MirOS",
+                               "MIT",
+                               "Motosoto",
+                               "MPL-1.0",
+                               "MPL-1.1",
+                               "MPL-2.0",
+                               "MPL-2.0-no-copyleft-exception",
+                               "Multics",
+                               "NASA-1.3",
+                               "Naumen",
+                               "NBPL-1.0",
+                               "NGPL",
+                               "NOSL",
+                               "NPL-1.0",
+                               "NPL-1.1",
+                               "Nokia",
+                               "NPOSL-3.0",
+                               "NTP",
+                               "OCLC-2.0",
+                               "ODbL-1.0",
+                               "PDDL-1.0",
+                               "OGTSL",
+                               "OLDAP-2.2.2",
+                               "OLDAP-1.1",
+                               "OLDAP-1.2",
+                               "OLDAP-1.3",
+                               "OLDAP-1.4",
+                               "OLDAP-2.0",
+                               "OLDAP-2.0.1",
+                               "OLDAP-2.1",
+                               "OLDAP-2.2",
+                               "OLDAP-2.2.1",
+                               "OLDAP-2.3",
+                               "OLDAP-2.4",
+                               "OLDAP-2.5",
+                               "OLDAP-2.6",
+                               "OLDAP-2.7",
+                               "OPL-1.0",
+                               "OSL-1.0",
+                               "OSL-2.0",
+                               "OSL-2.1",
+                               "OSL-3.0",
+                               "OLDAP-2.8",
+                               "OpenSSL",
+                               "PHP-3.0",
+                               "PHP-3.01",
+                               "PostgreSQL",
+                               "Python-2.0",
+                               "QPL-1.0",
+                               "RPSL-1.0",
+                               "RPL-1.1",
+                               "RPL-1.5",
+                               "RHeCos-1.1",
+                               "RSCPL",
+                               "Ruby",
+                               "SAX-PD",
+                               "SGI-B-1.0",
+                               "SGI-B-1.1",
+                               "SGI-B-2.0",
+                               "OFL-1.0",
+                               "OFL-1.1",
+                               "SimPL-2.0",
+                               "Sleepycat",
+                               "SMLNJ",
+                               "SugarCRM-1.1.3",
+                               "SISSL",
+                               "SISSL-1.2",
+                               "SPL-1.0",
+                               "Watcom-1.0",
+                               "NCSA",
+                               "VSL-1.0",
+                               "W3C",
+                               "WXwindows",
+                               "Xnet",
+                               "X11",
+                               "XFree86-1.1",
+                               "YPL-1.0",
+                               "YPL-1.1",
+                               "Zimbra-1.3",
+                               "Zlib",
+                               "ZPL-1.1",
+                               "ZPL-2.0",
+                               "ZPL-2.1",
+                               "Unlicense"
+                       ]
+               },
+               "ResourceLoaderModules": {
+                       "type": "object",
+                       "description": "ResourceLoader modules to register",
+                       "additionalProperties": false,
+                       "patternProperties": {
+                               "^[a-zA-Z0-9\\.]+$": {
+                                       "type": "object",
+                                       "description": "A single ResourceLoader module descriptor",
+                                       "properties": {
+                                               "localBasePath": {
+                                                       "type": "string",
+                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                               },
+                                               "remoteBasePath": {
+                                                       "type": "string",
+                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                               },
+                                               "remoteExtPath": {
+                                                       "type": "string",
+                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                               },
+                                               "scripts": {
+                                                       "type": "array",
+                                                       "description": "Scripts to always include (array of file paths)",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               },
+                                               "languageScripts": {
+                                                       "type": "object",
+                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                       "patternProperties": {
+                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                       "type": [
+                                                                               "string",
+                                                                               "array"
+                                                                       ],
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               "skinScripts": {
+                                                       "type": "object",
+                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                       "patternProperties": {
+                                                               ".+": {
+                                                                       "type": [
+                                                                               "string",
+                                                                               "array"
+                                                                       ],
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               "debugScripts": {
+                                                       "type": "array",
+                                                       "description": "Scripts to include in debug contexts",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               },
+                                               "loaderScripts": {
+                                                       "type": "array",
+                                                       "description": "Scripts to include in the startup module",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               },
+                                               "dependencies": {
+                                                       "type": "array",
+                                                       "description": "Modules which must be loaded before this module",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               },
+                                               "styles": {
+                                                       "type": "array",
+                                                       "description": "Styles to always load",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               },
+                                               "skinStyles": {
+                                                       "type": "object",
+                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                       "patternProperties": {
+                                                               ".+": {
+                                                                       "type": [
+                                                                               "string",
+                                                                               "array"
+                                                                       ],
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               "messages": {
+                                                       "type": "array",
+                                                       "description": "Messages to always load",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               },
+                                               "group": {
+                                                       "type": "string",
+                                                       "description": "Group which this module should be loaded together with"
+                                               },
+                                               "position": {
+                                                       "type": "string",
+                                                       "description": "Position on the page to load this module at",
+                                                       "enum": [
+                                                               "bottom",
+                                                               "top"
+                                                       ]
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "ResourceLoaderSources": {
+                       "type": "object",
+                       "description": "ResourceLoader sources to register"
+               },
+               "ResourceLoaderLESSVars": {
+                       "type": "object",
+                       "description": "ResourceLoader LESS variables"
+               },
+               "ResourceLoaderLESSFunctions": {
+                       "type": "object",
+                       "description": "ResourceLoader LESS functions"
+               },
+               "ResourceLoaderLESSImportPaths": {
+                       "type": "object",
+                       "description": "ResourceLoader import paths"
+               },
+               "ConfigRegistry": {
+                       "type": "object",
+                       "description": "Registry of factory functions to create Config objects"
+               },
+               "namespaces": {
+                       "type": "object",
+                       "description": "Method to add extra namespaces",
+                       "properties": {
+                               "id": {
+                                       "type": "integer"
+                               },
+                               "constant": {
+                                       "type": "string"
+                               },
+                               "name": {
+                                       "type": "string"
+                               },
+                               "gender": {
+                                       "type": "object",
+                                       "properties": {
+                                               "male": {
+                                                       "type": "string"
+                                               },
+                                               "female": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               },
+                               "subpages": {
+                                       "type": "boolean",
+                                       "default": false
+                               },
+                               "content": {
+                                       "type": "boolean",
+                                       "default": false
+                               },
+                               "defaultcontentmodel": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "TrackingCategories": {
+                       "type": "array",
+                       "description": "Tracking category message keys"
+               },
+               "DefaultUserOptions": {
+                       "type": "object",
+                       "description": "Default values of user options"
+               },
+               "HiddenPrefs": {
+                       "type": "array",
+                       "description": "Preferences users cannot set"
+               },
+               "GroupPermissions": {
+                       "type": "object",
+                       "description": "Default permissions to give to user groups"
+               },
+               "RevokePermissions": {
+                       "type": "object",
+                       "description": "Default permissions to revoke from user groups"
+               },
+               "ImplicitGroups": {
+                       "type": "array",
+                       "description": "Implicit groups"
+               },
+               "GroupsAddToSelf": {
+                       "type": "object",
+                       "description": "Groups a user can add to themselves"
+               },
+               "GroupsRemoveFromSelf": {
+                       "type": "object",
+                       "description": "Groups a user can remove from themselves"
+               },
+               "AddGroups": {
+                       "type": "object",
+                       "description": "Groups a user can add to users"
+               },
+               "RemoveGroups": {
+                       "type": "object",
+                       "description": "Groups a user can remove from users"
+               },
+               "AvailableRights": {
+                       "type": "array",
+                       "description": "User rights added by the extension"
+               },
+               "ContentHandlers": {
+                       "type": "object",
+                       "description": "Mapping of model ID to class name"
+               },
+               "RateLimits": {
+                       "type": "object",
+                       "description": "Rate limits"
+               },
+               "ParserTestFiles": {
+                       "type": "array",
+                       "description": "Parser test files to run"
+               },
+               "RecentChangesFlags": {
+                       "type": "object",
+                       "description": "Flags (letter symbols) shown on RecentChanges pages"
+               },
+               "ExtensionFunctions": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "Function to call after setup has finished"
+               },
+               "ExtensionMessagesFiles": {
+                       "type": "object",
+                       "description": "File paths containing PHP internationalization data"
+               },
+               "MessagesDirs": {
+                       "type": "object",
+                       "description": "Directory paths containing JSON internationalization data"
+               },
+               "ExtensionEntryPointListFiles": {
+                       "type": "object"
+               },
+               "SpecialPages": {
+                       "type": "object",
+                       "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+               },
+               "SpecialPageGroups": {
+                       "type": "object",
+                       "description": "Mapping of special page name to group it belongs to"
+               },
+               "AutoloadClasses": {
+                       "type": "object"
+               },
+               "Hooks": {
+                       "type": "object",
+                       "description": "Hooks this extension uses (mapping of hook name to callback)"
+               },
+               "JobClasses": {
+                       "type": "object",
+                       "description": "Job types this extension implements (mapping of job type to class name)"
+               },
+               "LogTypes": {
+                       "type": "array",
+                       "description": "List of new log types this extension uses"
+               },
+               "LogRestrictions": {
+                       "type": "object"
+               },
+               "FilterLogTypes": {
+                       "type": "array"
+               },
+               "LogNames": {
+                       "type": "object"
+               },
+               "LogHeaders": {
+                       "type": "object"
+               },
+               "LogActions": {
+                       "type": "object"
+               },
+               "LogActionsHandlers": {
+                       "type": "object"
+               },
+               "Actions": {
+                       "type": "object"
+               },
+               "APIModules": {
+                       "type": "object"
+               },
+               "APIFormatModules": {
+                       "type": "object"
+               },
+               "APIMetaModules": {
+                       "type": "object"
+               },
+               "APIPropModules": {
+                       "type": "object"
+               },
+               "APIListModules": {
+                       "type": "object"
+               },
+               "callback": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "A function to be called right after MediaWiki processes this file"
+               },
+               "config": {
+                       "type": "object",
+                       "description": "Configuration options for this extension"
+               }
+       }
+}
index 4a9e0b8..2de78dd 100644 (file)
@@ -66,7 +66,7 @@ email notification when an article is shown may add:
                # code to actually show the article goes here
 
                if ($wgNotifyArticle) {
-                       wfNotifyArticleShow($article));
+                       wfNotifyArticleShow($article);
                }
        }
 
@@ -314,7 +314,7 @@ $output: The OutputPage object where output() was called
 
 'AfterImportPage': When a page import is completed.
 $title: Title under which the revisions were imported
-$origTitle: Title provided by the XML file
+$foreignTitle: ForeignTitle object based on data provided by the XML file
 $revCount: Number of revisions in the XML file
 $sRevCount: Number of successfully imported revisions
 $pageInfo: associative array of page information
@@ -409,7 +409,8 @@ $options: Array Options passed to ApiHelp::getHelp
 
 'ApiOpenSearchSuggest': Called when constructing the OpenSearch results. Hooks
 can alter or append to the array.
-&$results: array of associative arrays. Keys are:
+&$results: array with integer keys to associative arrays. Keys in associative
+array:
   - title: Title object.
   - redirect from: Title or null.
   - extract: Description for this result.
@@ -1252,15 +1253,15 @@ $reason: reason
 'FormatAutocomments': When an autocomment is formatted by the Linker.
  &$comment: Reference to the accumulated comment. Initially null, when set the
    default code will be skipped.
- $pre: Initial part of the parsed comment before the call to the hook.
+ $pre: Boolean, true if there is text before this autocomment
  $auto: The extracted part of the parsed comment before the call to the hook.
- $post: The final part of the parsed comment before the call to the hook.
+ $post: Boolean, true if there is text after this autocomment
  $title: An optional title object used to links to sections. Can be null.
  $local: Boolean indicating whether section links should refer to local page.
 
 'GalleryGetModes': Get list of classes that can render different modes of a
  gallery
-$modeArray: An associative array mapping mode names to classes that implement
+&$modeArray: An associative array mapping mode names to classes that implement
  that mode. It is expected all registered classes are a subclass of
  ImageGalleryBase.
 
@@ -1460,7 +1461,7 @@ $page: ImagePage object
 'ImgAuthBeforeStream': executed before file is streamed to user, but only when
 using img_auth.php.
 &$title: the Title object of the file as it would appear for the upload page
-&$path: the original file and path name when img_auth was invoked by the the web
+&$path: the original file and path name when img_auth was invoked by the web
   server
 &$name: the name only component of the file
 &$result: The location to pass back results of the hook routine (only used if
index 31feec1..0024d98 100644 (file)
@@ -4,9 +4,9 @@ kss: kssnodecheck
 # Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
 # KSS style guide
        $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
-# Keep module names in strict alphabetical order, so CSS loads in the same order as ResourceLoader's addModuleStyles does; this can affect rendering.
+       $(eval MODULE_STR := $(shell paste -sd "|"  < styleGuideModules.txt))
 # See OutputPage::makeResourceLoaderLink.
-       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.legacy.commonPrint|mediawiki.legacy.shared|mediawiki.ui|mediawiki.ui.anchor|mediawiki.ui.button|mediawiki.ui.checkbox|mediawiki.ui.radio|mediawiki.ui.icon|mediawiki.ui.input|mediawiki.ui.text&only=styles" > $(KSS_RL_TMP)
+       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=${MODULE_STR}&only=styles" > $(KSS_RL_TMP)
        @node_modules/.bin/kss-node ../../resources/src/mediawiki.ui static/ --css $(KSS_RL_TMP) -t styleguide-template
        @rm $(KSS_RL_TMP)
 
index c383af9..76cfb62 100644 (file)
@@ -17,3 +17,5 @@ If MediaWiki is running on localhost, you can omit MEDIAWIKI_LOAD_URL.
 To rebuild without opening the web browser, run:
 
 MEDIAWIKI_LOAD_URL=mediawiki_hostname/w/load.php make
+
+When modifying styleGuideModules.txt, keep the list in strict alphabetical order (with no extra formatting), so CSS loads in the same order as ResourceLoader's addModuleStyles does; this can affect rendering.
diff --git a/docs/kss/styleGuideModules.txt b/docs/kss/styleGuideModules.txt
new file mode 100644 (file)
index 0000000..79212c0
--- /dev/null
@@ -0,0 +1,10 @@
+mediawiki.legacy.commonPrint
+mediawiki.legacy.shared
+mediawiki.ui
+mediawiki.ui.anchor
+mediawiki.ui.button
+mediawiki.ui.checkbox
+mediawiki.ui.radio
+mediawiki.ui.icon
+mediawiki.ui.input
+mediawiki.ui.text
index 16c5760..d18b199 100644 (file)
@@ -1,5 +1,5 @@
-MediaWiki has optional support for memcached, a "high-performance, 
-distributed memory object caching system". For general information 
+MediaWiki has optional support for memcached, a "high-performance,
+distributed memory object caching system". For general information
 on it, see: http://www.danga.com/memcached/
 
 Memcached is likely more trouble than a small site will need, but
@@ -10,7 +10,7 @@ in memory.
 == Installation ==
 
 Packages are available for Fedora, Debian, Ubuntu and probably other
-Linux distributions. If you there's no package available for your 
+Linux distributions. If there's no package available for your
 distribution, you can compile it from source.
 
 == Compilation ==
@@ -25,7 +25,7 @@ distribution, you can compile it from source.
 
 * memcached: http://www.danga.com/memcached/download.bml
   (as of this writing, 1.1.9 is current)
-  
+
 Memcached and libevent are under BSD-style licenses.
 
 The server should run on Linux and other Unix-like systems... you
@@ -40,9 +40,9 @@ memcached servers are not publicly accessible. Otherwise, anyone on
 the internet can put data into and read data from your cache.
 
 An attacker familiar with MediaWiki internals could use this to steal
-passwords and email addresses, or to make themselves a sysop and 
-install malicious javascript on the site. There may be other types 
-of vulnerability, no audit has been done -- so be safe and keep it 
+passwords and email addresses, or to make themselves a sysop and
+install malicious javascript on the site. There may be other types
+of vulnerability, no audit has been done -- so be safe and keep it
 behind a firewall.
 ********************* W A R N I N G ! ! ! ! ! ***********************
 
@@ -247,5 +247,5 @@ User:
        stores: instance of class User
        set in: User::saveToCache()
        cleared by: User::saveSettings(), User::clearSharedCache()
-       
+
 ... more to come ...
index aab9599..ecc3626 100644 (file)
@@ -1,28 +1,30 @@
-MWLogger implements a PSR-3 [0] compatible message logging system.
+MWLoggerFactory implements a PSR-3 [0] compatible message logging system.
 
-The MWLogger class is actually a thin wrapper around any PSR-3 LoggerInterface
-implementation. Named MWLogger instances can be obtained from the
-MWLogger::getInstance() static method. MWLogger expects a class implementing
-the MWLoggerSpi interface to act as a factory for new MWLogger instances.
+Named Psr\Log\LoggerInterface instances can be obtained from the
+MWLoggerFactory::getInstance() static method. MWLoggerFactory expects a class
+implementing the MWLoggerSpi interface to act as a factory for new
+Psr\Log\LoggerInterface instances.
 
-The "Spi" in MWLoggerSpi stands for "service provider interface". An SPI is
-a API intended to be implemented or extended by a third party. This software
+The "Spi" in MWLoggerSpi stands for "service provider interface". A SPI is
+an API intended to be implemented or extended by a third party. This software
 design pattern is intended to enable framework extension and replaceable
-components. It is specifically used in the MWLogger service to allow alternate
-PSR-3 logging implementations to be easily integrated with MediaWiki.
+components. It is specifically used in the MWLoggerFactory service to allow
+alternate PSR-3 logging implementations to be easily integrated with
+MediaWiki.
 
-The MWLogger::getInstance() static method is the means by which most code
-acquires an MWLogger instance. This in turn delegates creation of MWLogger
-instances to a class implementing the MWLoggerSpi service provider interface.
+The MWLoggerFactory::getInstance() static method is the means by which most
+code acquires a Psr\Log\LoggerInterface instance. This in turn delegates
+creation of Psr\Log\LoggerInterface instances to a class implementing the
+MWLoggerSpi service provider interface.
 
 The service provider interface allows the backend logging library to be
 implemented in multiple ways. The $wgMWLoggerDefaultSpi global provides the
 classname of the default MWLoggerSpi implementation to be loaded at runtime.
 This can either be the name of a class implementing the MWLoggerSpi with
 a zero argument constructor or a callable that will return an MWLoggerSpi
-instance. Alternately the MWLogger::registerProvider method can be called
-to inject an MWLoggerSpi instance into MWLogger and bypass the use of this
-configuration variable.
+instance. Alternately the MWLoggerFactory::registerProvider method can be
+called to inject an MWLoggerSpi instance into MWLoggerFactory and bypass the
+use of this configuration variable.
 
 The MWLoggerLegacySpi class implements a service provider to generate
 MWLoggerLegacyLogger instances. The MWLoggerLegacyLogger class implements the
@@ -33,18 +35,17 @@ DefaultSettings.php. It's usage should be transparent for users who are not
 ready or do not wish to switch to a alternate logging platform.
 
 The MWLoggerMonologSpi class implements a service provider to generate
-MWLogger instances that use the Monolog [1] logging library. See the PHP docs
-(or source) for MWLoggerMonologSpi for details on the configuration of this
-provider. The default configuration installs a null handler that will silently
-discard all logging events. The documentation provided by the class describes
-a more feature rich logging configuration.
+Psr\Log\LoggerInterface instances that use the Monolog [1] logging library.
+See the PHP docs (or source) for MWLoggerMonologSpi for details on the
+configuration of this provider. The default configuration installs a null
+handler that will silently discard all logging events. The documentation
+provided by the class describes a more feature rich logging configuration.
 
 == Classes ==
-; MWLogger
-: PSR-3 compatible logger that wraps any \Psr\Log\LoggerInterface
-  implementation
+; MWLoggerFactory
+: Factory for Psr\Log\LoggerInterface loggers
 ; MWLoggerSpi
-: Service provider interface for MWLogger factories
+: Service provider interface for MWLoggerFactory
 ; MWLoggerNullSpi
 : MWLoggerSpi for creating instances that discard all log events
 ; MWLoggerLegacySpi
@@ -64,7 +65,7 @@ a more feature rich logging configuration.
 == Globals ==
 ; $wgMWLoggerDefaultSpi
 : Specification for creating the default service provider interface to use
-  with MWLogger
+  with MWLoggerFactory
 
 [0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 [1]: https://github.com/Seldaek/monolog
index e998ebd..a3c8c33 100644 (file)
@@ -7,7 +7,7 @@ MediaWiki includes four core skins:
   Monobook.
 
 * Monobook: Named after the black-and-white photo of a book in the page
-  background. Introduced in the 2004 release of 1.3, it had been been the
+  background. Introduced in the 2004 release of 1.3, it had been the
   default skin since then, before being replaced by Vector.
 
 * Modern: An attractive blue/grey theme with sidebar and top bar. Derived from
index dcd171f..51470b6 100644 (file)
@@ -39,7 +39,6 @@
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 require __DIR__ . '/includes/WebStart.php';
-wfProfileIn( 'img_auth.php' );
 
 # Set action base paths so that WebRequest::getPathInfo()
 # recognizes the "X" as the 'title' in ../img_auth.php/X urls.
@@ -47,7 +46,6 @@ $wgArticlePath = false; # Don't let a "/*" article path clober our action path
 $wgActionPaths = array( "$wgUploadPath/" );
 
 wfImageAuthMain();
-wfProfileOut( 'img_auth.php' );
 wfLogProfilingData();
 // Commit and close up!
 $factory = wfGetLBFactory();
index 9bc92be..b14114d 100644 (file)
@@ -56,8 +56,6 @@ class AjaxDispatcher {
         * Load up our object with user supplied data
         */
        function __construct( Config $config ) {
-               wfProfileIn( __METHOD__ );
-
                $this->config = $config;
 
                $this->mode = "";
@@ -88,13 +86,11 @@ class AjaxDispatcher {
                                }
                                break;
                        default:
-                               wfProfileOut( __METHOD__ );
                                return;
                                # Or we could throw an exception:
                                # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -110,11 +106,8 @@ class AjaxDispatcher {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
-
                if ( !in_array( $this->func_name, $this->config->get( 'AjaxExportList' ) ) ) {
                        wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
-
                        wfHttpError(
                                400,
                                'Bad Request',
@@ -127,7 +120,6 @@ class AjaxDispatcher {
                                'You are not allowed to view pages.' );
                } else {
                        wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
-
                        try {
                                $result = call_user_func_array( $this->func_name, $this->args );
 
@@ -162,6 +154,5 @@ class AjaxDispatcher {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
        }
 }
index 9c6f1f0..6344c27 100644 (file)
@@ -24,7 +24,6 @@
  * Locations of core classes
  * Extension classes are specified with $wgAutoloadClasses
  * This array is a global instead of a static member of AutoLoader to work around a bug in APC
- * This array is now generated by maintenance/generateLocalAutoload.php
  */
 require_once __DIR__ . '/../autoload.php';
 
index 9079fb0..4698f45 100644 (file)
@@ -752,7 +752,6 @@ class Block {
         * @return bool
         */
        public function deleteIfExpired() {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->isExpired() ) {
                        wfDebug( "Block::deleteIfExpired() -- deleting\n" );
@@ -763,7 +762,6 @@ class Block {
                        $retVal = false;
                }
 
-               wfProfileOut( __METHOD__ );
                return $retVal;
        }
 
@@ -1055,7 +1053,6 @@ class Block {
                        return array();
                }
 
-               wfProfileIn( __METHOD__ );
                $conds = array();
                foreach ( array_unique( $ipChain ) as $ipaddr ) {
                        # Discard invalid IP addresses. Since XFF can be spoofed and we do not
@@ -1077,7 +1074,6 @@ class Block {
                }
 
                if ( !count( $conds ) ) {
-                       wfProfileOut( __METHOD__ );
                        return array();
                }
 
@@ -1108,7 +1104,6 @@ class Block {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $blocks;
        }
 
@@ -1140,8 +1135,6 @@ class Block {
                        return $blocks[0];
                }
 
-               wfProfileIn( __METHOD__ );
-
                // Sort hard blocks before soft ones and secondarily sort blocks
                // that disable account creation before those that don't.
                usort( $blocks, function ( Block $a, Block $b ) {
@@ -1222,11 +1215,9 @@ class Block {
                } elseif ( $blocksList['auto'] ) {
                        $chosenBlock = $blocksList['auto'];
                } else {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Proxy block found, but couldn't be classified." );
                }
 
-               wfProfileOut( __METHOD__ );
                return $chosenBlock;
        }
 
index 322b053..3a21e25 100644 (file)
@@ -60,8 +60,6 @@ class Category {
                        return true;
                }
 
-               wfProfileIn( __METHOD__ );
-
                $dbr = wfGetDB( DB_SLAVE );
                $row = $dbr->selectRow(
                        'category',
@@ -70,8 +68,6 @@ class Category {
                        __METHOD__
                );
 
-               wfProfileOut( __METHOD__ );
-
                if ( !$row ) {
                        # Okay, there were no contents.  Nothing to initialize.
                        if ( $this->mTitle ) {
@@ -258,7 +254,6 @@ class Category {
         * @return TitleArray TitleArray object for category members.
         */
        public function getMembers( $limit = false, $offset = '' ) {
-               wfProfileIn( __METHOD__ );
 
                $dbr = wfGetDB( DB_SLAVE );
 
@@ -284,8 +279,6 @@ class Category {
                        )
                );
 
-               wfProfileOut( __METHOD__ );
-
                return $result;
        }
 
@@ -318,8 +311,6 @@ class Category {
                        }
                }
 
-               wfProfileIn( __METHOD__ );
-
                $dbw = wfGetDB( DB_MASTER );
                $dbw->startAtomic( __METHOD__ );
 
@@ -363,8 +354,6 @@ class Category {
                );
                $dbw->endAtomic( __METHOD__ );
 
-               wfProfileOut( __METHOD__ );
-
                # Now we should update our local counts.
                $this->mPages = $result->pages;
                $this->mSubcats = $result->subcats;
index cf537e1..33de740 100644 (file)
@@ -185,7 +185,6 @@ class CategoryFinder {
         * Scans a "parent layer" of the articles/categories in $this->next
         */
        private function scanNextLayer() {
-               $profiler = new ProfileSection( __METHOD__ );
 
                # Find all parents of the article currently in $this->next
                $layer = array();
index f68da95..c898ec9 100644 (file)
@@ -104,7 +104,6 @@ class CategoryViewer extends ContextSource {
         * @return string HTML output
         */
        public function getHTML() {
-               wfProfileIn( __METHOD__ );
 
                $this->showGallery = $this->getConfig()->get( 'CategoryMagicGallery' )
                        && !$this->getOutput()->mNoGallery;
@@ -140,7 +139,6 @@ class CategoryViewer extends ContextSource {
                # put a div around the headings which are in the user language
                $r = Html::openElement( 'div', $langAttribs ) . $r . '</div>';
 
-               wfProfileOut( __METHOD__ );
                return $r;
        }
 
@@ -154,7 +152,7 @@ class CategoryViewer extends ContextSource {
                        $mode = $this->getRequest()->getVal( 'gallerymode', null );
                        try {
                                $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // User specified something invalid, fallback to default.
                                $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
                        }
@@ -389,13 +387,16 @@ class CategoryViewer extends ContextSource {
 
                if ( $rescnt > 0 ) {
                        # Showing subcategories
-                       $r .= "<div id=\"mw-subcategories\">\n";
-                       $r .= '<h2>' . $this->msg( 'subcategories' )->text() . "</h2>\n";
+                       $r .= Html::openElement( 'div', array( 'id' => 'mw-subcategories' ) );
+                       $r .= "\n";
+                       $r .= Html::element( 'h2', array(), $this->msg( 'subcategories' )->text() );
+                       $r .= "\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'subcat' );
                        $r .= $this->formatList( $this->children, $this->children_start_char );
                        $r .= $this->getSectionPagingLinks( 'subcat' );
-                       $r .= "\n</div>";
+                       $r .= "\n";
+                       $r .= Html::closeElement( 'div' );
                }
                return $r;
        }
@@ -418,13 +419,16 @@ class CategoryViewer extends ContextSource {
                $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'article' );
 
                if ( $rescnt > 0 ) {
-                       $r = "<div id=\"mw-pages\">\n";
-                       $r .= '<h2>' . $this->msg( 'category_header', $ti )->text() . "</h2>\n";
+                       $r .= Html::openElement( 'div', array( 'id' => 'mw-pages' ) );
+                       $r .= "\n";
+                       $r .= Html::element( 'h2', array(), $this->msg( 'category_header', $ti )->text() );
+                       $r .= "\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'page' );
                        $r .= $this->formatList( $this->articles, $this->articles_start_char );
                        $r .= $this->getSectionPagingLinks( 'page' );
-                       $r .= "\n</div>";
+                       $r .= "\n";
+                       $r .= Html::closeElement( 'div' );
                }
                return $r;
        }
index 64d9892..0b0c7d0 100644 (file)
@@ -270,6 +270,16 @@ $wgFavicon = '/favicon.ico';
  */
 $wgAppleTouchIcon = false;
 
+/**
+ * Value for the referrer policy meta tag.
+ * One of 'never', 'default', 'origin', 'always'. Setting it to false just
+ * prevents the meta tag from being output.
+ * See http://www.w3.org/TR/referrer-policy/ for details.
+ *
+ * @since 1.25
+ */
+$wgReferrerPolicy = false;
+
 /**
  * The local filesystem path to a temporary directory. This is not required to
  * be web accessible.
@@ -2348,6 +2358,23 @@ $wgClockSkewFudge = 5;
  */
 $wgInvalidateCacheOnLocalSettingsChange = true;
 
+/**
+ * When loading extensions through the extension registration system, this
+ * can be used to invalidate the cache. A good idea would be to set this to
+ * one file, you can just `touch` that one to invalidate the cache
+ *
+ * @par Example:
+ * @code
+ * $wgExtensionInfoMtime = filemtime( "$IP/LocalSettings.php" );
+ * @endcode
+ *
+ * If set to false, the mtime for each individual JSON file will be checked,
+ * which can be slow if a large number of extensions are being loaded.
+ *
+ * @var int|bool
+ */
+$wgExtensionInfoMTime = false;
+
 /** @} */ # end of cache settings
 
 /************************************************************************//**
@@ -3279,8 +3306,8 @@ $wgResourceModules = array();
  *     ),
  *   );
  *   // Note the '+' character:
- *   $wgResourceModuleSkinStyles['+foo'] = array(
- *     'bar' => 'skins/Foo/bar.css',
+ *   $wgResourceModuleSkinStyles['foo'] = array(
+ *     '+bar' => 'skins/Foo/bar.css',
  *   );
  * @endcode
  *
@@ -5239,9 +5266,11 @@ $wgDebugDumpSqlLength = 500;
  * Log destinations may be one of the following:
  * - false to completely remove from the output, including from $wgDebugLogFile.
  * - string values specifying a filename or URI.
- * - associative array mapping 'destination' key to the desired filename or URI.
- *   The associative array may also contain a 'sample' key with an integer value,
- *   specifying a sampling factor.
+ * - associative array with keys:
+ *   - 'destination' desired filename or URI.
+ *   - 'sample' an integer value, specifying a sampling factor (optional)
+ *   - 'level' A \Psr\Log\LogLevel constant, indicating the minimum level
+ *             to log (optional, since 1.25)
  *
  * @par Example:
  * @code
@@ -5253,22 +5282,23 @@ $wgDebugDumpSqlLength = 500;
  * $wgDebugLogGroups['memcached'] = array(
  *     'destination' => '/var/log/mediawiki/memcached.log',
  *     'sample' => 1000,  // log 1 message out of every 1,000.
+ *     'level' => \Psr\Log\LogLevel::WARNING
  * );
  * @endcode
  */
 $wgDebugLogGroups = array();
 
 /**
- * Default service provider for creating MWLogger instances.
+ * Default service provider for creating Psr\Log\LoggerInterface instances.
  *
  * The value should be an array suitable for use with
  * ObjectFactory::getObjectFromSpec(). The created object is expected to
  * implement the MWLoggerSpi interface. See ObjectFactory for additional
  * details.
  *
- * Alternately the MWLogger::registerProvider method can be called to inject
- * an MWLoggerSpi instance into MWLogger and bypass the use of this
- * configuration variable entirely.
+ * Alternately the MWLoggerFactory::registerProvider method can be called to
+ * inject an MWLoggerSpi instance into MWLoggerFactory and bypass the use of
+ * this configuration variable entirely.
  *
  * @since 1.25
  * @var array $wgMWLoggerDefaultSpi
@@ -5413,11 +5443,6 @@ $wgUDPProfilerPort = null;
  */
 $wgUDPProfilerFormatString = null;
 
-/**
- * Output debug message on every wfProfileIn/wfProfileOut
- */
-$wgDebugFunctionEntry = false;
-
 /**
  * Destination for wfIncrStats() data...
  * 'cache' to go into the system cache, if enabled (memcached)
@@ -5481,25 +5506,6 @@ $wgParserTestFiles = array(
  */
 $wgEnableJavaScriptTest = false;
 
-/**
- * Configuration for javascript testing.
- */
-$wgJavaScriptTestConfig = array(
-       'qunit' => array(
-               // Page where documentation can be found relevant to the QUnit test suite being ran.
-               // Used in the intro paragraph on [[Special:JavaScriptTest/qunit]] for the
-               // documentation link in the "javascripttest-qunit-intro" message.
-               'documentation' => '//www.mediawiki.org/wiki/Manual:JavaScript_unit_testing',
-               // If you are submitting the QUnit test suite to a TestSwarm instance,
-               // point this to the "inject.js" script of that instance. This is was registers
-               // the QUnit hooks to extract the test results and push them back up into the
-               // TestSwarm database.
-               // @example 'http://localhost/testswarm/js/inject.js'
-               // @example '//integration.mediawiki.org/testswarm/js/inject.js'
-               'testswarm-injectjs' => false,
-       ),
-);
-
 /**
  * Overwrite the caching key prefix with custom value.
  * @since 1.19
index 2155c1b..cb79fd1 100644 (file)
@@ -467,13 +467,11 @@ class EditPage {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
                wfDebug( __METHOD__ . ": enter\n" );
 
                // If they used redlink=1 and the page exists, redirect to the main article
                if ( $wgRequest->getBool( 'redlink' ) && $this->mTitle->exists() ) {
                        $wgOut->redirect( $this->mTitle->getFullURL() );
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -482,7 +480,6 @@ class EditPage {
 
                if ( $this->live ) {
                        $this->livePreview();
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -515,12 +512,9 @@ class EditPage {
 
                        $this->displayPermissionsError( $permErrors );
 
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
-               wfProfileIn( __METHOD__ . "-business-end" );
-
                $this->isConflict = false;
                // css / js subpages of user pages get a special treatment
                $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
@@ -541,8 +535,6 @@ class EditPage {
 
                if ( 'save' == $this->formtype ) {
                        if ( !$this->attemptSave() ) {
-                               wfProfileOut( __METHOD__ . "-business-end" );
-                               wfProfileOut( __METHOD__ );
                                return;
                        }
                }
@@ -552,8 +544,6 @@ class EditPage {
                if ( 'initial' == $this->formtype || $this->firsttime ) {
                        if ( $this->initialiseForm() === false ) {
                                $this->noSuchSectionPage();
-                               wfProfileOut( __METHOD__ . "-business-end" );
-                               wfProfileOut( __METHOD__ );
                                return;
                        }
 
@@ -566,8 +556,6 @@ class EditPage {
                }
 
                $this->showEditForm();
-               wfProfileOut( __METHOD__ . "-business-end" );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -732,13 +720,10 @@ class EditPage {
        function importFormData( &$request ) {
                global $wgContLang, $wgUser;
 
-               wfProfileIn( __METHOD__ );
-
                # Section edit can come from either the form or a link
                $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
 
                if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
-                       wfProfileOut( __METHOD__ );
                        throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
                }
 
@@ -753,13 +738,10 @@ class EditPage {
                                // Skip this if wpTextbox2 has input, it indicates that we came
                                // from a conflict page with raw page text, not a custom form
                                // modified by subclasses
-                               wfProfileIn( get_class( $this ) . "::importContentFormData" );
                                $textbox1 = $this->importContentFormData( $request );
                                if ( $textbox1 !== null ) {
                                        $this->textbox1 = $textbox1;
                                }
-
-                               wfProfileOut( get_class( $this ) . "::importContentFormData" );
                        }
 
                        # Truncate for whole multibyte characters
@@ -931,7 +913,6 @@ class EditPage {
                // Allow extensions to modify form data
                Hooks::run( 'EditPage::importFormData', array( $this, $request ) );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -992,8 +973,6 @@ class EditPage {
        protected function getContentObject( $def_content = null ) {
                global $wgOut, $wgRequest, $wgUser, $wgContLang;
 
-               wfProfileIn( __METHOD__ );
-
                $content = false;
 
                // For message page not locally set, use the i18n message.
@@ -1105,7 +1084,6 @@ class EditPage {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $content;
        }
 
@@ -1538,15 +1516,10 @@ class EditPage {
 
                $status = Status::newGood();
 
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-checks' );
-
                if ( !Hooks::run( 'EditPage::attemptSave', array( $this ) ) ) {
                        wfDebug( "Hook 'EditPage::attemptSave' aborted article saving\n" );
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1563,8 +1536,6 @@ class EditPage {
                        );
                        $status->fatal( 'spamprotectionmatch', false );
                        $status->value = self::AS_SPAM_ERROR;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1579,8 +1550,6 @@ class EditPage {
                                $ex->getMessage()
                        );
                        $status->value = self::AS_PARSE_ERROR;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1592,9 +1561,6 @@ class EditPage {
                                $code = $wgUser->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
                                $status->setResult( false, $code );
 
-                               wfProfileOut( __METHOD__ . '-checks' );
-                               wfProfileOut( __METHOD__ );
-
                                return $status;
                }
 
@@ -1623,8 +1589,6 @@ class EditPage {
                        wfDebugLog( 'SpamRegex', "$ip spam regex hit [[$pdbk]]: \"$match\"" );
                        $status->fatal( 'spamprotectionmatch', $match );
                        $status->value = self::AS_SPAM_ERROR;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
                if ( !Hooks::run(
@@ -1634,15 +1598,11 @@ class EditPage {
                        # Error messages etc. could be handled within the hook...
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                } elseif ( $this->hookError != '' ) {
                        # ...or the hook could be expecting us to produce an error
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR_EXPECTED;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1651,8 +1611,6 @@ class EditPage {
                        $wgUser->spreadAnyEditBlock();
                        # Check block state against master, thus 'false'.
                        $status->setResult( false, self::AS_BLOCKED_PAGE_FOR_USER );
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1661,22 +1619,16 @@ class EditPage {
                        // Error will be displayed by showEditForm()
                        $this->tooBig = true;
                        $status->setResult( false, self::AS_CONTENT_TOO_BIG );
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
                if ( !$wgUser->isAllowed( 'edit' ) ) {
                        if ( $wgUser->isAnon() ) {
                                $status->setResult( false, self::AS_READ_ONLY_PAGE_ANON );
-                               wfProfileOut( __METHOD__ . '-checks' );
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        } else {
                                $status->fatal( 'readonlytext' );
                                $status->value = self::AS_READ_ONLY_PAGE_LOGGED;
-                               wfProfileOut( __METHOD__ . '-checks' );
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
                }
@@ -1685,23 +1637,17 @@ class EditPage {
                        && !$wgUser->isAllowed( 'editcontentmodel' )
                ) {
                        $status->setResult( false, self::AS_NO_CHANGE_CONTENT_MODEL );
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
                if ( wfReadOnly() ) {
                        $status->fatal( 'readonlytext' );
                        $status->value = self::AS_READ_ONLY_PAGE;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
                if ( $wgUser->pingLimiter() || $wgUser->pingLimiter( 'linkpurge', 0 ) ) {
                        $status->fatal( 'actionthrottledtext' );
                        $status->value = self::AS_RATE_LIMITED;
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1709,13 +1655,9 @@ class EditPage {
                # confirmation
                if ( $this->wasDeletedSinceLastEdit() && !$this->recreate ) {
                        $status->setResult( false, self::AS_ARTICLE_WAS_DELETED );
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
-               wfProfileOut( __METHOD__ . '-checks' );
-
                # Load the page data from the master. If anything changes in the meantime,
                # we detect it by using page_latest like a token in a 1 try compare-and-swap.
                $this->mArticle->loadPageData( 'fromdbmaster' );
@@ -1727,7 +1669,6 @@ class EditPage {
                                $status->fatal( 'nocreatetext' );
                                $status->value = self::AS_NO_CREATE_PERMISSION;
                                wfDebug( __METHOD__ . ": no create permission\n" );
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
 
@@ -1745,12 +1686,10 @@ class EditPage {
                                $this->blankArticle = true;
                                $status->fatal( 'blankarticle' );
                                $status->setResult( false, self::AS_BLANK_ARTICLE );
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
 
                        if ( !$this->runPostMergeFilters( $textbox_content, $status, $wgUser ) ) {
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
 
@@ -1855,12 +1794,10 @@ class EditPage {
 
                        if ( $this->isConflict ) {
                                $status->setResult( false, self::AS_CONFLICT_DETECTED );
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
 
                        if ( !$this->runPostMergeFilters( $content, $status, $wgUser ) ) {
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
 
@@ -1870,7 +1807,6 @@ class EditPage {
                                        $this->missingSummary = true;
                                        $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
                                        $status->value = self::AS_SUMMARY_NEEDED;
-                                       wfProfileOut( __METHOD__ );
                                        return $status;
                                }
 
@@ -1879,7 +1815,6 @@ class EditPage {
                                        $this->missingComment = true;
                                        $status->fatal( 'missingcommenttext' );
                                        $status->value = self::AS_TEXTBOX_EMPTY;
-                                       wfProfileOut( __METHOD__ );
                                        return $status;
                                }
                        } elseif ( !$this->allowBlankSummary
@@ -1890,12 +1825,10 @@ class EditPage {
                                $this->missingSummary = true;
                                $status->fatal( 'missingsummary' );
                                $status->value = self::AS_SUMMARY_NEEDED;
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        }
 
                        # All's well
-                       wfProfileIn( __METHOD__ . '-sectionanchor' );
                        $sectionanchor = '';
                        if ( $this->section == 'new' ) {
                                $this->summary = $this->newSectionSummary( $sectionanchor );
@@ -1912,7 +1845,6 @@ class EditPage {
                                }
                        }
                        $result['sectionanchor'] = $sectionanchor;
-                       wfProfileOut( __METHOD__ . '-sectionanchor' );
 
                        // Save errors may fall down to the edit form, but we've now
                        // merged the section into full text. Clear the section field
@@ -1928,11 +1860,14 @@ class EditPage {
                        && $content->isRedirect()
                        && $content->getRedirectTarget()->equals( $this->getTitle() )
                ) {
-                       $this->selfRedirect = true;
-                       $status->fatal( 'selfredirect' );
-                       $status->value = self::AS_SELF_REDIRECT;
-                       wfProfileOut( __METHOD__ );
-                       return $status;
+                       // If the page already redirects to itself, don't warn.
+                       $currentTarget = $this->getCurrentContent()->getRedirectTarget();
+                       if ( !$currentTarget || !$currentTarget->equals( $this->getTitle() ) ) {
+                               $this->selfRedirect = true;
+                               $status->fatal( 'selfredirect' );
+                               $status->value = self::AS_SELF_REDIRECT;
+                               return $status;
+                       }
                }
 
                // Check for length errors again now that the section is merged in
@@ -1940,7 +1875,6 @@ class EditPage {
                if ( $this->kblength > $wgMaxArticleSize ) {
                        $this->tooBig = true;
                        $status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1970,7 +1904,6 @@ class EditPage {
                                // Destroys data doEdit() put in $status->value but who cares
                                $doEditStatus->value = self::AS_END;
                        }
-                       wfProfileOut( __METHOD__ );
                        return $doEditStatus;
                }
 
@@ -1981,7 +1914,6 @@ class EditPage {
                }
                $result['redirect'] = $content->isRedirect();
                $this->updateWatchlist();
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -2018,7 +1950,6 @@ class EditPage {
         * @return bool
         */
        private function mergeChangesIntoContent( &$editContent ) {
-               wfProfileIn( __METHOD__ );
 
                $db = wfGetDB( DB_MASTER );
 
@@ -2027,7 +1958,6 @@ class EditPage {
                $baseContent = $baseRevision ? $baseRevision->getContent() : null;
 
                if ( is_null( $baseContent ) ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -2036,7 +1966,6 @@ class EditPage {
                $currentContent = $currentRevision ? $currentRevision->getContent() : null;
 
                if ( is_null( $currentContent ) ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -2046,11 +1975,9 @@ class EditPage {
 
                if ( $result ) {
                        $editContent = $result;
-                       wfProfileOut( __METHOD__ );
                        return true;
                }
 
-               wfProfileOut( __METHOD__ );
                return false;
        }
 
@@ -2114,11 +2041,19 @@ class EditPage {
                $wgOut->addModules( 'mediawiki.action.edit' );
                $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
-               if ( $wgUser->getOption( 'uselivepreview', false ) ) {
+               if ( $wgUser->getOption( 'showtoolbar' ) ) {
+                       // The addition of default buttons is handled by getEditToolbar() which
+                       // has its own dependency on this module. The call here ensures the module
+                       // is loaded in time (it has position "top") for other modules to register
+                       // buttons (e.g. extensions, gadgets, user scripts).
+                       $wgOut->addModules( 'mediawiki.toolbar' );
+               }
+
+               if ( $wgUser->getOption( 'uselivepreview' ) ) {
                        $wgOut->addModules( 'mediawiki.action.edit.preview' );
                }
 
-               if ( $wgUser->getOption( 'useeditwarning', false ) ) {
+               if ( $wgUser->getOption( 'useeditwarning' ) ) {
                        $wgOut->addModules( 'mediawiki.action.edit.editWarning' );
                }
 
@@ -2361,8 +2296,6 @@ class EditPage {
        function showEditForm( $formCallback = null ) {
                global $wgOut, $wgUser;
 
-               wfProfileIn( __METHOD__ );
-
                # need to parse the preview early so that we know which templates are used,
                # otherwise users with "show preview after edit box" will get a blank list
                # we parse this near the beginning so that setHeaders can do the title
@@ -2377,7 +2310,6 @@ class EditPage {
                $this->setHeaders();
 
                if ( $this->showHeader() === false ) {
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -2581,7 +2513,6 @@ class EditPage {
                        $this->displayPreviewArea( $previewOutput, false );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -3238,8 +3169,6 @@ HTML
                        return '';
                }
 
-               wfProfileIn( __METHOD__ );
-
                $limitReport = Html::rawElement( 'div', array( 'class' => 'mw-limitReportExplanation' ),
                        wfMessage( 'limitreport-title' )->parseAsBlock()
                );
@@ -3274,8 +3203,6 @@ HTML
                        Html::closeElement( 'table' ) .
                        Html::closeElement( 'div' );
 
-               wfProfileOut( __METHOD__ );
-
                return $limitReport;
        }
 
@@ -3461,8 +3388,6 @@ HTML
                global $wgOut, $wgUser, $wgRawHtml, $wgLang;
                global $wgAllowUserCss, $wgAllowUserJs;
 
-               wfProfileIn( __METHOD__ );
-
                if ( $wgRawHtml && !$this->mTokenOk ) {
                        // Could be an offsite preview attempt. This is very unsafe if
                        // HTML is enabled, as it could be an attack.
@@ -3474,7 +3399,6 @@ HTML
                                $parsedNote = $wgOut->parse( "<div class='previewnote'>" .
                                        wfMessage( 'session_fail_preview_html' )->text() . "</div>", true, /* interface */true );
                        }
-                       wfProfileOut( __METHOD__ );
                        return $parsedNote;
                }
 
@@ -3488,7 +3412,6 @@ HTML
                                'AlternateEditPreview',
                                array( $this, &$content, &$previewHTML, &$this->mParserOutput ) )
                        ) {
-                               wfProfileOut( __METHOD__ );
                                return $previewHTML;
                        }
 
@@ -3561,6 +3484,8 @@ HTML
                        # But it's now deprecated, so never mind
 
                        $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
+                       $scopedCallback = $parserOptions->setupFakeRevision(
+                               $this->mTitle, $pstContent, $wgUser );
                        $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
 
                        # Try to stash the edit for the final submission step
@@ -3605,7 +3530,6 @@ HTML
                        'class' => 'mw-content-' . $pageViewLang->getDir() );
                $previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
 
-               wfProfileOut( __METHOD__ );
                return $previewhead . $previewHTML . $this->previewTextAfterContent;
        }
 
@@ -3743,7 +3667,11 @@ HTML
                                $tool['id'],
                        );
 
-                       $script .= Xml::encodeJsCall( 'mw.toolbar.addButton', $params );
+                       $script .= Xml::encodeJsCall(
+                               'mw.toolbar.addButton',
+                               $params,
+                               ResourceLoader::inDebugMode()
+                       );
                }
 
                $script .= '});';
index dd5cb0c..4600feb 100644 (file)
@@ -213,7 +213,6 @@ class WikiExporter {
         * @param array $cond
         */
        protected function do_list_authors( $cond ) {
-               wfProfileIn( __METHOD__ );
                $this->author_list = "<contributors>";
                // rev_deleted
 
@@ -239,7 +238,6 @@ class WikiExporter {
                                "</contributor>";
                }
                $this->author_list .= "</contributors>";
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -248,7 +246,6 @@ class WikiExporter {
         * @throws Exception
         */
        protected function dumpFrom( $cond = '' ) {
-               wfProfileIn( __METHOD__ );
                # For logging dumps...
                if ( $this->history & self::LOGS ) {
                        $where = array( 'user_id = log_user' );
@@ -304,7 +301,6 @@ class WikiExporter {
                                }
 
                                // Inform caller about problem
-                               wfProfileOut( __METHOD__ );
                                throw $e;
                        }
                # For page dumps...
@@ -349,7 +345,6 @@ class WikiExporter {
                                $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' );
                                # One, and only one hook should set this, and return false
                                if ( Hooks::run( 'WikiExporter::dumpStableQuery', array( &$tables, &$opts, &$join ) ) ) {
-                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( __METHOD__ . " given invalid history dump type." );
                                }
                        } elseif ( $this->history & WikiExporter::RANGE ) {
@@ -358,7 +353,6 @@ class WikiExporter {
                                $opts['ORDER BY'] = array( 'rev_page ASC', 'rev_id ASC' );
                        } else {
                                # Unknown history specification parameter?
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( __METHOD__ . " given invalid history dump type." );
                        }
                        # Query optimization hacks
@@ -417,7 +411,6 @@ class WikiExporter {
                                throw $e;
                        }
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -651,7 +644,6 @@ class XmlDumpWriter {
         * @access private
         */
        function writeRevision( $row ) {
-               wfProfileIn( __METHOD__ );
 
                $out = "    <revision>\n";
                $out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
@@ -726,7 +718,6 @@ class XmlDumpWriter {
 
                $out .= "    </revision>\n";
 
-               wfProfileOut( __METHOD__ );
                return $out;
        }
 
@@ -739,7 +730,6 @@ class XmlDumpWriter {
         * @access private
         */
        function writeLogItem( $row ) {
-               wfProfileIn( __METHOD__ );
 
                $out = "  <logitem>\n";
                $out .= "    " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
@@ -773,7 +763,6 @@ class XmlDumpWriter {
 
                $out .= "  </logitem>\n";
 
-               wfProfileOut( __METHOD__ );
                return $out;
        }
 
index 6937c32..15fdbc5 100644 (file)
@@ -106,7 +106,6 @@ class FeedUtils {
                $comment, $actiontext = ''
        ) {
                global $wgFeedDiffCutoff, $wgLang;
-               wfProfileIn( __METHOD__ );
 
                // log entries
                $completeText = '<p>' . implode( ' ',
@@ -124,12 +123,10 @@ class FeedUtils {
                // Can't diff special pages, unreadable pages or pages with no new revision
                // to compare against: just return the text.
                if ( $title->getNamespace() < 0 || $accErrors || !$newid ) {
-                       wfProfileOut( __METHOD__ );
                        return $completeText;
                }
 
                if ( $oldid ) {
-                       wfProfileIn( __METHOD__ . "-dodiff" );
 
                        #$diffText = $de->getDiff( wfMessage( 'revisionasof',
                        #       $wgLang->timeanddate( $timestamp ),
@@ -170,7 +167,6 @@ class FeedUtils {
                                $diffText = UtfNormal::cleanUp( $diffText );
                                $diffText = self::applyDiffStyle( $diffText );
                        }
-                       wfProfileOut( __METHOD__ . "-dodiff" );
                } else {
                        $rev = Revision::newFromId( $newid );
                        if ( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
@@ -208,7 +204,6 @@ class FeedUtils {
                }
                $completeText .= $diffText;
 
-               wfProfileOut( __METHOD__ );
                return $completeText;
        }
 
index 1c709e6..c1d14db 100644 (file)
@@ -201,7 +201,7 @@ class FileDeleteForm {
                                                $dbw->rollback( __METHOD__ );
                                        }
                                }
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // Rollback before returning to prevent UI from displaying
                                // incorrect "View or restore N deleted edits?"
                                $dbw->rollback( __METHOD__ );
index c1e1bb2..2025e17 100644 (file)
@@ -160,6 +160,80 @@ if ( !function_exists( 'hash_equals' ) ) {
 }
 /// @endcond
 
+/**
+ * Load an extension
+ *
+ * This is the closest equivalent to:
+ *   require_once "$IP/extensions/$name/$name.php";
+ * as it will process and load the extension immediately.
+ *
+ * However, batch loading with wfLoadExtensions will
+ * be more performant.
+ *
+ * @param string $name Name of the extension to load
+ * @param string|null $path Absolute path of where to find the extension.json file
+ */
+function wfLoadExtension( $name, $path = null ) {
+       if ( !$path ) {
+               global $IP;
+               $path = "$IP/extensions/$name/extension.json";
+       }
+       ExtensionRegistry::getInstance()->load( $path );
+}
+
+/**
+ * Load multiple extensions at once
+ *
+ * Same as wfLoadExtension, but more efficient if you
+ * are loading multiple extensions.
+ *
+ * If you want to specify custom paths, you should interact with
+ * ExtensionRegistry directly.
+ *
+ * @see wfLoadExtension
+ * @param string[] $exts Array of extension names to load
+ */
+function wfLoadExtensions( array $exts ) {
+       global $IP;
+       $registry = ExtensionRegistry::getInstance();
+       foreach ( $exts as $ext ) {
+               $registry->queue( "$IP/extensions/$ext/extension.json" );
+       }
+
+       $registry->loadFromQueue();
+}
+
+/**
+ * Load a skin
+ *
+ * @see wfLoadExtension
+ * @param string $name Name of the extension to load
+ * @param string|null $path Absolute path of where to find the skin.json file
+ */
+function wfLoadSkin( $name, $path = null ) {
+       if ( !$path ) {
+               global $IP;
+               $path = "$IP/skins/$name/skin.json";
+       }
+       ExtensionRegistry::getInstance()->load( $path );
+}
+
+/**
+ * Load multiple skins at once
+ *
+ * @see wfLoadExtensions
+ * @param string[] $skins Array of extension names to load
+ */
+function wfLoadSkins( array $skins ) {
+       global $IP;
+       $registry = ExtensionRegistry::getInstance();
+       foreach ( $skins as $skin ) {
+               $registry->queue( "$IP/skins/$skin/skin.json" );
+       }
+
+       $registry->loadFromQueue();
+}
+
 /**
  * Like array_diff( $a, $b ) except that it works with two-dimensional arrays.
  * @param array $a
@@ -1004,7 +1078,7 @@ function wfDebug( $text, $dest = 'all', array $context = array() ) {
                $context['prefix'] = $wgDebugLogPrefix;
        }
 
-       $logger = MWLogger::getInstance( 'wfDebug' );
+       $logger = MWLoggerFactory::getInstance( 'wfDebug' );
        $logger->debug( $text, $context );
 }
 
@@ -1067,21 +1141,25 @@ function wfDebugMem( $exact = false ) {
 }
 
 /**
- * Send a line to a supplementary debug log file, if configured, or main debug log if not.
- * To configure a supplementary log file, set $wgDebugLogGroups[$logGroup] to a string
- * filename or an associative array mapping 'destination' to the desired filename. The
- * associative array may also contain a 'sample' key with an integer value, specifying
- * a sampling factor.
+ * Send a line to a supplementary debug log file, if configured, or main debug
+ * log if not.
+ *
+ * To configure a supplementary log file, set $wgDebugLogGroups[$logGroup] to
+ * a string filename or an associative array mapping 'destination' to the
+ * desired filename. The associative array may also contain a 'sample' key
+ * with an integer value, specifying a sampling factor. Sampled log events
+ * will be emitted with a 1 in N random chance.
  *
  * @since 1.23 support for sampling log messages via $wgDebugLogGroups.
  * @since 1.25 support for additional context data
+ * @since 1.25 sample behavior dependent on configured $wgMWLoggerDefaultSpi
  *
  * @param string $logGroup
  * @param string $text
  * @param string|bool $dest Destination of the message:
  *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
  *     - 'log': only to the log and not in HTML
- *     - 'private': only to the specifc log if set in $wgDebugLogGroups and
+ *     - 'private': only to the specific log if set in $wgDebugLogGroups and
  *       discarded otherwise
  *   For backward compatibility, it can also take a boolean:
  *     - true: same as 'all'
@@ -1104,9 +1182,9 @@ function wfDebugLog(
                MWDebug::debugMsg( "[{$logGroup}] {$text}\n" );
        }
 
-       $logger = MWLogger::getInstance( $logGroup );
+       $logger = MWLoggerFactory::getInstance( $logGroup );
        $context['private'] = ( $dest === 'private' );
-       $logger->debug( $text, $context );
+       $logger->info( $text, $context );
 }
 
 /**
@@ -1118,7 +1196,7 @@ function wfDebugLog(
  * @param array $context Additional logging context data
  */
 function wfLogDBError( $text, array $context = array() ) {
-       $logger = MWLogger::getInstance( 'wfLogDBError' );
+       $logger = MWLoggerFactory::getInstance( 'wfLogDBError' );
        $logger->error( trim( $text ), $context );
 }
 
@@ -1177,9 +1255,11 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * @param string $file Filename
  * @param array $context Additional logging context data
  * @throws MWException
+ * @deprecated since 1.25 Use MWLoggerLegacyLogger::emit or UDPTransport
  */
 function wfErrorLog( $text, $file, array $context = array() ) {
-       $logger = MWLogger::getInstance( 'wfErrorLog' );
+       wfDeprecated( __METHOD__, '1.25' );
+       $logger = MWLoggerFactory::getInstance( 'wfErrorLog' );
        $context['destination'] = $file;
        $logger->info( trim( $text ), $context );
 }
@@ -1248,13 +1328,13 @@ function wfLogProfilingData() {
        // any knowledge about an URL and throw an exception instead.
        try {
                $ctx['url'] = urldecode( $wgRequest->getRequestURL() );
-       } catch ( MWException $ignored ) {
+       } catch ( Exception $ignored ) {
                // no-op
        }
 
        $ctx['output'] = $profiler->getOutput();
 
-       $log = MWLogger::getInstance( 'profileoutput' );
+       $log = MWLoggerFactory::getInstance( 'profileoutput' );
        $log->info( "Elapsed: {elapsed}; URL: <{url}>\n{output}", $ctx );
 }
 
@@ -1509,10 +1589,8 @@ function wfMsgForContentNoTrans( $key ) {
 function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) {
        wfDeprecated( __METHOD__, '1.21' );
 
-       wfProfileIn( __METHOD__ );
        $message = wfMsgGetKey( $key, $useDB, $forContent, $transform );
        $message = wfMsgReplaceArgs( $message, $args );
-       wfProfileOut( __METHOD__ );
        return $message;
 }
 
@@ -1531,7 +1609,7 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
 function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true ) {
        wfDeprecated( __METHOD__, '1.21' );
 
-       wfRunHooks( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) );
+       Hooks::run( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) );
 
        $cache = MessageCache::singleton();
        $message = $cache->get( $key, $useDB, $langCode );
@@ -1837,7 +1915,7 @@ function wfBacktrace( $raw = null ) {
 
        $frames = array_map( function ( $frame ) use ( $frameFormat ) {
                $file = !empty( $frame['file'] ) ? basename( $frame['file'] ) : '-';
-               $line = $frame['line'] ?: '-';
+               $line = isset( $frame['line'] ) ? $frame['line'] : '-';
                $call = $frame['function'];
                if ( !empty( $frame['class'] ) ) {
                        $call = $frame['class'] . $frame['type'] . $call;
@@ -2069,10 +2147,12 @@ function wfVarDump( $var ) {
  */
 function wfHttpError( $code, $label, $desc ) {
        global $wgOut;
-       $wgOut->disable();
        header( "HTTP/1.0 $code $label" );
        header( "Status: $code $label" );
-       $wgOut->sendCacheControl();
+       if ( $wgOut ) {
+               $wgOut->disable();
+               $wgOut->sendCacheControl();
+       }
 
        header( 'Content-type: text/html; charset=utf-8' );
        print "<!doctype html>" .
@@ -2964,7 +3044,7 @@ function wfShellWikiCmd( $script, array $parameters = array(), array $options =
        global $wgPhpCli;
        // Give site config file a chance to run the script in a wrapper.
        // The caller may likely want to call wfBasename() on $script.
-       wfRunHooks( 'wfShellWikiCmd', array( &$script, &$parameters, &$options ) );
+       Hooks::run( 'wfShellWikiCmd', array( &$script, &$parameters, &$options ) );
        $cmd = isset( $options['php'] ) ? array( $options['php'] ) : array( $wgPhpCli );
        if ( isset( $options['wrapper'] ) ) {
                $cmd[] = $options['wrapper'];
@@ -3416,7 +3496,7 @@ function wfResetSessionID() {
                $_SESSION = $tmp;
        }
        $newSessionId = session_id();
-       wfRunHooks( 'ResetSessionID', array( $oldSessionId, $newSessionId ) );
+       Hooks::run( 'ResetSessionID', array( $oldSessionId, $newSessionId ) );
 }
 
 /**
@@ -3891,7 +3971,7 @@ function wfBCP47( $code ) {
 /**
  * Get a cache object.
  *
- * @param int $inputType Cache type, one the the CACHE_* constants.
+ * @param int $inputType Cache type, one of the CACHE_* constants.
  * @return BagOStuff
  */
 function wfGetCache( $inputType ) {
@@ -3946,7 +4026,7 @@ function wfGetLangConverterCacheStorage() {
  * @param string|null $deprecatedVersion Optionally mark hook as deprecated with version number
  *
  * @return bool True if no handler aborted the hook
- * @deprecated 1.25
+ * @deprecated 1.25 - use Hooks::run
  */
 function wfRunHooks( $event, array $args = array(), $deprecatedVersion = null ) {
        return Hooks::run( $event, $args, $deprecatedVersion );
@@ -4004,7 +4084,6 @@ function wfUnpack( $format, $data, $length = false ) {
  */
 function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
        static $badImageCache = null; // based on bad_image_list msg
-       wfProfileIn( __METHOD__ );
 
        # Handle redirects
        $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
@@ -4014,8 +4093,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 
        # Run the extension hook
        $bad = false;
-       if ( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
-               wfProfileOut( __METHOD__ );
+       if ( !Hooks::run( 'BadImage', array( $name, &$bad ) ) ) {
                return $bad;
        }
 
@@ -4065,7 +4143,6 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 
        $contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
        $bad = isset( $badImages[$name] ) && !isset( $badImages[$name][$contextKey] );
-       wfProfileOut( __METHOD__ );
        return $bad;
 }
 
@@ -4078,7 +4155,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
  */
 function wfCanIPUseHTTPS( $ip ) {
        $canDo = true;
-       wfRunHooks( 'CanIPUseHTTPS', array( $ip, &$canDo ) );
+       Hooks::run( 'CanIPUseHTTPS', array( $ip, &$canDo ) );
        return !!$canDo;
 }
 
index 44f78a5..dffc7bc 100644 (file)
@@ -127,11 +127,12 @@ class Hooks {
         * @param string|null $deprecatedVersion Optionally, mark hook as deprecated with version number
         * @return bool True if no handler aborted the hook
         *
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
         * @since 1.22 A hook function is not required to return a value for
         *   processing to continue. Not returning a value (or explicitly
         *   returning null) is equivalent to returning true.
-        * @throws MWException
-        * @throws FatalError
         */
        public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
                $profiler = Profiler::instance();
index b3437d3..93a1a04 100644 (file)
@@ -198,8 +198,7 @@ class Html {
        /**
         * Returns an HTML element in a string.  The major advantage here over
         * manually typing out the HTML is that it will escape all attribute
-        * values.  If you're hardcoding all the attributes, or there are none, you
-        * should probably just type out the html element yourself.
+        * values.
         *
         * This is quite similar to Xml::tags(), but it implements some useful
         * HTML-specific logic.  For instance, there is no $allowShortTag
@@ -893,7 +892,7 @@ class Html {
                                continue;
                        }
                        if ( $nsId === NS_MAIN ) {
-                               // For other namespaces use use the namespace prefix as label, but for
+                               // For other namespaces use the namespace prefix as label, but for
                                // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
                                $nsName = wfMessage( 'blanknamespace' )->text();
                        } elseif ( is_int( $nsId ) ) {
index ccbfba8..b2926d1 100644 (file)
@@ -133,7 +133,6 @@ class HtmlFormatter {
         * @return array Array of removed DOMElements
         */
        public function filterContent() {
-               wfProfileIn( __METHOD__ );
                $removals = $this->parseItemsToRemove();
 
                // Bail out early if nothing to do
@@ -143,7 +142,6 @@ class HtmlFormatter {
                        },
                        true
                ) ) {
-                       wfProfileOut( __METHOD__ );
                        return array();
                }
 
@@ -178,7 +176,7 @@ class HtmlFormatter {
 
                // CSS Classes
                $domElemsToRemove = array();
-               $xpath = new DOMXpath( $doc );
+               $xpath = new DOMXPath( $doc );
                foreach ( $removals['CLASS'] as $classToRemove ) {
                        $elements = $xpath->query( '//*[contains(@class, "' . $classToRemove . '")]' );
 
@@ -202,7 +200,6 @@ class HtmlFormatter {
                        $removed = array_merge( $removed, $this->removeElements( $elements ) );
                }
 
-               wfProfileOut( __METHOD__ );
                return $removed;
        }
 
@@ -235,7 +232,6 @@ class HtmlFormatter {
         * @return string
         */
        private function fixLibXML( $html ) {
-               wfProfileIn( __METHOD__ );
                static $replacements;
                if ( !$replacements ) {
                        // We don't include rules like '&#34;' => '&amp;quot;' because entities had already been
@@ -249,7 +245,6 @@ class HtmlFormatter {
                }
                $html = $replacements->replace( $html );
                $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
-               wfProfileOut( __METHOD__ );
                return $html;
        }
 
@@ -264,10 +259,8 @@ class HtmlFormatter {
         * @return string Processed HTML
         */
        public function getText( $element = null ) {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->doc ) {
-                       wfProfileIn( __METHOD__ . '-dom' );
                        if ( $element !== null && !( $element instanceof DOMElement ) ) {
                                $element = $this->doc->getElementById( $element );
                        }
@@ -283,9 +276,7 @@ class HtmlFormatter {
                                $body->appendChild( $element );
                        }
                        $html = $this->doc->saveHTML();
-                       wfProfileOut( __METHOD__ . '-dom' );
 
-                       wfProfileIn( __METHOD__ . '-fixes' );
                        $html = $this->fixLibXml( $html );
                        if ( wfIsWindows() ) {
                                // Cleanup for CRLF misprocessing of unknown origin on Windows.
@@ -294,7 +285,6 @@ class HtmlFormatter {
                                // XML code paths if possible and fix there.
                                $html = str_replace( '&#13;', '', $html );
                        }
-                       wfProfileOut( __METHOD__ . '-fixes' );
                } else {
                        $html = $this->html;
                }
@@ -302,14 +292,11 @@ class HtmlFormatter {
                $html = preg_replace( '/<!--.*?-->|^.*?<body>|<\/body>.*$/s', '', $html );
                $html = $this->onHtmlReady( $html );
 
-               wfProfileIn( __METHOD__ . '-flatten' );
                if ( $this->elementsToFlatten ) {
                        $elements = implode( '|', $this->elementsToFlatten );
                        $html = preg_replace( "#</?($elements)\\b[^>]*>#is", '', $html );
                }
-               wfProfileOut( __METHOD__ . '-flatten' );
 
-               wfProfileOut( __METHOD__ );
                return $html;
        }
 
@@ -322,6 +309,7 @@ class HtmlFormatter {
         * @param string $type The type of selector (ID, CLASS, TAG_CLASS, or TAG)
         * @param string $rawName The raw name of the selector
         * @return bool Whether the selector was successfully recognised
+        * @throws MWException
         */
        protected function parseSelector( $selector, &$type, &$rawName ) {
                if ( strpos( $selector, '.' ) === 0 ) {
@@ -349,7 +337,6 @@ class HtmlFormatter {
         * @return array
         */
        protected function parseItemsToRemove() {
-               wfProfileIn( __METHOD__ );
                $removals = array(
                        'ID' => array(),
                        'TAG' => array(),
@@ -371,7 +358,6 @@ class HtmlFormatter {
                        $removals['TAG'][] = 'video';
                }
 
-               wfProfileOut( __METHOD__ );
                return $removals;
        }
 }
index f9ee14b..d066df8 100644 (file)
@@ -59,7 +59,6 @@ class Http {
         */
        public static function request( $method, $url, $options = array() ) {
                wfDebug( "HTTP: $method: $url\n" );
-               wfProfileIn( __METHOD__ . "-$method" );
 
                $options['method'] = strtoupper( $method );
 
@@ -77,7 +76,6 @@ class Http {
                if ( $status->isOK() ) {
                        $content = $req->getContent();
                }
-               wfProfileOut( __METHOD__ . "-$method" );
                return $content;
        }
 
@@ -436,7 +434,6 @@ class MWHttpRequest {
         * @return Status
         */
        public function execute() {
-               wfProfileIn( __METHOD__ );
 
                $this->content = "";
 
@@ -454,7 +451,6 @@ class MWHttpRequest {
                        $this->setUserAgent( Http::userAgent() );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -463,7 +459,6 @@ class MWHttpRequest {
         * found in an array in the member variable headerList.
         */
        protected function parseHeader() {
-               wfProfileIn( __METHOD__ );
 
                $lastname = "";
 
@@ -482,7 +477,6 @@ class MWHttpRequest {
 
                $this->parseCookies();
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -616,7 +610,6 @@ class MWHttpRequest {
         * Parse the cookies in the response headers and store them in the cookie jar.
         */
        protected function parseCookies() {
-               wfProfileIn( __METHOD__ );
 
                if ( !$this->cookieJar ) {
                        $this->cookieJar = new CookieJar;
@@ -629,7 +622,6 @@ class MWHttpRequest {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -717,12 +709,10 @@ class CurlHttpRequest extends MWHttpRequest {
        }
 
        public function execute() {
-               wfProfileIn( __METHOD__ );
 
                parent::execute();
 
                if ( !$this->status->isOK() ) {
-                       wfProfileOut( __METHOD__ );
                        return $this->status;
                }
 
@@ -768,7 +758,6 @@ class CurlHttpRequest extends MWHttpRequest {
                $curlHandle = curl_init( $this->url );
 
                if ( !curl_setopt_array( $curlHandle, $this->curlOptions ) ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Error setting curl options." );
                }
 
@@ -797,8 +786,6 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
-               wfProfileOut( __METHOD__ );
-
                return $this->status;
        }
 
@@ -834,7 +821,6 @@ class PhpHttpRequest extends MWHttpRequest {
        }
 
        public function execute() {
-               wfProfileIn( __METHOD__ );
 
                parent::execute();
 
@@ -940,13 +926,11 @@ class PhpHttpRequest extends MWHttpRequest {
 
                if ( $fh === false ) {
                        $this->status->fatal( 'http-request-error' );
-                       wfProfileOut( __METHOD__ );
                        return $this->status;
                }
 
                if ( $result['timed_out'] ) {
                        $this->status->fatal( 'http-timed-out', $this->url );
-                       wfProfileOut( __METHOD__ );
                        return $this->status;
                }
 
@@ -968,8 +952,6 @@ class PhpHttpRequest extends MWHttpRequest {
                }
                fclose( $fh );
 
-               wfProfileOut( __METHOD__ );
-
                return $this->status;
        }
 }
index 6f93351..c3caecc 100644 (file)
  */
 class WikiImporter {
        private $reader = null;
+       private $foreignNamespaces = null;
        private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
-       private $mSiteInfoCallback, $mTargetNamespace, $mTargetRootPage, $mPageOutCallback;
+       private $mSiteInfoCallback, $mTargetNamespace, $mPageOutCallback;
        private $mNoticeCallback, $mDebug;
        private $mImportUploads, $mImageBasePath;
        private $mNoUpdates = false;
        /** @var Config */
        private $config;
+       /** @var ImportTitleFactory */
+       private $importTitleFactory;
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
@@ -68,6 +71,8 @@ class WikiImporter {
                $this->setUploadCallback( array( $this, 'importUpload' ) );
                $this->setLogItemCallback( array( $this, 'importLogItem' ) );
                $this->setPageOutCallback( array( $this, 'finishImportPage' ) );
+
+               $this->importTitleFactory = new NaiveImportTitleFactory();
        }
 
        /**
@@ -199,6 +204,15 @@ class WikiImporter {
                return $previous;
        }
 
+       /**
+        * Sets the factory object to use to convert ForeignTitle objects into local
+        * Title objects
+        * @param ImportTitleFactory $factory
+        */
+       public function setImportTitleFactory( $factory ) {
+               $this->importTitleFactory = $factory;
+       }
+
        /**
         * Set a target namespace to override the defaults
         * @param null|int $namespace
@@ -208,9 +222,16 @@ class WikiImporter {
                if ( is_null( $namespace ) ) {
                        // Don't override namespaces
                        $this->mTargetNamespace = null;
-               } elseif ( $namespace >= 0 ) {
-                       // @todo FIXME: Check for validity
-                       $this->mTargetNamespace = intval( $namespace );
+                       $this->setImportTitleFactory( new NaiveImportTitleFactory() );
+                       return true;
+               } elseif (
+                       $namespace >= 0 &&
+                       MWNamespace::exists( intval( $namespace ) )
+               ) {
+                       $namespace = intval( $namespace );
+                       $this->mTargetNamespace = $namespace;
+                       $this->setImportTitleFactory( new NamespaceImportTitleFactory( $namespace ) );
+                       return true;
                } else {
                        return false;
                }
@@ -225,7 +246,7 @@ class WikiImporter {
                $status = Status::newGood();
                if ( is_null( $rootpage ) ) {
                        // No rootpage
-                       $this->mTargetRootPage = null;
+                       $this->setImportTitleFactory( new NaiveImportTitleFactory() );
                } elseif ( $rootpage !== '' ) {
                        $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
                        $title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace )
@@ -244,9 +265,9 @@ class WikiImporter {
                                                : $wgContLang->getNsText( $title->getNamespace() );
                                        $status->fatal( 'import-rootpage-nosubpage', $displayNSText );
                                } else {
-                                       // set namespace to 'all', so the namespace check in processTitle() can passed
+                                       // set namespace to 'all', so the namespace check in processTitle() can pass
                                        $this->setTargetNamespace( null );
-                                       $this->mTargetRootPage = $title->getPrefixedDBkey();
+                                       $this->setImportTitleFactory( new SubpageImportTitleFactory( $title ) );
                                }
                        }
                }
@@ -320,13 +341,14 @@ class WikiImporter {
        /**
         * Mostly for hook use
         * @param Title $title
-        * @param string $origTitle
+        * @param ForeignTitle $foreignTitle
         * @param int $revCount
         * @param int $sRevCount
         * @param array $pageInfo
         * @return bool
         */
-       public function finishImportPage( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) {
+       public function finishImportPage( $title, $foreignTitle, $revCount,
+                       $sRevCount, $pageInfo ) {
                $args = func_get_args();
                return Hooks::run( 'AfterImportPage', $args );
        }
@@ -348,6 +370,20 @@ class WikiImporter {
                $this->debug( "-- Text: " . $revision->text );
        }
 
+       /**
+        * Notify the callback function of site info
+        * @param array $siteInfo
+        * @return bool|mixed
+        */
+       private function siteInfoCallback( $siteInfo ) {
+               if ( isset( $this->mSiteInfoCallback ) ) {
+                       return call_user_func_array( $this->mSiteInfoCallback,
+                                       array( $siteInfo, $this ) );
+               } else {
+                       return false;
+               }
+       }
+
        /**
         * Notify the callback function when a new "<page>" is reached.
         * @param Title $title
@@ -361,12 +397,13 @@ class WikiImporter {
        /**
         * Notify the callback function when a "</page>" is closed.
         * @param Title $title
-        * @param Title $origTitle
+        * @param ForeignTitle $foreignTitle
         * @param int $revCount
         * @param int $sucCount Number of revisions for which callback returned true
         * @param array $pageInfo Associative array of page information
         */
-       private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
+       private function pageOutCallback( $title, $foreignTitle, $revCount,
+                       $sucCount, $pageInfo ) {
                if ( isset( $this->mPageOutCallback ) ) {
                        $args = func_get_args();
                        call_user_func_array( $this->mPageOutCallback, $args );
@@ -424,11 +461,11 @@ class WikiImporter {
                $buffer = "";
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
-                       case XmlReader::TEXT:
-                       case XmlReader::SIGNIFICANT_WHITESPACE:
+                       case XMLReader::TEXT:
+                       case XMLReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
                                break;
-                       case XmlReader::END_ELEMENT:
+                       case XMLReader::END_ELEMENT:
                                return $buffer;
                        }
                }
@@ -466,7 +503,7 @@ class WikiImporter {
 
                        if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
                                // Do nothing
-                       } elseif ( $tag == 'mediawiki' && $type == XmlReader::END_ELEMENT ) {
+                       } elseif ( $tag == 'mediawiki' && $type == XMLReader::END_ELEMENT ) {
                                break;
                        } elseif ( $tag == 'siteinfo' ) {
                                $this->handleSiteInfo();
@@ -493,18 +530,31 @@ class WikiImporter {
                return true;
        }
 
-       /**
-        * @return bool
-        * @throws MWException
-        */
        private function handleSiteInfo() {
-               // Site info is useful, but not actually used for dump imports.
-               // Includes a quick short-circuit to save performance.
-               if ( !$this->mSiteInfoCallback ) {
-                       $this->reader->next();
-                       return true;
+               $this->debug( "Enter site info handler." );
+               $siteInfo = array();
+
+               // Fields that can just be stuffed in the siteInfo object
+               $normalFields = array( 'sitename', 'base', 'generator', 'case' );
+
+               while ( $this->reader->read() ) {
+                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                                       $this->reader->name == 'siteinfo' ) {
+                               break;
+                       }
+
+                       $tag = $this->reader->name;
+
+                       if ( $tag == 'namespace' ) {
+                               $this->foreignNamespaces[ $this->nodeAttribute( 'key' ) ] =
+                                       $this->nodeContents();
+                       } elseif ( in_array( $tag, $normalFields ) ) {
+                               $siteInfo[$tag] = $this->nodeContents();
+                       }
                }
-               throw new MWException( "SiteInfo tag is not yet handled, do not set mSiteInfoCallback" );
+
+               $siteInfo['_namespaces'] = $this->foreignNamespaces;
+               $this->siteInfoCallback( $siteInfo );
        }
 
        private function handleLogItem() {
@@ -516,7 +566,7 @@ class WikiImporter {
                                        'logtitle', 'params' );
 
                while ( $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'logitem' ) {
                                break;
                        }
@@ -574,17 +624,19 @@ class WikiImporter {
                $pageInfo = array( 'revisionCount' => 0, 'successfulRevisionCount' => 0 );
 
                // Fields that can just be stuffed in the pageInfo object
-               $normalFields = array( 'title', 'id', 'redirect', 'restrictions' );
+               $normalFields = array( 'title', 'ns', 'id', 'redirect', 'restrictions' );
 
                $skip = false;
                $badTitle = false;
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'page' ) {
                                break;
                        }
 
+                       $skip = false;
+
                        $tag = $this->reader->name;
 
                        if ( $badTitle ) {
@@ -605,29 +657,35 @@ class WikiImporter {
                                        $pageInfo[$tag] = $this->nodeAttribute( 'title' );
                                } else {
                                        $pageInfo[$tag] = $this->nodeContents();
-                                       if ( $tag == 'title' ) {
-                                               $title = $this->processTitle( $pageInfo['title'] );
+                               }
+                       } elseif ( $tag == 'revision' || $tag == 'upload' ) {
+                               if ( !isset( $title ) ) {
+                                       $title = $this->processTitle( $pageInfo['title'],
+                                               isset( $pageInfo['ns'] ) ? $pageInfo['ns'] : null );
+
+                                       if ( !$title ) {
+                                               $badTitle = true;
+                                               $skip = true;
+                                       }
 
-                                               if ( !$title ) {
-                                                       $badTitle = true;
-                                                       $skip = true;
-                                               }
+                                       $this->pageCallback( $title );
+                                       list( $pageInfo['_title'], $foreignTitle ) = $title;
+                               }
 
-                                               $this->pageCallback( $title );
-                                               list( $pageInfo['_title'], $origTitle ) = $title;
+                               if ( $title ) {
+                                       if ( $tag == 'revision' ) {
+                                               $this->handleRevision( $pageInfo );
+                                       } else {
+                                               $this->handleUpload( $pageInfo );
                                        }
                                }
-                       } elseif ( $tag == 'revision' ) {
-                               $this->handleRevision( $pageInfo );
-                       } elseif ( $tag == 'upload' ) {
-                               $this->handleUpload( $pageInfo );
                        } elseif ( $tag != '#text' ) {
                                $this->warn( "Unhandled page XML tag $tag" );
                                $skip = true;
                        }
                }
 
-               $this->pageOutCallback( $pageInfo['_title'], $origTitle,
+               $this->pageOutCallback( $pageInfo['_title'], $foreignTitle,
                                        $pageInfo['revisionCount'],
                                        $pageInfo['successfulRevisionCount'],
                                        $pageInfo );
@@ -645,7 +703,7 @@ class WikiImporter {
                $skip = false;
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'revision' ) {
                                break;
                        }
@@ -737,7 +795,7 @@ class WikiImporter {
                $skip = false;
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'upload' ) {
                                break;
                        }
@@ -835,7 +893,7 @@ class WikiImporter {
                $info = array();
 
                while ( $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'contributor' ) {
                                break;
                        }
@@ -852,28 +910,27 @@ class WikiImporter {
 
        /**
         * @param string $text
+        * @param string|null $ns
         * @return array|bool
         */
-       private function processTitle( $text ) {
-               $workTitle = $text;
-               $origTitle = Title::newFromText( $workTitle );
-
-               if ( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
-                       # makeTitleSafe, because $origTitle can have a interwiki (different setting of interwiki map)
-                       # and than dbKey can begin with a lowercase char
-                       $title = Title::makeTitleSafe( $this->mTargetNamespace,
-                               $origTitle->getDBkey() );
+       private function processTitle( $text, $ns = null ) {
+               if ( is_null( $this->foreignNamespaces ) ) {
+                       $foreignTitleFactory = new NaiveForeignTitleFactory();
                } else {
-                       if ( !is_null( $this->mTargetRootPage ) ) {
-                               $workTitle = $this->mTargetRootPage . '/' . $workTitle;
-                       }
-                       $title = Title::newFromText( $workTitle );
+                       $foreignTitleFactory = new NamespaceAwareForeignTitleFactory(
+                               $this->foreignNamespaces );
                }
 
+               $foreignTitle = $foreignTitleFactory->createForeignTitle( $text,
+                       intval( $ns ) );
+
+               $title = $this->importTitleFactory->createTitleFromForeignTitle(
+                       $foreignTitle );
+
                $commandLineMode = $this->config->get( 'CommandLineMode' );
                if ( is_null( $title ) ) {
                        # Invalid page title? Ignore the page
-                       $this->notice( 'import-error-invalid', $workTitle );
+                       $this->notice( 'import-error-invalid', $foreignTitle->getFullText() );
                        return false;
                } elseif ( $title->isExternal() ) {
                        $this->notice( 'import-error-interwiki', $title->getPrefixedText() );
@@ -891,7 +948,7 @@ class WikiImporter {
                        return false;
                }
 
-               return array( $title, $origTitle );
+               return array( $title, $foreignTitle );
        }
 }
 
@@ -1652,7 +1709,10 @@ class WikiRevision {
 }
 
 /**
- * @todo document (e.g. one-sentence class description).
+ * Used for importing XML dumps where the content of the dump is in a string.
+ * This class is ineffecient, and should only be used for small dumps.
+ * For larger dumps, ImportStreamSource should be used instead.
+ *
  * @ingroup SpecialPage
  */
 class ImportStringSource {
@@ -1681,7 +1741,7 @@ class ImportStringSource {
 }
 
 /**
- * @todo document (e.g. one-sentence class description).
+ * Imports a XML dump from a file (either from file upload, files on disk, or HTTP)
  * @ingroup SpecialPage
  */
 class ImportStreamSource {
index bfb8937..f220eba 100644 (file)
@@ -197,7 +197,6 @@ class Linker {
                        wfWarn( __METHOD__ . ': Requires $target to be a Title object.', 2 );
                        return "<!-- ERROR -->$html";
                }
-               wfProfileIn( __METHOD__ );
 
                if ( is_string( $query ) ) {
                        // some functions withing core using this still hand over query strings
@@ -212,7 +211,6 @@ class Linker {
                if ( !Hooks::run( 'LinkBegin',
                        array( $dummy, $target, &$html, &$customAttribs, &$query, &$options, &$ret ) )
                ) {
-                       wfProfileOut( __METHOD__ );
                        return $ret;
                }
 
@@ -220,7 +218,6 @@ class Linker {
                $target = self::normaliseSpecialPage( $target );
 
                # If we don't know whether the page exists, let's find out.
-               wfProfileIn( __METHOD__ . '-checkPageExistence' );
                if ( !in_array( 'known', $options ) && !in_array( 'broken', $options ) ) {
                        if ( $target->isKnown() ) {
                                $options[] = 'known';
@@ -228,7 +225,6 @@ class Linker {
                                $options[] = 'broken';
                        }
                }
-               wfProfileOut( __METHOD__ . '-checkPageExistence' );
 
                $oldquery = array();
                if ( in_array( "forcearticlepath", $options ) && $query ) {
@@ -255,7 +251,6 @@ class Linker {
                        $ret = Html::rawElement( 'a', $attribs, $html );
                }
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -280,7 +275,6 @@ class Linker {
         * @return string
         */
        private static function linkUrl( $target, $query, $options ) {
-               wfProfileIn( __METHOD__ );
                # We don't want to include fragments for broken links, because they
                # generally make no sense.
                if ( in_array( 'broken', $options ) && $target->hasFragment() ) {
@@ -306,7 +300,6 @@ class Linker {
                }
 
                $ret = $target->getLinkURL( $query, false, $proto );
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -320,12 +313,10 @@ class Linker {
         * @return array
         */
        private static function linkAttribs( $target, $attribs, $options ) {
-               wfProfileIn( __METHOD__ );
                global $wgUser;
                $defaults = array();
 
                if ( !in_array( 'noclasses', $options ) ) {
-                       wfProfileIn( __METHOD__ . '-getClasses' );
                        # Now build the classes.
                        $classes = array();
 
@@ -346,7 +337,6 @@ class Linker {
                        if ( $classes != array() ) {
                                $defaults['class'] = implode( ' ', $classes );
                        }
-                       wfProfileOut( __METHOD__ . '-getClasses' );
                }
 
                # Get a default title attribute.
@@ -370,7 +360,6 @@ class Linker {
                                $ret[$key] = $val;
                        }
                }
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -933,7 +922,6 @@ class Linker {
                }
 
                global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
-               wfProfileIn( __METHOD__ );
                if ( $label == '' ) {
                        $label = $title->getPrefixedText();
                }
@@ -946,19 +934,16 @@ class Linker {
                        $redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
 
                        if ( $redir ) {
-                               wfProfileOut( __METHOD__ );
                                return self::linkKnown( $title, $encLabel, array(), wfCgiToArray( $query ) );
                        }
 
                        $href = self::getUploadUrl( $title, $query );
 
-                       wfProfileOut( __METHOD__ );
                        return '<a href="' . htmlspecialchars( $href ) . '" class="new" title="' .
                                htmlspecialchars( $title->getPrefixedText(), ENT_QUOTES ) . '">' .
                                $encLabel . '</a>';
                }
 
-               wfProfileOut( __METHOD__ );
                return self::linkKnown( $title, $encLabel, array(), wfCgiToArray( $query ) );
        }
 
@@ -1179,7 +1164,7 @@ class Linker {
                Hooks::run( 'UserToolLinksEdit', array( $userId, $userText, &$items ) );
 
                if ( $items ) {
-                       return wfMessage( 'word-separator' )->plain()
+                       return wfMessage( 'word-separator' )->escaped()
                                . '<span class="mw-usertoollinks">'
                                . wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $items ) )->escaped()
                                . '</span>';
@@ -1266,7 +1251,7 @@ class Linker {
                        $userId = $rev->getUser( Revision::FOR_THIS_USER );
                        $userText = $rev->getUserText( Revision::FOR_THIS_USER );
                        $link = self::userLink( $userId, $userText )
-                               . wfMessage( 'word-separator' )->plain()
+                               . wfMessage( 'word-separator' )->escaped()
                                . self::userToolLinks( $userId, $userText );
                } else {
                        $link = wfMessage( 'rev-deleted-user' )->escaped();
@@ -1295,7 +1280,6 @@ class Linker {
         * @return mixed|string
         */
        public static function formatComment( $comment, $title = null, $local = false ) {
-               wfProfileIn( __METHOD__ );
 
                # Sanitize text a bit:
                $comment = str_replace( "\n", " ", $comment );
@@ -1306,12 +1290,12 @@ class Linker {
                $comment = self::formatAutocomments( $comment, $title, $local );
                $comment = self::formatLinksInComment( $comment, $title, $local );
 
-               wfProfileOut( __METHOD__ );
                return $comment;
        }
 
        /**
         * Converts autogenerated comments in edit summaries into section links.
+        *
         * The pattern for autogen comments is / * foo * /, which makes for
         * some nasty regex.
         * We look for all comments, match any text before and after the comment,
@@ -1324,14 +1308,28 @@ class Linker {
         * @return string Formatted comment
         */
        private static function formatAutocomments( $comment, $title = null, $local = false ) {
-               return preg_replace_callback(
-                       '!(.*)/\*\s*(.*?)\s*\*/(.*)!',
-                       function ( $match ) use ( $title, $local ) {
+               // @todo $append here is something of a hack to preserve the status
+               // quo. Someone who knows more about bidi and such should decide
+               // (1) what sane rendering even *is* for an LTR edit summary on an RTL
+               // wiki, both when autocomments exist and when they don't, and
+               // (2) what markup will make that actually happen.
+               $append = '';
+               $comment = preg_replace_callback(
+                       // To detect the presence of content before or after the
+                       // auto-comment, we use capturing groups inside optional zero-width
+                       // assertions. But older versions of PCRE can't directly make
+                       // zero-width assertions optional, so wrap them in a non-capturing
+                       // group.
+                       '!(?:(?<=(.)))?/\*\s*(.*?)\s*\*/(?:(?=(.)))?!',
+                       function ( $match ) use ( $title, $local, &$append ) {
                                global $wgLang;
 
-                               $pre = $match[1];
+                               // Ensure all match positions are defined
+                               $match += array( '', '', '', '' );
+
+                               $pre = $match[1] !== '';
                                $auto = $match[2];
-                               $post = $match[3];
+                               $post = $match[3] !== '';
                                $comment = null;
                                Hooks::run( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
                                if ( $comment === null ) {
@@ -1361,7 +1359,7 @@ class Linker {
                                        }
                                        if ( $pre ) {
                                                # written summary $presep autocomment (summary /* section */)
-                                               $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
+                                               $pre = wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
                                        }
                                        if ( $post ) {
                                                # autocomment $postsep written summary (/* section */ summary)
@@ -1369,12 +1367,14 @@ class Linker {
                                        }
                                        $auto = '<span class="autocomment">' . $auto . '</span>';
                                        $comment = $pre . $link . $wgLang->getDirMark()
-                                               . '<span dir="auto">' . $auto . $post . '</span>';
+                                               . '<span dir="auto">' . $auto;
+                                       $append .= '</span>';
                                }
                                return $comment;
                        },
                        $comment
                );
+               return $comment . $append;
        }
 
        /**
@@ -1385,9 +1385,11 @@ class Linker {
         * @param string $comment Text to format links in
         * @param Title|null $title An optional title object used to links to sections
         * @param bool $local Whether section links should refer to local page
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki), as used by WikiMap
+        *
         * @return string
         */
-       public static function formatLinksInComment( $comment, $title = null, $local = false ) {
+       public static function formatLinksInComment( $comment, $title = null, $local = false, $wikiId = null ) {
                return preg_replace_callback(
                        '/
                                \[\[
@@ -1401,7 +1403,7 @@ class Linker {
                                \]\]
                                ([^[]*) # 3. link trail (the text up until the next link)
                        /x',
-                       function ( $match ) use ( $title, $local ) {
+                       function ( $match ) use ( $title, $local, $wikiId ) {
                                global $wgContLang;
 
                                $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
@@ -1457,11 +1459,22 @@ class Linker {
                                                        $newTarget = clone ( $title );
                                                        $newTarget->setFragment( '#' . $target->getFragment() );
                                                        $target = $newTarget;
+
                                                }
-                                               $thelink = Linker::link(
-                                                       $target,
-                                                       $linkText . $inside
-                                               ) . $trail;
+
+                                               if ( $wikiId !== null ) {
+                                                       $thelink = Linker::makeExternalLink(
+                                                               WikiMap::getForeignURL( $wikiId, $target->getPrefixedURL() ),
+                                                               $linkText . $inside,
+                                                               true
+                                                       ) . $trail;
+                                               } else {
+                                                       $thelink = Linker::link(
+                                                               $target,
+                                                               $linkText . $inside
+                                                       ) . $trail;
+                                               }
+
                                        }
                                }
                                if ( $thelink ) {
@@ -1498,7 +1511,6 @@ class Linker {
                # ../Foobar/ -- convert to CurrentPage/Foobar, use 'Foobar' as text
                #              (from CurrentPage/CurrentSubPage)
 
-               wfProfileIn( __METHOD__ );
                $ret = $target; # default return value is no change
 
                # Some namespaces don't allow subpages,
@@ -1557,7 +1569,6 @@ class Linker {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -1594,7 +1605,7 @@ class Linker {
         * @return string HTML fragment
         */
        public static function revComment( Revision $rev, $local = false, $isPublic = false ) {
-               if ( $rev->getRawComment() == "" ) {
+               if ( $rev->getComment( Revision::RAW ) == "" ) {
                        return "";
                }
                if ( $rev->isDeleted( Revision::DELETED_COMMENT ) && $isPublic ) {
@@ -1812,7 +1823,7 @@ class Linker {
                $inner = self::buildRollbackLink( $rev, $context, $editCount );
 
                if ( !in_array( 'noBrackets', $options ) ) {
-                       $inner = $context->msg( 'brackets' )->rawParams( $inner )->plain();
+                       $inner = $context->msg( 'brackets' )->rawParams( $inner )->escaped();
                }
 
                return '<span class="mw-rollback-link">' . $inner . '</span>';
@@ -1859,7 +1870,7 @@ class Linker {
                $editCount = 0;
                $moreRevs = false;
                foreach ( $res as $row ) {
-                       if ( $rev->getRawUserText() != $row->rev_user_text ) {
+                       if ( $rev->getUserText( Revision::RAW ) != $row->rev_user_text ) {
                                if ( $verify &&
                                        ( $row->rev_deleted & Revision::DELETED_TEXT
                                                || $row->rev_deleted & Revision::DELETED_USER
@@ -1897,7 +1908,7 @@ class Linker {
        ) {
                global $wgShowRollbackEditCount, $wgMiserMode;
 
-               // To config which pages are effected by miser mode
+               // To config which pages are affected by miser mode
                $disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
 
                if ( $context === null ) {
@@ -1980,7 +1991,6 @@ class Linker {
                $section = false, $more = null
        ) {
                global $wgLang;
-               wfProfileIn( __METHOD__ );
 
                $outText = '';
                if ( count( $templates ) > 0 ) {
@@ -2060,7 +2070,6 @@ class Linker {
 
                        $outText .= '</ul>';
                }
-               wfProfileOut( __METHOD__ );
                return $outText;
        }
 
@@ -2072,7 +2081,6 @@ class Linker {
         * @return string HTML output
         */
        public static function formatHiddenCategories( $hiddencats ) {
-               wfProfileIn( __METHOD__ );
 
                $outText = '';
                if ( count( $hiddencats ) > 0 ) {
@@ -2089,7 +2097,6 @@ class Linker {
                        }
                        $outText .= '</ul>';
                }
-               wfProfileOut( __METHOD__ );
                return $outText;
        }
 
@@ -2118,7 +2125,6 @@ class Linker {
         *   escape), or false for no title attribute
         */
        public static function titleAttrib( $name, $options = null ) {
-               wfProfileIn( __METHOD__ );
 
                $message = wfMessage( "tooltip-$name" );
 
@@ -2147,7 +2153,6 @@ class Linker {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $tooltip;
        }
 
@@ -2167,7 +2172,6 @@ class Linker {
                if ( isset( self::$accesskeycache[$name] ) ) {
                        return self::$accesskeycache[$name];
                }
-               wfProfileIn( __METHOD__ );
 
                $message = wfMessage( "accesskey-$name" );
 
@@ -2183,7 +2187,6 @@ class Linker {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                self::$accesskeycache[$name] = $accesskey;
                return self::$accesskeycache[$name];
        }
@@ -2291,7 +2294,6 @@ class Linker {
        static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
                wfDeprecated( __METHOD__, '1.21' );
 
-               wfProfileIn( __METHOD__ );
                $query = wfCgiToArray( $query );
                list( $inside, $trail ) = self::splitTrail( $trail );
                if ( $text === '' ) {
@@ -2300,7 +2302,6 @@ class Linker {
 
                $ret = self::link( $nt, "$prefix$text$inside", array(), $query ) . $trail;
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -2325,8 +2326,6 @@ class Linker {
        ) {
                wfDeprecated( __METHOD__, '1.21' );
 
-               wfProfileIn( __METHOD__ );
-
                if ( $text == '' ) {
                        $text = self::linkText( $title );
                }
@@ -2340,7 +2339,6 @@ class Linker {
                $ret = self::link( $title, "$prefix$text$inside", $attribs, $query,
                        array( 'known', 'noclasses' ) ) . $trail;
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
index 4b3d36a..ea91470 100644 (file)
@@ -182,6 +182,11 @@ class MWTimestamp {
                        $output .= ' GMT';
                }
 
+               if ( $style == TS_MW && strlen( $output ) !== 14 ) {
+                       throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
+                               'the specified format' );
+               }
+
                return $output;
        }
 
index 4b24a00..186821d 100644 (file)
@@ -330,15 +330,12 @@ class MagicWord {
         */
        function load( $id ) {
                global $wgContLang;
-               wfProfileIn( __METHOD__ );
                $this->mId = $id;
                $wgContLang->getMagic( $this );
                if ( !$this->mSynonyms ) {
                        $this->mSynonyms = array( 'brionmademeputthishere' );
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Error: invalid magic word '$id'" );
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -655,7 +652,7 @@ class MagicWord {
         * This method uses the php feature to do several replacements at the same time,
         * thereby gaining some efficiency. The result is placed in the out variable
         * $result. The return value is true if something was replaced.
-        * @todo Should this be static? It doesn't seem to be used at all
+        * @deprecated since 1.25, unused
         *
         * @param array $magicarr
         * @param string $subject
@@ -664,6 +661,7 @@ class MagicWord {
         * @return bool
         */
        function replaceMultiple( $magicarr, $subject, &$result ) {
+               wfDeprecated( __METHOD__, '1.25' );
                $search = array();
                $replace = array();
                foreach ( $magicarr as $id => $replacement ) {
index 6e2a0c9..d94443b 100644 (file)
@@ -59,7 +59,7 @@ class MediaWiki {
                $request = $this->context->getRequest();
                $curid = $request->getInt( 'curid' );
                $title = $request->getVal( 'title' );
-               $action = $request->getVal( 'action', 'view' );
+               $action = $request->getVal( 'action' );
 
                if ( $request->getCheck( 'search' ) ) {
                        // Compatibility with old search URLs which didn't use Special:Search
@@ -157,8 +157,6 @@ class MediaWiki {
        private function performRequest() {
                global $wgTitle;
 
-               wfProfileIn( __METHOD__ );
-
                $request = $this->context->getRequest();
                $requestTitle = $title = $this->context->getTitle();
                $output = $this->context->getOutput();
@@ -176,7 +174,6 @@ class MediaWiki {
                        || $title->isSpecial( 'Badtitle' )
                ) {
                        $this->context->setTitle( SpecialPage::getTitleFor( 'Badtitle' ) );
-                       wfProfileOut( __METHOD__ );
                        throw new BadTitleError();
                }
 
@@ -201,7 +198,6 @@ class MediaWiki {
                        $this->context->setTitle( $badTitle );
                        $wgTitle = $badTitle;
 
-                       wfProfileOut( __METHOD__ );
                        throw new PermissionsError( 'read', $permErrors );
                }
 
@@ -225,7 +221,6 @@ class MediaWiki {
                                $output->redirect( $url, 301 );
                        } else {
                                $this->context->setTitle( SpecialPage::getTitleFor( 'Badtitle' ) );
-                               wfProfileOut( __METHOD__ );
                                throw new BadTitleError();
                        }
                // Redirect loops, no title in URL, $wgUsePathInfo URLs, and URLs with a variant
@@ -283,7 +278,6 @@ class MediaWiki {
                        } elseif ( is_string( $article ) ) {
                                $output->redirect( $article );
                        } else {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle()"
                                        . " returned neither an object nor a URL" );
                        }
@@ -294,7 +288,6 @@ class MediaWiki {
                        $user->addAutopromoteOnceGroups( 'onView' );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -304,7 +297,6 @@ class MediaWiki {
         * @return mixed An Article, or a string to redirect to another URL
         */
        private function initializeArticle() {
-               wfProfileIn( __METHOD__ );
 
                $title = $this->context->getTitle();
                if ( $this->context->canUseWikiPage() ) {
@@ -322,7 +314,6 @@ class MediaWiki {
                // NS_MEDIAWIKI has no redirects.
                // It is also used for CSS/JS, so performance matters here...
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
-                       wfProfileOut( __METHOD__ );
                        return $article;
                }
 
@@ -353,7 +344,6 @@ class MediaWiki {
                                if ( is_string( $target ) ) {
                                        if ( !$this->config->get( 'DisableHardRedirects' ) ) {
                                                // we'll need to redirect
-                                               wfProfileOut( __METHOD__ );
                                                return $target;
                                        }
                                }
@@ -374,7 +364,6 @@ class MediaWiki {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $article;
        }
 
@@ -385,7 +374,6 @@ class MediaWiki {
         * @param Title $requestTitle The original title, before any redirects were applied
         */
        private function performAction( Page $page, Title $requestTitle ) {
-               wfProfileIn( __METHOD__ );
 
                $request = $this->context->getRequest();
                $output = $this->context->getOutput();
@@ -395,7 +383,6 @@ class MediaWiki {
                if ( !Hooks::run( 'MediaWikiPerformAction',
                                array( $output, $page, $title, $user, $request, $this ) )
                ) {
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -412,7 +399,6 @@ class MediaWiki {
                        }
 
                        $action->show();
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -421,7 +407,6 @@ class MediaWiki {
                        $output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -456,7 +441,6 @@ class MediaWiki {
         * @return bool
         */
        private function checkMaxLag() {
-               wfProfileIn( __METHOD__ );
                $maxLag = $this->context->getRequest()->getVal( 'maxlag' );
                if ( !is_null( $maxLag ) ) {
                        list( $host, $lag ) = wfGetLB()->getMaxLag();
@@ -472,25 +456,19 @@ class MediaWiki {
                                        echo "Waiting for a database server: $lag seconds lagged\n";
                                }
 
-                               wfProfileOut( __METHOD__ );
-
                                exit;
                        }
                }
-               wfProfileOut( __METHOD__ );
                return true;
        }
 
        private function main() {
                global $wgTitle;
 
-               wfProfileIn( __METHOD__ );
-
                $request = $this->context->getRequest();
 
                // Send Ajax requests to the Ajax dispatcher.
-               if ( $this->config->get( 'UseAjax' ) && $request->getVal( 'action', 'view' ) == 'ajax' ) {
-
+               if ( $this->config->get( 'UseAjax' ) && $request->getVal( 'action' ) === 'ajax' ) {
                        // Set a dummy title, because $wgTitle == null might break things
                        $title = Title::makeTitle( NS_MAIN, 'AJAX' );
                        $this->context->setTitle( $title );
@@ -498,7 +476,6 @@ class MediaWiki {
 
                        $dispatcher = new AjaxDispatcher( $this->config );
                        $dispatcher->performAction( $this->context->getUser() );
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -551,13 +528,11 @@ class MediaWiki {
                                $output->addVaryHeader( 'X-Forwarded-Proto' );
                                $output->redirect( $redirUrl );
                                $output->output();
-                               wfProfileOut( __METHOD__ );
                                return;
                        }
                }
 
                if ( $this->config->get( 'UseFileCache' ) && $title->getNamespace() >= 0 ) {
-                       wfProfileIn( 'main-try-filecache' );
                        if ( HTMLFileCache::useFileCache( $this->context ) ) {
                                // Try low-level file cache hit
                                $cache = new HTMLFileCache( $title, $action );
@@ -572,12 +547,9 @@ class MediaWiki {
                                        $this->context->getWikiPage()->doViewUpdates( $this->context->getUser() );
                                        // Tell OutputPage that output is taken care of
                                        $this->context->getOutput()->disable();
-                                       wfProfileOut( 'main-try-filecache' );
-                                       wfProfileOut( __METHOD__ );
                                        return;
                                }
                        }
-                       wfProfileOut( 'main-try-filecache' );
                }
 
                // Actually do the work of the request and build up any output
@@ -593,7 +565,6 @@ class MediaWiki {
                // Output everything!
                $this->context->getOutput()->output();
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -627,8 +598,6 @@ class MediaWiki {
                        return; // recursion guard
                }
 
-               $section = new ProfileSection( __METHOD__ );
-
                if ( $jobRunRate < 1 ) {
                        $max = mt_getrandmax();
                        if ( mt_rand( 0, $max ) > $max * $jobRunRate ) {
index e3b4dbe..6f7e8e5 100644 (file)
@@ -56,9 +56,7 @@ class MessageBlobStore {
         * @return array An array mapping module names to message blobs
         */
        public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
-               wfProfileIn( __METHOD__ );
                if ( !count( $modules ) ) {
-                       wfProfileOut( __METHOD__ );
                        return array();
                }
                // Try getting from the DB first
@@ -73,7 +71,6 @@ class MessageBlobStore {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $blobs;
        }
 
index d57f305..ebe98a3 100644 (file)
@@ -218,7 +218,7 @@ class MimeMagic {
                                wfDebug( __METHOD__ . ": can't load mime types from $mimeTypeFile\n" );
                        }
                } else {
-                       wfDebug( __METHOD__ . ": no mime types file defined, using build-ins only.\n" );
+                       wfDebug( __METHOD__ . ": no mime types file defined, using built-ins only.\n" );
                }
 
                $types .= "\n" . $this->mExtraTypes;
@@ -295,7 +295,7 @@ class MimeMagic {
                                wfDebug( __METHOD__ . ": can't load mime info from $mimeInfoFile\n" );
                        }
                } else {
-                       wfDebug( __METHOD__ . ": no mime info file defined, using build-ins only.\n" );
+                       wfDebug( __METHOD__ . ": no mime info file defined, using built-ins only.\n" );
                }
 
                $info .= "\n" . $this->mExtraInfo;
index 24b9e46..4101d09 100644 (file)
@@ -247,8 +247,9 @@ class OutputPage extends ContextSource {
        protected $mSquidMaxage = 0;
 
        /**
-        * @var bool
-        * @todo Document
+        * @var bool Controls if anti-clickjacking / frame-breaking headers will
+        * be sent. This should be done for pages where edit actions are possible.
+        * Setters: $this->preventClickjacking() and $this->allowClickjacking().
         */
        protected $mPreventClickjacking = true;
 
@@ -1075,7 +1076,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Set the page as printable, i.e. it'll be displayed with with all
+        * Set the page as printable, i.e. it'll be displayed with all
         * print styles included
         */
        public function setPrintable() {
@@ -1626,6 +1627,7 @@ class OutputPage extends ContextSource {
         * @param string $text
         * @param bool $linestart Is this the start of a line?
         * @param bool $interface Is this text in the user interface language?
+        * @throws MWException
         */
        public function addWikiText( $text, $linestart = true, $interface = true ) {
                $title = $this->getTitle(); // Work around E_STRICT
@@ -1683,8 +1685,6 @@ class OutputPage extends ContextSource {
        ) {
                global $wgParser;
 
-               wfProfileIn( __METHOD__ );
-
                $popts = $this->parserOptions();
                $oldTidy = $popts->setTidy( $tidy );
                $popts->setInterfaceMessage( (bool)$interface );
@@ -1698,7 +1698,6 @@ class OutputPage extends ContextSource {
 
                $this->addParserOutput( $parserOutput );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -2171,8 +2170,6 @@ class OutputPage extends ContextSource {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
-
                $response = $this->getRequest()->response();
                $config = $this->getConfig();
 
@@ -2207,7 +2204,6 @@ class OutputPage extends ContextSource {
                                }
                        }
 
-                       wfProfileOut( __METHOD__ );
                        return;
                } elseif ( $this->mStatusCode ) {
                        $message = HttpStatus::getMessage( $this->mStatusCode );
@@ -2262,9 +2258,7 @@ class OutputPage extends ContextSource {
                        // adding of CSS or Javascript by extensions.
                        Hooks::run( 'BeforePageDisplay', array( &$this, &$sk ) );
 
-                       wfProfileIn( 'Output-skin' );
                        $sk->outputPage();
-                       wfProfileOut( 'Output-skin' );
                }
 
                // This hook allows last minute changes to final overall output by modifying output buffer
@@ -2274,7 +2268,6 @@ class OutputPage extends ContextSource {
 
                ob_end_flush();
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -2624,8 +2617,6 @@ class OutputPage extends ContextSource {
        public function headElement( Skin $sk, $includeStyle = true ) {
                global $wgContLang;
 
-               $section = new ProfileSection( __METHOD__ );
-
                $userdir = $this->getLanguage()->getDir();
                $sitedir = $wgContLang->getDir();
 
@@ -2727,7 +2718,7 @@ class OutputPage extends ContextSource {
         *   call rather than a "<script src='...'>" tag.
         * @return string The html "<script>", "<link>" and "<style>" tags
         */
-       protected function makeResourceLoaderLink( $modules, $only, $useESI = false,
+       public function makeResourceLoaderLink( $modules, $only, $useESI = false,
                array $extraQuery = array(), $loadCall = false
        ) {
                $modules = (array)$modules;
@@ -3136,7 +3127,7 @@ class OutputPage extends ContextSource {
         * have to be purged on configuration changes.
         * @return array
         */
-       private function getJSVars() {
+       public function getJSVars() {
                global $wgContLang;
 
                $curRevisionId = 0;
@@ -3293,6 +3284,13 @@ class OutputPage extends ContextSource {
                        'content' => "MediaWiki $wgVersion",
                ) );
 
+               if ( $config->get( 'ReferrerPolicy' ) !== false ) {
+                       $tags['meta-referrer'] = Html::element( 'meta', array(
+                               'name' => 'referrer',
+                               'content' => $config->get( 'ReferrerPolicy' )
+                       ) );
+               }
+
                $p = "{$this->mIndexPolicy},{$this->mFollowPolicy}";
                if ( $p !== 'index,follow' ) {
                        // http://www.robotstxt.org/wc/meta-user.html
@@ -3795,12 +3793,13 @@ class OutputPage extends ContextSource {
         * This function takes a number of message/argument specifications, wraps them in
         * some overall structure, and then parses the result and adds it to the output.
         *
-        * In the $wrap, $1 is replaced with the first message, $2 with the second, and so
-        * on. The subsequent arguments may either be strings, in which case they are the
-        * message names, or arrays, in which case the first element is the message name,
-        * and subsequent elements are the parameters to that message.
+        * In the $wrap, $1 is replaced with the first message, $2 with the second,
+        * and so on. The subsequent arguments may be either
+        * 1) strings, in which case they are message names, or
+        * 2) arrays, in which case, within each array, the first element is the message
+        *    name, and subsequent elements are the parameters to that message.
         *
-        * Don't use this for messages that are not in users interface language.
+        * Don't use this for messages that are not in the user's interface language.
         *
         * For example:
         *
@@ -3811,7 +3810,7 @@ class OutputPage extends ContextSource {
         *    $wgOut->addWikiText( "<div class='error'>\n"
         *        . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
-        * The newline after opening div is needed in some wikitext. See bug 19226.
+        * The newline after the opening div is needed in some wikitext. See bug 19226.
         *
         * @param string $wrap
         */
index 44995ac..9e0a255 100644 (file)
@@ -130,8 +130,7 @@ class Preferences {
                        if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
                                $info['disabled'] = 'disabled';
                        }
-                       $field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
-                       $field->mParent = $dummyForm;
+                       $field = HTMLForm::loadInputFromParameters( $name, $info, $dummyForm ); // For validation
                        $defaultOptions = User::getDefaultOptions();
                        $globalDefault = isset( $defaultOptions[$name] )
                                ? $defaultOptions[$name]
@@ -244,10 +243,9 @@ class Preferences {
                        'type' => 'info',
                        'label' => $context->msg( 'prefs-memberingroups' )->numParams(
                                count( $userGroups ) )->params( $userName )->parse(),
-                       'default' => $context->msg( 'prefs-memberingroups-type',
-                               $lang->commaList( $userGroups ),
-                               $lang->commaList( $userMembers )
-                       )->plain(),
+                       'default' => $context->msg( 'prefs-memberingroups-type' )
+                               ->rawParams( $lang->commaList( $userGroups ), $lang->commaList( $userMembers ) )
+                               ->escaped(),
                        'raw' => true,
                        'section' => 'personal/info',
                );
@@ -339,11 +337,11 @@ class Preferences {
                        'type' => 'radio',
                        'section' => 'personal/i18n',
                        'options' => array(
-                               $context->msg( 'parentheses',
-                                       $context->msg( 'gender-unknown' )->text()
-                               )->text() => 'unknown',
-                               $context->msg( 'gender-female' )->text() => 'female',
-                               $context->msg( 'gender-male' )->text() => 'male',
+                               $context->msg( 'parentheses' )
+                                       ->params( $context->msg( 'gender-unknown' )->plain() )
+                                       ->escaped() => 'unknown',
+                               $context->msg( 'gender-female' )->escaped() => 'female',
+                               $context->msg( 'gender-male' )->escaped() => 'male',
                        ),
                        'label-message' => 'yourgender',
                        'help-message' => 'prefs-help-gender',
@@ -451,8 +449,8 @@ class Preferences {
                                                array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
 
                                        $emailAddress .= $emailAddress == '' ? $link : (
-                                               $context->msg( 'word-separator' )->plain()
-                                               . $context->msg( 'parentheses' )->rawParams( $link )->plain()
+                                               $context->msg( 'word-separator' )->escaped()
+                                               . $context->msg( 'parentheses' )->rawParams( $link )->escaped()
                                        );
                                }
 
@@ -870,7 +868,7 @@ class Preferences {
                        'min' => 1,
                        'max' => ceil( $rcMaxAge / ( 3600 * 24 ) ),
                        'help' => $context->msg( 'recentchangesdays-max' )->numParams(
-                               ceil( $rcMaxAge / ( 3600 * 24 ) ) )->text()
+                               ceil( $rcMaxAge / ( 3600 * 24 ) ) )->escaped()
                );
                $defaultPreferences['rclimit'] = array(
                        'type' => 'int',
@@ -927,7 +925,7 @@ class Preferences {
                        'max' => $watchlistdaysMax,
                        'section' => 'watchlist/displaywatchlist',
                        'help' => $context->msg( 'prefs-watchlist-days-max' )->numParams(
-                               $watchlistdaysMax )->text(),
+                               $watchlistdaysMax )->escaped(),
                        'label-message' => 'prefs-watchlist-days',
                );
                $defaultPreferences['wllimit'] = array(
@@ -1047,7 +1045,7 @@ class Preferences {
                $ret = array();
 
                $mptitle = Title::newMainPage();
-               $previewtext = $context->msg( 'skin-preview' )->text();
+               $previewtext = $context->msg( 'skin-preview' )->escaped();
 
                # Only show skins that aren't disabled in $wgSkipSkins
                $validSkinNames = Skin::getAllowedSkins();
@@ -1092,10 +1090,9 @@ class Preferences {
                                $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
                        }
 
-                       $display = $sn . ' ' . $context->msg(
-                               'parentheses',
-                               $context->getLanguage()->pipeList( $linkTools )
-                       )->text();
+                       $display = $sn . ' ' . $context->msg( 'parentheses' )
+                               ->rawParams( $context->getLanguage()->pipeList( $linkTools ) )
+                               ->escaped();
                        $ret[$display] = $skinkey;
                }
 
index caa3ef5..2885679 100644 (file)
@@ -95,7 +95,6 @@ abstract class PrefixSearch {
         * @return array
         */
        public function searchWithVariants( $search, $limit, array $namespaces, $offset = 0 ) {
-               wfProfileIn( __METHOD__ );
                $searches = $this->search( $search, $limit, $namespaces, $offset );
 
                // if the content language has variants, try to retrieve fallback results
@@ -116,7 +115,6 @@ abstract class PrefixSearch {
                                }
                        }
                }
-               wfProfileOut( __METHOD__ );
                return $searches;
        }
 
index 76ad252..4eae1ce 100644 (file)
@@ -209,11 +209,11 @@ class ProtectionForm {
                if ( $this->mTitle->getRestrictionTypes() === array() ) {
                        // No restriction types available for the current title
                        // this might happen if an extension alters the available types
-                       $out->setPageTitle( wfMessage(
+                       $out->setPageTitle( $this->mContext->msg(
                                'protect-norestrictiontypes-title',
                                $this->mTitle->getPrefixedText()
                        ) );
-                       $out->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
+                       $out->addWikiText( $this->mContext->msg( 'protect-norestrictiontypes-text' )->plain() );
 
                        // Show the log in case protection was possible once
                        $this->showLogExtract( $out );
@@ -240,12 +240,12 @@ class ProtectionForm {
                # the protection settings at this time
                if ( $this->disabled ) {
                        $out->setPageTitle(
-                               wfMessage( 'protect-title-notallowed',
+                               $this->mContext->msg( 'protect-title-notallowed',
                                        $this->mTitle->getPrefixedText() )
                        );
                        $out->addWikiText( $out->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
                } else {
-                       $out->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
+                       $out->setPageTitle( $this->mContext->msg( 'protect-title', $this->mTitle->getPrefixedText() ) );
                        $out->addWikiMsg( 'protect-text',
                                wfEscapeWikiText( $this->mTitle->getPrefixedText() ) );
                }
@@ -279,7 +279,7 @@ class ProtectionForm {
                $reasonstr = $this->mReasonSelection;
                if ( $reasonstr != 'other' && $this->mReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $reasonstr .= wfMessage( 'colon-separator' )->text() . $this->mReason;
+                       $reasonstr .= $this->mContext->msg( 'colon-separator' )->text() . $this->mReason;
                } elseif ( $reasonstr == 'other' ) {
                        $reasonstr = $this->mReason;
                }
@@ -342,10 +342,11 @@ class ProtectionForm {
         * @return string HTML form
         */
        function buildForm() {
-               $user = $this->mContext->getUser();
-               $output = $this->mContext->getOutput();
-               $lang = $this->mContext->getLanguage();
-               $cascadingRestrictionLevels = $this->mContext->getConfig()->get( 'CascadingRestrictionLevels' );
+               $context = $this->mContext;
+               $user = $context->getUser();
+               $output = $context->getOutput();
+               $lang = $context->getLanguage();
+               $cascadingRestrictionLevels = $context->getConfig()->get( 'CascadingRestrictionLevels' );
                $out = '';
                if ( !$this->disabled ) {
                        $output->addModules( 'mediawiki.legacy.protect' );
@@ -356,7 +357,7 @@ class ProtectionForm {
                }
 
                $out .= Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, wfMessage( 'protect-legend' )->text() ) .
+                       Xml::element( 'legend', null, $context->msg( 'protect-legend' )->text() ) .
                        Xml::openElement( 'table', array( 'id' => 'mwProtectSet' ) ) .
                        Xml::openElement( 'tbody' );
 
@@ -367,7 +368,7 @@ class ProtectionForm {
                foreach ( $this->mRestrictions as $action => $selected ) {
                        // Messages:
                        // restriction-edit, restriction-move, restriction-create, restriction-upload
-                       $msg = wfMessage( 'restriction-' . $action );
+                       $msg = $context->msg( 'restriction-' . $action );
                        $out .= "<tr><td>" .
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', null, $msg->exists() ? $msg->text() : $action ) .
@@ -375,23 +376,23 @@ class ProtectionForm {
                                "<tr><td>" . $this->buildSelector( $action, $selected ) . "</td></tr><tr><td>";
 
                        $mProtectexpiry = Xml::label(
-                               wfMessage( 'protectexpiry' )->text(),
+                               $context->msg( 'protectexpiry' )->text(),
                                "mwProtectExpirySelection-$action"
                        );
                        $mProtectother = Xml::label(
-                               wfMessage( 'protect-othertime' )->text(),
+                               $context->msg( 'protect-othertime' )->text(),
                                "mwProtect-$action-expires"
                        );
 
                        $expiryFormOptions = '';
                        if ( $this->mExistingExpiry[$action] ) {
                                if ( $this->mExistingExpiry[$action] == 'infinity' ) {
-                                       $existingExpiryMessage = wfMessage( 'protect-existing-expiry-infinity' );
+                                       $existingExpiryMessage = $context->msg( 'protect-existing-expiry-infinity' );
                                } else {
-                                       $timestamp = $lang->timeanddate( $this->mExistingExpiry[$action], true );
-                                       $d = $lang->date( $this->mExistingExpiry[$action], true );
-                                       $t = $lang->time( $this->mExistingExpiry[$action], true );
-                                       $existingExpiryMessage = wfMessage( 'protect-existing-expiry', $timestamp, $d, $t );
+                                       $timestamp = $lang->userTimeAndDate( $this->mExistingExpiry[$action], $user );
+                                       $d = $lang->userDate( $this->mExistingExpiry[$action], $user );
+                                       $t = $lang->userTime( $this->mExistingExpiry[$action], $user );
+                                       $existingExpiryMessage = $context->msg( 'protect-existing-expiry', $timestamp, $d, $t );
                                }
                                $expiryFormOptions .=
                                        Xml::option(
@@ -402,7 +403,7 @@ class ProtectionForm {
                        }
 
                        $expiryFormOptions .= Xml::option(
-                               wfMessage( 'protect-othertime-op' )->text(),
+                               $context->msg( 'protect-othertime-op' )->text(),
                                "othertime"
                        ) . "\n";
                        foreach ( explode( ',', $scExpiryOptions ) as $option ) {
@@ -464,7 +465,7 @@ class ProtectionForm {
                                        <td></td>
                                        <td class="mw-input">' .
                                                Xml::checkLabel(
-                                                       wfMessage( 'protect-cascade' )->text(),
+                                                       $context->msg( 'protect-cascade' )->text(),
                                                        'mwProtect-cascade',
                                                        'mwProtect-cascade',
                                                        $this->mCascade, $this->disabledAttrib
@@ -477,12 +478,12 @@ class ProtectionForm {
                # Add manual and custom reason field/selects as well as submit
                if ( !$this->disabled ) {
                        $mProtectreasonother = Xml::label(
-                               wfMessage( 'protectcomment' )->text(),
+                               $context->msg( 'protectcomment' )->text(),
                                'wpProtectReasonSelection'
                        );
 
                        $mProtectreason = Xml::label(
-                               wfMessage( 'protect-otherreason' )->text(),
+                               $context->msg( 'protect-otherreason' )->text(),
                                'mwProtect-reason'
                        );
 
@@ -521,7 +522,7 @@ class ProtectionForm {
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( wfMessage( 'watchthis' )->text(),
+                                               Xml::checkLabel( $context->msg( 'watchthis' )->text(),
                                                        'mwProtectWatch', 'mwProtectWatch',
                                                        $user->isWatched( $this->mTitle ) || $user->getOption( 'watchdefault' ) ) .
                                        "</td>
@@ -532,7 +533,7 @@ class ProtectionForm {
                                        <td></td>
                                        <td class='mw-submit'>" .
                                                Xml::submitButton(
-                                                       wfMessage( 'confirm' )->text(),
+                                                       $context->msg( 'confirm' )->text(),
                                                        array( 'id' => 'mw-Protect-submit' )
                                                ) .
                                        "</td>
@@ -545,7 +546,7 @@ class ProtectionForm {
                        $title = Title::makeTitle( NS_MEDIAWIKI, 'Protect-dropdown' );
                        $link = Linker::link(
                                $title,
-                               wfMessage( 'protect-edit-reasonlist' )->escaped(),
+                               $context->msg( 'protect-edit-reasonlist' )->escaped(),
                                array(),
                                array( 'action' => 'edit' )
                        );
@@ -600,14 +601,14 @@ class ProtectionForm {
         */
        private function getOptionLabel( $permission ) {
                if ( $permission == '' ) {
-                       return wfMessage( 'protect-default' )->text();
+                       return $this->mContext->msg( 'protect-default' )->text();
                } else {
                        // Messages: protect-level-autoconfirmed, protect-level-sysop
-                       $msg = wfMessage( "protect-level-{$permission}" );
+                       $msg = $this->mContext->msg( "protect-level-{$permission}" );
                        if ( $msg->exists() ) {
                                return $msg->text();
                        }
-                       return wfMessage( 'protect-fallback', $permission )->text();
+                       return $this->mContext->msg( 'protect-fallback', $permission )->text();
                }
        }
 
index 8ba79df..90cc35a 100644 (file)
@@ -515,7 +515,6 @@ class Revision implements IDBAccessObject {
                if ( !$revIds ) {
                        return $revLens; // empty
                }
-               wfProfileIn( __METHOD__ );
                $res = $db->select( 'revision',
                        array( 'rev_id', 'rev_len' ),
                        array( 'rev_id' => $revIds ),
@@ -523,7 +522,6 @@ class Revision implements IDBAccessObject {
                foreach ( $res as $row ) {
                        $revLens[$row->rev_id] = $row->rev_len;
                }
-               wfProfileOut( __METHOD__ );
                return $revLens;
        }
 
@@ -828,9 +826,11 @@ class Revision implements IDBAccessObject {
         * Fetch revision's user id without regard for the current user's permissions
         *
         * @return string
+        * @deprecated since 1.25, use getUser( Revision::RAW )
         */
        public function getRawUser() {
-               return $this->mUser;
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->getUser( self::RAW );
        }
 
        /**
@@ -852,7 +852,15 @@ class Revision implements IDBAccessObject {
                } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return '';
                } else {
-                       return $this->getRawUserText();
+                       if ( $this->mUserText === null ) {
+                               $this->mUserText = User::whoIs( $this->mUser ); // load on demand
+                               if ( $this->mUserText === false ) {
+                                       # This shouldn't happen, but it can if the wiki was recovered
+                                       # via importing revs and there is no user table entry yet.
+                                       $this->mUserText = $this->mOrigUserText;
+                               }
+                       }
+                       return $this->mUserText;
                }
        }
 
@@ -860,17 +868,11 @@ class Revision implements IDBAccessObject {
         * Fetch revision's username without regard for view restrictions
         *
         * @return string
+        * @deprecated since 1.25, use getUserText( Revision::RAW )
         */
        public function getRawUserText() {
-               if ( $this->mUserText === null ) {
-                       $this->mUserText = User::whoIs( $this->mUser ); // load on demand
-                       if ( $this->mUserText === false ) {
-                               # This shouldn't happen, but it can if the wiki was recovered
-                               # via importing revs and there is no user table entry yet.
-                               $this->mUserText = $this->mOrigUserText;
-                       }
-               }
-               return $this->mUserText;
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->getUserText( self::RAW );
        }
 
        /**
@@ -900,9 +902,11 @@ class Revision implements IDBAccessObject {
         * Fetch revision comment without regard for the current user's permissions
         *
         * @return string
+        * @deprecated since 1.25, use getComment( Revision::RAW )
         */
        public function getRawComment() {
-               return $this->mComment;
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->getComment( self::RAW );
        }
 
        /**
@@ -938,7 +942,7 @@ class Revision implements IDBAccessObject {
                $dbr = wfGetDB( DB_SLAVE );
                return RecentChange::newFromConds(
                        array(
-                               'rc_user_text' => $this->getRawUserText(),
+                               'rc_user_text' => $this->getUserText( Revision::RAW ),
                                'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
                                'rc_this_oldid' => $this->getId()
                        ),
@@ -1213,7 +1217,6 @@ class Revision implements IDBAccessObject {
         * @return string Text the text requested or false on failure
         */
        public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
-               wfProfileIn( __METHOD__ );
 
                # Get data
                $textField = $prefix . 'text';
@@ -1228,7 +1231,6 @@ class Revision implements IDBAccessObject {
                if ( isset( $row->$textField ) ) {
                        $text = $row->$textField;
                } else {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -1237,7 +1239,6 @@ class Revision implements IDBAccessObject {
                        $url = $text;
                        $parts = explode( '://', $url, 2 );
                        if ( count( $parts ) == 1 || $parts[1] == '' ) {
-                               wfProfileOut( __METHOD__ );
                                return false;
                        }
                        $text = ExternalStore::fetchFromURL( $url, array( 'wiki' => $wiki ) );
@@ -1247,7 +1248,6 @@ class Revision implements IDBAccessObject {
                if ( $text !== false ) {
                        $text = self::decompressRevisionText( $text, $flags );
                }
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -1331,8 +1331,6 @@ class Revision implements IDBAccessObject {
        public function insertOn( $dbw ) {
                global $wgDefaultExternalStore, $wgContentHandlerUseDB;
 
-               wfProfileIn( __METHOD__ );
-
                $this->checkContentModel();
 
                $data = $this->mText;
@@ -1343,7 +1341,6 @@ class Revision implements IDBAccessObject {
                        // Store and get the URL
                        $data = ExternalStore::insertToDefault( $data );
                        if ( !$data ) {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Unable to store text to external storage" );
                        }
                        if ( $flags ) {
@@ -1403,7 +1400,6 @@ class Revision implements IDBAccessObject {
                        $title = $this->getTitle();
 
                        if ( $title === null ) {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Insufficient information to determine the title of the "
                                        . "revision's page!" );
                        }
@@ -1421,7 +1417,6 @@ class Revision implements IDBAccessObject {
 
                Hooks::run( 'RevisionInsertComplete', array( &$this, $data, $flags ) );
 
-               wfProfileOut( __METHOD__ );
                return $this->mId;
        }
 
@@ -1490,7 +1485,6 @@ class Revision implements IDBAccessObject {
         * @return string|bool The revision's text, or false on failure
         */
        protected function loadText() {
-               wfProfileIn( __METHOD__ );
 
                // Caching may be beneficial for massive use of external storage
                global $wgRevisionCacheExpiry, $wgMemc;
@@ -1500,7 +1494,6 @@ class Revision implements IDBAccessObject {
                        $text = $wgMemc->get( $key );
                        if ( is_string( $text ) ) {
                                wfDebug( __METHOD__ . ": got id $textId from cache\n" );
-                               wfProfileOut( __METHOD__ );
                                return $text;
                        }
                }
@@ -1548,8 +1541,6 @@ class Revision implements IDBAccessObject {
                        $wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $text;
        }
 
@@ -1571,8 +1562,6 @@ class Revision implements IDBAccessObject {
        public static function newNullRevision( $dbw, $pageId, $summary, $minor, $user = null ) {
                global $wgContentHandlerUseDB;
 
-               wfProfileIn( __METHOD__ );
-
                $fields = array( 'page_latest', 'page_namespace', 'page_title',
                                                'rev_text_id', 'rev_len', 'rev_sha1' );
 
@@ -1619,7 +1608,6 @@ class Revision implements IDBAccessObject {
                        $revision = null;
                }
 
-               wfProfileOut( __METHOD__ );
                return $revision;
        }
 
index 11c30a2..6942ac0 100644 (file)
@@ -372,8 +372,6 @@ class Sanitizer {
                static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
                        $htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
 
-               wfProfileIn( __METHOD__ );
-
                // Base our staticInitialised variable off of the global config state so that if the globals
                // are changed (like in the screwed up test system) we will re-initialise the settings.
                $globalContext = implode( '-', compact( 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
@@ -600,7 +598,6 @@ class Sanitizer {
                                $text .= '&lt;' . str_replace( '>', '&gt;', $x );
                        }
                }
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -615,7 +612,6 @@ class Sanitizer {
         * @return string
         */
        static function removeHTMLcomments( $text ) {
-               wfProfileIn( __METHOD__ );
                while ( ( $start = strpos( $text, '<!--' ) ) !== false ) {
                        $end = strpos( $text, '-->', $start + 4 );
                        if ( $end === false ) {
@@ -646,7 +642,6 @@ class Sanitizer {
                                $text = substr_replace( $text, '', $start, $end - $start );
                        }
                }
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -1267,24 +1262,6 @@ class Sanitizer {
                }
        }
 
-       /**
-        * Normalize whitespace and character references in an XML source-
-        * encoded text for an attribute value.
-        *
-        * See http://www.w3.org/TR/REC-xml/#AVNormalize for background,
-        * but note that we're not returning the value, but are returning
-        * XML source fragments that will be slapped into output.
-        *
-        * @param string $text
-        * @return string
-        * @todo Remove, unused?
-        */
-       private static function normalizeAttributeValue( $text ) {
-               return str_replace( '"', '&quot;',
-                       self::normalizeWhitespace(
-                               Sanitizer::normalizeCharReferences( $text ) ) );
-       }
-
        /**
         * @param string $text
         * @return string
index 535b13d..c75429e 100644 (file)
@@ -33,8 +33,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 }
 
 $fname = 'Setup.php';
-wfProfileIn( $fname );
-wfProfileIn( $fname . '-defaults' );
+$ps_setup = Profiler::instance()->scopedProfileIn( $fname );
+
+// If any extensions are still queued, force load them
+ExtensionRegistry::getInstance()->loadFromQueue();
 
 // Check to see if we are at the file scope
 if ( !isset( $wgVersion ) ) {
@@ -43,6 +45,7 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
+$ps_default = Profiler::instance()->scopedProfileIn( $fname . '-defaults' );
 
 if ( $wgScript === false ) {
        $wgScript = "$wgScriptPath/index$wgScriptExtension";
@@ -458,32 +461,25 @@ if ( $wgProfileOnly ) {
        $wgDebugLogFile = '';
 }
 
-wfProfileOut( $fname . '-defaults' );
+Profiler::instance()->scopedProfileOut( $ps_default );
 
 // Disable MWDebug for command line mode, this prevents MWDebug from eating up
 // all the memory from logging SQL queries on maintenance scripts
 global $wgCommandLineMode;
 if ( $wgDebugToolbar && !$wgCommandLineMode ) {
-       wfProfileIn( $fname . '-debugtoolbar' );
        MWDebug::init();
-       wfProfileOut( $fname . '-debugtoolbar' );
 }
 
 if ( !class_exists( 'AutoLoader' ) ) {
        require_once "$IP/includes/AutoLoader.php";
 }
 
-wfProfileIn( $fname . '-exception' );
 MWExceptionHandler::installHandler();
-wfProfileOut( $fname . '-exception' );
 
-wfProfileIn( $fname . '-includes' );
 require_once "$IP/includes/normal/UtfNormalUtil.php";
-require_once "$IP/includes/GlobalFunctions.php";
 require_once "$IP/includes/normal/UtfNormalDefines.php";
-wfProfileOut( $fname . '-includes' );
 
-wfProfileIn( $fname . '-defaults2' );
+$ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
 if ( $wgCanonicalServer === false ) {
        $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
@@ -514,20 +510,20 @@ if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
                . 'HTTP or HTTPS. Disabling secure login.' );
 }
 
-// Now that GlobalFunctions is loaded, set defaults that depend
-// on it.
+// Now that GlobalFunctions is loaded, set defaults that depend on it.
 if ( $wgTmpDirectory === false ) {
-       wfProfileIn( $fname . '-tempDir' );
+       $ps_tmpdir = Profiler::instance()->scopedProfileIn( $fname . '-tempDir' );
        $wgTmpDirectory = wfTempDir();
-       wfProfileOut( $fname . '-tempDir' );
+       Profiler::instance()->scopedProfileOut( $ps_tmpdir );
 }
 
 // We don't use counters anymore. Left here for extensions still
 // expecting this to exist. Should be removed sometime 1.26 or later.
 $wgDisableCounters = true;
 
-wfProfileOut( $fname . '-defaults2' );
-wfProfileIn( $fname . '-misc1' );
+Profiler::instance()->scopedProfileOut( $ps_default2 );
+
+$ps_misc = Profiler::instance()->scopedProfileIn( $fname . '-misc1' );
 
 // Raise the memory limit if it's too low
 wfMemoryLimit();
@@ -569,8 +565,8 @@ if ( $wgCommandLineMode ) {
        wfDebug( $debug );
 }
 
-wfProfileOut( $fname . '-misc1' );
-wfProfileIn( $fname . '-memcached' );
+Profiler::instance()->scopedProfileOut( $ps_misc );
+$ps_memcached = Profiler::instance()->scopedProfileIn( $fname . '-memcached' );
 
 $wgMemc = wfGetMainCache();
 $messageMemc = wfGetMessageCacheStorage();
@@ -581,12 +577,12 @@ wfDebugLog( 'caches', 'main: ' . get_class( $wgMemc ) .
        ', message: ' . get_class( $messageMemc ) .
        ', parser: ' . get_class( $parserMemc ) );
 
-wfProfileOut( $fname . '-memcached' );
+Profiler::instance()->scopedProfileOut( $ps_memcached );
 
 // Most of the config is out, some might want to run hooks here.
 Hooks::run( 'SetupAfterCache' );
 
-wfProfileIn( $fname . '-session' );
+$ps_session = Profiler::instance()->scopedProfileIn( $fname . '-session' );
 
 if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
        // If session.auto_start is there, we can't touch session name
@@ -599,8 +595,8 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
        }
 }
 
-wfProfileOut( $fname . '-session' );
-wfProfileIn( $fname . '-globals' );
+Profiler::instance()->scopedProfileOut( $ps_session );
+$ps_globals = Profiler::instance()->scopedProfileIn( $fname . '-globals' );
 
 /**
  * @var Language $wgContLang
@@ -648,8 +644,8 @@ $wgTitle = null;
  */
 $wgDeferredUpdateList = array();
 
-wfProfileOut( $fname . '-globals' );
-wfProfileIn( $fname . '-extensions' );
+Profiler::instance()->scopedProfileOut( $ps_globals );
+$ps_extensions = Profiler::instance()->scopedProfileIn( $fname . '-extensions' );
 
 // Extension setup functions for extensions other than skins
 // Entries should be added to this variable during the inclusion
@@ -669,13 +665,14 @@ foreach ( $wgExtensionFunctions as $func ) {
                $profName = $fname . '-extensions-' . strval( $func );
        }
 
-       wfProfileIn( $profName );
+       $ps_ext_func = Profiler::instance()->scopedProfileIn( $profName );
        call_user_func( $func );
-       wfProfileOut( $profName );
+       Profiler::instance()->scopedProfileOut( $ps_ext_func );
 }
 
 wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
 
-wfProfileOut( $fname . '-extensions' );
-wfProfileOut( $fname );
+Profiler::instance()->scopedProfileOut( $ps_extensions );
+Profiler::instance()->scopedProfileOut( $ps_setup );
+
index 32c6761..15c18f3 100644 (file)
@@ -221,7 +221,6 @@ class SiteStats {
         * @return int
         */
        static function pagesInNs( $ns ) {
-               wfProfileIn( __METHOD__ );
                if ( !isset( self::$pageCount[$ns] ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        self::$pageCount[$ns] = (int)$dbr->selectField(
@@ -231,7 +230,6 @@ class SiteStats {
                                __METHOD__
                        );
                }
-               wfProfileOut( __METHOD__ );
                return self::$pageCount[$ns];
        }
 
index 2503150..a52b25b 100644 (file)
@@ -39,10 +39,8 @@ class StreamFile {
         * @return bool Success
         */
        public static function stream( $fname, $headers = array(), $sendErrors = true ) {
-               wfProfileIn( __METHOD__ );
 
                if ( FileBackend::isStoragePath( $fname ) ) { // sanity
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
                }
 
@@ -54,14 +52,11 @@ class StreamFile {
                if ( $res == self::NOT_MODIFIED ) {
                        $ok = true; // use client cache
                } elseif ( $res == self::READY_STREAM ) {
-                       wfProfileIn( __METHOD__ . '-send' );
                        $ok = readfile( $fname );
-                       wfProfileOut( __METHOD__ . '-send' );
                } else {
                        $ok = false; // failed
                }
 
-               wfProfileOut( __METHOD__ );
                return $ok;
        }
 
index 7f12c16..2dfcdc2 100644 (file)
@@ -150,10 +150,8 @@ class StubObject {
 
                if ( get_class( $GLOBALS[$this->global] ) != $this->class ) {
                        $fname = __METHOD__ . '-' . $this->global;
-                       wfProfileIn( $fname );
                        $caller = wfGetCaller( $level );
                        if ( ++$recursionLevel > 2 ) {
-                               wfProfileOut( $fname );
                                throw new MWException( "Unstub loop detected on call of "
                                        . "\${$this->global}->$name from $caller\n" );
                        }
@@ -161,7 +159,6 @@ class StubObject {
                                . "\${$this->global}::$name from $caller\n" );
                        $GLOBALS[$this->global] = $this->_newObject();
                        --$recursionLevel;
-                       wfProfileOut( $fname );
                        return $GLOBALS[$this->global];
                }
        }
@@ -182,6 +179,24 @@ class StubUserLang extends StubObject {
                return $this->_call( $name, $args );
        }
 
+       /**
+        * Call Language::findVariantLink after unstubbing $wgLang.
+        *
+        * This method is implemented with a full signature rather than relying on
+        * __call so that the pass-by-reference signature of the proxied method is
+        * honored.
+        *
+        * @param string &$link The name of the link
+        * @param Title &$nt The title object of the link
+        * @param bool $ignoreOtherCond To disable other conditions when
+        *   we need to transclude a template or update a category's link
+        */
+       public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
+               global $wgLang;
+               $this->_unstub( 'findVariantLink', 3 );
+               return $wgLang->findVariantLink( $link, $nt, $ignoreOtherCond );
+       }
+
        /**
         * @return Language
         */
index fa8d034..2d0cfda 100644 (file)
@@ -614,28 +614,13 @@ class Title {
         * Note that this doesn't pick up many things that could be wrong with titles, but that
         * replacing this regex with something valid will make many titles valid.
         *
-        * @todo move this into MediaWikiTitleCodec
+        * @deprecated since 1.25, use MediaWikiTitleCodec::getTitleInvalidRegex() instead
         *
         * @return string Regex string
         */
        static function getTitleInvalidRegex() {
-               static $rxTc = false;
-               if ( !$rxTc ) {
-                       # Matching titles will be held as illegal.
-                       $rxTc = '/' .
-                               # Any character not allowed is forbidden...
-                               '[^' . self::legalChars() . ']' .
-                               # URL percent encoding sequences interfere with the ability
-                               # to round-trip titles -- you can't link to them consistently.
-                               '|%[0-9A-Fa-f]{2}' .
-                               # XML/HTML character references produce similar issues.
-                               '|&[A-Za-z0-9\x80-\xff]+;' .
-                               '|&#[0-9]+;' .
-                               '|&#x[0-9A-Fa-f]+;' .
-                               '/S';
-               }
-
-               return $rxTc;
+               wfDeprecated( __METHOD__, '1.25' );
+               return MediaWikiTitleCodec::getTitleInvalidRegex();
        }
 
        /**
@@ -1044,7 +1029,6 @@ class Title {
         * Is this in a namespace that allows actual pages?
         *
         * @return bool
-        * @internal note -- uses hardcoded namespace index instead of constants
         */
        public function canExist() {
                return $this->mNamespace >= NS_MAIN;
@@ -1335,6 +1319,25 @@ class Title {
                return Title::makeTitle( $subjectNS, $this->getDBkey() );
        }
 
+       /**
+        * Get the other title for this page, if this is a subject page
+        * get the talk page, if it is a subject page get the talk page
+        *
+        * @since 1.25
+        * @throws MWException
+        * @return Title
+        */
+       public function getOtherPage() {
+               if ( $this->isSpecialPage() ) {
+                       throw new MWException( 'Special pages cannot have other pages' );
+               }
+               if ( $this->isTalkPage() ) {
+                       return $this->getSubjectPage();
+               } else {
+                       return $this->getTalkPage();
+               }
+       }
+
        /**
         * Get the default namespace index, for when there is no namespace
         *
@@ -1779,7 +1782,6 @@ class Title {
         * @return string The URL
         */
        public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
-               wfProfileIn( __METHOD__ );
                if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
                        $ret = $this->getFullURL( $query, $query2, $proto );
                } elseif ( $this->getPrefixedText() === '' && $this->hasFragment() ) {
@@ -1787,7 +1789,6 @@ class Title {
                } else {
                        $ret = $this->getLocalURL( $query, $query2 ) . $this->getFragmentForURL();
                }
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -2441,7 +2442,6 @@ class Title {
        protected function getUserPermissionsErrorsInternal( $action, $user,
                $doExpensiveQueries = true, $short = false
        ) {
-               wfProfileIn( __METHOD__ );
 
                # Read has special handling
                if ( $action == 'read' ) {
@@ -2482,7 +2482,6 @@ class Title {
                        $errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
                }
 
-               wfProfileOut( __METHOD__ );
                return $errors;
        }
 
@@ -2718,8 +2717,6 @@ class Title {
                        return array( $this->mHasCascadingRestrictions, $pagerestrictions );
                }
 
-               wfProfileIn( __METHOD__ );
-
                $dbr = wfGetDB( DB_SLAVE );
 
                if ( $this->getNamespace() == NS_FILE ) {
@@ -2794,7 +2791,6 @@ class Title {
                        $this->mHasCascadingRestrictions = $sources;
                }
 
-               wfProfileOut( __METHOD__ );
                return array( $sources, $pagerestrictions );
        }
 
@@ -2813,8 +2809,10 @@ class Title {
         * Accessor/initialisation for mRestrictions
         *
         * @param string $action Action that permission needs to be checked for
-        * @return array Restriction levels needed to take the action. All levels
-        *     are required.
+        * @return array Restriction levels needed to take the action. All levels are
+        *     required. Note that restriction levels are normally user rights, but 'sysop'
+        *     and 'autoconfirmed' are also allowed for backwards compatibility. These should
+        *     be mapped to 'editprotected' and 'editsemiprotected' respectively.
         */
        public function getRestrictions( $action ) {
                if ( !$this->mRestrictionsLoaded ) {
@@ -4041,7 +4039,7 @@ class Title {
                if ( $this->mIsBigDeletion === null ) {
                        $dbr = wfGetDB( DB_SLAVE );
 
-                       $innerQuery = $dbr->selectSQLText(
+                       $revCount = $dbr->selectRowCount(
                                'revision',
                                '1',
                                array( 'rev_page' => $this->getArticleID() ),
@@ -4049,13 +4047,6 @@ class Title {
                                array( 'LIMIT' => $wgDeleteRevisionsLimit + 1 )
                        );
 
-                       $revCount = $dbr->query(
-                               'SELECT COUNT(*) FROM (' . $innerQuery . ') AS innerQuery',
-                               __METHOD__
-                       );
-                       $revCount = $revCount->fetchRow();
-                       $revCount = $revCount['COUNT(*)'];
-
                        $this->mIsBigDeletion = $revCount > $wgDeleteRevisionsLimit;
                }
 
@@ -4107,12 +4098,11 @@ class Title {
                        'rev_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $new->getTimestamp() ) )
                );
                if ( $max !== null ) {
-                       $res = $dbr->select( 'revision', '1',
+                       return $dbr->selectRowCount( 'revision', '1',
                                $conds,
                                __METHOD__,
                                array( 'LIMIT' => $max + 1 ) // extra to detect truncation
                        );
-                       return $res->numRows();
                } else {
                        return (int)$dbr->selectField( 'revision', 'count(*)', $conds, __METHOD__ );
                }
@@ -4163,17 +4153,19 @@ class Title {
                }
                // No DB query needed if $old and $new are the same or successive revisions:
                if ( $old->getId() === $new->getId() ) {
-                       return ( $old_cmp === '>' && $new_cmp === '<' ) ? array() : array( $old->getRawUserText() );
+                       return ( $old_cmp === '>' && $new_cmp === '<' ) ?
+                               array() :
+                               array( $old->getUserText( Revision::RAW ) );
                } elseif ( $old->getId() === $new->getParentId() ) {
                        if ( $old_cmp === '>=' && $new_cmp === '<=' ) {
-                               $authors[] = $old->getRawUserText();
-                               if ( $old->getRawUserText() != $new->getRawUserText() ) {
-                                       $authors[] = $new->getRawUserText();
+                               $authors[] = $old->getUserText( Revision::RAW );
+                               if ( $old->getUserText( Revision::RAW ) != $new->getUserText( Revision::RAW ) ) {
+                                       $authors[] = $new->getUserText( Revision::RAW );
                                }
                        } elseif ( $old_cmp === '>=' ) {
-                               $authors[] = $old->getRawUserText();
+                               $authors[] = $old->getUserText( Revision::RAW );
                        } elseif ( $new_cmp === '<=' ) {
-                               $authors[] = $new->getRawUserText();
+                               $authors[] = $new->getUserText( Revision::RAW );
                        }
                        return $authors;
                }
@@ -4625,16 +4617,13 @@ class Title {
         */
        public function getPageLanguage() {
                global $wgLang, $wgLanguageCode;
-               wfProfileIn( __METHOD__ );
                if ( $this->isSpecialPage() ) {
                        // special pages are in the user language
-                       wfProfileOut( __METHOD__ );
                        return $wgLang;
                }
 
                // Checking if DB language is set
                if ( $this->mDbPageLanguage ) {
-                       wfProfileOut( __METHOD__ );
                        return wfGetLangObj( $this->mDbPageLanguage );
                }
 
@@ -4652,7 +4641,6 @@ class Title {
                        $langObj = wfGetLangObj( $this->mPageLanguage[0] );
                }
 
-               wfProfileOut( __METHOD__ );
                return $langObj;
        }
 
@@ -4703,7 +4691,9 @@ class Title {
                $editnotice_ns = 'editnotice-' . $this->getNamespace();
                $editnotice_ns_message = wfMessage( $editnotice_ns );
                if ( $editnotice_ns_message->exists() ) {
-                       $notices[$editnotice_ns] = $editnotice_ns_message->parseAsBlock();
+                       $notices[$editnotice_ns] = '<div class="mw-editnotice mw-editnotice-namespace ' .
+                               Sanitizer::escapeClass( "mw-$editnotice_ns" ) . '">' .
+                               $editnotice_ns_message->parseAsBlock() . '</div>';
                }
                if ( MWNamespace::hasSubpages( $this->getNamespace() ) ) {
                        $parts = explode( '/', $this->getDBkey() );
@@ -4712,7 +4702,9 @@ class Title {
                                $editnotice_base .= '-' . array_shift( $parts );
                                $editnotice_base_msg = wfMessage( $editnotice_base );
                                if ( $editnotice_base_msg->exists() ) {
-                                       $notices[$editnotice_base] = $editnotice_base_msg->parseAsBlock();
+                                       $notices[$editnotice_base] = '<div class="mw-editnotice mw-editnotice-base ' .
+                                               Sanitizer::escapeClass( "mw-$editnotice_base" ) . '">' .
+                                               $editnotice_base_msg->parseAsBlock() . '</div>';
                                }
                        }
                } else {
@@ -4720,7 +4712,9 @@ class Title {
                        $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->getDBkey() );
                        $editnoticeMsg = wfMessage( $editnoticeText );
                        if ( $editnoticeMsg->exists() ) {
-                               $notices[$editnoticeText] = $editnoticeMsg->parseAsBlock();
+                               $notices[$editnoticeText] = '<div class="mw-editnotice mw-editnotice-page ' .
+                                       Sanitizer::escapeClass( "mw-$editnoticeText" ) . '">' .
+                                       $editnoticeMsg->parseAsBlock() . '</div>';
                        }
                }
 
index bda825f..ad4ce60 100644 (file)
@@ -324,7 +324,6 @@ class User implements IDBAccessObject {
                if ( $this->mLoadedItems === true ) {
                        return;
                }
-               wfProfileIn( __METHOD__ );
 
                // Set it now to avoid infinite recursion in accessors
                $this->mLoadedItems = true;
@@ -353,10 +352,8 @@ class User implements IDBAccessObject {
                                Hooks::run( 'UserLoadAfterLoadFromSession', array( $this ) );
                                break;
                        default:
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -1019,7 +1016,6 @@ class User implements IDBAccessObject {
         * @param string|bool $name
         */
        public function loadDefaults( $name = false ) {
-               wfProfileIn( __METHOD__ );
 
                $passwordFactory = self::getPasswordFactory();
 
@@ -1051,7 +1047,6 @@ class User implements IDBAccessObject {
 
                Hooks::run( 'UserLoadDefaults', array( $this, $name ) );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -1489,7 +1484,6 @@ class User implements IDBAccessObject {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
                wfDebug( __METHOD__ . ": checking...\n" );
 
                // Initialize data...
@@ -1564,7 +1558,6 @@ class User implements IDBAccessObject {
                // Extensions
                Hooks::run( 'GetBlockedStatus', array( &$this ) );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -1596,7 +1589,6 @@ class User implements IDBAccessObject {
         * @return bool True if blacklisted.
         */
        public function inDnsBlacklist( $ip, $bases ) {
-               wfProfileIn( __METHOD__ );
 
                $found = false;
                // @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
@@ -1631,7 +1623,6 @@ class User implements IDBAccessObject {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $found;
        }
 
@@ -1648,7 +1639,6 @@ class User implements IDBAccessObject {
                if ( !$wgProxyList ) {
                        return false;
                }
-               wfProfileIn( __METHOD__ );
 
                if ( !is_array( $wgProxyList ) ) {
                        // Load from the specified file
@@ -1665,7 +1655,6 @@ class User implements IDBAccessObject {
                } else {
                        $ret = false;
                }
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -1717,8 +1706,6 @@ class User implements IDBAccessObject {
                }
 
                global $wgMemc;
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $action );
 
                $limits = $wgRateLimits[$action];
                $keys = array();
@@ -1799,8 +1786,6 @@ class User implements IDBAccessObject {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $action );
-               wfProfileOut( __METHOD__ );
                return $triggered;
        }
 
@@ -1835,7 +1820,6 @@ class User implements IDBAccessObject {
         */
        public function isBlockedFrom( $title, $bFromSlave = false ) {
                global $wgBlockAllowsUTEdit;
-               wfProfileIn( __METHOD__ );
 
                $blocked = $this->isBlocked( $bFromSlave );
                $allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
@@ -1848,7 +1832,6 @@ class User implements IDBAccessObject {
 
                Hooks::run( 'UserIsBlockedFrom', array( $this, $title, &$blocked, &$allowUsertalk ) );
 
-               wfProfileOut( __METHOD__ );
                return $blocked;
        }
 
@@ -2489,7 +2472,7 @@ class User implements IDBAccessObject {
                        $type = $oldaddr != '' ? 'changed' : 'set';
                        $result = $this->sendConfirmationMail( $type );
                        if ( $result->isGood() ) {
-                               // Say the the caller that a confirmation mail has been sent
+                               // Say to the caller that a confirmation mail has been sent
                                $result->value = 'eauth';
                        }
                } else {
@@ -2930,7 +2913,6 @@ class User implements IDBAccessObject {
         */
        public function getEffectiveGroups( $recache = false ) {
                if ( $recache || is_null( $this->mEffectiveGroups ) ) {
-                       wfProfileIn( __METHOD__ );
                        $this->mEffectiveGroups = array_unique( array_merge(
                                $this->getGroups(), // explicit groups
                                $this->getAutomaticGroups( $recache ) // implicit groups
@@ -2939,7 +2921,6 @@ class User implements IDBAccessObject {
                        Hooks::run( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
                        // Force reindexation of groups when a hook has unset one of them
                        $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
-                       wfProfileOut( __METHOD__ );
                }
                return $this->mEffectiveGroups;
        }
@@ -2953,7 +2934,6 @@ class User implements IDBAccessObject {
         */
        public function getAutomaticGroups( $recache = false ) {
                if ( $recache || is_null( $this->mImplicitGroups ) ) {
-                       wfProfileIn( __METHOD__ );
                        $this->mImplicitGroups = array( '*' );
                        if ( $this->getId() ) {
                                $this->mImplicitGroups[] = 'user';
@@ -2968,7 +2948,6 @@ class User implements IDBAccessObject {
                                // as getEffectiveGroups() depends on this function
                                $this->mEffectiveGroups = null;
                        }
-                       wfProfileOut( __METHOD__ );
                }
                return $this->mImplicitGroups;
        }
@@ -3008,7 +2987,6 @@ class User implements IDBAccessObject {
 
                if ( $this->mEditCount === null ) {
                        /* Populate the count, if it has not been populated yet */
-                       wfProfileIn( __METHOD__ );
                        $dbr = wfGetDB( DB_SLAVE );
                        // check if the user_editcount field has been initialized
                        $count = $dbr->selectField(
@@ -3022,7 +3000,6 @@ class User implements IDBAccessObject {
                                $count = $this->initEditCount();
                        }
                        $this->mEditCount = $count;
-                       wfProfileOut( __METHOD__ );
                }
                return (int)$this->mEditCount;
        }
@@ -3815,8 +3792,6 @@ class User implements IDBAccessObject {
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
 
-               $section = new ProfileSection( __METHOD__ );
-
                $this->loadPasswords();
 
                // Certain authentication plugins do NOT want to save
@@ -4471,7 +4446,7 @@ class User implements IDBAccessObject {
                if ( $title ) {
                        return Linker::link( $title, htmlspecialchars( $text ) );
                } else {
-                       return $text;
+                       return htmlspecialchars( $text );
                }
        }
 
@@ -4764,7 +4739,7 @@ class User implements IDBAccessObject {
                if ( $action === true ) {
                        $action = 'byemail';
                } elseif ( $action === false ) {
-                       if ( $this->getName() == $wgUser->getName() ) {
+                       if ( $this->equals( $wgUser ) ) {
                                $action = 'create';
                        } else {
                                $action = 'create2';
@@ -5049,4 +5024,15 @@ class User implements IDBAccessObject {
                        return Status::newFatal( 'badaccess-group0' );
                }
        }
+
+       /**
+        * Checks if two user objects point to the same user.
+        *
+        * @since 1.25
+        * @param User $user
+        * @return bool
+        */
+       public function equals( User $user ) {
+               return $this->getName() === $user->getName();
+       }
 }
index fbd6119..4d22692 100644 (file)
@@ -275,7 +275,6 @@ class WatchedItem {
         * @return bool
         */
        public static function batchAddWatch( array $items ) {
-               $section = new ProfileSection( __METHOD__ );
 
                if ( wfReadOnly() ) {
                        return false;
@@ -331,11 +330,9 @@ class WatchedItem {
         * @return bool
         */
        public function removeWatch() {
-               wfProfileIn( __METHOD__ );
 
                // Only loggedin user can have a watchlist
                if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -370,7 +367,6 @@ class WatchedItem {
 
                $this->watched = false;
 
-               wfProfileOut( __METHOD__ );
                return $success;
        }
 
index e931f28..f86a454 100644 (file)
@@ -207,9 +207,9 @@ class WebRequest {
         * @return array
         */
        public static function detectProtocol() {
-               if ( ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ||
+               if ( ( !empty( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' ) ||
                        ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
-                       $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) ) {
+                       $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) ) {
                        return 'https';
                } else {
                        return 'http';
index 217ba3f..125e544 100644 (file)
@@ -74,11 +74,13 @@ if ( file_exists( "$IP/StartProfiler.php" ) ) {
        require "$IP/StartProfiler.php";
 }
 
-wfProfileIn( 'WebStart.php-conf' );
 
 # Load default settings
 require_once "$IP/includes/DefaultSettings.php";
 
+# Load global functions
+require_once "$IP/includes/GlobalFunctions.php";
+
 # Load composer's autoloader if present
 if ( is_readable( "$IP/vendor/autoload.php" ) ) {
        require_once "$IP/vendor/autoload.php";
@@ -104,9 +106,7 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        require_once MW_CONFIG_FILE;
 }
 
-wfProfileOut( 'WebStart.php-conf' );
 
-wfProfileIn( 'WebStart.php-ob_start' );
 # Initialise output buffering
 # Check that there is no previous output or previously set up buffers, because
 # that would cause us to potentially mix gzip and non-gzip output, creating a
@@ -115,7 +115,6 @@ if ( ob_get_level() == 0 ) {
        require_once "$IP/includes/OutputHandler.php";
        ob_start( 'wfOutputHandler' );
 }
-wfProfileOut( 'WebStart.php-ob_start' );
 
 if ( !defined( 'MW_NO_SETUP' ) ) {
        require_once "$IP/includes/Setup.php";
index 34cd48d..f16f5aa 100644 (file)
@@ -161,7 +161,7 @@ class WikiReference {
        }
 
        /**
-        * Get the the URL in a way to de displayed to the user
+        * Get the URL in a way to be displayed to the user
         * More or less Wikimedia specific
         *
         * @return string
index c07ac73..78b8715 100644 (file)
@@ -94,9 +94,7 @@ class Xml {
                        $attribs = array_map( array( 'UtfNormal', 'cleanUp' ), $attribs );
                }
                if ( $contents ) {
-                       wfProfileIn( __METHOD__ . '-norm' );
                        $contents = $wgContLang->normalize( $contents );
-                       wfProfileOut( __METHOD__ . '-norm' );
                }
                return self::element( $element, $attribs, $contents );
        }
index e064aab..c19e8fa 100644 (file)
@@ -42,7 +42,6 @@ class CreditsAction extends FormlessAction {
         * @return string HTML
         */
        public function onView() {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->page->getID() == 0 ) {
                        $s = $this->msg( 'nocredits' )->parse();
@@ -50,8 +49,6 @@ class CreditsAction extends FormlessAction {
                        $s = $this->getCredits( -1 );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return Html::rawElement( 'div', array( 'id' => 'mw-credits' ), $s );
        }
 
@@ -63,7 +60,6 @@ class CreditsAction extends FormlessAction {
         * @return string Html
         */
        public function getCredits( $cnt, $showIfMax = true ) {
-               wfProfileIn( __METHOD__ );
                $s = '';
 
                if ( $cnt != 0 ) {
@@ -73,8 +69,6 @@ class CreditsAction extends FormlessAction {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $s;
        }
 
index 6ee5d2c..1e2f889 100644 (file)
@@ -102,8 +102,6 @@ class HistoryAction extends FormlessAction {
                        return; // Client cache fresh and headers sent, nothing more to do.
                }
 
-               wfProfileIn( __METHOD__ );
-
                $this->preCacheMessages();
                $config = $this->context->getConfig();
 
@@ -131,7 +129,6 @@ class HistoryAction extends FormlessAction {
                $feedType = $request->getVal( 'feed' );
                if ( $feedType ) {
                        $this->feed( $feedType );
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -151,7 +148,6 @@ class HistoryAction extends FormlessAction {
                                        'msgKey' => array( 'moveddeleted-notice' )
                                )
                        );
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -215,7 +211,6 @@ class HistoryAction extends FormlessAction {
                );
                $out->preventClickjacking( $pager->getPreventClickjacking() );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index ad8e719..9e4a150 100644 (file)
@@ -338,7 +338,11 @@ class InfoAction extends FormlessAction {
                                $whatLinksHere,
                                $this->msg( 'pageinfo-redirects-name' )->escaped(),
                                array(),
-                               array( 'hidelinks' => 1, 'hidetrans' => 1 )
+                               array(
+                                       'hidelinks' => 1,
+                                       'hidetrans' => 1,
+                                       'hideimages' => $title->getNamespace() == NS_FILE
+                               )
                        ),
                        $this->msg( 'pageinfo-redirects-value' )
                                ->numParams( count( $title->getRedirectsHere() ) )
@@ -386,7 +390,7 @@ class InfoAction extends FormlessAction {
                // Page protection
                $pageInfo['header-restrictions'] = array();
 
-               // Is this page effected by the cascading protection of something which includes it?
+               // Is this page affected by the cascading protection of something which includes it?
                if ( $title->isCascadeProtected() ) {
                        $cascadingFrom = '';
                        $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
@@ -630,7 +634,6 @@ class InfoAction extends FormlessAction {
         * @return array
         */
        protected function pageCounts( Title $title ) {
-               wfProfileIn( __METHOD__ );
                $id = $title->getArticleID();
                $config = $this->context->getConfig();
 
@@ -743,8 +746,6 @@ class InfoAction extends FormlessAction {
                        __METHOD__
                );
 
-               wfProfileOut( __METHOD__ );
-
                return $result;
        }
 
index e2e5a1d..0a8628d 100644 (file)
@@ -36,9 +36,7 @@ class UnwatchAction extends WatchAction {
        }
 
        public function onSubmit( $data ) {
-               wfProfileIn( __METHOD__ );
                self::doUnwatch( $this->getTitle(), $this->getUser() );
-               wfProfileOut( __METHOD__ );
 
                return true;
        }
index f333efb..9647340 100644 (file)
@@ -48,9 +48,7 @@ class WatchAction extends FormAction {
        }
 
        public function onSubmit( $data ) {
-               wfProfileIn( __METHOD__ );
                self::doWatch( $this->getTitle(), $this->getUser() );
-               wfProfileOut( __METHOD__ );
 
                return true;
        }
index 9cb895d..3a31b2a 100644 (file)
@@ -66,13 +66,11 @@ abstract class ApiBase extends ContextSource {
        const PARAM_RANGE_ENFORCE = 9;
        /// @since 1.25
        // Specify an alternative i18n message for this help parameter.
-       // Value can be a string key, an array giving key and parameters, or a
-       // Message object.
+       // Value is $msg for ApiBase::makeMessage()
        const PARAM_HELP_MSG = 10;
        /// @since 1.25
        // Specify additional i18n messages to append to the normal message. Value
-       // is an array of any of strings giving the message key, arrays giving key and
-       // parameters, or Message objects.
+       // is an array of $msg for ApiBase::makeMessage()
        const PARAM_HELP_MSG_APPEND = 11;
        /// @since 1.25
        // Specify additional information tags for the parameter. Value is an array
@@ -82,9 +80,14 @@ abstract class ApiBase extends ContextSource {
        // comma-joined list of values, $3 = module prefix.
        const PARAM_HELP_MSG_INFO = 12;
        /// @since 1.25
-       // When PARAM_DFLT is an array, this may be an array mapping those values
+       // When PARAM_TYPE is an array, this may be an array mapping those values
        // to page titles which will be linked in the help.
        const PARAM_VALUE_LINKS = 13;
+       /// @since 1.25
+       // When PARAM_TYPE is an array, this is an array mapping those values to
+       // $msg for ApiBase::makeMessage(). Any value not having a mapping will use
+       // apihelp-{$path}-paramvalue-{$param}-{$value} is used.
+       const PARAM_HELP_MSG_PER_VALUE = 14;
 
        const LIMIT_BIG1 = 500; // Fast query, std user limit
        const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit
@@ -1042,6 +1045,7 @@ abstract class ApiBase extends ContextSource {
         * @param string $token Supplied token
         * @param array $params All supplied parameters for the module
         * @return bool
+        * @throws MWException
         */
        final public function validateToken( $token, array $params ) {
                $tokenType = $this->needsToken();
@@ -1291,6 +1295,7 @@ abstract class ApiBase extends ContextSource {
         * @since 1.23
         * @param Status $status
         * @return array Array of code and error string
+        * @throws MWException
         */
        public function getErrorFromStatus( $status ) {
                if ( $status->isGood() ) {
@@ -2018,6 +2023,10 @@ abstract class ApiBase extends ContextSource {
         * @return array Keys are parameter names, values are arrays of Message objects
         */
        public function getFinalParamDescription() {
+               $prefix = $this->getModulePrefix();
+               $name = $this->getModuleName();
+               $path = $this->getModulePath();
+
                $desc = $this->getParamDescription();
                Hooks::run( 'APIGetParamDescription', array( &$this, &$desc ) );
 
@@ -2048,35 +2057,61 @@ abstract class ApiBase extends ContextSource {
                        if ( isset( $settings[ApiBase::PARAM_HELP_MSG] ) ) {
                                $msg = $settings[ApiBase::PARAM_HELP_MSG];
                        } else {
-                               $msg = $this->msg( "apihelp-{$this->getModulePath()}-param-{$param}" );
+                               $msg = $this->msg( "apihelp-{$path}-param-{$param}" );
                                if ( !$msg->exists() ) {
                                        $msg = $this->msg( 'api-help-fallback-parameter', $d );
                                }
                        }
-                       $msg = ApiBase::makeMessage( $msg, $this->getContext(), array(
-                               $this->getModulePrefix(),
-                               $param,
-                               $this->getModuleName(),
-                               $this->getModulePath(),
-                       ) );
+                       $msg = ApiBase::makeMessage( $msg, $this->getContext(),
+                               array( $prefix, $param, $name, $path ) );
                        if ( !$msg ) {
                                $this->dieDebug( __METHOD__,
                                        'Value in ApiBase::PARAM_HELP_MSG is not valid' );
                        }
                        $msgs[$param] = array( $msg );
 
+                       if ( isset( $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE] ) ) {
+                               if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE] ) ) {
+                                       $this->dieDebug( __METHOD__,
+                                               'ApiBase::PARAM_HELP_MSG_PER_VALUE is not valid' );
+                               }
+                               if ( !is_array( $settings[ApiBase::PARAM_TYPE] ) ) {
+                                       $this->dieDebug( __METHOD__,
+                                               'ApiBase::PARAM_HELP_MSG_PER_VALUE may only be used when ' .
+                                               'ApiBase::PARAM_TYPE is an array' );
+                               }
+
+                               $valueMsgs = $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE];
+                               foreach ( $settings[ApiBase::PARAM_TYPE] as $value ) {
+                                       if ( isset( $valueMsgs[$value] ) ) {
+                                               $msg = $valueMsgs[$value];
+                                       } else {
+                                               $msg = "apihelp-{$path}-paramvalue-{$param}-{$value}";
+                                       }
+                                       $m = ApiBase::makeMessage( $msg, $this->getContext(),
+                                               array( $prefix, $param, $name, $path, $value ) );
+                                       if ( $m ) {
+                                               $m = new ApiHelpParamValueMessage(
+                                                       $value,
+                                                       array( $m->getKey(), 'api-help-param-no-description' ),
+                                                       $m->getParams()
+                                               );
+                                               $msgs[$param][] = $m->setContext( $this->getContext() );
+                                       } else {
+                                               $this->dieDebug( __METHOD__,
+                                                       "Value in ApiBase::PARAM_HELP_MSG_PER_VALUE for $value is not valid" );
+                                       }
+                               }
+                       }
+
                        if ( isset( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) {
                                if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) {
                                        $this->dieDebug( __METHOD__,
                                                'Value for ApiBase::PARAM_HELP_MSG_APPEND is not an array' );
                                }
                                foreach ( $settings[ApiBase::PARAM_HELP_MSG_APPEND] as $m ) {
-                                       $m = ApiBase::makeMessage( $m, $this->getContext(), array(
-                                               $this->getModulePrefix(),
-                                               $param,
-                                               $this->getModuleName(),
-                                               $this->getModulePath(),
-                                       ) );
+                                       $m = ApiBase::makeMessage( $m, $this->getContext(),
+                                               array( $prefix, $param, $name, $path ) );
                                        if ( $m ) {
                                                $msgs[$param][] = $m;
                                        } else {
@@ -2146,6 +2181,10 @@ abstract class ApiBase extends ContextSource {
         * Profiling: total module execution time
         */
        private $mTimeIn = 0, $mModuleTime = 0;
+       /** @var ScopedCallback */
+       private $profile;
+       /** @var ScopedCallback */
+       private $dbProfile;
 
        /**
         * Get the name of the module as shown in the profiler log
@@ -2170,7 +2209,7 @@ abstract class ApiBase extends ContextSource {
                        ApiBase::dieDebug( __METHOD__, 'Called twice without calling profileOut()' );
                }
                $this->mTimeIn = microtime( true );
-               wfProfileIn( $this->getModuleProfileName() );
+               $this->profile = Profiler::instance()->scopedProfileIn( $this->getModuleProfileName() );
        }
 
        /**
@@ -2189,7 +2228,7 @@ abstract class ApiBase extends ContextSource {
 
                $this->mModuleTime += microtime( true ) - $this->mTimeIn;
                $this->mTimeIn = 0;
-               wfProfileOut( $this->getModuleProfileName() );
+               Profiler::instance()->scopedProfileOut( $this->profile );
        }
 
        /**
@@ -2236,7 +2275,8 @@ abstract class ApiBase extends ContextSource {
                        ApiBase::dieDebug( __METHOD__, 'Called twice without calling profileDBOut()' );
                }
                $this->mDBTimeIn = microtime( true );
-               wfProfileIn( $this->getModuleProfileName( true ) );
+
+               $this->dbProfile = Profiler::instance()->scopedProfileIn( $this->getModuleProfileName( true ) );
        }
 
        /**
@@ -2256,7 +2296,7 @@ abstract class ApiBase extends ContextSource {
 
                $this->mDBTime += $time;
                $this->getMain()->mDBTime += $time;
-               wfProfileOut( $this->getModuleProfileName( true ) );
+               Profiler::instance()->scopedProfileOut( $this->dbProfile );
        }
 
        /**
index f663cc6..8ad2ad9 100644 (file)
@@ -252,7 +252,7 @@ class ApiEditPage extends ApiBase {
                        'format' => $contentFormat,
                        'model' => $contentHandler->getModelID(),
                        'wpEditToken' => $params['token'],
-                       'wpIgnoreBlankSummary' => '',
+                       'wpIgnoreBlankSummary' => true,
                        'wpIgnoreBlankArticle' => true,
                        'wpIgnoreSelfRedirect' => true,
                );
@@ -462,7 +462,6 @@ class ApiEditPage extends ApiBase {
                        case EditPage::AS_CONFLICT_DETECTED:
                                $this->dieUsageMsg( 'editconflict' );
 
-                       // case EditPage::AS_SUMMARY_NEEDED: Can't happen since we set wpIgnoreBlankSummary
                        case EditPage::AS_TEXTBOX_EMPTY:
                                $this->dieUsageMsg( 'emptynewsection' );
 
@@ -487,6 +486,7 @@ class ApiEditPage extends ApiBase {
                                break;
 
                        case EditPage::AS_SUMMARY_NEEDED:
+                               // Shouldn't happen since we set wpIgnoreBlankSummary, but just in case
                                $this->dieUsageMsg( 'summaryrequired' );
 
                        case EditPage::AS_END:
index 751be75..4a5afb9 100644 (file)
@@ -114,7 +114,7 @@ class ApiExpandTemplates extends ApiBase {
                        } else {
                                if ( isset( $prop['categories'] ) ) {
                                        $categories = $wgParser->getOutput()->getCategories();
-                                       if ( !empty( $categories ) ) {
+                                       if ( $categories ) {
                                                $categories_result = array();
                                                foreach ( $categories as $category => $sortkey ) {
                                                        $entry = array();
@@ -126,6 +126,20 @@ class ApiExpandTemplates extends ApiBase {
                                                $retval['categories'] = $categories_result;
                                        }
                                }
+                               if ( isset( $prop['properties'] ) ) {
+                                       $properties = $wgParser->getOutput()->getProperties();
+                                       if ( $properties ) {
+                                               $properties_result = array();
+                                               foreach ( $properties as $name => $value ) {
+                                                       $entry = array();
+                                                       $entry['name'] = $name;
+                                                       ApiResult::setContent( $entry, $value );
+                                                       $properties_result[] = $entry;
+                                               }
+                                               $result->setIndexedTagName( $properties_result, 'property' );
+                                               $retval['properties'] = $properties_result;
+                                       }
+                               }
                                if ( isset( $prop['volatile'] ) && $frame->isVolatile() ) {
                                        $retval['volatile'] = '';
                                }
@@ -157,6 +171,7 @@ class ApiExpandTemplates extends ApiBase {
                                ApiBase::PARAM_TYPE => array(
                                        'wikitext',
                                        'categories',
+                                       'properties',
                                        'volatile',
                                        'ttl',
                                        'parsetree',
index e2d4d61..8662a64 100644 (file)
@@ -38,24 +38,16 @@ class ApiFormatWddx extends ApiFormatBase {
        public function execute() {
                $this->markDeprecated();
 
-               // Some versions of PHP have a broken wddx_serialize_value, see
-               // PHP bug 45314. Test encoding an affected character (U+00A0)
-               // to avoid this.
-               $expected =
-                       "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
-               if ( function_exists( 'wddx_serialize_value' )
-                       && !$this->getIsHtml()
-                       && wddx_serialize_value( "\xc2\xa0" ) == $expected
-               ) {
+               if ( !$this->getIsHtml() && !static::useSlowPrinter() ) {
                        $this->printText( wddx_serialize_value( $this->getResultData() ) );
                } else {
                        // Don't do newlines and indentation if we weren't asked
                        // for pretty output
                        $nl = ( $this->getIsHtml() ? "\n" : '' );
-                       $indstr = ' ';
+                       $indstr = ( $this->getIsHtml() ? ' ' : '' );
                        $this->printText( "<?xml version=\"1.0\"?>$nl" );
                        $this->printText( "<wddxPacket version=\"1.0\">$nl" );
-                       $this->printText( "$indstr<header/>$nl" );
+                       $this->printText( "$indstr<header />$nl" );
                        $this->printText( "$indstr<data>$nl" );
                        $this->slowWddxPrinter( $this->getResultData(), 4 );
                        $this->printText( "$indstr</data>$nl" );
@@ -63,6 +55,44 @@ class ApiFormatWddx extends ApiFormatBase {
                }
        }
 
+       public static function useSlowPrinter() {
+               if ( !function_exists( 'wddx_serialize_value' ) ) {
+                       return true;
+               }
+
+               // Some versions of PHP have a broken wddx_serialize_value, see
+               // PHP bug 45314. Test encoding an affected character (U+00A0)
+               // to avoid this.
+               $expected =
+                       "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
+               if ( wddx_serialize_value( "\xc2\xa0" ) !== $expected ) {
+                       return true;
+               }
+
+               // Some versions of HHVM don't correctly encode ampersands.
+               $expected =
+                       "<wddxPacket version='1.0'><header/><data><string>&amp;</string></data></wddxPacket>";
+               if ( wddx_serialize_value( '&' ) !== $expected ) {
+                       return true;
+               }
+
+               // Some versions of HHVM don't correctly encode empty arrays as subvalues.
+               $expected =
+                       "<wddxPacket version='1.0'><header/><data><array length='1'><array length='0'></array></array></data></wddxPacket>";
+               if ( wddx_serialize_value( array( array() ) ) !== $expected ) {
+                       return true;
+               }
+
+               // Some versions of HHVM don't correctly encode associative arrays with numeric keys.
+               $expected =
+                       "<wddxPacket version='1.0'><header/><data><struct><var name='2'><number>1</number></var></struct></data></wddxPacket>";
+               if ( wddx_serialize_value( array( 2 => 1 ) ) !== $expected ) {
+                       return true;
+               }
+
+               return false;
+       }
+
        /**
         * Recursively go through the object and output its data in WDDX format.
         * @param mixed $elemValue
@@ -104,6 +134,8 @@ class ApiFormatWddx extends ApiFormatBase {
                        $this->printText( $indstr . Xml::element( 'boolean',
                                array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
                        );
+               } elseif ( $elemValue === null ) {
+                       $this->printText( $indstr . Xml::element( 'null', array() ) . $nl );
                } else {
                        ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
                }
index 8708fb7..dd05f45 100644 (file)
@@ -546,10 +546,10 @@ class ApiHelp extends ApiBase {
                                        }
 
                                        if ( $description ) {
-                                               $help['parameters'] .= Html::openElement( 'dd',
-                                                       array( 'class' => 'description' ) );
-                                               $help['parameters'] .= join( '', $description );
-                                               $help['parameters'] .= Html::closeElement( 'dd' );
+                                               $description = join( '', $description );
+                                               $description = preg_replace( '!\s*</([oud]l)>\s*<\1>\s*!', "\n", $description );
+                                               $help['parameters'] .= Html::rawElement( 'dd',
+                                                       array( 'class' => 'description' ), $description );
                                        }
 
                                        foreach ( $info as $i ) {
diff --git a/includes/api/ApiHelpParamValueMessage.php b/includes/api/ApiHelpParamValueMessage.php
new file mode 100644 (file)
index 0000000..7cf3d6e
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ *
+ *
+ * Created on Dec 22, 2014
+ *
+ * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.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
+ */
+
+/**
+ * Message subclass that prepends wikitext for API help.
+ *
+ * This exists so the apihelp-*-paramvalue-*-* messages don't all have to
+ * include markup wikitext while still keeping the
+ * 'APIGetParamDescriptionMessages' hook simple.
+ *
+ * @since 1.25
+ */
+class ApiHelpParamValueMessage extends Message {
+
+       protected $paramValue;
+
+       /**
+        * @see Message::__construct
+        *
+        * @param string $paramValue Parameter value being documented
+        * @param string $text Message to use.
+        * @param array $params Parameters for the message.
+        * @throws InvalidArgumentException
+        */
+       public function __construct( $paramValue, $text, $params = array() ) {
+               parent::__construct( $text, $params );
+               $this->paramValue = $paramValue;
+       }
+
+       /**
+        * Fetch the parameter value
+        * @return string
+        */
+       public function getParamValue() {
+               return $this->paramValue;
+       }
+
+       /**
+        * Fetch the message.
+        * @return string
+        */
+       public function fetchMessage() {
+               if ( $this->message === null ) {
+                       $this->message = ";{$this->paramValue}:" . parent::fetchMessage();
+               }
+               return $this->message;
+       }
+
+}
index a134074..c7dcce8 100644 (file)
@@ -79,7 +79,7 @@ class ApiImport extends ApiBase {
 
                try {
                        $importer->doImport();
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $this->dieUsageMsg( array( 'import-unknownerror', $e->getMessage() ) );
                }
 
index 81353f6..9a98054 100644 (file)
@@ -190,19 +190,20 @@ class ApiMain extends ApiBase {
 
                $uselang = $this->getParameter( 'uselang' );
                if ( $uselang === 'user' ) {
-                       $uselang = $this->getUser()->getOption( 'language' );
-                       $uselang = RequestContext::sanitizeLangCode( $uselang );
-                       Hooks::run( 'UserGetLanguageObject', array( $this->getUser(), &$uselang, $this ) );
-               } elseif ( $uselang === 'content' ) {
-                       global $wgContLang;
-                       $uselang = $wgContLang->getCode();
-               }
-               $code = RequestContext::sanitizeLangCode( $uselang );
-               $this->getContext()->setLanguage( $code );
-               if ( !$this->mInternalMode ) {
-                       global $wgLang;
-                       $wgLang = $this->getContext()->getLanguage();
-                       RequestContext::getMain()->setLanguage( $wgLang );
+                       // Assume the parent context is going to return the user language
+                       // for uselang=user (see T85635).
+               } else {
+                       if ( $uselang === 'content' ) {
+                               global $wgContLang;
+                               $uselang = $wgContLang->getCode();
+                       }
+                       $code = RequestContext::sanitizeLangCode( $uselang );
+                       $this->getContext()->setLanguage( $code );
+                       if ( !$this->mInternalMode ) {
+                               global $wgLang;
+                               $wgLang = $this->getContext()->getLanguage();
+                               RequestContext::getMain()->setLanguage( $wgLang );
+                       }
                }
 
                $config = $this->getConfig();
@@ -458,6 +459,7 @@ class ApiMain extends ApiBase {
         *
         * @since 1.23
         * @param Exception $e
+        * @throws Exception
         */
        public static function handleApiBeforeMainException( Exception $e ) {
                ob_start();
@@ -486,6 +488,8 @@ class ApiMain extends ApiBase {
         * If the parameter and the header do match, the header is checked against $wgCrossSiteAJAXdomains
         * and $wgCrossSiteAJAXdomainExceptions, and if the origin qualifies, the appropriate CORS
         * headers are set.
+        * http://www.w3.org/TR/cors/#resource-requests
+        * http://www.w3.org/TR/cors/#resource-preflight-requests
         *
         * @return bool False if the caller should abort (403 case), true otherwise (all other cases)
         */
@@ -498,12 +502,14 @@ class ApiMain extends ApiBase {
 
                $request = $this->getRequest();
                $response = $request->response();
+
                // Origin: header is a space-separated list of origins, check all of them
                $originHeader = $request->getHeader( 'Origin' );
                if ( $originHeader === false ) {
                        $origins = array();
                } else {
-                       $origins = explode( ' ', $originHeader );
+                       $originHeader = trim( $originHeader );
+                       $origins = preg_split( '/\s+/', $originHeader );
                }
 
                if ( !in_array( $originParam, $origins ) ) {
@@ -518,19 +524,44 @@ class ApiMain extends ApiBase {
                }
 
                $config = $this->getConfig();
-               $matchOrigin = self::matchOrigin(
+               $matchOrigin = count( $origins ) === 1 && self::matchOrigin(
                        $originParam,
                        $config->get( 'CrossSiteAJAXdomains' ),
                        $config->get( 'CrossSiteAJAXdomainExceptions' )
                );
 
                if ( $matchOrigin ) {
-                       $response->header( "Access-Control-Allow-Origin: $originParam" );
+                       $requestedMethod = $request->getHeader( 'Access-Control-Request-Method' );
+                       $preflight = $request->getMethod() === 'OPTIONS' && $requestedMethod !== false;
+                       if ( $preflight ) {
+                               // This is a CORS preflight request
+                               if ( $requestedMethod !== 'POST' && $requestedMethod !== 'GET' ) {
+                                       // If method is not a case-sensitive match, do not set any additional headers and terminate.
+                                       return true;
+                               }
+                               // We allow the actual request to send the following headers
+                               $requestedHeaders = $request->getHeader( 'Access-Control-Request-Headers' );
+                               if ( $requestedHeaders !== false ) {
+                                       if ( !self::matchRequestedHeaders( $requestedHeaders ) ) {
+                                               return true;
+                                       }
+                                       $response->header( 'Access-Control-Allow-Headers: ' . $requestedHeaders );
+                               }
+
+                               // We only allow the actual request to be GET or POST
+                               $response->header( 'Access-Control-Allow-Methods: POST, GET' );
+                       }
+
+                       $response->header( "Access-Control-Allow-Origin: $originHeader" );
                        $response->header( 'Access-Control-Allow-Credentials: true' );
-                       $response->header( 'Access-Control-Allow-Headers: Api-User-Agent' );
-                       $this->getOutput()->addVaryHeader( 'Origin' );
+                       $response->header( "Timing-Allow-Origin: $originHeader" ); # http://www.w3.org/TR/resource-timing/#timing-allow-origin
+
+                       if ( !$preflight ) {
+                               $response->header( 'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag' );
+                       }
                }
 
+               $this->getOutput()->addVaryHeader( 'Origin' );
                return true;
        }
 
@@ -559,6 +590,41 @@ class ApiMain extends ApiBase {
                return false;
        }
 
+       /**
+        * Attempt to validate the value of Access-Control-Request-Headers against a list
+        * of headers that we allow the follow up request to send.
+        *
+        * @param string $requestedHeaders Comma seperated list of HTTP headers
+        * @return bool True if all requested headers are in the list of allowed headers
+        */
+       protected static function matchRequestedHeaders( $requestedHeaders ) {
+               if ( trim( $requestedHeaders ) === '' ) {
+                       return true;
+               }
+               $requestedHeaders = explode( ',', $requestedHeaders );
+               $allowedAuthorHeaders = array_flip( array(
+                       /* simple headers (see spec) */
+                       'accept',
+                       'accept-language',
+                       'content-language',
+                       'content-type',
+                       /* non-authorable headers in XHR, which are however requested by some UAs */
+                       'accept-encoding',
+                       'dnt',
+                       'origin',
+                       /* MediaWiki whitelist */
+                       'api-user-agent',
+               ) );
+               foreach ( $requestedHeaders as $rHeader ) {
+                       $rHeader = strtolower( trim( $rHeader ) );
+                       if ( !isset( $allowedAuthorHeaders[$rHeader] ) ) {
+                               wfDebugLog( 'api', 'CORS preflight failed on requested header: ' . $rHeader );
+                               return false;
+                       }
+               }
+               return true;
+       }
+
        /**
         * Helper function to convert wildcard string into a regex
         * '*' => '.*?'
@@ -575,7 +641,7 @@ class ApiMain extends ApiBase {
                        $wildcard
                );
 
-               return "/https?:\/\/$wildcard/";
+               return "/^https?:\/\/$wildcard$/";
        }
 
        protected function sendCacheHeaders() {
@@ -709,12 +775,14 @@ class ApiMain extends ApiBase {
 
                        $errMessage = array(
                                'code' => 'internal_api_error_' . get_class( $e ),
-                               'info' => $info,
-                       );
-                       ApiResult::setContent(
-                               $errMessage,
-                               $config->get( 'ShowExceptionDetails' ) ? "\n\n{$e->getTraceAsString()}\n\n" : ''
+                               'info' => '[' . MWExceptionHandler::getLogId( $e ) . '] ' . $info,
                        );
+                       if ( $config->get( 'ShowExceptionDetails' ) ) {
+                               ApiResult::setContent(
+                                       $errMessage,
+                                       MWExceptionHandler::getRedactedTraceAsString( $e )
+                               );
+                       }
                }
 
                // Remember all the warnings to re-add them later
@@ -778,6 +846,8 @@ class ApiMain extends ApiBase {
        /**
         * Set up the module for response
         * @return ApiBase The module that will handle this action
+        * @throws MWException
+        * @throws UsageException
         */
        protected function setupModule() {
                // Instantiate the module requested by the user
index f4b99ae..f24a03f 100644 (file)
@@ -118,7 +118,7 @@ class ApiOpenSearch extends ApiBase {
         * @param int $limit Maximum items to return
         * @param array $namespaces Namespaces to search
         * @param bool $resolveRedir Whether to resolve redirects
-        * @param array &$results Put results here
+        * @param array &$results Put results here. Keys have to be integers.
         */
        protected function search( $search, $limit, $namespaces, $resolveRedir, &$results ) {
                // Find matching titles as Title objects
@@ -128,24 +128,31 @@ class ApiOpenSearch extends ApiBase {
                        return;
                }
 
+               // Special pages need unique integer ids in the return list, so we just
+               // assign them negative numbers because those won't clash with the
+               // always positive articleIds that non-special pages get.
+               $nextSpecialPageId = -1;
+
                if ( $resolveRedir ) {
                        // Query for redirects
-                       $db = $this->getDb();
-                       $lb = new LinkBatch( $titles );
-                       $res = $db->select(
-                               array( 'page', 'redirect' ),
-                               array( 'page_namespace', 'page_title', 'rd_namespace', 'rd_title' ),
-                               array(
-                                       'rd_from = page_id',
-                                       'rd_interwiki IS NULL OR rd_interwiki = ' . $db->addQuotes( '' ),
-                                       $lb->constructSet( 'page', $db ),
-                               ),
-                               __METHOD__
-                       );
                        $redirects = array();
-                       foreach ( $res as $row ) {
-                               $redirects[$row->page_namespace][$row->page_title] =
-                                       array( $row->rd_namespace, $row->rd_title );
+                       $lb = new LinkBatch( $titles );
+                       if ( !$lb->isEmpty() ) {
+                               $db = $this->getDb();
+                               $res = $db->select(
+                                       array( 'page', 'redirect' ),
+                                       array( 'page_namespace', 'page_title', 'rd_namespace', 'rd_title' ),
+                                       array(
+                                               'rd_from = page_id',
+                                               'rd_interwiki IS NULL OR rd_interwiki = ' . $db->addQuotes( '' ),
+                                               $lb->constructSet( 'page', $db ),
+                                       ),
+                                       __METHOD__
+                               );
+                               foreach ( $res as $row ) {
+                                       $redirects[$row->page_namespace][$row->page_title] =
+                                               array( $row->rd_namespace, $row->rd_title );
+                               }
                        }
 
                        // Bypass any redirects
@@ -161,7 +168,12 @@ class ApiOpenSearch extends ApiBase {
                                }
                                if ( !isset( $seen[$ns][$dbkey] ) ) {
                                        $seen[$ns][$dbkey] = true;
-                                       $results[$title->getArticleId()] = array(
+                                       $resultId = $title->getArticleId();
+                                       if ( $resultId === 0 ) {
+                                               $resultId = $nextSpecialPageId;
+                                               $nextSpecialPageId -= 1;
+                                       }
+                                       $results[$resultId] = array(
                                                'title' => $title,
                                                'redirect from' => $from,
                                                'extract' => false,
@@ -173,7 +185,12 @@ class ApiOpenSearch extends ApiBase {
                        }
                } else {
                        foreach ( $titles as $title ) {
-                               $results[$title->getArticleId()] = array(
+                               $resultId = $title->getArticleId();
+                               if ( $resultId === 0 ) {
+                                       $resultId = $nextSpecialPageId;
+                                       $nextSpecialPageId -= 1;
+                               }
+                               $results[$resultId] = array(
                                        'title' => $title,
                                        'redirect from' => null,
                                        'extract' => false,
@@ -323,6 +340,7 @@ class ApiOpenSearch extends ApiBase {
         *
         * @param string $type MIME type
         * @return string
+        * @throws MWException
         */
        public static function getOpenSearchTemplate( $type ) {
                global $wgOpenSearchTemplate, $wgCanonicalServer;
index 1417ef7..981c119 100644 (file)
@@ -450,6 +450,9 @@ class ApiPageSet extends ApiBase {
                        if ( $titleTo->hasFragment() ) {
                                $r['tofragment'] = $titleTo->getFragment();
                        }
+                       if ( $titleTo->isExternal() ) {
+                               $r['tointerwiki'] = $titleTo->getInterwiki();
+                       }
                        $values[] = $r;
                }
                if ( !empty( $values ) && $result ) {
@@ -1049,7 +1052,9 @@ class ApiPageSet extends ApiBase {
                                $row->rd_interwiki
                        );
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
-                       if ( !$to->isExternal() && !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
+                       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 );
                        }
                        $this->mRedirectTitles[$from] = $to;
@@ -1326,7 +1331,13 @@ class ApiPageSet extends ApiBase {
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_HELP_MSG => array(
                                        'api-pageset-param-converttitles',
-                                       $this->getLanguage()->commaList( LanguageConverter::$languagesWithVariants ),
+                                       new DeferredStringifier(
+                                               function ( IContextSource $context ) {
+                                                       return $context->getLanguage()
+                                                               ->commaList( LanguageConverter::$languagesWithVariants );
+                                               },
+                                               $this
+                                       )
                                ),
                        ),
                );
index 17773a7..b74d528 100644 (file)
@@ -129,8 +129,9 @@ class ApiParamInfo extends ApiBase {
         * @param array $res Result array
         * @param string $key Result key
         * @param Message[] $msgs
+        * @param bool $joinLists
         */
-       protected function formatHelpMessages( array &$res, $key, array $msgs ) {
+       protected function formatHelpMessages( array &$res, $key, array $msgs, $joinLists = false ) {
                switch ( $this->helpFormat ) {
                        case 'none':
                                break;
@@ -141,6 +142,9 @@ class ApiParamInfo extends ApiBase {
                                        $ret[] = $m->setContext( $this->context )->text();
                                }
                                $res[$key] = join( "\n\n", $ret );
+                               if ( $joinLists ) {
+                                       $res[$key] = preg_replace( '!^(([*#:;])[^\n]*)\n\n(?=\2)!m', "$1\n", $res[$key] );
+                               }
                                break;
 
                        case 'html':
@@ -148,16 +152,24 @@ class ApiParamInfo extends ApiBase {
                                foreach ( $msgs as $m ) {
                                        $ret[] = $m->setContext( $this->context )->parseAsBlock();
                                }
-                               $res[$key] = join( "\n", $ret );
+                               $ret = join( "\n", $ret );
+                               if ( $joinLists ) {
+                                       $ret = preg_replace( '!\s*</([oud]l)>\s*<\1>\s*!', "\n", $ret );
+                               }
+                               $res[$key] = $ret;
                                break;
 
                        case 'raw':
                                $res[$key] = array();
                                foreach ( $msgs as $m ) {
-                                       $res[$key][] = array(
+                                       $a = array(
                                                'key' => $m->getKey(),
                                                'params' => $m->getParams(),
                                        );
+                                       if ( $m instanceof ApiHelpParamValueMessage ) {
+                                               $a['forvalue'] = $m->getParamValue();
+                                       }
+                                       $res[$key][] = $a;
                                }
                                $this->getResult()->setIndexedTagName( $res[$key], 'msg' );
                                break;
@@ -232,7 +244,7 @@ class ApiParamInfo extends ApiBase {
                                'name' => $name
                        );
                        if ( isset( $paramDesc[$name] ) ) {
-                               $this->formatHelpMessages( $item, 'description', $paramDesc[$name] );
+                               $this->formatHelpMessages( $item, 'description', $paramDesc[$name], true );
                        }
 
                        if ( !empty( $settings[ApiBase::PARAM_REQUIRED] ) ) {
index ff91b92..83d2cbc 100644 (file)
@@ -419,7 +419,6 @@ class ApiParse extends ApiBase {
         * @return ParserOptions
         */
        protected function makeParserOptions( WikiPage $pageObj, array $params ) {
-               wfProfileIn( __METHOD__ );
 
                $popts = $pageObj->makeParserOptions( $this->getContext() );
                $popts->enableLimitReport( !$params['disablepp'] );
@@ -427,8 +426,6 @@ class ApiParse extends ApiBase {
                $popts->setIsSectionPreview( $params['sectionpreview'] );
                $popts->setEditSection( !$params['disableeditsection'] );
 
-               wfProfileOut( __METHOD__ );
-
                return $popts;
        }
 
index 725b782..6c962cd 100644 (file)
@@ -232,10 +232,25 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
                        }
 
-                       list( $major, $minor ) = File::splitMime( $params['mime'] );
-
-                       $this->addWhereFld( 'img_major_mime', $major );
-                       $this->addWhereFld( 'img_minor_mime', $minor );
+                       $mimeConds = array();
+                       foreach ( $params['mime'] as $mime ) {
+                               list( $major, $minor ) = File::splitMime( $mime );
+                               $mimeConds[] = $db->makeList(
+                                       array(
+                                               'img_major_mime' => $major,
+                                               'img_minor_mime' => $minor,
+                                       ),
+                                       LIST_AND
+                               );
+                       }
+                       // safeguard against internal_api_error_DBQueryError
+                       if ( count( $mimeConds ) > 0 ) {
+                               $this->addWhere( $db->makeList( $mimeConds, LIST_OR ) );
+                       } else {
+                               // no MIME types, no files
+                               $this->getResult()->addValue( 'query', $this->getModuleName(), array() );
+                               return;
+                       }
                }
 
                $limit = $params['limit'];
@@ -333,7 +348,9 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        'prop' => array(
                                ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
                                ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_ISMULTI => true
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-prop',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => ApiQueryImageInfo::getPropertyMessages( $this->propertyFilter ),
                        ),
                        'prefix' => null,
                        'minsize' => array(
@@ -357,6 +374,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        ),
                        'mime' => array(
                                ApiBase::PARAM_DFLT => null,
+                               ApiBase::PARAM_ISMULTI => true,
                        ),
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
@@ -383,6 +401,8 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        'action=query&list=allimages&aiprop=user|timestamp|url&' .
                                'aisort=timestamp&aidir=older'
                                => 'apihelp-query+allimages-example-recent',
+                       'action=query&list=allimages&aimime=image/png|image/gif'
+                               => 'apihelp-query+allimages-example-mimetypes',
                        'action=query&generator=allimages&gailimit=4&' .
                                'gaifrom=T&prop=imageinfo'
                                => 'apihelp-query+allimages-example-generator',
index a85c9c9..e243593 100644 (file)
@@ -168,9 +168,23 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $this->addTables( 'langlinks' );
                        $this->addWhere( 'page_id=ll_from' );
                        $this->addOption( 'STRAIGHT_JOIN' );
-                       // We have to GROUP BY all selected fields to stop
-                       // PostgreSQL from whining
-                       $this->addOption( 'GROUP BY', $selectFields );
+
+                       // MySQL filesorts if we use a GROUP BY that works with the rules
+                       // in the 1992 SQL standard (it doesn't like having the
+                       // constant-in-WHERE page_namespace column in there). Using the
+                       // 1999 rules works fine, but that breaks other DBs. Sigh.
+                       /// @todo Once we drop support for 1992-rule DBs, we can simplify this.
+                       $dbType = $db->getType();
+                       if ( $dbType === 'mysql' || $dbType === 'sqlite' ||
+                               $dbType === 'postgres' && $db->getServerVersion() >= 9.1
+                       ) {
+                               // 1999 rules, or screw-the-rules
+                               $this->addOption( 'GROUP BY', array( 'page_title', 'page_id' ) );
+                       } else {
+                               // 1992 rules
+                               $this->addOption( 'GROUP BY', $selectFields );
+                       }
+
                        $forceNameTitleIndex = false;
                }
 
index cfd06f1..c4ca5d6 100644 (file)
@@ -632,7 +632,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DFLT => 'timestamp|user',
-                               ApiBase::PARAM_TYPE => self::getPropertyNames()
+                               ApiBase::PARAM_TYPE => self::getPropertyNames(),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => self::getPropertyMessages(),
                        ),
                        'limit' => array(
                                ApiBase::PARAM_TYPE => 'limit',
@@ -690,11 +691,43 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * Returns all possible parameters to iiprop
         *
         * @param array $filter List of properties to filter out
-        *
         * @return array
         */
        public static function getPropertyNames( $filter = array() ) {
-               return array_diff( array_keys( self::getProperties() ), $filter );
+               return array_keys( self::getPropertyMessages( $filter ) );
+       }
+
+       /**
+        * Returns messages for all possible parameters to iiprop
+        *
+        * @param array $filter List of properties to filter out
+        * @return array
+        */
+       public static function getPropertyMessages( $filter = array() ) {
+               return array_diff_key(
+                       array(
+                               'timestamp' => 'apihelp-query+imageinfo-paramvalue-prop-timestamp',
+                               'user' => 'apihelp-query+imageinfo-paramvalue-prop-user',
+                               'userid' => 'apihelp-query+imageinfo-paramvalue-prop-userid',
+                               'comment' => 'apihelp-query+imageinfo-paramvalue-prop-comment',
+                               'parsedcomment' => 'apihelp-query+imageinfo-paramvalue-prop-parsedcomment',
+                               'canonicaltitle' => 'apihelp-query+imageinfo-paramvalue-prop-canonicaltitle',
+                               'url' => 'apihelp-query+imageinfo-paramvalue-prop-url',
+                               'size' => 'apihelp-query+imageinfo-paramvalue-prop-size',
+                               'dimensions' => 'apihelp-query+imageinfo-paramvalue-prop-dimensions',
+                               'sha1' => 'apihelp-query+imageinfo-paramvalue-prop-sha1',
+                               'mime' => 'apihelp-query+imageinfo-paramvalue-prop-mime',
+                               'thumbmime' => 'apihelp-query+imageinfo-paramvalue-prop-thumbmime',
+                               'mediatype' => 'apihelp-query+imageinfo-paramvalue-prop-mediatype',
+                               'metadata' => 'apihelp-query+imageinfo-paramvalue-prop-metadata',
+                               'commonmetadata' => 'apihelp-query+imageinfo-paramvalue-prop-commonmetadata',
+                               'extmetadata' => 'apihelp-query+imageinfo-paramvalue-prop-extmetadata',
+                               'archivename' => 'apihelp-query+imageinfo-paramvalue-prop-archivename',
+                               'bitdepth' => 'apihelp-query+imageinfo-paramvalue-prop-bitdepth',
+                               'uploadwarning' => 'apihelp-query+imageinfo-paramvalue-prop-uploadwarning',
+                       ),
+                       array_flip( $filter )
+               );
        }
 
        /**
index 88b2074..05a1a15 100644 (file)
@@ -42,7 +42,7 @@ class ApiQueryInfo extends ApiQueryBase {
        private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
                $pageLatest, $pageLength;
 
-       private $protections, $watched, $watchers, $notificationtimestamps,
+       private $protections, $restrictionTypes, $watched, $watchers, $notificationtimestamps,
                $talkids, $subjectids, $displaytitles;
        private $showZeroWatchers = false;
 
@@ -419,6 +419,13 @@ class ApiQueryInfo extends ApiQueryBase {
                                        $this->protections[$ns][$dbkey];
                        }
                        $this->getResult()->setIndexedTagName( $pageInfo['protection'], 'pr' );
+
+                       $pageInfo['restrictiontypes'] = array();
+                       if ( isset( $this->restrictionTypes[$ns][$dbkey] ) ) {
+                               $pageInfo['restrictiontypes'] =
+                                       $this->restrictionTypes[$ns][$dbkey];
+                       }
+                       $this->getResult()->setIndexedTagName( $pageInfo['restrictiontypes'], 'rt' );
                }
 
                if ( $this->fld_watched && isset( $this->watched[$ns][$dbkey] ) ) {
@@ -568,7 +575,8 @@ class ApiQueryInfo extends ApiQueryBase {
                        }
                }
 
-               // Cascading protections
+               // Separate good and missing titles into files and other pages
+               // and populate $this->restrictionTypes
                $images = $others = array();
                foreach ( $this->everything as $title ) {
                        if ( $title->getNamespace() == NS_FILE ) {
@@ -576,6 +584,9 @@ class ApiQueryInfo extends ApiQueryBase {
                        } else {
                                $others[] = $title;
                        }
+                       // Applicable protection types
+                       $this->restrictionTypes[$title->getNamespace()][$title->getDBkey()] =
+                               array_values( $title->getRestrictionTypes() );
                }
 
                if ( count( $others ) ) {
@@ -811,7 +822,9 @@ class ApiQueryInfo extends ApiQueryBase {
                                        'displaytitle',
                                        // If you add more properties here, please consider whether they
                                        // need to be added to getCacheMode()
-                               ) ),
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
+                       ),
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_DFLT => null,
index 5f9fae4..7d79680 100644 (file)
@@ -36,7 +36,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        private $fld_ids = false, $fld_title = false, $fld_type = false,
-               $fld_action = false, $fld_user = false, $fld_userid = false,
+               $fld_user = false, $fld_userid = false,
                $fld_timestamp = false, $fld_comment = false, $fld_parsedcomment = false,
                $fld_details = false, $fld_tags = false;
 
@@ -50,7 +50,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_type = isset( $prop['type'] );
-               $this->fld_action = isset( $prop['action'] );
                $this->fld_user = isset( $prop['user'] );
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_timestamp = isset( $prop['timestamp'] );
@@ -200,8 +199,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                // Paranoia: avoid brute force searches (bug 17342)
-               $hideActions = $params['namespace'] !== null || !is_null( $title ) || !is_null( $params['action'] );
-               if ( $hideActions || !is_null( $user ) ) {
+               if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
                                $userBits = LogPage::DELETED_USER;
@@ -212,7 +210,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                $titleBits = 0;
                                $userBits = 0;
                        }
-                       if ( $hideActions && $titleBits ) {
+                       if ( ( $params['namespace'] !== null || !is_null( $title ) ) && $titleBits ) {
                                $this->addWhere( $db->bitAnd( 'log_deleted', $titleBits ) . " != $titleBits" );
                        }
                        if ( !is_null( $user ) && $userBits ) {
@@ -373,18 +371,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $title = Title::makeTitle( $row->log_namespace, $row->log_title );
                }
 
-               if ( $this->fld_title || $this->fld_ids || $this->fld_type
-                       || $this->fld_details && $row->log_params !== ''
-               ) {
+               if ( $this->fld_title || $this->fld_ids || $this->fld_details && $row->log_params !== '' ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
                                $vals['actionhidden'] = '';
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCan( $row, LogPage::DELETED_ACTION, $user ) ) {
-
-                               if ( $this->fld_type ) {
-                                       $vals['action'] = $row->log_action;
-                               }
                                if ( $this->fld_title ) {
                                        ApiQueryBase::addTitleInfo( $vals, $title );
                                }
@@ -408,6 +400,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( $this->fld_type ) {
                        $vals['type'] = $row->log_type;
+                       $vals['action'] = $row->log_action;
                }
 
                if ( $this->fld_user || $this->fld_userid ) {
index cdc61cd..b6ef604 100644 (file)
@@ -178,7 +178,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                if ( !is_null( $params['type'] ) ) {
                        try {
                                $this->addWhereFld( 'rc_type', RecentChange::parseToRCType( $params['type'] ) );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                ApiBase::dieDebug( __METHOD__, $e->getMessage() );
                        }
                }
index a658309..281f838 100644 (file)
@@ -179,9 +179,9 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                        if ( $revision->userCan( Revision::DELETED_USER, $user ) ) {
                                if ( $this->fld_user ) {
-                                       $vals['user'] = $revision->getRawUserText();
+                                       $vals['user'] = $revision->getUserText( Revision::RAW );
                                }
-                               $userid = $revision->getRawUser();
+                               $userid = $revision->getUser( Revision::RAW );
                                if ( !$userid ) {
                                        $vals['anon'] = '';
                                }
@@ -228,7 +228,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                $anyHidden = true;
                        }
                        if ( $revision->userCan( Revision::DELETED_COMMENT, $user ) ) {
-                               $comment = $revision->getRawComment();
+                               $comment = $revision->getComment( Revision::RAW );
 
                                if ( $this->fld_comment ) {
                                        $vals['comment'] = $comment;
index be6f669..1debb2e 100644 (file)
@@ -90,7 +90,9 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_TYPE => self::getPropertyNames( $this->propertyFilter )
+                               ApiBase::PARAM_TYPE => self::getPropertyNames( $this->propertyFilter ),
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-prop',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => self::getPropertyMessages( $this->propertyFilter )
                        ),
                        'urlwidth' => array(
                                ApiBase::PARAM_TYPE => 'integer',
index e8d7258..2e107ac 100644 (file)
@@ -55,7 +55,6 @@ class ApiQueryTokens extends ApiQueryBase {
        public static function getTokenTypeSalts() {
                static $salts = null;
                if ( !$salts ) {
-                       wfProfileIn( __METHOD__ );
                        $salts = array(
                                'csrf' => '',
                                'watch' => 'watch',
@@ -65,7 +64,6 @@ class ApiQueryTokens extends ApiQueryBase {
                        );
                        Hooks::run( 'ApiQueryTokensRegisterTypes', array( &$salts ) );
                        ksort( $salts );
-                       wfProfileOut( __METHOD__ );
                }
 
                return $salts;
index fed5a33..aa38564 100644 (file)
@@ -167,9 +167,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
                if ( isset( $this->prop['unreadcount'] ) ) {
                        $dbr = $this->getQuery()->getNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
 
-                       $sql = $dbr->selectSQLText(
+                       $count = $dbr->selectRowCount(
                                'watchlist',
-                               array( 'dummy' => 1 ),
+                               '1',
                                array(
                                        'wl_user' => $user->getId(),
                                        'wl_notificationtimestamp IS NOT NULL',
@@ -177,7 +177,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                __METHOD__,
                                array( 'LIMIT' => self::WL_UNREAD_LIMIT )
                        );
-                       $count = $dbr->selectField( array( 'c' => "($sql)" ), 'COUNT(*)' );
 
                        if ( $count >= self::WL_UNREAD_LIMIT ) {
                                $vals['unreadcount'] = self::WL_UNREAD_LIMIT . '+';
index 4059ff8..6e60fe4 100644 (file)
@@ -199,7 +199,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                if ( !is_null( $params['type'] ) ) {
                        try {
                                $this->addWhereFld( 'rc_type', RecentChange::parseToRCType( $params['type'] ) );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                ApiBase::dieDebug( __METHOD__, $e->getMessage() );
                        }
                }
index 5bc2efb..306c478 100644 (file)
@@ -518,6 +518,7 @@ class ApiResult extends ApiBase {
         * @param ApiBase $module
         * @param string $paramName
         * @param string|array $paramValue
+        * @throws MWException
         */
        public function setContinueParam( ApiBase $module, $paramName, $paramValue ) {
                $name = $module->getModuleName();
index 2f9f37e..09489e4 100644 (file)
@@ -239,7 +239,9 @@ class ApiStashEdit extends ApiBase {
                                $wgMemc->unlock( $key );
                        }
                        $sec = microtime( true ) - $start;
-                       wfDebugLog( 'StashEdit', "Waited $sec seconds on '$key'." );
+                       if ( $sec > .01 ) {
+                               wfDebugLog( 'StashEdit', "Waited $sec seconds on '$key'." );
+                       }
                }
 
                if ( !is_object( $editInfo ) || !$editInfo->output ) {
@@ -331,7 +333,12 @@ class ApiStashEdit extends ApiBase {
                // If an item is renewed, mind the cache TTL determined by config and parser functions
                $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() );
                $ttl = min( $parserOutput->getCacheExpiry() - $since, 5 * 60 );
-               if ( $ttl > 0 && !$parserOutput->getFlag( 'vary-revision' ) ) {
+
+               // Note: ParserOutput with that contains secondary data update callbacks can not be
+               // stashed, since the callbacks are not serializable (see ParserOutput::__sleep).
+               $hasCustomDataUpdates = $parserOutput->hasCustomDataUpdates();
+
+               if ( $ttl > 0 && !$parserOutput->getFlag( 'vary-revision' ) && !$hasCustomDataUpdates ) {
                        // Only store what is actually needed
                        $stashInfo = (object)array(
                                'pstContent' => $pstContent,
index f7290af..073495c 100644 (file)
@@ -63,7 +63,6 @@ class ApiTokens extends ApiBase {
                if ( $types ) {
                        return $types;
                }
-               wfProfileIn( __METHOD__ );
                $types = array( 'patrol' => array( 'ApiQueryRecentChanges', 'getPatrolToken' ) );
                $names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
                        'email', 'import', 'watch', 'options' );
@@ -72,7 +71,6 @@ class ApiTokens extends ApiBase {
                }
                Hooks::run( 'ApiTokensGetTokenTypes', array( &$types ) );
                ksort( $types );
-               wfProfileOut( __METHOD__ );
 
                return $types;
        }
index 43e4c61..d6ad7f3 100644 (file)
@@ -161,7 +161,7 @@ class ApiUpload extends ApiBase {
                        }
                } catch ( UploadStashException $e ) {
                        $this->handleStashException( $e );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $this->dieUsage( $e->getMessage(), 'stashfailed' );
                }
 
@@ -182,7 +182,7 @@ class ApiUpload extends ApiBase {
                try {
                        $result['filekey'] = $this->performStash();
                        $result['sessionkey'] = $result['filekey']; // backwards compatibility
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $result['warnings']['stashfailed'] = $e->getMessage();
                }
 
@@ -209,7 +209,7 @@ class ApiUpload extends ApiBase {
                                $filekey = $this->performStash();
                        } catch ( UploadStashException $e ) {
                                $this->handleStashException( $e );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // FIXME: Error handling here is wrong/different from rest of this
                                $this->dieUsage( $e->getMessage(), 'stashfailed' );
                        }
@@ -283,7 +283,7 @@ class ApiUpload extends ApiBase {
                                throw new MWException( 'Invalid stashed file' );
                        }
                        $fileKey = $stashFile->getFileKey();
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $message = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage();
                        wfDebug( __METHOD__ . ' ' . $message . "\n" );
                        $className = get_class( $e );
@@ -306,7 +306,7 @@ class ApiUpload extends ApiBase {
                try {
                        $data['filekey'] = $this->performStash();
                        $data['sessionkey'] = $data['filekey'];
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $data['stashfailed'] = $e->getMessage();
                }
                $data['invalidparameter'] = $parameter;
index d82b0d8..ce0943c 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Meno25",
-                       "أحمد المحمودي"
+                       "أحمد المحمودي",
+                       "Khaled"
                ]
        },
        "apihelp-main-param-format": "صيغة الخرج.",
@@ -19,5 +20,6 @@
        "apihelp-delete-description": "حذف صفحة.",
        "apihelp-delete-param-unwatch": "أزل الصفحة من قائمة مراقبتك.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-emailuser-description": "مراسلة المستخدم",
        "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
 }
index 3f1d862..d50831a 100644 (file)
@@ -4,7 +4,7 @@
                        "Red Winged Duck"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Дакумэнтацыя]\n* [https://www.mediawiki.org/wiki/API:FAQ Частыя пытаньні]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Памылкі і запыты]\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», а потым і значэньне загалоўка і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Дакумэнтацыя]\n* [https://www.mediawiki.org/wiki/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», а потым і значэньне загалоўка і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Дзеяньне для выкананьня.",
        "apihelp-main-param-format": "Фармат вываду.",
        "apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі «maxlag» з паведамленьнем кшталту «Чаканьне $host: $lag сэкундаў затрымкі».<br />Глядзіце https://www.mediawiki.org/wiki/Manual:Maxlag_parameter дзеля дадатковай інфармацыі.",
        "apihelp-block-param-autoblock": "Аўтаматычна блякаваць апошні ўжыты IP-адрас, а таксама ўсе наступныя IP-адрасы, зь якіх будуць спробы ўваходу.",
        "apihelp-block-param-noemail": "Забараняе ўдзельніку дасылаць лісты электроннай пошты празь вікі (трэба мець права «blockemail»).",
        "apihelp-block-param-hidename": "Схаваць імя ўдзельніка з журналу блякаваньняў (патрабуе права «hideuser»).",
-       "apihelp-block-param-allowusertalk": "Дазволіць удзельніку рэдагаваць уласную старонку гутарак (залежыць ад $wgBlockAllowsUTEdit)."
+       "apihelp-block-param-allowusertalk": "Дазволіць удзельніку рэдагаваць уласную старонку гутарак (залежыць ад $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Калі ўдзельнік ужо заблякаваны, перапісаць дзейнае блякаваньне.",
+       "apihelp-block-param-watchuser": "Назіраць за старонкай удзельніка або старонкай IP-адрасу, а таксама старонкай гутарак.",
+       "apihelp-block-example-ip-simple": "Заблякаваць IP-адрас 192.0.2.5 на тры дні з прычынай «First strike»",
+       "apihelp-block-example-user-complex": "Заблякаваць удзельніка Vandal назаўсёды з прычынай «Vandalism», а таксама забараніць стварэньне новых рахункаў і адсылку лістоў электроннай поштай",
+       "apihelp-clearhasmsg-description": "Ачышчае сьцяг hasmsg для актуальнага карыстальніка.",
+       "apihelp-clearhasmsg-example-1": "Ачыстка сьцягу hasmsg для актуальнага карыстальніка",
+       "apihelp-compare-description": "Атрымаць розьніцу паміж 2 старонкамі.\n\nВы мусіце перадаць нумар вэрсіі, назву або ID старонкі для абодвух «from» і «to».",
+       "apihelp-compare-param-fromtitle": "Першая назва для параўнаньня.",
+       "apihelp-compare-param-fromid": "ID першай старонкі для параўнаньня.",
+       "apihelp-compare-param-fromrev": "Першая вэрсія для параўнаньня.",
+       "apihelp-compare-param-totitle": "Другая назва для параўнаньня.",
+       "apihelp-compare-param-toid": "ID другой старонкі для параўнаньня.",
+       "apihelp-compare-param-torev": "Другая вэрсія для параўнаньня.",
+       "apihelp-compare-example-1": "Паказвае розьніцу паміж вэрсіямі 1 і 2",
+       "apihelp-createaccount-description": "Стварэньне новага рахунку ўдзельніка.",
+       "apihelp-createaccount-param-name": "Імя ўдзельніка.",
+       "apihelp-createaccount-param-password": "Пароль (ігнаруецца, калі выстаўлена $1mailpassword).",
+       "apihelp-createaccount-param-domain": "Дамэн для вонкавай аўтэнтыфікацыі (неабавязкова).",
+       "apihelp-createaccount-param-token": "Маркер стварэньня рахунку, атрыманы пры першым запыце.",
+       "apihelp-createaccount-param-email": "Адрас электроннай пошты ўдзельніка (неабавязкова).",
+       "apihelp-createaccount-param-realname": "Сапраўднае імя ўдзельніка (неабавязкова).",
+       "apihelp-createaccount-param-mailpassword": "Калі ўсталяванае любое значэньне, выпадковы пароль будзе дасланы карыстальніку на электронную пошту.",
+       "apihelp-createaccount-param-reason": "Неабавязковая прычына стварэньня рахунку, якая будзе запісаная ў журнал.",
+       "apihelp-createaccount-param-language": "Моўны код, які будзе выстаўлены ўдзельніку па змоўчаньні (неабавязкова, па змоўчаньні мова зьместу)."
 }
index c8df203..420e6ac 100644 (file)
@@ -4,8 +4,13 @@
                        "Palapa"
                ]
        },
+       "apihelp-main-param-action": "Koju akciju izvesti.",
+       "apihelp-main-param-format": "Format izlaza.",
        "apihelp-block-description": "Blokiraj korisnika",
        "apihelp-block-param-reason": "Razlog za blokadu",
+       "apihelp-block-example-ip-simple": "Blokiraj IP 192.0.2.5 na tri dana sa razlogom \"Prvi napad\"",
+       "apihelp-compare-param-fromtitle": "Prvi naslov za poređenje.",
        "apihelp-delete-description": "Obriši stranicu.",
+       "apihelp-edit-param-text": "Sadržaj stranice.",
        "apihelp-edit-param-minor": "Mala izmjena."
 }
diff --git a/includes/api/i18n/ca.json b/includes/api/i18n/ca.json
new file mode 100644 (file)
index 0000000..a4fb770
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Toniher"
+               ]
+       },
+       "apihelp-main-param-format": "El format de la sortida.",
+       "apihelp-block-description": "Bloca un usuari.",
+       "apihelp-block-param-nocreate": "Evita la creació de comptes.",
+       "apihelp-createaccount-param-name": "Nom d'usuari.",
+       "apihelp-createaccount-param-password": "Contrasenya (ignorada si es defineix $1mailpassword)",
+       "apihelp-delete-description": "Suprimeix una pàgina.",
+       "apihelp-edit-description": "Crea i edita pàgines.",
+       "apihelp-edit-param-text": "Contingut de la pàgina."
+}
index 1eb7109..1d866ba 100644 (file)
@@ -4,5 +4,9 @@
                        "Умар"
                ]
        },
+       "apihelp-main-param-action": "Кхочушдан дезарг.",
+       "apihelp-main-param-format": "Гойту формат.",
+       "apihelp-main-param-curtimestamp": "Хилламийн юкъатоха ханна йолу билгало",
+       "apihelp-createaccount-param-name": "Декъашхочун цӀе.",
        "apihelp-userrights-param-userid": "Декъашхочун ID."
 }
index 976b6d8..14fae0c 100644 (file)
@@ -2,10 +2,11 @@
        "@metadata": {
                "authors": [
                        "Mormegil",
-                       "YjM"
+                       "YjM",
+                       "Juandev"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Jaká akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
        "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.<br />Více informací najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Maxlag_parameter příručce].",
        "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).",
        "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
        "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „blockemail“.)",
+       "apihelp-block-param-hidename": "Skrýt uživatelské jméno v knize zablokování. (Vyžaduje oprávnění „hideuser“.)",
        "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na $wgBlockAllowsUTEdit).",
        "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
        "apihelp-block-param-watchuser": "Sledovat uživatelskou a diskusní stranu tohoto uživatele nebo adresy IP.",
+       "apihelp-block-example-ip-simple": "Zablokovat IP 192.0.2.5 na tři dny s důvodem „First strike“",
        "apihelp-block-example-user-complex": "Trvale zablokovat uživatele Vandal s odůvodněním „Vandalism“ a bránit vytváření nových účtů a e-mailování",
        "apihelp-compare-description": "Vrátí rozdíl dvou stránek.\n\nVe „from“ a „to“ musíte zadat číslo revize, název stránky nebo ID stránky.",
        "apihelp-compare-param-fromtitle": "Název první stránky k porovnání.",
        "apihelp-createaccount-param-realname": "Skutečné jméno uživatele (nepovinné).",
        "apihelp-createaccount-param-mailpassword": "Pokud je nastaveno na libovolnou hodnotu, zašle se náhodně vygenerované heslo na e-mail uživatele.",
        "apihelp-delete-description": "Smazat stránku.",
+       "apihelp-edit-param-minor": "Malá editace.",
+       "apihelp-edit-param-notminor": "Nemalá editace.",
+       "apihelp-edit-param-bot": "Označit tuto editaci jako editaci bota.",
+       "apihelp-edit-param-createonly": "Needitovat stránku, pokud již existuje.",
+       "apihelp-edit-param-watch": "Přidat stránku na váš seznam sledovaných stránek.",
+       "apihelp-edit-param-unwatch": "Odstranit stránku z vašeho seznamu sledovaných stránek.",
        "apihelp-help-description": "Zobrazuje nápovědu k uvedeným modulům.",
        "apihelp-help-param-modules": "Moduly, pro které se má zobrazit nápověda (hodnoty parametrů action= a format= nebo „main“). Submoduly lze zadávat pomocí „+“.",
        "apihelp-help-param-submodules": "Zahrnout nápovědu pro podmoduly uvedeného modulu.",
        "api-help-permissions-granted-to": "Uděleno {{PLURAL:$1|skupině|skupinám}}: $2",
        "api-help-right-apihighlimits": "Používání vyšších limitů v API dotazech (pomalé dotazy: $1, rychlé dotazy: $2). Limity pro pomalé dotazy se vztahují i na vícehodnotové parametry.",
        "api-credits-header": "Zásluhy",
-       "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://bugzilla.wikimedia.org/."
+       "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://phabricator.wikimedia.org/."
 }
index 4c9fef4..5e2aad9 100644 (file)
@@ -4,25 +4,27 @@
                        "Florian",
                        "Kghbln",
                        "Metalhead64",
-                       "Inkowik"
+                       "Inkowik",
+                       "Umherirrender",
+                       "Giftpflanze"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/de Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ/de Häufig gestellte Fragen]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, aber die API ist noch in aktiver Entwicklung und könnte sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste] für Mitteilungen über Aktualisierungen.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ versandt. Die zurückgesandten Werte des Headers und des Fehlercodes werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
-       "apihelp-main-param-action": "Welche Aktion ausgeführt werden soll.",
-       "apihelp-main-param-format": "Das Format der Ausgabe.",
-       "apihelp-main-param-maxlag": "Maximale Verzögerung kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um Aktionen zu speichern, die Websitereplikationsverzögerungen verursachen, kann dieser Parameter den Client warten lassen, bis die Replikationsverzögerung weniger als dem angegebenen Wert entspricht. Im Fall einer übermäßigen Verzögerung wird der Fehlercode „maxlag“ zurückgegeben mit einer Nachricht wie „Waiting for $host: $lag seconds lagged“.<br />Siehe https://www.mediawiki.org/wiki/Manual:Maxlag_parameter für weitere Informationen.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/de Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ/de Häufig gestellte Fragen]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Auszuführende Aktion.",
+       "apihelp-main-param-format": "Format der Ausgabe.",
+       "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode „maxlag“ zurückgegeben mit einer Nachricht wie „Waiting for $host: $lag seconds lagged“.<br />Siehe https://www.mediawiki.org/wiki/Manual:Maxlag_parameter für weitere Informationen.",
        "apihelp-main-param-smaxage": "Den s-maxage-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
        "apihelp-main-param-maxage": "Den max-age-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
-       "apihelp-main-param-assert": "Den angemeldeten Benutzer verifizieren, falls auf „user“ festgelegt oder hat das Bot-Benutzerrecht, falls „bot“.",
-       "apihelp-main-param-requestid": "Jeder hier angegebene Wert wird in der Antwort eingeschlossen. Kann für unterschiedliche Anfragen verwendet werden.",
-       "apihelp-main-param-servedby": "Den von der Anfrage bereitgestellten Hostnamen in den Ergebnissen einschließen.",
-       "apihelp-main-param-curtimestamp": "Den aktuellen Zeitstempel im Ergebnis einschließen.",
-       "apihelp-main-param-origin": "Beim Zugriff auf die API mit einer Kreuz-Domain-AJAX-Anfrage (CORS) lege dies auf die entstehende Domain fest. Dies muss in einer beliebigen Vorfluganfrage eingeschlossen werden und deshalb ein Teil der Anfrage-URI sein (nicht der POST-Body). Dies muss genau einem der Ursprünge im Origin: header entsprechen, so muss es auf etwas festgelegt werden wie http://de.wikipedia.org oder https://meta.wikimedia.org. Falls dieser Parameter nicht dem Origin: header entspricht, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem Origin: header entspricht und der Ursprung weißgelistet ist, wird ein Zugriffskontrolle-erlauben-Ursprung festgelegt.",
+       "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf „user“ gesetzt, oder Bot ist, wenn auf „bot“ gesetzt.",
+       "apihelp-main-param-requestid": "Der angegebene Wert wird mit in die Antwort aufgenommen und kann zur Unterscheidung von Anfragen verwendet werden.",
+       "apihelp-main-param-servedby": "Namen des bearbeitenden Hosts mit zurückgeben.",
+       "apihelp-main-param-curtimestamp": "Aktuellen Zeitstempel mit zurückgeben.",
+       "apihelp-main-param-origin": "Beim Zugriff auf die API mittels Cross-Domain-AJAX-Anfrage (CORS) ist dieser Parameter auf die veranlassende Domain zu setzen. Er muss in jedem Pre-Flight-Request angegeben werden und deshalb ein Teil der Anfrage-URI sein (nicht des POST-Bodys). Er muss genau einer der Angaben im Origin:-Header entsprechen, d.&nbsp;h. er muss auf etwas wie http://de.wikipedia.org oder https://meta.wikimedia.org gesetzt werden. Falls dieser Parameter nicht mit dem Origin:-Header übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem Origin:-Header entspricht und die Domain auf der Whitelist ist, wird ein Access-Control-Allow-Origin:-Header gesetzt.",
        "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. Eine Liste der Codes kann von [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] mit siprop=languages abgerufen werden. Gib „user“ zum Verwenden der aktuellen Benutzerspracheinstellung oder „content“ an, um die Inhaltssprache des Wikis zu verwenden.",
        "apihelp-block-description": "Einen Benutzer sperren.",
-       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, den du sperren willst.",
-       "apihelp-block-param-expiry": "Ablaufzeit. Kann relativ (z.&nbsp;B. „5 Monate“ oder „2 Wochen“) oder absolut (z.&nbsp;B. „2014-09-18T12:34:56Z“) sein. Falls auf „unbeschränkt“ oder „niemals“ gesetzt, wird die Sperre nie ablaufen.",
-       "apihelp-block-param-reason": "Grund für die Sperre.",
+       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, der gesperrt werden soll.",
+       "apihelp-block-param-expiry": "Sperrdauer. Kann relativ (z.&nbsp;B. „5 months“ oder „2 weeks“) oder absolut (z.&nbsp;B. „2014-09-18T12:34:56Z“) sein. Wenn auf „infinite“, „indefinite“ oder „never“ gesetzt, ist die Sperre unbegrenzt.",
+       "apihelp-block-param-reason": "Sperrbegründung.",
        "apihelp-block-param-anononly": "Nur anonyme Benutzer sperren (z.&nbsp;B. anonyme Bearbeitungen für diese IP deaktivieren).",
        "apihelp-block-param-nocreate": "Benutzerkontenerstellung verhindern.",
        "apihelp-block-param-autoblock": "Die zuletzt verwendete IP-Adresse automatisch sperren und alle darauffolgenden IP-Adressen, die versuchen sich anzumelden.",
        "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das hideuser-Recht).",
        "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von $wgBlockAllowsUTEdit).",
        "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
-       "apihelp-block-param-watchuser": "Beobachtet die Benutzer- oder IP-Benutzer- und -diskussionsseiten.",
-       "apihelp-block-example-ip-simple": "Sperren der IP 192.0.2.5 für drei Tage mit der Begründung „erste Verwarnung“",
-       "apihelp-block-example-user-complex": "Benutzer unbeschränkt sperren mit der Begründung „Vandalismus“ und Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
-       "apihelp-clearhasmsg-description": "Löscht das hasmsg-Flag für den aktuellen Benutzer.",
-       "apihelp-clearhasmsg-example-1": "Löscht das hasmsg-Flag für den aktuellen Benutzer",
-       "apihelp-compare-description": "Ruft den Unterschied zwischen 2 Seiten ab.\n\nDu musst eine Versionsnummer, einen Seitentitel oder eine Seitenkennung für „von“ und „nach“ angeben.",
+       "apihelp-block-param-watchuser": "Benutzer- und Benutzerdiskussionsseite beobachten.",
+       "apihelp-block-example-ip-simple": "IP 192.0.2.5 für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren",
+       "apihelp-block-example-user-complex": "Benutzer unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
+       "apihelp-clearhasmsg-description": "Löschen des hasmsg-Flags („hat Nachrichten“-Flag) für den aktuellen Benutzer.",
+       "apihelp-clearhasmsg-example-1": "hasmsg-Flags für den aktuellen Benutzer löschen",
+       "apihelp-compare-description": "Abrufen des Unterschieds zwischen 2 Seiten.\n\nDu musst eine Versionsnummer, einen Seitentitel oder eine Seitennummer für „from“ als auch „to“ angeben.",
        "apihelp-compare-param-fromtitle": "Erster zu vergleichender Titel.",
-       "apihelp-compare-param-fromid": "Erste zu vergleichende Seitenkennung.",
+       "apihelp-compare-param-fromid": "Erste zu vergleichende Seitennummer.",
        "apihelp-compare-param-fromrev": "Erste zu vergleichende Version.",
        "apihelp-compare-param-totitle": "Zweiter zu vergleichender Titel.",
-       "apihelp-compare-param-toid": "Zweite zu vergleichende Seitenkennung.",
+       "apihelp-compare-param-toid": "Zweite zu vergleichende Seitennummer.",
        "apihelp-compare-param-torev": "Zweite zu vergleichende Version.",
-       "apihelp-compare-example-1": "Erstellt einen Unterschied zwischen Version 1 und 2",
-       "apihelp-createaccount-description": "Erstellt ein neues Benutzerkonto.",
+       "apihelp-compare-example-1": "Unterschied zwischen Version 1 und 2 abrufen",
+       "apihelp-createaccount-description": "Erstellen eines neuen Benutzerkontos.",
        "apihelp-createaccount-param-name": "Benutzername.",
-       "apihelp-createaccount-param-password": "Passwort (ignoriert, falls $1mailpassword festgelegt ist).",
+       "apihelp-createaccount-param-password": "Passwort (wird ignoriert, wenn $1mailpassword angegeben ist).",
        "apihelp-createaccount-param-domain": "Domain für die externe Authentifizierung (optional).",
        "apihelp-createaccount-param-token": "Der in der ersten Anfrage erhaltene Benutzerkontenerstellungs-Token.",
        "apihelp-createaccount-param-email": "E-Mail-Adresse des Benutzers (optional).",
-       "apihelp-createaccount-param-realname": "Bürgerlicher Name des Benutzers (optional).",
-       "apihelp-createaccount-param-mailpassword": "Falls auf einen beliebigen Wert gesetzt, wird ein zufälliges Passwort per E-Mail an den Benutzer versandt.",
+       "apihelp-createaccount-param-realname": "Realname des Benutzers (optional).",
+       "apihelp-createaccount-param-mailpassword": "Wenn ein Wert angegeben wird, wird ein zufälliges Passwort per E-Mail an den Benutzer versandt.",
        "apihelp-createaccount-param-reason": "Optionale Begründung für die Benutzerkontenerstellung, die in den Logbüchern vermerkt wird.",
        "apihelp-createaccount-param-language": "Festzulegender standardmäßiger Sprachcode für den Benutzer (optional, Standard ist Inhaltssprache).",
-       "apihelp-createaccount-example-pass": "Erstellt den Benutzer „testuser“ mit dem Passwort „test123“",
-       "apihelp-createaccount-example-mail": "Benutzer „testmailuser“ erstellen und ein zufällig generiertes Passwort per E-Mail versenden",
-       "apihelp-delete-description": "Löscht eine Seite.",
-       "apihelp-delete-param-title": "Titel der Seite, die du löschen möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
-       "apihelp-delete-param-pageid": "Seitenkennung der Seite, die du löschen möchtest. Kann nicht zusammen mit $1title verwendet werden.",
-       "apihelp-delete-param-reason": "Grund für die Löschung. Falls nicht festgelegt, wird ein automatisch generierter Grund verwendet.",
-       "apihelp-delete-param-watch": "Fügt die Seite deiner Beobachtungsliste hinzu.",
-       "apihelp-delete-param-watchlist": "Die Seite bedingungslos zu deiner Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
-       "apihelp-delete-param-unwatch": "Die Seite von deiner Beobachtungsliste entfernen.",
-       "apihelp-delete-param-oldimage": "Der Name des alten zu löschenden Bildes, wie von [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] angegeben.",
-       "apihelp-delete-example-simple": "Löscht die Hauptseite",
-       "apihelp-delete-example-reason": "Die Hauptseite löschen mit der Begründung „Vorbereitung für die Verschiebung“",
+       "apihelp-createaccount-example-pass": "Benutzer „testuser“ mit dem Passwort „test123“ erstellen",
+       "apihelp-createaccount-example-mail": "Benutzer „testmailuser“ erstellen und zufällig generiertes Passwort per E-Mail verschicken",
+       "apihelp-delete-description": "Löschen einer Seite.",
+       "apihelp-delete-param-title": "Titel der Seite, die gelöscht werden soll. Kann nicht zusammen mit $1pageid verwendet werden.",
+       "apihelp-delete-param-pageid": "Seitennummer der Seite, die gelöscht werden soll. Kann nicht zusammen mit $1title verwendet werden.",
+       "apihelp-delete-param-reason": "Löschbegründung. Falls nicht festgelegt, wird eine automatisch generierte Begründung verwendet.",
+       "apihelp-delete-param-watch": "Seite auf die Beobachtungsliste setzen.",
+       "apihelp-delete-param-watchlist": "Seite bedingungslos zur Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
+       "apihelp-delete-param-unwatch": "Seite von der Beobachtungsliste entfernen.",
+       "apihelp-delete-param-oldimage": "Name des alten zu löschenden Bildes, wie von [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] angegeben.",
+       "apihelp-delete-example-simple": "Hauptseite löschen",
+       "apihelp-delete-example-reason": "Hauptseite löschen mit der Begründung „Preparing for move“ (Vorbereitung für Verschiebung)",
        "apihelp-disabled-description": "Dieses Modul wurde deaktiviert.",
-       "apihelp-edit-description": "Erstellt und bearbeitet Seiten.",
+       "apihelp-edit-description": "Erstellen und Bearbeiten von Seiten.",
        "apihelp-edit-param-title": "Titel der Seite, die du bearbeiten möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
-       "apihelp-edit-param-pageid": "Seitenkennung der Seite, die du bearbeiten möchtest. Kann nicht zusammen mit $1title verwendet werden.",
+       "apihelp-edit-param-pageid": "Seitennummer der Seite, die du bearbeiten möchtest. Kann nicht zusammen mit $1title verwendet werden.",
        "apihelp-edit-param-section": "Abschnittsnummer. 0 für die Einleitung, „new“ für einen neuen Abschnitt.",
-       "apihelp-edit-param-sectiontitle": "Der Titel für einen neuen Abschnitt.",
+       "apihelp-edit-param-sectiontitle": "Die Überschrift für einen neuen Abschnitt.",
        "apihelp-edit-param-text": "Seiteninhalt.",
-       "apihelp-edit-param-summary": "Bearbeitungszusammenfassung. Auch Abschnittstitel, wenn $1section=new und $1sectiontitle nicht festgelegt ist.",
+       "apihelp-edit-param-summary": "Bearbeitungszusammenfassung. Auch Abschnittsüberschrift, wenn $1section=new und $1sectiontitle nicht festgelegt ist.",
        "apihelp-edit-param-minor": "Kleine Bearbeitung.",
        "apihelp-edit-param-notminor": "Nicht-kleine Bearbeitung.",
        "apihelp-edit-param-bot": "Diese Bearbeitung als Bot-Bearbeitung markieren.",
        "apihelp-edit-param-basetimestamp": "Zeitstempel der Basisversion, wird verwendet zum Aufspüren von Bearbeitungskonflikten. Kann abgerufen werden durch [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
-       "apihelp-edit-param-starttimestamp": "Zeitstempel, an dem du den Bearbeitungsprozess begonnen hast, wird verwendet zum Aufspüren von Bearbeitungskonflikten. Ein geeigneter Wert kann abgerufen werden mithilfe [[Special:ApiHelp/main|curtimestamp]] beim Beginn des Bearbeitungsprozesses (z.&nbsp;B. beim Laden des Seiteninhalts zum Bearbeiten).",
-       "apihelp-edit-param-recreate": "Fehler ignorieren, wenn der Artikel in der Zwischenzeit gelöscht wurde.",
-       "apihelp-edit-param-createonly": "Die Seite nicht bearbeiten, falls sie bereits vorhanden ist.",
+       "apihelp-edit-param-starttimestamp": "Zeitstempel, an dem der Bearbeitungsprozess begonnen wurde, wird verwendet zum Aufspüren von Bearbeitungskonflikten. Ein geeigneter Wert kann abgerufen werden mithilfe [[Special:ApiHelp/main|curtimestamp]] beim Beginn des Bearbeitungsprozesses (z.&nbsp;B. beim Laden des Seiteninhalts zum Bearbeiten).",
+       "apihelp-edit-param-recreate": "Keinen Fehler zurückgeben, wenn die Seite in der Zwischenzeit gelöscht wurde.",
+       "apihelp-edit-param-createonly": "Seite nicht bearbeiten, falls sie bereits vorhanden ist.",
        "apihelp-edit-param-nocreate": "Einen Fehler zurückgeben, falls die Seite nicht vorhanden ist.",
-       "apihelp-edit-param-watch": "Fügt die Seite deiner Beobachtungsliste hinzu.",
-       "apihelp-edit-param-unwatch": "Entfernt die Seite von deiner Beobachtungsliste.",
+       "apihelp-edit-param-watch": "Seite der Beobachtungsliste hinzufügen.",
+       "apihelp-edit-param-unwatch": "Seite von der Beobachtungsliste entfernen.",
        "apihelp-edit-param-watchlist": "Die Seite bedingungslos zu deiner Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
-       "apihelp-edit-param-md5": "Der MD5-Hash des Parameters $1text oder die verbundenen Parameter $1prependtext und $1appendtext. Falls festgelegt, wird die Bearbeitung nicht ausgeführt, bis der Hash korrekt ist.",
-       "apihelp-edit-param-prependtext": "Ergänzt diesen Text am Anfang der Seite. Überschreibt $1text.",
-       "apihelp-edit-param-appendtext": "Fügt diesen Text an das Ende der Seite hinzu. Überschreibt $1text.\n\nVerwende $1section=new zum Anhängen eines neuen Abschnitts anstatt dieses Parameters.",
+       "apihelp-edit-param-md5": "Der MD5-Hash des Parameters $1text oder der aneinandergehängten Parameter $1prependtext und $1appendtext. Wenn angegeben, wird die Bearbeitung nicht ausgeführt, wenn der Hash nicht korrekt ist.",
+       "apihelp-edit-param-prependtext": "Diesen Text an den Anfang der Seite setzen. Überschreibt $1text.",
+       "apihelp-edit-param-appendtext": "Diesen Text an das Ende der Seite hinzufügen. Überschreibt $1text.\n\nVerwende statt dieses Parameters $1section=new zum Anhängen eines neuen Abschnitts.",
        "apihelp-edit-param-undo": "Diese Version rückgängig machen. Überschreibt $1text, $1prependtext und $1appendtext.",
-       "apihelp-edit-param-undoafter": "Alle Versionen von $1undo auf diese rückgängig machen. Falls nicht angegeben, nur eine Version rückgängig machen.",
-       "apihelp-edit-param-redirect": "Weiterleitungen automatisch anpassen.",
+       "apihelp-edit-param-undoafter": "Alle Versionen von $1undo bis zu dieser rückgängig machen. Falls nicht angegeben, nur eine Version rückgängig machen.",
+       "apihelp-edit-param-redirect": "Weiterleitungen automatisch auflösen.",
        "apihelp-edit-param-contentformat": "Für den Eingabetext verwendetes Inhaltsserialisierungsformat.",
        "apihelp-edit-param-contentmodel": "Inhaltsmodell des neuen Inhalts.",
-       "apihelp-edit-param-token": "Der Token sollte immer als letzter Parameter gesendet werden, mindestens aber nach dem $1text-Parameter.",
+       "apihelp-edit-param-token": "Der Token sollte immer als letzter Parameter gesendet werden, zumindest aber nach dem $1text-Parameter.",
        "apihelp-edit-example-edit": "Eine Seite bearbeiten",
        "apihelp-edit-example-prepend": "_&#95;NOTOC_&#95; bei einer Seite voranstellen",
        "apihelp-edit-example-undo": "Versionen 13579 bis 13585 mit automatischer Zusammenfassung rückgängig machen",
        "apihelp-emailuser-description": "E-Mail an einen Benutzer senden.",
        "apihelp-emailuser-param-target": "Benutzer, an den die E-Mail gesendet werden soll.",
        "apihelp-emailuser-param-subject": "Betreffzeile.",
-       "apihelp-emailuser-param-text": "Textkörper.",
+       "apihelp-emailuser-param-text": "E-Mail-Inhalt.",
        "apihelp-emailuser-param-ccme": "Eine Kopie dieser E-Mail an mich senden.",
        "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer „WikiSysop“ mit dem Text „Inhalt“ senden",
        "apihelp-expandtemplates-description": "Alle Vorlagen im Wikitext expandieren.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
        "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
-       "apihelp-expandtemplates-example-simple": "Expandiert den Wikitext „<nowiki>{{Project:Spielwiese}}</nowiki>“",
+       "apihelp-expandtemplates-example-simple": "Den Wikitext „<nowiki>{{Project:Spielwiese}}</nowiki>“ expandieren",
        "apihelp-feedcontributions-description": "Gibt einen Benutzerbeiträge-Feed zurück.",
        "apihelp-feedcontributions-param-feedformat": "Das Format des Feeds.",
        "apihelp-feedcontributions-param-user": "Von welchen Benutzern die Beiträge abgerufen werden sollen.",
-       "apihelp-feedcontributions-param-namespace": "Auf welchen Namensraum die Beiträge gefiltert werden sollen.",
+       "apihelp-feedcontributions-param-namespace": "Auf welchen Namensraum die Beiträge begrenzt werden sollen.",
        "apihelp-feedcontributions-param-year": "Von Jahr (und früher).",
        "apihelp-feedcontributions-param-month": "Von Monat (und früher).",
        "apihelp-feedcontributions-param-tagfilter": "Beiträge filtern, die diese Markierungen haben.",
        "apihelp-feedrecentchanges-param-feedformat": "Das Format des Feeds.",
        "apihelp-feedrecentchanges-param-namespace": "Namensraum, auf den die Ergebnisse beschränkt werden sollen.",
        "apihelp-feedrecentchanges-param-invert": "Alle Namensräume außer dem ausgewählten.",
-       "apihelp-feedrecentchanges-param-associated": "Verbundene Namensräume (Diskussion oder Haupt) einschließen.",
+       "apihelp-feedrecentchanges-param-associated": "Verbundenen Namensraum (Diskussions oder Hauptnamensraum) mit einschließen.",
        "apihelp-feedrecentchanges-param-days": "Tage, auf die die Ergebnisse beschränkt werden sollen.",
        "apihelp-feedrecentchanges-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-feedrecentchanges-param-from": "Änderungen seit jetzt anzeigen.",
        "apihelp-feedrecentchanges-param-hidemyself": "Eigene Änderungen ausblenden.",
        "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
        "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.",
        "apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen",
        "apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen",
        "apihelp-feedwatchlist-description": "Gibt einen Beobachtungslisten-Feed zurück.",
        "api-help-param-integer-min": "{{PLURAL:$1|1=Der Wert darf|2=Die Werte dürfen}} nicht kleiner sein als $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=Der Wert darf|2=Die Werte dürfen}} nicht größer sein als $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Der Wert muss|2=Die Werte müssen}} zwischen $2 und $3 sein.",
-       "api-help-param-upload": "Muss als Dateiupload mithilfe Mehrteil-Formdaten bereitgestellt werden.",
+       "api-help-param-upload": "Muss als Dateiupload mithilfe eines multipart/form-data-Formular bereitgestellt werden.",
        "api-help-param-multi-separate": "Werte mit „|“ trennen.",
        "api-help-param-multi-max": "Maximale Anzahl der Werte ist {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} für Bots).",
        "api-help-param-default": "Standard: $1",
        "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
-       "api-help-param-token": "Ein „$1“-Token wurde abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
        "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
        "api-help-permissions": "{{PLURAL:$1|Berechtigung|Berechtigungen}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Gewährt an}}: $2",
        "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
        "api-credits-header": "Danksagungen",
-       "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://bugzilla.wikimedia.org/ ein."
+       "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://phabricator.wikimedia.org/ ein."
 }
index f7e3a57..c83058d 100644 (file)
@@ -5,7 +5,7 @@
                ]
        },
 
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, a HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, a HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Which action to perform.",
        "apihelp-main-param-format": "The format of the output.",
        "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code \"maxlag\" is returned with a message like \"Waiting for $host: $lag seconds lagged\".<br />See https://www.mediawiki.org/wiki/Manual:Maxlag_parameter for more information.",
@@ -83,7 +83,7 @@
        "apihelp-edit-param-bot": "Mark this edit as bot.",
        "apihelp-edit-param-basetimestamp": "Timestamp of the base revision, used to detect edit conflicts. May be obtained through [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Timestamp when you began the editing process, used to detect edit conflicts. An appropriate value may be obtained using [[Special:ApiHelp/main|curtimestamp]] when beginning the edit process (e.g. when loading the page content to edit).",
-       "apihelp-edit-param-recreate": "Override any errors about the article having been deleted in the meantime.",
+       "apihelp-edit-param-recreate": "Override any errors about the page having been deleted in the meantime.",
        "apihelp-edit-param-createonly": "Don't edit the page if it exists already.",
        "apihelp-edit-param-nocreate": "Throw an error if the page doesn't exist.",
        "apihelp-edit-param-watch": "Add the page to your watchlist.",
        "apihelp-expandtemplates-param-title": "Title of page.",
        "apihelp-expandtemplates-param-text": "Wikitext to convert.",
        "apihelp-expandtemplates-param-revid": "Revision ID, for <nowiki>{{REVISIONID}}</nowiki> and similar variables.",
-       "apihelp-expandtemplates-param-prop": "Which pieces of information to get:\n;wikitext:The expanded wikitext.\n;categories:Any categories present in the input that are not represented in the wikitext output.\n;volatile:Whether the output is volatile and should not be reused elsewhere within the page.\n;ttl:The maximum time after which caches of the result should be invalidated.\n;parsetree:The XML parse tree of the input.\nNote that if no values are selected, the result will contain the wikitext, but the output will be in a deprecated format.",
+       "apihelp-expandtemplates-param-prop": "Which pieces of information to get:\n;wikitext:The expanded wikitext.\n;categories:Any categories present in the input that are not represented in the wikitext output.\n;properties:Page properties defined by expanded magic words in the wikitext.\n;volatile:Whether the output is volatile and should not be reused elsewhere within the page.\n;ttl:The maximum time after which caches of the result should be invalidated.\n;parsetree:The XML parse tree of the input.\nNote that if no values are selected, the result will contain the wikitext, but the output will be in a deprecated format.",
        "apihelp-expandtemplates-param-includecomments": "Whether to include HTML comments in the output.",
        "apihelp-expandtemplates-param-generatexml": "Generate XML parse tree (replaced by $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Expand the wikitext \"<nowiki>{{Project:Sandbox}}</nowiki>\"",
        "apihelp-query+allimages-param-to": "The image title to stop enumerating at. Can only be used with $1sort=name.",
        "apihelp-query+allimages-param-start": "The timestamp to start enumerating from. Can only be used with $1sort=timestamp.",
        "apihelp-query+allimages-param-end": "The timestamp to end enumerating. Can only be used with $1sort=timestamp.",
-       "apihelp-query+allimages-param-prop": "Which image information to get:\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds the user who uploaded the image version.\n;userid:Add the user ID that uploaded the image version.\n;comment:Comment on the version.\n;parsedcomment:Parse the comment on the version.\n;canonicaltitle:Adds the canonical title of the image file.\n;url:Gives URL to the image and the description page.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;sha1:Adds SHA-1 hash for the image.\n;mime:Adds MIME type of the image.\n;mediatype:Adds the media type of the image.\n;metadata:Lists Exif metadata for the version of the image.\n;commonmetadata:Lists file format generic metadata for the version of the image.\n;extmetadata:Lists formatted metadata combined from multiple sources. Results are HTML formatted.\n;bitdepth:Adds the bit depth of the version.",
        "apihelp-query+allimages-param-prefix": "Search for all image titles that begin with this value. Can only be used with $1sort=name.",
        "apihelp-query+allimages-param-minsize": "Limit to images with at least this many bytes.",
        "apihelp-query+allimages-param-maxsize": "Limit to images with at most this many bytes.",
        "apihelp-query+allimages-param-sha1base36": "SHA1 hash of image in base 36 (used in MediaWiki).",
        "apihelp-query+allimages-param-user": "Only return files uploaded by this user. Can only be used with $1sort=timestamp. Cannot be used together with $1filterbots.",
        "apihelp-query+allimages-param-filterbots": "How to filter files uploaded by bots. Can only be used with $1sort=timestamp. Cannot be used together with $1user.",
-       "apihelp-query+allimages-param-mime": "What MIME type to search for. e.g. image/jpeg.",
+       "apihelp-query+allimages-param-mime": "What MIME types to search for, e.g. <kbd>image/jpeg</kbd>.",
        "apihelp-query+allimages-param-limit": "How many images in total to return.",
        "apihelp-query+allimages-example-B": "Show a list of files starting at the letter \"B\"",
        "apihelp-query+allimages-example-recent": "Show a list of recently uploaded files similar to [[Special:NewFiles]]",
+       "apihelp-query+allimages-example-mimetypes": "Show a list of files with MIME type <kbd>image/png</kbd> or <kbd>image/gif</kbd>",
        "apihelp-query+allimages-example-generator": "Show info about 4 files starting at the letter \"T\"",
 
        "apihelp-query+alllinks-description": "Enumerate all links that point to a given namespace.",
        "apihelp-query+filearchive-param-dir": "The direction in which to list.",
        "apihelp-query+filearchive-param-sha1": "SHA1 hash of image. Overrides $1sha1base36.",
        "apihelp-query+filearchive-param-sha1base36": "SHA1 hash of image in base 36 (used in MediaWiki).",
-       "apihelp-query+filearchive-param-prop": "Which image information to get:\n;sha1:Adds SHA-1 hash for the image.\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds user who uploaded the image version.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;description:Adds description the image version.\n;parseddescription:Parse the description on the version.\n;mime:Adds MIME of the image.\n;mediatype:Adds the media type of the image.\n;metadata:Lists Exif metadata for the version of the image.\n;bitdepth:Adds the bit depth of the version.\n;archivename:Adds the file name of the archive version for non-latest versions.",
+       "apihelp-query+filearchive-param-prop": "Which image information to get:\n;sha1:Adds SHA-1 hash for the image.\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds user who uploaded the image version.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;description:Adds description the image version.\n;parseddescription:Parse the description on the version.\n;mime:Adds MIME of the image.\n;mediatype:Adds the media type of the image.\n;metadata:Lists Exif metadata for the version of the image.\n;bitdepth:Adds the bit depth of the version.\n;archivename:Adds the filename of the archive version for non-latest versions.",
        "apihelp-query+filearchive-example-simple": "Show a list of all deleted files",
 
        "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.",
        "apihelp-query+fileusage-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
        "apihelp-query+fileusage-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+fileusage-param-limit": "How many to return.",
-       "apihelp-query+fileusage-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.",
+       "apihelp-query+fileusage-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirect:Only show non-redirects.",
        "apihelp-query+fileusage-example-simple": "Get a list of pages using [[:File:Example.jpg]]",
        "apihelp-query+fileusage-example-generator": "Get information about pages using [[:File:Example.jpg]]",
 
        "apihelp-query+imageinfo-description": "Returns file information and upload history.",
-       "apihelp-query+imageinfo-param-prop": "Which file information to get:\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds the user who uploaded each file version.\n;userid:Add the user ID that uploaded each file version.\n;comment:Comment on the version.\n;parsedcomment:Parse the comment on the version.\n;canonicaltitle:Adds the canonical title of the file.\n;url:Gives URL to the file and the description page.\n;size:Adds the size of the file in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;sha1:Adds SHA-1 hash for the file.\n;mime:Adds MIME type of the file.\n;thumbmime:Adds MIME type of the image thumbnail (requires url and param $1urlwidth).\n;mediatype:Adds the media type of the file.\n;metadata:Lists Exif metadata for the version of the file.\n;commonmetadata:Lists file format generic metadata for the version of the file.\n;extmetadata:Lists formatted metadata combined from multiple sources. Results are HTML formatted.\n;archivename:Adds the file name of the archive version for non-latest versions.\n;bitdepth:Adds the bit depth of the version.\n;uploadwarning:Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core.",
+       "apihelp-query+imageinfo-param-prop": "Which file information to get:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adds timestamp for the uploaded version.",
+       "apihelp-query+imageinfo-paramvalue-prop-user":"Adds the user who uploaded each file version.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid":"Add the user ID that uploaded each file version.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment":"Comment on the version.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment":"Parse the comment on the version.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle":"Adds the canonical title of the file.",
+       "apihelp-query+imageinfo-paramvalue-prop-url":"Gives URL to the file and the description page.",
+       "apihelp-query+imageinfo-paramvalue-prop-size":"Adds the size of the file in bytes and the height, width and page count (if applicable).",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions":"Alias for size.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1":"Adds SHA-1 hash for the file.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime":"Adds MIME type of the file.",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime":"Adds MIME type of the image thumbnail (requires url and param $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype":"Adds the media type of the file.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata":"Lists Exif metadata for the version of the file.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata":"Lists file format generic metadata for the version of the file.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata":"Lists formatted metadata combined from multiple sources. Results are HTML formatted.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename":"Adds the filename of the archive version for non-latest versions.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth":"Adds the bit depth of the version.",
+       "apihelp-query+imageinfo-paramvalue-prop-uploadwarning":"Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core.",
        "apihelp-query+imageinfo-param-limit": "How many file revisions to return per file.",
        "apihelp-query+imageinfo-param-start": "Timestamp to start listing from.",
        "apihelp-query+imageinfo-param-end": "Timestamp to stop listing at.",
        "apihelp-query+imageusage-example-generator": "Get information about pages using [[:File:Albert Einstein Head.jpg]]",
 
        "apihelp-query+info-description": "Get basic page information.",
-       "apihelp-query+info-param-prop": "Which additional properties to get:\n;protection:List the protection level of each page.\n;talkid:The page ID of the talk page for each non-talk page.\n;watched:List the watched status of each page.\n;watchers:The number of watchers, if allowed.\n;notificationtimestamp:The watchlist notification timestamp of each page.\n;subjectid:The page ID of the parent page for each talk page.\n;url:Gives a full URL, an edit URL, and the canonical URL for each page.\n;readable:Whether the user can read this page.\n;preload:Gives the text returned by EditFormPreloadText.\n;displaytitle:Gives the way the page title is actually displayed.",
+       "apihelp-query+info-param-prop": "Which additional properties to get:",
+       "apihelp-query+info-paramvalue-prop-protection": "List the protection level of each page.",
+       "apihelp-query+info-paramvalue-prop-talkid": "The page ID of the talk page for each non-talk page.",
+       "apihelp-query+info-paramvalue-prop-watched": "List the watched status of each page.",
+       "apihelp-query+info-paramvalue-prop-watchers": "The number of watchers, if allowed.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "The watchlist notification timestamp of each page.",
+       "apihelp-query+info-paramvalue-prop-subjectid": "The page ID of the parent page for each talk page.",
+       "apihelp-query+info-paramvalue-prop-url": "Gives a full URL, an edit URL, and the canonical URL for each page.",
+       "apihelp-query+info-paramvalue-prop-readable": "Whether the user can read this page.",
+       "apihelp-query+info-paramvalue-prop-preload": "Gives the text returned by EditFormPreloadText.",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "Gives the way the page title is actually displayed.",
        "apihelp-query+info-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.",
        "apihelp-query+info-example-simple": "Get information about the [[Main Page]]",
        "apihelp-query+info-example-protection": "Get general and protection information about the [[Main Page]]",
        "apihelp-query+linkshere-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
        "apihelp-query+linkshere-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+linkshere-param-limit": "How many to return.",
-       "apihelp-query+linkshere-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.",
+       "apihelp-query+linkshere-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirect:Only show non-redirects.",
        "apihelp-query+linkshere-example-simple": "Get a list of pages linking to the [[Main Page]]",
        "apihelp-query+linkshere-example-generator": "Get information about pages linking to the [[Main Page]]",
 
        "apihelp-query+revisions-example-last5": "Get last 5 revisions of the \"Main Page\"",
        "apihelp-query+revisions-example-first5": "Get first 5 revisions of the \"Main Page\"",
        "apihelp-query+revisions-example-first5-after": "Get first 5 revisions of the \"Main Page\" made after 2006-05-01",
-       "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the \"Main Page\" that were not made made by anonymous user \"127.0.0.1\"",
+       "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the \"Main Page\" that were not made by anonymous user \"127.0.0.1\"",
        "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the \"Main Page\" that were made by the user \"MediaWiki default\"",
 
        "apihelp-query+revisions+base-param-prop": "Which properties to get for each revision:\n;ids:The ID of the revision.\n;flags:Revision flags (minor).\n;timestamp:The timestamp of the revision.\n;user:User that made the revision.\n;userid:User ID of the revision creator.\n;size:Length (bytes) of the revision.\n;sha1:SHA-1 (base 16) of the revision.\n;contentmodel:Content model ID of the revision.\n;comment:Comment by the user for the revision.\n;parsedcomment:Parsed comment by the user for the revision.\n;content:Text of the revision.\n;tags:Tags for the revision.",
        "apihelp-query+stashimageinfo-description": "Returns file information for stashed files.",
        "apihelp-query+stashimageinfo-param-filekey": "Key that identifies a previous upload that was stashed temporarily.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias for $1filekey, for backward compatibility.",
-       "apihelp-query+stashimageinfo-param-prop": "Which image information to get:\n;timestamp:Adds timestamp for the uploaded version.\n;canonicaltitle:Adds the canonical title of the image file.\n;url:Gives URL to the image and the description page.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;sha1:Adds SHA-1 hash for the image.\n;mime:Adds MIME type of the image.\n;thumbmime:Adds MIME type of the image thumbnail (requires url and param $1urlwidth).\n;metadata:Lists Exif metadata for the version of the image.\n;commonmetadata:Lists file format generic metadata for the version of the image.\n;extmetadata:Lists formatted metadata combined from multiple sources. Results are HTML formatted.\n;bitdepth:Adds the bit depth of the version.",
        "apihelp-query+stashimageinfo-example-simple": "Returns information for a stashed file",
        "apihelp-query+stashimageinfo-example-params": "Returns thumbnails for two stashed files",
 
        "apihelp-query+transcludedin-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
        "apihelp-query+transcludedin-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+transcludedin-param-limit": "How many to return.",
-       "apihelp-query+transcludedin-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.",
+       "apihelp-query+transcludedin-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirect:Only show non-redirects.",
        "apihelp-query+transcludedin-example-simple": "Get a list of pages transcluding the [[Main Page]]",
        "apihelp-query+transcludedin-example-generator": "Get information about pages transcluding the [[Main Page]]",
 
        "apihelp-query+usercontribs-param-userprefix": "Retrieve contributions for all users whose names begin with this value. Overrides $1user.",
        "apihelp-query+usercontribs-param-namespace": "Only list contributions in these namespaces.",
        "apihelp-query+usercontribs-param-prop": "Include additional pieces of information:\n;ids:Adds the page ID and revision ID.\n;title:Adds the title and namespace ID of the page.\n;timestamp:Adds the timestamp of the edit.\n;comment:Adds the comment of the edit.\n;parsedcomment:Adds the parsed comment of the edit.\n;size:Adds the new size of the edit.\n;sizediff:Adds the size delta of the edit against its parent.\n;flags:Adds flags of the edit.\n;patrolled:Tags patrolled edits.\n;tags:Lists tags for the edit.",
-       "apihelp-query+usercontribs-param-show": "Show only items that meet thse criteria, e.g. non minor edits only: $2show=!minor.\n\nIf $2show=patrolled or $2show=!patrolled is set, revisions older than [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
+       "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: $2show=!minor.\n\nIf $2show=patrolled or $2show=!patrolled is set, revisions older than [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
        "apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.",
        "apihelp-query+usercontribs-param-toponly": "Only list changes which are the latest revision.",
        "apihelp-query+usercontribs-example-user": "Show contributions of [[User:Example]]",
        "api-help-right-apihighlimits": "Use higher limits in API queries (slow queries: $1; fast queries: $2). The limits for slow queries also apply to multivalue parameters.",
 
        "api-credits-header": "Credits",
-       "api-credits": "API developers:\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://bugzilla.wikimedia.org/."
+       "api-credits": "API developers:\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://phabricator.wikimedia.org/."
 }
index 4550a75..7964b15 100644 (file)
@@ -18,6 +18,9 @@
        "apihelp-compare-param-fromtitle": "Primer título para comparar",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
        "apihelp-createaccount-param-name": "Nombre de usuario.",
+       "apihelp-createaccount-param-email": "Dirección de correo electrónico del usuario (opcional).",
+       "apihelp-createaccount-param-realname": "Nombre verdadero del usuario (opcional).",
+       "apihelp-createaccount-example-pass": "Crear cuenta de usuario «testuser» con la contraseña «test123»",
        "apihelp-delete-description": "Borrar una página.",
        "apihelp-delete-param-watch": "Añadir esta página a tu lista de seguimiento.",
        "apihelp-delete-param-unwatch": "Borrar esta página de tu lista de seguimiento.",
        "apihelp-edit-param-notminor": "Edición no menor.",
        "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
        "apihelp-edit-param-createonly": "No editar la página si ya existe.",
+       "apihelp-edit-param-nocreate": "Producir un error si la página no existe.",
        "apihelp-edit-param-watch": "Añadir la página a tu lista de seguimiento.",
        "apihelp-edit-param-unwatch": "Quitar la página de tu lista de seguimiento.",
        "apihelp-edit-example-edit": "Editar una página",
+       "apihelp-edit-example-prepend": "Anteponer _&#95;NOTOC_&#95; a una página",
+       "apihelp-edit-example-undo": "Deshacer intervalo de revisiones 13579-13585 con resumen automático",
        "apihelp-emailuser-description": "Enviar un mensaje de correo electrónico a un usuario.",
+       "apihelp-emailuser-param-target": "Cuenta de usuario destinatario.",
+       "apihelp-emailuser-param-subject": "Encabezamiento de asunto.",
+       "apihelp-emailuser-param-text": "Cuerpo del mensaje.",
+       "apihelp-emailuser-param-ccme": "Enviarme una copia de este mensaje.",
        "apihelp-expandtemplates-param-title": "Título de la página.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
        "apihelp-feedcontributions-description": "Devuelve el canal de contribuciones de un usuario.",
        "apihelp-feedcontributions-param-year": "A partir del año (y anteriores).",
        "apihelp-feedcontributions-param-month": "A partir del mes (y anteriores).",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar solo las contribuciones borradas.",
+       "apihelp-feedrecentchanges-param-feedformat": "El formato del canal.",
+       "apihelp-feedrecentchanges-param-from": "Mostrar los cambios realizados a partir de entonces.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar cambios menores.",
+       "apihelp-feedrecentchanges-param-hidebots": "Ocultar los cambios realizados por bots.",
+       "apihelp-feedrecentchanges-param-hideanons": "Ocultar los cambios realizados por usuarios anónimos.",
+       "apihelp-feedrecentchanges-param-hideliu": "Ocultar los cambios realizados por usuarios registrados.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar los cambios patrullados.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar los cambios realizados por ti.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
+       "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días",
+       "apihelp-feedwatchlist-description": "Devuelve el canal de una lista de seguimiento.",
+       "apihelp-feedwatchlist-param-feedformat": "El formato del canal.",
+       "apihelp-filerevert-description": "Revertir el archivo a una versión anterior.",
+       "apihelp-filerevert-param-filename": "Nombre de archivo final, sin el prefijo Archivo:",
+       "apihelp-filerevert-param-comment": "Comentario de carga.",
+       "apihelp-help-example-main": "Ayuda del módulo principal",
+       "apihelp-help-example-recursive": "Toda la ayuda en una página",
+       "apihelp-help-example-help": "Ayuda del módulo de ayuda en sí",
+       "apihelp-imagerotate-description": "Girar una o más imágenes.",
        "apihelp-import-param-summary": "Resumen de importación.",
+       "apihelp-import-param-xml": "Se cargó el archivo XML.",
+       "apihelp-import-param-rootpage": "Importar como subpágina de esta página.",
        "apihelp-login-param-name": "Nombre de usuario.",
        "apihelp-login-param-password": "Contraseña.",
        "apihelp-login-param-domain": "Dominio (opcional).",
+       "apihelp-login-example-login": "Acceder",
+       "apihelp-logout-description": "Salir y vaciar los datos de la sesión.",
+       "apihelp-logout-example-logout": "Cerrar la sesión del usuario actual",
        "apihelp-move-description": "Mover una página.",
+       "apihelp-move-param-reason": "Motivo del traslado.",
+       "apihelp-move-param-movetalk": "Trasladar la página de discusión si existe.",
+       "apihelp-move-param-movesubpages": "Trasladar las subpáginas si procede.",
+       "apihelp-move-param-noredirect": "No crear una redirección.",
+       "apihelp-move-param-watch": "Añadir la página y su redirección a tu lista de seguimiento.",
+       "apihelp-move-param-unwatch": "Quitar la página y su redirección de tu lista de seguimiento.",
+       "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
+       "apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar cadena.",
        "apihelp-options-example-reset": "Restablecer todas las preferencias",
        "apihelp-patrol-example-rcid": "Patrullar un cambio reciente",
        "apihelp-patrol-example-revid": "Patrullar una revisión",
+       "apihelp-protect-param-reason": "Motivo de la (des)protección.",
        "apihelp-protect-example-protect": "Proteger una página",
+       "apihelp-query+allimages-param-sha1": "Suma SHA1 de la imagen. Invalida $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "Suma SHA1 de la imagen en base 36 (usada en MediaWiki).",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
diff --git a/includes/api/i18n/eu.json b/includes/api/i18n/eu.json
new file mode 100644 (file)
index 0000000..ca6f4c8
--- /dev/null
@@ -0,0 +1,25 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Subi"
+               ]
+       },
+       "apihelp-block-description": "Blokeatu erabiltzaile bat.",
+       "apihelp-edit-param-minor": "Aldaketa txikia.",
+       "apihelp-expandtemplates-param-title": "Orrialdearen izenburua.",
+       "apihelp-imagerotate-description": "Irudi bat edo gehiago biratu.",
+       "apihelp-login-param-password": "Pasahitza.",
+       "apihelp-login-param-domain": "Domeinua (hautazkoa).",
+       "apihelp-login-example-login": "Saioa hasi",
+       "apihelp-move-description": "Orrialde bat mugitu",
+       "apihelp-protect-example-protect": "Orrialde bat babestu",
+       "api-help-main-header": "Modulu nagusia",
+       "api-help-flag-deprecated": "Modulu hau zaharkitua dago.",
+       "api-help-param-deprecated": "Zaharkitua.",
+       "api-help-param-required": "Parametro hau beharrezkoa da.",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Hutsik egon behar du|Hutsik egon daiteke edo $2}}",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(deskribapenik gabe)</span>",
+       "api-help-examples": "{{PLURAL:$1|Adibidea|Adibideak}}:",
+       "api-credits-header": "Kredituak",
+       "api-credits": "API garatzaileak:\n* Roan Kattouw (garatzaile nagusia, 2007ko ira.–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (sortzailea, garatzaile nagusia, 2006ko ira.–2007ko ira.)\n* Brad Jorsch (garatzaile nagusia 2013–gaur egun)\n\nMesedez, bidal iezazkiguzu zure iruzkinak, iradokizunak eta galderak mediawiki-api@lists.wikimedia.org helbidera edo bete ezazu errore-txostena https://phabricator.wikimedia.org/ helbidean."
+}
index 91b4907..c8a49ba 100644 (file)
        "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به \"همگان\"",
        "apihelp-protect-example-unprotect2": "خارج ساختن صفحه از حفاظت با قراردادن هیچ‌گونه محدودیت‌حفاظتی",
        "apihelp-purge-param-forcelinkupdate": "به‌روزرسانی جداول پیوندها.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "جدول پیوندها را به‌روز رسانی کنید، و جدول‌های پیوندهای هر صفحه‌ای را که از این صفحه به عنوان الگو استفاده می‌کند به‌روز رسانی کنید.",
+       "apihelp-query-param-list": "کدام فهرست‌ها دریافت شود.",
+       "apihelp-query-param-meta": "کدام فراداده‌ها دریافت شود.",
+       "apihelp-query+allcategories-param-prefix": "عنوان همهٔ رده‌ها را که با این مقدار آغاز می‌شود جستجو کنید.",
+       "apihelp-query+allcategories-param-limit": "میزان رده‌ها برای بازگرداندن.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "نمی‌تواند همراه $3user به کار رود.",
        "apihelp-query+allfileusages-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
        "apihelp-query+allfileusages-param-dir": "جهتی که باید فهرست شود.",
        "apihelp-query+allfileusages-example-unique": "فهرست پرونده‌های با عنوان یکتا",
        "apihelp-query+alllinks-param-dir": "جهتی که باید فهرست شود.",
        "apihelp-query+allpages-param-filterredir": "صفحه‌هایی که باید فهرست شوند.",
        "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.",
+       "apihelp-query+allpages-param-limit": "میزان کل صفحه‌ها برای بازگرداندن.",
        "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
+       "apihelp-query+backlinks-example-simple": "نمایش پیوندها به [[صفحهٔ اصلی]]",
        "apihelp-query+blocks-example-simple": "فهرست بسته‌شده‌ها",
+       "apihelp-query+categories-param-show": "کدام نوع رده‌ها نمایش داده‌شود.",
+       "apihelp-query+categories-param-limit": "چه میزان رده بازگردانده شود.",
+       "apihelp-query+categories-param-categories": "فقط این رده‌ها فهرست شود. کاربردی برای بررسی وجود یک صفحهٔ مشخص در یک ردهٔ مشخص.",
        "apihelp-query+categorymembers-description": "فهرست‌کردن همهٔ صفحه‌ها در یک ردهٔ مشخص‌شده.",
        "apihelp-query+categorymembers-param-sort": "خصوصیت برای مرتب‌سازی",
        "apihelp-query+categorymembers-param-dir": "جهت مرتب شدن",
index b86eb57..b1a7e8c 100644 (file)
@@ -1,8 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Nike"
+                       "Nike",
+                       "MrTapsa"
                ]
        },
+       "apihelp-query+linkshere-param-show": "Näytä vain kohteet, jotka täyttävät nämä kriteerit:\n;redirect:Näytä vain uudelleenohjaukset.\n;!redirect:Näytä vain ei-uudelleenohjaukset",
        "apihelp-upload-param-stash": "Mikäli valittu, palvelin säilöö tiedoston väliaikaisesti tallentamisen sijaan."
 }
index 2274371..53840a6 100644 (file)
@@ -3,10 +3,11 @@
                "authors": [
                        "Gomoko",
                        "Windes",
-                       "Orlodrim"
+                       "Orlodrim",
+                       "McDutchie"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
        "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur « maxlag » est renvoyé avec un message tel que « Attente de $host : $lag secondes de délai ».<br />Voyez https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pour plus d’information.",
@@ -16,7 +17,7 @@
        "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
-       "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et ne doit donc pas faire partie de l’URI de la requête (ni du corps du POST). Il doit correspondre exactement à une des origines dans l’entête Origin: header, donc il doit être fixé avec quelque chose comme http://en.wikipedia.org or https://meta.wikimedia.org. Si ce paramètre ne correspond pas à l’entête Origin:, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête Origin: et que l’origine est en liste blanche, un entête Access-Control-Allow-Origin sera positionné.",
+       "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST). Il doit correspondre exactement à une des origines dans l’entête Origin: header, donc il doit être fixé avec quelque chose comme http://en.wikipedia.org or https://meta.wikimedia.org. Si ce paramètre ne correspond pas à l’entête Origin:, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête Origin: et que l’origine est en liste blanche, un entête Access-Control-Allow-Origin sera positionné.",
        "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. Une liste de codes peut être analysée depuis [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] avec siprop=languages, ou en spécifiant « user » pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant « content » pour utiliser le langage du contenu de ce wiki.",
        "apihelp-block-description": "Bloquer un utilisateur.",
        "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "apihelp-expandtemplates-param-revid": "ID de révision, pour <nowiki>{{REVISIONID}}</nowiki> et les variables semblables.",
-       "apihelp-expandtemplates-param-prop": "Quelles informations récupérer :\n;wikitext:Le wikitexte développé.\n;categories:Toutes les catégories présentes dans l’entrée qui ne sont pas représentées dans le wikitexte de sortie.\n;volatile:Si la sortie est volatile et ne devrait pas être réutilisée ailleurs dans la page.\n;ttl:Le délai maximal après lequel les caches du résultat devraient être invalidés.\n;parsetree:L’arbre d’analyse XML de l’entrée.\nNoter que si aucune valeur n’est sélectionnée, le résultat contiendra le wikitexte, mais la sortie sera dans un format obsolète.",
+       "apihelp-expandtemplates-param-prop": "Quelles informations récupérer :\n;wikitext:Le wikitexte développé.\n;categories:Toutes les catégories présentes dans l’entrée qui ne sont pas représentées dans le wikitexte de sortie.\n;properties:Propriétés de page définies en développant les mots magiques dans le wikitexte.\n;volatile:Si la sortie est volatile et ne devrait pas être réutilisée ailleurs dans la page.\n;ttl:Le délai maximal après lequel les caches du résultat devraient être invalidés.\n;parsetree:L’arbre d’analyse XML de l’entrée.\nNoter que si aucune valeur n’est sélectionnée, le résultat contiendra le wikitexte, mais la sortie sera dans un format obsolète.",
        "apihelp-expandtemplates-param-includecomments": "S’il faut inclure les commentaires HTML dans la sortie.",
        "apihelp-expandtemplates-param-generatexml": "Générer l’arbre d’analyse XML (remplacé par $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Développe le wikitexte « <nowiki>{{Project:Sandbox}}</nowiki> »",
        "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-prop": "Quelle information obtenir sur l’image :\n;timestamp:Ajoute l’horodatage de la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé la version de l’image.\n;userid:Ajoute l’ID de l’utilisateur qui a téléchargé la version de l’image.\n;comment:Commentaire sur la version.\n;parsedcomment:Analyser le commentaire de la version.\n;canonicaltitle:Ajoute le titre canonique du fichier image.\n;url:Fournit l’URL vers l’image et la page de description.\n;size:Ajoute la taille de l’image en octets et sa hauteur et largeur, et le numéro de page (si applicable).\n;dimensions:Alias de la taille.\n;sha1:Ajoute le hachage SHA-1 de l’image.\n;mime:Ajoute le type MIME de l’image.\n;mediatype:Ajoute le type de média de l’image.\n;metadata:Liste les métadonnées Exif de la version de l’image.\n;commonmetadata:Liste les métadonnées génériques du format de fichier pour la version de l’image.\n;extmetadata:Liste les métadonnées mises en forme regroupées depuis différentes sources. Les résultats sont au format HTML.\n;bitdepth:Ajoute la profondeur de couleur de la version.",
        "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-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MédiaWiki).",
        "apihelp-query+allimages-param-user": "Renvoyer seulement les fichiers téléchargés par cet utilisateur. Utilisable uniquement avec $1sort=timestamp. Impossible à utiliser avec $1filterbots.",
        "apihelp-query+allimages-param-filterbots": "Comment filtrer les fichiers téléchargés par des robots. Peut être utilisé uniquement avec $1sort=timestamp. Impossible à utiliser avec $1user.",
-       "apihelp-query+allimages-param-mime": "Quel type MIME rechercher, par ex. image/jpeg.",
+       "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 « B »",
        "apihelp-query+allimages-example-recent": "Afficher une liste des 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 « T »",
        "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
        "apihelp-query+alllinks-param-from": "Le titre du lien auquel démarrer l’énumération.",
        "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Marque si la page est une redirection.",
        "apihelp-query+fileusage-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+fileusage-param-limit": "Combien renvoyer.",
-       "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirects:Afficher uniquement les non-redirections.",
+       "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+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-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-comment": "Commentaire sur la version.",
+       "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-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-thumbmime": "Ajoute le type MIME de la vignette de l’image (nécessite l’URL et le paramètre $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Ajoute le type de média du fichier.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "Liste les métadonnées Exif de la version du fichier.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Liste les métadonnées génériques du format du fichier pour la version du fichier.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Liste les métadonnées mises en forme combinées depuis diverses sources. Les résultats sont au format HTML.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
+       "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-param-limit": "Combien de révision 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+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-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-paramvalue-prop-watchers": "Le nombre d’observateurs, si c’est autorisé.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "L’horodatage de notification de la liste de suivi de chaque page.",
+       "apihelp-query+info-paramvalue-prop-subjectid": "L’ID de page de la page parent de chaque page de discussion.",
+       "apihelp-query+info-paramvalue-prop-url": "Fournit une URL complète, une URL de modification, et l’URL canonique de chaque page.",
+       "apihelp-query+info-paramvalue-prop-readable": "Si l’utilisateur peut lire cette page.",
+       "apihelp-query+info-paramvalue-prop-preload": "Fournit le texte renvoyé par EditFormPreloadText.",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "Fournit la manière dont le titre de la page est réellement affiché.",
        "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 [[Main Page]]",
        "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur [[Main Page]]",
        "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Indique si la page est une redirection.",
        "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+linkshere-param-limit": "Combien de résultats renvoyer.",
-       "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirects:Afficher uniquement les non-redirections.",
+       "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à  [[Main Page]]",
        "apihelp-query+linkshere-example-generator": "Obtenir des informations sur les pages liées à [[Main Page]]",
        "apihelp-query+logevents-description": "Obtenir des événements des journaux.",
        "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.",
        "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.",
-       "apihelp-query+stashimageinfo-param-prop": "Quelles informations de l’image obtenir :\n;timestamp:Ajoute l’horodatage pour la version téléchargée.\n;canonicaltitle:Ajoute le titre canonique du fichier image.\n;url:Fournit l’URL de l’image et sa page de description.\n;size:Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de pages (si c&est applicable).\n;dimensions:Alias pour la taille.\n;sha1:Ajoute le hachage SHA-1 pour l’image.\n;mime:Ajoute le type MIME de l’image.\n;thumbmime:Ajoute le type MIME de la vignette de l’image (nécessite l’URL et le paramètre $1urlwidth).\n;metadata:Liste les métadonnées Exif pour la version de l’image.\n;commonmetadata:Liste les métadonnées génériques du format de fichier pour la version de l’image.\n;extmetadata:Liste les métadonnées mises en forme combinées depuis diverses sources. Les résultats sont au format HTML.\n;bitdepth:Ajoute la profondeur de bits de la version.",
        "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.",
        "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
        "apihelp-query+tags-description": "Lister les balises de modification.",
        "apihelp-query+transcludedin-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de page de chaque page.\n;title:Titre de chaque page.\n;redirect:Marque si cette page est une redirection.",
        "apihelp-query+transcludedin-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+transcludedin-param-limit": "Combien en renvoyer.",
-       "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirects:Afficher uniquement les non-redirections.",
+       "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+transcludedin-example-simple": "Obtenir une liste des pages incluant [[Main Page]]",
        "apihelp-query+transcludedin-example-generator": "Obtenir des informations sur les pages incluant [[Main Page]]",
        "apihelp-query+usercontribs-description": "Obtenir toutes les modifications par un utilisateur.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Accordé à}} : $2",
        "api-help-right-apihighlimits": "Utiliser des valeurs plus hautes dans les requêtes de l’API (requêtes lentes : $1 ; requêtes rapides : $2). Les limites pour les requêtes lentes s’appliquent aussi aux paramètres multivalués.",
        "api-credits-header": "Remerciements",
-       "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://bugzilla.wikimedia.org/."
+       "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
 }
diff --git a/includes/api/i18n/frc.json b/includes/api/i18n/frc.json
new file mode 100644 (file)
index 0000000..27ff6dd
--- /dev/null
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hangmanwa7id"
+               ]
+       },
+       "apihelp-block-description": "Bloquer un useur.",
+       "apihelp-createaccount-param-name": "Nom d'useur.",
+       "apihelp-createaccount-param-password": "Mot de passe (ignoré si $1mailpassword est défini).",
+       "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (optional).",
+       "apihelp-delete-description": "Effacer une page.",
+       "apihelp-delete-param-title": "Titre de la page que tu veux effacer. Impossible de l’user avec $1pageid.",
+       "apihelp-delete-example-simple": "Effacer la Page principale",
+       "apihelp-emailuser-description": "Emailer un useur.",
+       "apihelp-expandtemplates-param-title": "Titre de la page.",
+       "apihelp-login-param-name": "Nom d’useur.",
+       "apihelp-login-param-password": "Mot de passe.",
+       "apihelp-login-param-domain": "Domaine (optional)."
+}
diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json
new file mode 100644 (file)
index 0000000..6ee0a0c
--- /dev/null
@@ -0,0 +1,305 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Elisardojm"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentación]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Que acción se realizará.",
+       "apihelp-main-param-format": "O formato de saída.",
+       "apihelp-main-param-requestid": "Calquera valor dado aquí será incluído na resposta. Pode usarse para distingir peticións.",
+       "apihelp-main-param-curtimestamp": "Incluir a marca de tempo actual no resultado.",
+       "apihelp-block-description": "Bloquear un usuario.",
+       "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear.",
+       "apihelp-block-param-reason": "Motivo para o bloqueo.",
+       "apihelp-block-param-anononly": "Bloquear só usuarios anónimos (é dicir, desactivar edicións anónimas desta IP).",
+       "apihelp-block-param-nocreate": "Previr a creación de contas.",
+       "apihelp-block-param-autoblock": "Bloquear automaticamente o último enderezo IP utilizado, e calquera outro enderezo desde o que intente conectarse.",
+       "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 IP e a de conversa deste usuario",
+       "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
+       "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.",
+       "apihelp-compare-param-fromrev": "Primeira revisión a comparar.",
+       "apihelp-compare-param-totitle": "Segundo título para comparar.",
+       "apihelp-compare-param-toid": "Identificador da segunda páxina a comparar.",
+       "apihelp-compare-param-torev": "Segunda revisión a comparar.",
+       "apihelp-compare-example-1": "Mostrar diferencias entre a revisión 1 e a 2",
+       "apihelp-createaccount-description": "Crear unha nova conta de usuario.",
+       "apihelp-createaccount-param-name": "Nome de usuario.",
+       "apihelp-createaccount-param-password": "Contrasinal (ignorado se $1mailpassword está activo)",
+       "apihelp-createaccount-param-domain": "Dominio para autenticación externa (opcional)",
+       "apihelp-createaccount-param-email": "Enderezo de correo eletrónico do usuario (opcional).",
+       "apihelp-createaccount-param-realname": "Nome real do usuario (opcional).",
+       "apihelp-createaccount-example-pass": "Crear usuario \"testuser\" con contrasinal \"test123\"",
+       "apihelp-createaccount-example-mail": "Crear usuario \"testmailuser\" e enviar por correo electrónico un contrasinal xenerado de forma aleatoria",
+       "apihelp-delete-description": "Borrar a páxina.",
+       "apihelp-delete-param-title": "Título da páxina que quere eliminar. Non pode usarse xunto con $1pageid.",
+       "apihelp-delete-param-pageid": "Identificador da páxina que quere eliminar. Non pode usarse xunto con $1title.",
+       "apihelp-delete-param-reason": "Razón para o borrado. Se non se indica, usarase unha razón xenerada automaticamente.",
+       "apihelp-delete-param-watch": "Engadir esta páxina á lista de vixilancia.",
+       "apihelp-delete-param-unwatch": "Eliminar esta páxina da lista de vixilancia.",
+       "apihelp-delete-example-simple": "Borrar a Páxina Principal",
+       "apihelp-delete-example-reason": "Eliminar a Páxina Principal coa razón \"Preparando para mover\"",
+       "apihelp-disabled-description": "Este módulo foi desactivado.",
+       "apihelp-edit-description": "Crear e editar páxinas.",
+       "apihelp-edit-param-title": "Título da páxina que quere editar. Non pode usarse xunto con $1pageid.",
+       "apihelp-edit-param-pageid": "Identificador da páxina que quere editar. Non pode usarse xunto con $1title.",
+       "apihelp-edit-param-section": "Número de selección. O 0 é para a sección superior, \"novo\" para unha sección nova.",
+       "apihelp-edit-param-sectiontitle": "Título para unha nova sección.",
+       "apihelp-edit-param-text": "Contido da páxina.",
+       "apihelp-edit-param-minor": "Edición pequena.",
+       "apihelp-edit-param-notminor": "Edición non pequena.",
+       "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
+       "apihelp-edit-param-createonly": "Non editar a páxina se xa existe.",
+       "apihelp-edit-param-watch": "Engadir esta páxina á lista de vixilancia.",
+       "apihelp-edit-param-unwatch": "Eliminar esta páxina da lista de vixilancia.",
+       "apihelp-edit-example-edit": "Editar a páxina",
+       "apihelp-emailuser-description": "Enviar un correo electrónico a un usuario.",
+       "apihelp-emailuser-param-target": "Usuario ó que lle mandar correo electrónico.",
+       "apihelp-emailuser-param-text": "Corpo do correo.",
+       "apihelp-emailuser-param-ccme": "Enviarme unha copia deste correo.",
+       "apihelp-expandtemplates-description": "Expandir tódolos modelos en wikitexto.",
+       "apihelp-expandtemplates-param-title": "Título da páxina.",
+       "apihelp-expandtemplates-param-text": "Sintaxis wiki a converter.",
+       "apihelp-feedcontributions-description": "Devolve a lista de contribucións dun usuario.",
+       "apihelp-feedcontributions-param-year": "Desde o ano (e anteriores).",
+       "apihelp-feedcontributions-param-month": "Desde o mes de (e anteriores).",
+       "apihelp-feedcontributions-param-deletedonly": "Mostrar só as contribuciones eliminadas.",
+       "apihelp-feedcontributions-param-toponly": "Mostrar só as edicións que que son as ultimas revisións.",
+       "apihelp-feedcontributions-param-newonly": "Mostrar só as edicións que crearon páxinas.",
+       "apihelp-feedcontributions-param-showsizediff": "Mostrar diferenza de tamaño entre edicións.",
+       "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados a visualizar.",
+       "apihelp-feedrecentchanges-param-from": "Mostrar modificacións desde entón.",
+       "apihelp-feedrecentchanges-param-hideminor": "Ocultar cambios menores.",
+       "apihelp-feedrecentchanges-param-hidebots": "Ocultar cambios feitos por bots.",
+       "apihelp-import-param-xml": "Subido ficheiro XML.",
+       "apihelp-import-param-rootpage": "Importar como subpáxina desta páxina.",
+       "apihelp-login-param-name": "Nome de usuario.",
+       "apihelp-login-param-password": "Contrasinal",
+       "apihelp-login-param-domain": "Dominio (opcional).",
+       "apihelp-login-example-login": "Identificarse",
+       "apihelp-logout-description": "Terminar e limpar datos de sesión.",
+       "apihelp-move-description": "Mover unha páxina.",
+       "apihelp-move-param-from": "Título da páxina que quere mover. Non pode usarse xunto con $1fromid.",
+       "apihelp-move-param-fromid": "Identificador da páxina que quere mover. Non pode usarse xunto con $1from.",
+       "apihelp-move-param-reason": "Motivo para o movemento.",
+       "apihelp-move-param-movetalk": "Mover a páxina de conversa, se existe.",
+       "apihelp-move-param-noredirect": "Non crear unha redirección.",
+       "apihelp-move-param-watch": "Engadir a páxina e a redirección á súa páxina de vixiancia.",
+       "apihelp-move-param-unwatch": "Eliminar a páxina e a redirección da súa páxina de vixiancia.",
+       "apihelp-move-param-ignorewarnings": "Ignorar as advertencias.",
+       "apihelp-opensearch-param-search": "Buscar texto.",
+       "apihelp-opensearch-param-limit": "Número máximo de resultados a visualizar.",
+       "apihelp-opensearch-param-namespace": "Espazo de nomes no que buscar.",
+       "apihelp-opensearch-param-format": "O formato de saída.",
+       "apihelp-opensearch-example-te": "Atopar páxinas comezando por \"Te\"",
+       "apihelp-options-example-reset": "Restablecer tódaalas preferencias",
+       "apihelp-paraminfo-description": "Obter información sobre módulos API.",
+       "apihelp-patrol-example-rcid": "Patrullar un cambio recente",
+       "apihelp-patrol-example-revid": "Patrullar unha revisión",
+       "apihelp-protect-param-title": "Título da páxina que quere (des)protexer. Non pode usarse xunto con $1pageid.",
+       "apihelp-protect-param-pageid": "Identificador da páxina que quere (des)protexer. Non pode usarse xunto con $1title.",
+       "apihelp-protect-param-reason": "Razón para (des)protexer.",
+       "apihelp-protect-example-protect": "Protexer unha páxina",
+       "apihelp-purge-param-forcelinkupdate": "Actualizar as táboas de ligazóns.",
+       "apihelp-purge-example-simple": "Purgar a \"Páxina Principal\" e páxina \"API\"",
+       "apihelp-query+alldeletedrevisions-param-from": "Comezar listado neste título.",
+       "apihelp-query+alldeletedrevisions-param-to": "Parar listado neste título.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Buscar tódolos títulos de páxinas que comezan con este valor.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Só listar revisións marcadas con esta etiqueta.",
+       "apihelp-query+alldeletedrevisions-param-user": "Só listar revisións deste usuario.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
+       "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do Usuario:Exemplo",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal",
+       "apihelp-query+allfileusages-param-from": "Título do ficheiro no que comezar a enumerar.",
+       "apihelp-query+allfileusages-param-to": "Título do ficheiro no que rematar de enumerar.",
+       "apihelp-query+allfileusages-param-prefix": "Buscar tódolos títulos de ficheiro que comezan con este valor.",
+       "apihelp-query+allfileusages-param-limit": "Número total de obxectos a devolver.",
+       "apihelp-query+allfileusages-param-dir": "Dirección na cal listar.",
+       "apihelp-query+allimages-description": "Enumerar tódalas imaxes secuencialmente.",
+       "apihelp-query+allimages-param-sort": "Propiedade pol que ordenar.",
+       "apihelp-query+allimages-param-dir": "Dirección na cal listar.",
+       "apihelp-query+allimages-param-user": "Mostrar só ficheiros subidos por este usuario. Só pode usarse con $1sort=timestamp. Non se pode usar xunto a $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Como filtrar ficheiros subidos por bots. Só pode usarse con $1sort=timestamp. Non pode usarse xunto con $1user.",
+       "apihelp-query+allimages-param-mime": "Que tipos MIME  buscar, por exemplo <kbd>imaxe/jpeg</kbd>.",
+       "apihelp-query+allimages-param-limit": "Cantas imaxes mostar en total.",
+       "apihelp-query+deletedrevs-param-prefix": "Buscar tódolos títulos de páxina que comezan con este valor.",
+       "apihelp-query+deletedrevs-param-unique": "Só listar unha revisión por cada páxina.",
+       "apihelp-query+deletedrevs-param-tag": "Só listar revisións marcadas con esta etiqueta.",
+       "apihelp-query+deletedrevs-param-user": "Só listar revisións deste usuario.",
+       "apihelp-query+deletedrevs-param-excludeuser": "Non listar revisións deste usuario.",
+       "apihelp-query+deletedrevs-param-namespace": "Só listar páxinas neste espazo de nomes.",
+       "apihelp-query+deletedrevs-param-limit": "Máximo número de revisións a listar.",
+       "apihelp-query+deletedrevs-example-mode2": "Listar as últimas 50 contribucións borradas de Bob (modo 2)",
+       "apihelp-query+deletedrevs-example-mode3-main": "Listar as primeiras 50 revisións borradas no espazo de nomes principal (modo 3)",
+       "apihelp-query+disabled-description": "Este módulo de consulta foi desactivado.",
+       "apihelp-query+duplicatefiles-param-limit": "Cantos ficheiros duplicados devolver.",
+       "apihelp-query+duplicatefiles-param-dir": "Dirección na cal listar.",
+       "apihelp-query+duplicatefiles-param-localonly": "Só buscar por ficheiros no repositorio local.",
+       "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados de tódolos ficheiros",
+       "apihelp-query+embeddedin-param-title": "Título a buscar. Non pode usarse xunto con $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "Identificador de páxina a buscar. Non pode usarse xunto con $1title.",
+       "apihelp-query+embeddedin-param-namespace": "Espazo de nomes a enumerar.",
+       "apihelp-query+embeddedin-param-dir": "Dirección na cal listar.",
+       "apihelp-query+embeddedin-param-filterredir": "Como filtrar para redireccións.",
+       "apihelp-query+embeddedin-param-limit": "Número total de páxinas a devolver.",
+       "apihelp-query+extlinks-param-limit": "Cantas ligazóns devolver.",
+       "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á [[Main Page]]",
+       "apihelp-query+exturlusage-description": "Enumerar páxinas que conteñen unha dirección URL dada.",
+       "apihelp-query+exturlusage-param-namespace": "Espazo de nomes a enumerar.",
+       "apihelp-query+exturlusage-param-limit": "Cantas páxinas devolver.",
+       "apihelp-query+exturlusage-example-simple": "Mostrar páxinas ligando a http://www.mediawiki.org",
+       "apihelp-query+filearchive-param-prefix": "Buscar tódolos títulos de imaxes que comezan con este valor.",
+       "apihelp-query+filearchive-param-limit": "Cantas imaxes devolver en total.",
+       "apihelp-query+filearchive-param-dir": "Dirección na cal listar.",
+       "apihelp-query+filearchive-example-simple": "Mostrar unha lista de tódolos fichieiros eliminados.",
+       "apihelp-query+filerepoinfo-example-simple": "Obter infomación sobre os repositorios de ficheiros",
+       "apihelp-query+fileusage-description": "Atopar tódalas páxinas que usan os ficheiros dados.",
+       "apihelp-query+fileusage-param-namespace": "Só incluír páxinas nestes espazos de nomes.",
+       "apihelp-query+fileusage-param-limit": "Cantos mostrar.",
+       "apihelp-query+fileusage-example-simple": "Obter unha lista de páxinas usando [[:File:Example.jpg]]",
+       "apihelp-query+fileusage-example-generator": "Obter infomación sobre páxinas que usan [[:File:Example.jpg]]",
+       "apihelp-query+imageinfo-description": "Devolve información de ficheiros e historial de subidas.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "Engade o usuario que subeu cada versión de ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "Comentario da versión.",
+       "apihelp-query+prefixsearch-param-search": "Buscar texto.",
+       "apihelp-query+prefixsearch-param-namespace": "Espazo de nomes no que buscar.",
+       "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados a visualizar.",
+       "apihelp-query+prefixsearch-param-offset": "Número de resultados a saltar.",
+       "apihelp-query+protectedtitles-param-namespace": "Só listar títulos nestes espazos de nomes.",
+       "apihelp-query+protectedtitles-param-level": "Só listar títulos con estos niveis de protección.",
+       "apihelp-query+protectedtitles-param-limit": "Número total de páxinas a devolver.",
+       "apihelp-query+protectedtitles-example-simple": "Listar títulos protexidos",
+       "apihelp-query+protectedtitles-example-generator": "Atopar ligazóns ós títulos protexidos no espazo de nomes principal",
+       "apihelp-query+querypage-param-page": "Nome da páxina especial. Teña en conta que diferencia entre maiúsculas e minúsculas.",
+       "apihelp-query+querypage-param-limit": "Número de resultados a visualizar.",
+       "apihelp-query+querypage-example-ancientpages": "Resultados devoltos de [[Special:Ancientpages]].",
+       "apihelp-query+random-param-namespace": "Devolver páxinas só neste espazo de nomes.",
+       "apihelp-query+random-param-limit": "Limitar cantas páxinas aleatorias se van devolver.",
+       "apihelp-query+recentchanges-description": "Enumerar cambios recentes.",
+       "apihelp-query+recentchanges-param-start": "Selo de tempo para comenzar a enumeración.",
+       "apihelp-query+recentchanges-param-end": "Selo de tempo para rematar a enumeración.",
+       "apihelp-query+recentchanges-param-user": "Só listar cambios deste usuario.",
+       "apihelp-query+recentchanges-param-excludeuser": "Non listar cambios deste usuario.",
+       "apihelp-query+recentchanges-param-tag": "Só listar cambios marcados con esta etiqueta.",
+       "apihelp-query+recentchanges-param-limit": "Número total de páxinas a devolver.",
+       "apihelp-query+recentchanges-param-type": "Que tipos de cambios mostrar.",
+       "apihelp-query+recentchanges-param-toponly": "Listar só cambios que son a última revisión.",
+       "apihelp-query+recentchanges-example-simple": "Listar cambios recentes.",
+       "apihelp-query+redirects-param-namespace": "Só incluir páxinas nestes espacios de nomes.",
+       "apihelp-query+redirects-example-simple": "Obter unha lista de redireccións á [[Main Page]]",
+       "apihelp-query+redirects-example-generator": "Obter información sobre tódalas redireccións á [[Main Page]]",
+       "apihelp-query+revisions-param-user": "Só incluir revisión feitas polo usuario.",
+       "apihelp-query+revisions-param-excludeuser": "Excluír revisións feitas polo usuario.",
+       "apihelp-query+revisions-param-tag": "Só listar revisións marcadas con esta etiqueta.",
+       "apihelp-query+revisions-example-last5": "Mostrar as cinco últimas revisión da \"Páxina Principal\"",
+       "apihelp-query+revisions-example-first5": "Mostar as cinco primeiras revisións da \"Páxina Principal\"",
+       "apihelp-query+revisions-example-first5-after": "Mostrar as cinco primeiras revisións da \"Páxinas Principais\" feitas despois de 2006-05-01",
+       "apihelp-query+revisions-example-first5-not-localhost": "Mostrar as cinco primeiras revisións da \"Páxina Principal\" que non foron feitas polo usuario anónimo \"127.0.0.1\"",
+       "apihelp-query+revisions-example-first5-user": "Mostrar as cinco primeiras revisión da \"Páxina Principal\" feitas polo usuario \"MediaWiki default\"",
+       "apihelp-query+revisions+base-param-limit": "Limitar cantas revisións se van devolver.",
+       "apihelp-query+search-description": "Facer unha busca por texto completo.",
+       "apihelp-query+search-param-search": "Buscar tódolos títulos de páxina (ou contido) que teñan este valor.",
+       "apihelp-query+search-param-namespace": "Buscar só nestes espazos de nomes.",
+       "apihelp-query+search-param-what": "Que tipo de busca lanzar.",
+       "apihelp-query+search-param-info": "Que metadatos devolver.",
+       "apihelp-query+search-param-limit": "Número total de páxinas a devolver.",
+       "apihelp-query+search-param-interwiki": "Incluir na busca resultados de interwikis, se é posible.",
+       "apihelp-query+search-example-simple": "Buscar por \"significado\"",
+       "apihelp-query+search-example-text": "Buscar texto por \"significado\"",
+       "apihelp-query+siteinfo-description": "Devolver información xeral sobre o sitio.",
+       "apihelp-query+siteinfo-param-numberingroup": "Listar o número de usuarios nos grupos de usuarios.",
+       "apihelp-query+tags-param-limit": "Máximo número de etiquetas a listar.",
+       "apihelp-query+tags-example-simple": "Listar as marcas dispoñibles",
+       "apihelp-query+templates-param-namespace": "Mostrar modelos só neste espazo de nomes.",
+       "apihelp-query+templates-param-limit": "Número de modelos a devolver.",
+       "apihelp-query+templates-param-dir": "Dirección na cal listar.",
+       "apihelp-query+templates-example-simple": "Coller modelos da [[Main Page]]",
+       "apihelp-query+templates-example-generator": "Obter información sobre os modelos na [[Main Page]]",
+       "apihelp-query+templates-example-namespaces": "Obter modelos da [[Main Page]] no espazo de nomes de Usuarios e Modelos",
+       "apihelp-query+transcludedin-param-namespace": "Só incluir páxinas nestes espacios de nomes.",
+       "apihelp-query+transcludedin-param-limit": "Cantos mostrar.",
+       "apihelp-query+usercontribs-description": "Mostrar tódalas edicións dun usuario.",
+       "apihelp-query+usercontribs-param-limit": "Máximo número de contribucións a mostar.",
+       "apihelp-query+usercontribs-param-namespace": "Só listar contribucións nestes espazos de nomes.",
+       "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.",
+       "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.",
+       "apihelp-query+usercontribs-example-user": "Mostrar contribucións de [[User:Example]]",
+       "apihelp-query+usercontribs-example-ipprefix": "Mostrar contribucións de tódalas IP que comezan por \"192.0.2.\"",
+       "apihelp-query+userinfo-description": "Obter información sobre o usuario actual.",
+       "apihelp-query+userinfo-example-simple": "Obter información sobre o usuario actual.",
+       "apihelp-query+userinfo-example-data": "Obter información adicional sobre o usuario actual.",
+       "apihelp-query+users-description": "Obter información sobre unha lista de usuarios.",
+       "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
+       "apihelp-query+users-example-simple": "Mostar información para [[User:Example]]",
+       "apihelp-query+watchlist-param-start": "Selo de tempo para comenzar a enumeración",
+       "apihelp-query+watchlist-param-end": "Selo de tempo para rematar a enumeración.",
+       "apihelp-query+watchlist-param-user": "Só listar cambios deste usuario.",
+       "apihelp-query+watchlist-param-excludeuser": "Non listar cambios deste usuario.",
+       "apihelp-query+watchlist-param-limit": "Cantos resultados totais mostrar por petición.",
+       "apihelp-query+watchlistraw-param-namespace": "Só listar páxinas nestes espazos de nomes.",
+       "apihelp-query+watchlistraw-param-limit": "Cantos resultados totais mostrar por petición.",
+       "apihelp-query+watchlistraw-param-show": "Só listar os elementos que cumplen estos criterios.",
+       "apihelp-query+watchlistraw-example-simple": "Listar páxinas na lista de vixiancia do usuario actual.",
+       "apihelp-revisiondelete-description": "Borrar e restaurar revisións.",
+       "apihelp-revisiondelete-param-hide": "Que ocultar para cada revisión.",
+       "apihelp-revisiondelete-param-show": "Que mostrar para cada revisión.",
+       "apihelp-revisiondelete-param-reason": "Razón para o borrado ou restaurado.",
+       "apihelp-revisiondelete-example-revision": "Ocultar contido para revisión 12345 na Páxina Principal",
+       "apihelp-rollback-param-markbot": "Marcar as edicións revertidas e a reversión como edicións de bot.",
+       "apihelp-rollback-example-simple": "Desfacer as últimas edicións do usuario Example á [[Main Page]]",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "Traballar en tódalas páxinas vixiadas.",
+       "apihelp-setnotificationtimestamp-example-all": "Restaurar o estado de notificación para toda a páxina de vixiancia",
+       "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a \"Páxina principal\"",
+       "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de Usuario",
+       "apihelp-unblock-description": "Desbloquear un usuario.",
+       "apihelp-unblock-param-reason": "Razón para desbloquear.",
+       "apihelp-unblock-example-id": "Desbloquear bloqueo ID #105",
+       "apihelp-unblock-example-user": "Desbloquear usuario Bob con razón \"Síntoo Bob\"",
+       "apihelp-undelete-param-title": "Título da páxina a restaurar.",
+       "apihelp-undelete-param-reason": "Razón para restaurar.",
+       "apihelp-undelete-example-page": "Restaurar [[Main Page]]",
+       "apihelp-undelete-example-revisions": "Restaurar dúas revisións de [[Main Page]]",
+       "apihelp-upload-param-text": "Texto da páxina inicial para novos ficheiros.",
+       "apihelp-upload-param-watch": "Vixiar a páxina.",
+       "apihelp-upload-param-ignorewarnings": "Ignorar as advertencias.",
+       "apihelp-upload-param-filesize": "Tamaño de ficheiro completo da carga.",
+       "apihelp-upload-example-url": "Carga dunha URL",
+       "apihelp-upload-example-filekey": "Completar carga que fallou debido a avisos",
+       "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-remove": "Eliminar o usuario destes grupos.",
+       "apihelp-userrights-param-reason": "Motivo para o cambio.",
+       "apihelp-watch-example-watch": "Vixiar a páxina \"Páxina Principal\"",
+       "apihelp-watch-example-unwatch": "Deixar de vixiar a páxina \"Páxina Principal\"",
+       "apihelp-watch-example-generator": "Vixiar as primeiras páxinas no espazo de nomes principal",
+       "api-orm-param-limit": "Número máximo de filas a mostrar.",
+       "api-pageset-param-titles": "Lista de títulos nos que traballar.",
+       "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.",
+       "api-help-title": "Axuda da API de MediaWiki",
+       "api-help-main-header": "Módulo principal",
+       "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-flag-readrights": "Este módulo precisa permisos de lectura.",
+       "api-help-flag-writerights": "Este módulo precisa permisos de escritura.",
+       "api-help-flag-mustbeposted": "Este módulo só acepta peticións POST.",
+       "api-help-flag-generator": "Este módulo pode usarse como xenerador.",
+       "api-help-parameters": "{{PLURAL:$1|Parámetro|Parámetros}}:",
+       "api-help-param-deprecated": "Obsoleto.",
+       "api-help-param-required": "Este parámetro é obrigatorio.",
+       "api-help-param-list": "{{PLURAL:$1|1=Un valor|2=Valores (separados con \"{{!}}\")}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Debe ser baleiro|Pode ser baleiro, ou $2}}",
+       "api-help-param-limit": "Non se permiten máis de $1.",
+       "api-help-param-limit2": "Non se permiten máis de $1 ($2 para bots).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=O valor debe ser maior |2=Os valores deben ser maiores}} que $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=O valor debe ser menor |2=Os valores deben ser menores}} que $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=O valor debe estar entre $2 e $3 |2=Os valores deben estar entre $2 e $3}}.",
+       "api-help-param-multi-separate": "Separe os valores con \"|\".",
+       "api-help-param-default": "Por defecto: $1",
+       "api-help-param-default-empty": "Por defecto: <span class=\"apihelp-empty\">(baleiro)</span>",
+       "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
+       "api-help-permissions": "{{PLURAL:$1|Permiso|Permisos}}:",
+       "api-credits-header": "Créditos"
+}
index 2774af3..18fdb04 100644 (file)
@@ -20,6 +20,7 @@
        "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "תגובה על הגרסה.",
        "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.",
        "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור",
        "apihelp-xml-param-xslt": "אם צוין, מוסיף &lt;xslt&gt; כגליון סגנונות. זה צריך להיות דף ויקי במרחב השם מדיה ויקי ששמו מסתיים ב\".xsl\".",
diff --git a/includes/api/i18n/hsb.json b/includes/api/i18n/hsb.json
new file mode 100644 (file)
index 0000000..b25ae9b
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "J budissin"
+               ]
+       },
+       "apihelp-main-param-format": "Wudawanski format"
+}
index f377056..b756613 100644 (file)
        "apihelp-main-param-requestid": "Omne valor fornite hic essera includite in le responsa. Pote esser usate pro distinguer requestas.",
        "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.",
        "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.",
+       "apihelp-main-param-origin": "Quando acceder al API usante un requesta AJAX inter-dominios (CORS), mitte isto al dominio de origine. Isto debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Isto debe corresponder exactemente a un del origines in le capite Origin:, dunque illo debe esser mittite a qualcusa como http://ia.wikipedia.org o https://meta.wikimedia.org. Si iste parametro non corresponde al capite Origin:, un responsa 403 essera retornate. Si iste parametro corresponde al capite Origin: e le origine es in le lista blanc, un capite Access-Control-Allow-Origin essera inserite.",
+       "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages. Un lista de codices pote esser obtenite ab [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages, o specifica \"user\" pro usar le preferentia de lingua del usator actual, o specifica \"content\" pro usar le lingua de contento de iste wiki.",
        "apihelp-block-description": "Blocar un usator.",
-       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar."
+       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar.",
+       "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. \"5 months\" o \"2 weeks\") o absolute (p.ex. \"2014-09-18T12:34:56Z\"). Si es mittite a \"infinite\", \"indefinite\" o \"never\", le blocada nunquam expirara.",
+       "apihelp-block-param-reason": "Motivo del blocada.",
+       "apihelp-block-param-anononly": "Blocar solmente usatores anonyme (i.e. disactivar modificationes anonyme pro iste adresse IP).",
+       "apihelp-block-param-nocreate": "Impedir le creation de contos.",
+       "apihelp-block-param-autoblock": "Blocar automaticamente le adresse IP usate le plus recentemente, e omne IPs successive desde le quales ille/-a tenta facer modificationes.",
+       "apihelp-block-param-noemail": "Impedir que le usator invia e-mail per le wiki. (Require le derecto \"blockemail\").",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"",
+       "api-credits": "Programmatores del API:\n* Roan Kattouw (programmator dirigente Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, programmator dirigente Sept. 2006–Sept. 2007)\n* Brad Jorsch (programmator dirigente 2013–presente)\n\nInvia tu commentos, suggestiones e questiones a mediawiki-api@lists.wikimedia.org\no insere un reportage de bug a https://phabricator.wikimedia.org/."
 }
index a06db94..dc69351 100644 (file)
@@ -2,7 +2,9 @@
        "@metadata": {
                "authors": [
                        "Shirayuki",
-                       "2nd-player"
+                       "2nd-player",
+                       "Los688",
+                       "Whym"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
        "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。コードの一覧は [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] に siprop=languages を付けることで取得できます。\"user\" を指定することで現在の利用者の個人設定の言語を、\"content\" を指定することでこのウィキの本文の言語を使用することもできます。",
        "apihelp-block-description": "利用者をブロックします。",
+       "apihelp-block-param-user": "ブロックする利用者名、IPアドレスまたはIPレンジ。",
+       "apihelp-block-param-reason": "ブロックの理由。",
+       "apihelp-block-param-anononly": "匿名利用者のみブロックします(つまり、このIPからの匿名での編集を不可能にします)。",
        "apihelp-block-param-nocreate": "アカウントの作成を禁止します。",
+       "apihelp-block-param-autoblock": "その利用者が最後に使用したIPアドレスと、ブロック後に編集を試みた際のIPアドレスを自動的にブロックします。",
+       "apihelp-block-param-noemail": "Wikiを通して電子メールを送信することを禁止します。(\"blockemail\" 権限が必要です)",
+       "apihelp-block-param-hidename": "ブロック記録から利用者名を秘匿します。(\"hideuser\" 権限が必要です)",
+       "apihelp-block-param-reblock": "その利用者がすでにブロックされている場合、ブロックを上書きします。",
+       "apihelp-block-param-watchuser": "その利用者またはIPの利用者ページとトークページをウォッチします。",
+       "apihelp-block-example-ip-simple": "IP 192.0.2.5 を \"First strike\" という理由で3日ブロックする",
+       "apihelp-block-example-user-complex": "利用者 \"Vandal\" を \"Vandalism\" という理由で無期限ブロックし、新たなアカウント作成とメールの送信を禁止する。",
        "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
+       "apihelp-createaccount-param-name": "利用者名。",
        "apihelp-createaccount-param-password": "パスワード ($1mailpassword が設定されると無視されます)。",
        "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
        "apihelp-delete-description": "ページを削除します。",
        "apihelp-delete-param-title": "削除するページ名です。 $1pageid とは同時に使用できません。",
        "apihelp-delete-param-pageid": "削除するページIDです。 $1title とは同時に使用できません。",
+       "apihelp-delete-param-reason": "削除の理由です。入力しない場合、自動的に生成された理由が使用されます。",
        "apihelp-delete-param-watch": "そのページをウォッチリストに追加します。",
        "apihelp-delete-param-unwatch": "そのページをウォッチリストから除去します。",
        "apihelp-delete-example-simple": "「Main Page」を削除する",
+       "apihelp-delete-example-reason": "\"Preparing for move\" という理由で Main Page を削除する",
        "apihelp-disabled-description": "このモジュールは無効化されています。",
+       "apihelp-edit-description": "ページを作成、編集します。",
        "apihelp-edit-param-title": "編集するページ名です。$1pageid とは同時に使用できません。",
        "apihelp-edit-param-pageid": "編集するページIDです。$1title とは同時に使用できません。",
        "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-minor": "細部の編集",
        "apihelp-edit-param-createonly": "すでにそのページが存在する場合は編集を行いません。",
        "apihelp-edit-param-nocreate": "そのページが存在しない場合にエラーを返します。",
        "apihelp-edit-param-watch": "そのページをウォッチリストに追加します。",
        "apihelp-edit-param-unwatch": "そのページをウォッチリストから除去します。",
        "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
+       "apihelp-edit-example-edit": "ページを編集",
        "apihelp-emailuser-description": "利用者に電子メールを送信します。",
        "apihelp-emailuser-param-target": "送信先の利用者名。",
        "apihelp-emailuser-param-text": "電子メールの本文。",
        "apihelp-emailuser-param-ccme": "電子メールの複製を自分にも送信します。",
+       "apihelp-filerevert-example-revert": "Wiki.png を 2011-03-05T15:27:40Z の版に差し戻す。",
        "apihelp-help-description": "指定したモジュールのヘルプを表示します。",
        "apihelp-help-param-modules": "ヘルプを表示するモジュールです (action= パラメーターおよび format= パラメーターの値、または \"main\")。\"+\" を使用して下位モジュールを指定できます。",
        "apihelp-help-param-submodules": "指定したモジュールの下位モジュールのヘルプを含めます。",
@@ -53,6 +72,7 @@
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
        "apihelp-login-param-name": "利用者名。",
        "apihelp-login-param-password": "パスワード。",
+       "apihelp-login-example-login": "ログイン",
        "apihelp-move-description": "ページを移動します。",
        "apihelp-move-param-from": "移動するページのページ名です。 $1fromid とは同時に使用できません。",
        "apihelp-move-param-fromid": "移動するページのページIDです。 $1from とは同時に使用できません。",
        "apihelp-yaml-description": "データを YAML 形式で出力します。",
        "apihelp-yamlfm-description": "データを YAML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
-       "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n出力形式を変更するには format パラメーターを指定します。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定します。\n\n詳細情報については [https://www.mediawiki.org/wiki/API の完全な説明文書]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
+       "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\nformat パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [https://www.mediawiki.org/wiki/API 完全な説明文書]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
        "api-help-title": "MediaWiki API ヘルプ",
        "api-help-lead": "このページは自動生成された MediaWiki API の説明文書ページです。\n\n説明文書と例: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "メイン モジュール",
        "api-help-permissions": "{{PLURAL:$1|権限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2",
        "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://bugzilla.wikimedia.org/"
+       "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 a417e47..f6608fd 100644 (file)
@@ -4,7 +4,23 @@
                        "Kwj2772"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\"> * [https://www.mediawiki.org/wiki/API:Main_page 설명문서] * [https://www.mediawiki.org/wiki/API:FAQ FAQ] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 https://www.mediawiki.org/wiki/API:Errors_and_warnings 를 참고하십시오.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\"> * [https://www.mediawiki.org/wiki/API:Main_page 설명문서] * [https://www.mediawiki.org/wiki/API:FAQ FAQ] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 https://www.mediawiki.org/wiki/API:Errors_and_warnings 를 참고하십시오.",
        "apihelp-main-param-action": "수행할 동작",
-       "apihelp-main-param-format": "출력값의 형식."
+       "apihelp-main-param-format": "출력값의 형식.",
+       "apihelp-block-description": "사용자를 차단합니다.",
+       "apihelp-block-param-user": "차단하고자 하는 계정 이름, IP 주소 또는 대역",
+       "apihelp-block-param-expiry": "기한. 상대값(예시: \"5 months\" 또는 \"2 weeks\") 또는 절대값(예시: \"2014-09-18T12:34:56Z\")이 될 수 있습니다. \"infinite\", \"indefinite\" 또는 \"never\"로 설정하면 무기한으로 설정됩니다.",
+       "apihelp-block-param-reason": "차단 이유.",
+       "apihelp-block-param-anononly": "익명 사용자만 차단합니다. (즉, 이 IP의 익명 편집을 막음)",
+       "apihelp-block-param-nocreate": "계정 생성을 막습니다.",
+       "apihelp-block-param-autoblock": "최근 사용한 IP 주소나 로그인을 시도한 이후에 사용한 모든 IP 주소를 자동으로 차단합니다.",
+       "apihelp-block-param-noemail": "위키를 통해 이메일을 보내지 못하도록 막습니다. (\"blockemail\" 권한 필요)",
+       "apihelp-block-param-hidename": "차단 기록에서 사용자 이름을 숨깁니다. (\"hideuser\" 권한 필요)",
+       "apihelp-block-param-allowusertalk": "자신의 토론 문서를 편집할 수 있도록 허용합니다. ($wgBlockAllowsUTEdit 값에 따라 다름)",
+       "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.",
+       "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
+       "apihelp-block-example-ip-simple": "IP 192.0.2.5에 대해 \"First strike\"라는 이유로 3일간 차단하기",
+       "apihelp-block-example-user-complex": "사용자 Vandal을 \"Vandalism\"이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
+       "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
+       "api-help-param-default": "기본값: $1"
 }
index 8fa5ca9..5f4e0df 100644 (file)
        "apihelp-query+deletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
        "apihelp-query+deletedrevs-param-unique": "Nëmmen eng Versioun fir all Säit weisen.",
        "apihelp-query+filearchive-example-simple": "Eng Lëscht vun alle geläschte Fichiere weisen",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "Setzt fir all Versioun vum Fichier de Benotzer dobäi deen en eropgelueden huet.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "Bemierkung iwwert d'Versioun.",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias fir Gréisst.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlech wéi $1urlwidth.",
        "apihelp-query+images-example-simple": "Eng Lëscht vun de Fichiere kréien déi op der [[Main Page|Haaptsäit]] benotzt ginn",
        "apihelp-query+imageusage-example-simple": "Säite weisen déi [[:File:Albert Einstein Head.jpg]] benotzen",
+       "apihelp-query+info-paramvalue-prop-readable": "Ob de Benotzer dës Säit liese kann.",
        "apihelp-query+langlinks-param-lang": "Nëmme Sproochlinke mat dësem Sproochcode zréckginn.",
        "apihelp-query+protectedtitles-param-namespace": "Nëmmen Titelen aus dësen Nummraim opzielen.",
        "apihelp-query+recentchanges-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
index 3126a28..8e2a8b5 100644 (file)
@@ -4,7 +4,7 @@
                        "Jagwar"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Torohevitra be kokoa]\n* [https://www.mediawiki.org/wiki/API:FAQ Fanontaniana miverina matetika]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lisitry ny mailaka manaraka]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Filazana API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Baogy & hataka]\n</div>\n<strong>Status:</strong> \nTokony mandeha avokoa ny fitaovana aseho eto amin'ity pehy ity, na dia izany aza mbola am-panamboarana ny API ary mety hiova na oviana na oviana. Araho amin'ny alalan'ny fisoratana ny mailakao ao amin'ny [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce lisitra fampielezana] ny fiovana.\n\n<strong>Hataka diso:</strong> \nRehefa alefa ao amin'i API ny hata, ho alefa miaraka amin'ny lakile \"MediaWiki-API-Error\" ny header HTTP ary samy homen-tsanda mitovy ny header ary ny kaodin-kadisoana. Ho an'ny torohay fanampiny dia jereo https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Torohevitra be kokoa]\n* [https://www.mediawiki.org/wiki/API:FAQ Fanontaniana miverina matetika]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lisitry ny mailaka manaraka]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Filazana API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Baogy & hataka]\n</div>\n<strong>Status:</strong> \nTokony mandeha avokoa ny fitaovana aseho eto amin'ity pehy ity, na dia izany aza mbola am-panamboarana ny API ary mety hiova na oviana na oviana. Araho amin'ny alalan'ny fisoratana ny mailakao ao amin'ny [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce lisitra fampielezana] ny fiovana.\n\n<strong>Hataka diso:</strong> \nRehefa alefa ao amin'i API ny hata, ho alefa miaraka amin'ny lakile \"MediaWiki-API-Error\" ny header HTTP ary samy homen-tsanda mitovy ny header ary ny kaodin-kadisoana. Ho an'ny torohay fanampiny dia jereo https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Inona ny zavatra ho atao.",
        "apihelp-main-param-format": "Format mivoaka",
        "apihelp-createaccount-param-name": "Anaram-pikambana."
index 9d6b027..686dab3 100644 (file)
@@ -4,7 +4,7 @@
                        "Bjankuloski06"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Документација]\n* [https://www.mediawiki.org/wiki/API:FAQ ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Документација]\n* [https://www.mediawiki.org/wiki/API:FAQ ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Кое дејство да се изврши.",
        "apihelp-main-param-format": "Формат на изводот.",
        "apihelp-main-param-maxlag": "Максималниот заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код „maxlag“ со порака од обликот „Го чекам $host: има заостаток од $lag секунди“.<br />Погл. https://www.mediawiki.org/wiki/Manual:Maxlag_parameter за повеќе информации.",
        "apihelp-query+alllinks-example-unique-generator": "Ги дава сите наслови со врски, означувајќи ги отсутните",
        "apihelp-query+alllinks-example-generator": "Дава страници што ги содржат врските",
        "apihelp-query+allmessages-description": "Дава пораки од ова мрежно место.",
+       "apihelp-query+allmessages-param-prop": "Кои својства да се дадат.",
        "apihelp-query+allmessages-param-filter": "Дај само пораки со називи што ја содржат оваа низа.",
        "apihelp-query+allmessages-param-customised": "Дај само пораки во оваа состојба на прилагоденост.",
        "apihelp-query+allmessages-param-lang": "Дај само пораки на овој јазик.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Доделена на}: $2",
        "api-help-right-apihighlimits": "Уоптреба на повисоки ограничувања за приложни барања (бавни барања: $1; брзи барања: $2). Ограничувањата за бавни барања важат и за повеќевредносни параметри.",
        "api-credits-header": "Признанија",
-       "api-credits": "Разработувачи на Извршникот:\n* Роан Катау (главен резработувач од септември 2007 до 2009 г.)\n* Виктор Василев\n* Брајан Тонг Мињ\n* Сем Рид\n* Јуриј Астрахан (создавач, главен разработувач од септември 2006 до септември 2007 г.)\n* Brad Jorsch (главен разработувач од 2013 г. до денес)\n\nВашите коментари, предлози и прашања испраќајте ги на mediawiki-api@lists.wikimedia.org\nа грешките пријавувајте ги на https://bugzilla.wikimedia.org/."
+       "api-credits": "Разработувачи на Извршникот:\n* Роан Катау (главен резработувач од септември 2007 до 2009 г.)\n* Виктор Василев\n* Брајан Тонг Мињ\n* Сем Рид\n* Јуриј Астрахан (создавач, главен разработувач од септември 2006 до септември 2007 г.)\n* Brad Jorsch (главен разработувач од 2013 г. до денес)\n\nВашите коментари, предлози и прашања испраќајте ги на mediawiki-api@lists.wikimedia.org\nа грешките пријавувајте ги на https://phabricator.wikimedia.org/."
 }
index ec494f4..041cf2c 100644 (file)
@@ -12,7 +12,9 @@
        "apihelp-help-example-main": "Bantuan untuk modul utama",
        "apihelp-help-example-recursive": "Segala bantuan dalam satu halaman",
        "apihelp-help-example-help": "Bantuan untuk modul bantuan",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Menambahkan jenis MIME thumbnail imej (memerlukan url dan param $1urlwidth).",
        "apihelp-query+prefixsearch-param-offset": "Bilangan hasil untuk dilangkau.",
+       "apihelp-query+usercontribs-param-show": "Hanya paparkan item-item yang mematuhi kriteria ini, cth. suntingan selain yang kecil sahaja: $2show=!minor.\n\nJika ditetapkannya $2show=patrolled atau $2show=!patrolled, maka semakan-semakan yang lebih lama daripada [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 saat) tidak akan dipaparkan.",
        "apihelp-userrights-param-userid": "ID pengguna.",
        "apihelp-dbgfm-description": "Data output dalam format var_export() PHP (''pretty-print'' dalam HTML).",
        "apihelp-dump-description": "Output data dalam format var_dump() PHP.",
index 450c641..d700f7a 100644 (file)
@@ -5,25 +5,41 @@
                        "Sjoerddebruin",
                        "Robin0van0der0vliet",
                        "Mar(c)",
-                       "Valhallasw"
+                       "Valhallasw",
+                       "Sikjes"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentatie]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie https://www.mediawiki.org/wiki/API:Errors_and_warnings voor meer informatie.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentatie]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie https://www.mediawiki.org/wiki/API:Errors_and_warnings voor meer informatie.",
        "apihelp-main-param-action": "Welke handeling uit te voeren.",
        "apihelp-main-param-format": "De opmaak van de uitvoer.",
        "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode \"maxlag\" teruggegeven met een bericht als \"Waiting for $host: $lag seconds lagged\".<br />Zie https://www.mediawiki.org/wiki/Manual:Maxlag_parameter voor mee informatie.",
        "apihelp-main-param-smaxage": "Stelt de header \"s-maxage\" in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-maxage": "Stelt de header \"max-age\" in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
-       "apihelp-main-param-assert": "Controleer of de gebruiker ingelogd is als \"user\" is meegegeven, en of de gebruiker het bot-gebruikersrecht heeft als \"bot\" is meegegeven.",
-       "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-assert": "Controleer of de gebruiker is aangemeld als \"user\" is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als \"bot\" is meegegeven.",
+       "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": "Voeg de huidige tijd toe aan het antwoord.",
+       "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
        "apihelp-block-description": "Gebruiker blokkeren.",
        "apihelp-block-param-reason": "Reden voor blokkade.",
+       "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen in te loggen.",
+       "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
+       "apihelp-delete-description": "Verwijder een pagina.",
+       "apihelp-delete-example-simple": "Verwijder de Hoofdpagina",
+       "apihelp-delete-example-reason": "Verwijder de Hoofdpagina met als reden \"Voorbereiding voor verplaatsing\"",
+       "apihelp-disabled-description": "Deze module is uitgeschakeld.",
+       "apihelp-edit-param-minor": "Kleine bewerking.",
+       "apihelp-edit-param-notminor": "Geen kleine bewerking.",
+       "apihelp-edit-param-bot": "Markeer deze bewerking als bot.",
+       "apihelp-edit-param-createonly": "Bewerk de pagina niet als die al bestaat.",
+       "apihelp-edit-param-nocreate": "Geef een foutmelding als de pagina niet bestaat.",
+       "apihelp-edit-param-watch": "Voeg de pagina toe aan je volglijst.",
+       "apihelp-edit-param-unwatch": "Verwijder de pagina van je volglijst.",
        "apihelp-edit-example-edit": "Pagina bewerken",
        "apihelp-emailuser-description": "Gebruiker e-mailen.",
+       "apihelp-emailuser-param-target": "Gebruiker naar wie de e-mail moet worden gestuurd.",
        "apihelp-emailuser-param-subject": "Onderwerpkoptekst.",
        "apihelp-emailuser-param-text": "E-mailtekst.",
+       "apihelp-emailuser-param-ccme": "Stuur mij een kopie van deze e-mail.",
        "apihelp-expandtemplates-param-title": "Paginanaam.",
        "apihelp-feedcontributions-param-year": "Van jaar (en eerder).",
        "apihelp-feedcontributions-param-month": "Van maand (en eerder).",
@@ -36,5 +52,5 @@
        "api-help-param-deprecated": "Verouderd.",
        "api-help-param-default": "Standaard: $1",
        "api-credits-header": "Vermeldingen",
-       "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://bugzilla.wikimedia.org/."
+       "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://phabricator.wikimedia.org/."
 }
index f61f215..4578a06 100644 (file)
@@ -4,7 +4,8 @@
                        "Chrumps",
                        "Py64",
                        "Pan Cube",
-                       "Alan ffm"
+                       "Alan ffm",
+                       "Devwebtel"
                ]
        },
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
        "apihelp-block-description": "Zablokuj użytkownika.",
        "apihelp-block-param-reason": "Powód blokady.",
        "apihelp-block-param-nocreate": "Zapobiegnij utworzeniu konta.",
+       "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika i jego IP oraz jego stronę dyskusji.",
+       "apihelp-block-example-ip-simple": "Zablokuj IP 192.0.2.5 na 3 dni za \"Pierwszy atak\"",
        "apihelp-createaccount-param-name": "Nazwa użytkownika",
        "apihelp-delete-description": "Usuń stronę.",
+       "apihelp-delete-param-watch": "Dodaj stronę do twojej listy obserwowanych.",
+       "apihelp-delete-param-unwatch": "Usuń stronę z twojej listy obserwowanych.",
        "apihelp-delete-example-simple": "Usuń stronę główną",
+       "apihelp-disabled-description": "Ten moduł został wyłączony.",
+       "apihelp-edit-description": "Utwórz i edytuj strony.;",
        "apihelp-edit-param-text": "Zawartość strony.",
        "apihelp-edit-param-minor": "Drobna zmiana.",
+       "apihelp-edit-param-notminor": "Nie drobna zmiana.",
+       "apihelp-edit-param-bot": "Oznacz tą edycję jako edycję bota.",
        "apihelp-edit-example-edit": "Edytuj stronę",
        "apihelp-emailuser-description": "Wyślij e‐mail do użytkownika.",
        "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.",
        "apihelp-move-description": "Przenieś stronę.",
        "apihelp-move-param-ignorewarnings": "Ignoruj wszystkie ostrzeżenia.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Dodaje kanoniczny tytuł pliku.",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias rozmiaru.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Dodaje typ MIME pliku.",
+       "apihelp-query+info-paramvalue-prop-watchers": "Liczba obserwujących, jeśli jest to dozwolone.",
+       "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę.",
        "apihelp-query+prefixsearch-param-offset": "Liczba wyników do pominięcia.",
        "apihelp-query+search-description": "Wykonaj wyszukiwanie pełnotekstowe.",
        "apihelp-query+watchlist-param-excludeuser": "Nie wyświetlaj zmian wykonanych przez tego użytkownika.",
        "api-help-permissions": "{{PLURAL:$2|Uprawnienie|Uprawnienia}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
        "api-credits-header": "Twórcy",
-       "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://bugzilla.wikimedia.org/."
+       "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://phabricator.wikimedia.org/."
 }
index 4dc23e5..99aeb0f 100644 (file)
@@ -5,11 +5,12 @@
                        "Fúlvio"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Qual acção a executar.",
        "apihelp-main-param-format": "O formato de saída.",
        "apihelp-block-description": "Bloquear um utilizador.",
        "apihelp-block-param-user": "Nome de utilizador(a), endereço ou gama de IP que pretende bloquear.",
+       "apihelp-block-param-reason": "Motivo do bloqueio.",
        "apihelp-block-param-nocreate": "Impedir criação de contas.",
        "apihelp-createaccount-description": "Criar uma nova conta.",
        "apihelp-createaccount-param-name": "Nome de utilizador(a).",
        "apihelp-edit-param-minor": "Edição menor.",
        "apihelp-edit-param-bot": "Marcar esta edição como robô.",
        "apihelp-edit-example-edit": "Editar uma página",
+       "apihelp-emailuser-description": "Enviar correio eletrónico a utilizador.",
+       "apihelp-emailuser-param-subject": "Assunto.",
+       "apihelp-emailuser-param-text": "Texto.",
        "apihelp-expandtemplates-param-title": "Título da página.",
+       "apihelp-feedcontributions-param-feedformat": "O formato do feed.",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições eliminadas.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.",
+       "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.",
        "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados a apresentar.",
        "apihelp-feedrecentchanges-param-from": "Mostrar alterações desde então.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar edições menores.",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "api-help-param-multi-separate": "Separe os valores com \"|\".",
+       "api-help-param-default": "Padrão: $1",
+       "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
        "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
+       "api-help-permissions": "{{PLURAL:$1|Permissão|Permissiões}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
        "api-credits-header": "Créditos",
-       "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://bugzilla.wikimedia.org/."
+       "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://phabricator.wikimedia.org/."
 }
index 0889dc9..c8713e8 100644 (file)
@@ -3,7 +3,9 @@
                "authors": [
                        "Liuxinyu970226",
                        "Robby",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "Umherirrender",
+                       "McDutchie"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "apihelp-main-param-uselang": "{{doc-apihelp-param|main|uselang}}",
        "apihelp-block-description": "{{doc-apihelp-description|block}}",
        "apihelp-block-param-user": "{{doc-apihelp-param|block|user}}",
-       "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}",
+       "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}",
        "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}",
-       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}",
-       "apihelp-block-param-nocreate": "{{doc-apihelp-param|block|nocreate}}",
-       "apihelp-block-param-autoblock": "{{doc-apihelp-param|block|autoblock}}",
-       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}",
+       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n* See also {{msg-mw|ipb-hardblock}}",
+       "apihelp-block-param-nocreate": "{{doc-apihelp-param|block|nocreate}}\n* See also {{msg-mw|ipbcreateaccount}}",
+       "apihelp-block-param-autoblock": "{{doc-singularthey}}\n{{doc-apihelp-param|block|autoblock}}\n* See also {{msg-mw|ipbenableautoblock}}",
+       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n* See also {{msg-mw|ipbemailban}}",
        "apihelp-block-param-hidename": "{{doc-apihelp-param|block|hidename}}",
-       "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}",
+       "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}\n* See also {{msg-mw|ipb-disableusertalk}}",
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
        "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}",
        "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}",
        "apihelp-expandtemplates-description": "{{doc-apihelp-description|expandtemplates}}",
        "apihelp-expandtemplates-param-title": "{{doc-apihelp-param|expandtemplates|title}}",
        "apihelp-expandtemplates-param-text": "{{doc-apihelp-param|expandtemplates|text}}",
-       "apihelp-expandtemplates-param-revid": "{{doc-apihelp-param|expandtemplates|revid}}",
+       "apihelp-expandtemplates-param-revid": "{{doc-apihelp-param|expandtemplates|revid}}\n{{doc-important|Do not translate <code><<nowiki />nowiki>{{<nowiki />REVISIONID}}<<nowiki />/nowiki></code>}}",
        "apihelp-expandtemplates-param-prop": "{{doc-apihelp-param|expandtemplates|prop}}",
        "apihelp-expandtemplates-param-includecomments": "{{doc-apihelp-param|expandtemplates|includecomments}}",
        "apihelp-expandtemplates-param-generatexml": "{{doc-apihelp-param|expandtemplates|generatexml}}",
        "apihelp-query+allimages-param-to": "{{doc-apihelp-param|query+allimages|to}}",
        "apihelp-query+allimages-param-start": "{{doc-apihelp-param|query+allimages|start}}",
        "apihelp-query+allimages-param-end": "{{doc-apihelp-param|query+allimages|end}}",
-       "apihelp-query+allimages-param-prop": "{{doc-apihelp-param|query+allimages|prop}}",
        "apihelp-query+allimages-param-prefix": "{{doc-apihelp-param|query+allimages|prefix}}",
        "apihelp-query+allimages-param-minsize": "{{doc-apihelp-param|query+allimages|minsize}}",
        "apihelp-query+allimages-param-maxsize": "{{doc-apihelp-param|query+allimages|maxsize}}",
        "apihelp-query+allimages-param-limit": "{{doc-apihelp-param|query+allimages|limit}}",
        "apihelp-query+allimages-example-B": "{{doc-apihelp-example|query+allimages}}",
        "apihelp-query+allimages-example-recent": "{{doc-apihelp-example|query+allimages}}",
+       "apihelp-query+allimages-example-mimetypes": "{{doc-apihelp-example|query+allimages}}",
        "apihelp-query+allimages-example-generator": "{{doc-apihelp-example|query+allimages}}",
        "apihelp-query+alllinks-description": "{{doc-apihelp-description|query+alllinks}}",
        "apihelp-query+alllinks-param-from": "{{doc-apihelp-param|query+alllinks|from}}",
        "apihelp-query+fileusage-example-simple": "{{doc-apihelp-example|query+fileusage}}",
        "apihelp-query+fileusage-example-generator": "{{doc-apihelp-example|query+fileusage}}",
        "apihelp-query+imageinfo-description": "{{doc-apihelp-description|query+imageinfo}}",
-       "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop}}",
+       "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop|paramvalues=1}}",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+imageinfo|prop|timestamp}}",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+imageinfo|prop|user}}",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+imageinfo|prop|userid}}",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+imageinfo|prop|comment}}",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+imageinfo|prop|parsedcomment}}",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "{{doc-apihelp-paramvalue|query+imageinfo|prop|canonicaltitle}}",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+imageinfo|prop|url}}",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+imageinfo|prop|size}}",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "{{doc-apihelp-paramvalue|query+imageinfo|prop|dimensions}}",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "{{doc-apihelp-paramvalue|query+imageinfo|prop|sha1}}",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "{{doc-apihelp-paramvalue|query+imageinfo|prop|mime}}",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "{{doc-apihelp-paramvalue|query+imageinfo|prop|thumbmime}}",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "{{doc-apihelp-paramvalue|query+imageinfo|prop|mediatype}}",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "{{doc-apihelp-paramvalue|query+imageinfo|prop|metadata}}",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "{{doc-apihelp-paramvalue|query+imageinfo|prop|commonmetadata}}",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "{{doc-apihelp-paramvalue|query+imageinfo|prop|extmetadata}}",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "{{doc-apihelp-paramvalue|query+imageinfo|prop|archivename}}",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "{{doc-apihelp-paramvalue|query+imageinfo|prop|bitdepth}}",
+       "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "{{doc-apihelp-paramvalue|query+imageinfo|prop|uploadwarning}}",
        "apihelp-query+imageinfo-param-limit": "{{doc-apihelp-param|query+imageinfo|limit}}",
        "apihelp-query+imageinfo-param-start": "{{doc-apihelp-param|query+imageinfo|start}}",
        "apihelp-query+imageinfo-param-end": "{{doc-apihelp-param|query+imageinfo|end}}",
        "apihelp-query+imageusage-example-simple": "{{doc-apihelp-example|query+imageusage}}",
        "apihelp-query+imageusage-example-generator": "{{doc-apihelp-example|query+imageusage}}",
        "apihelp-query+info-description": "{{doc-apihelp-description|query+info}}",
-       "apihelp-query+info-param-prop": "{{doc-apihelp-param|query+info|prop}}",
+       "apihelp-query+info-param-prop": "{{doc-apihelp-param|query+info|prop|paramvalues=1}}",
+       "apihelp-query+info-paramvalue-prop-protection": "{{doc-apihelp-paramvalue|query+info|prop|protection}}",
+       "apihelp-query+info-paramvalue-prop-talkid": "{{doc-apihelp-paramvalue|query+info|prop|talkid}}",
+       "apihelp-query+info-paramvalue-prop-watched": "{{doc-apihelp-paramvalue|query+info|prop|watched}}",
+       "apihelp-query+info-paramvalue-prop-watchers": "{{doc-apihelp-paramvalue|query+info|prop|watchers}}",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "{{doc-apihelp-paramvalue|query+info|prop|notificationtimestamp}}",
+       "apihelp-query+info-paramvalue-prop-subjectid": "{{doc-apihelp-paramvalue|query+info|prop|subjectid}}",
+       "apihelp-query+info-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+info|prop|url}}",
+       "apihelp-query+info-paramvalue-prop-readable": "{{doc-apihelp-paramvalue|query+info|prop|readable}}",
+       "apihelp-query+info-paramvalue-prop-preload": "{{doc-apihelp-paramvalue|query+info|prop|preload}}",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "{{doc-apihelp-paramvalue|query+info|prop|displaytitle}}",
        "apihelp-query+info-param-token": "{{doc-apihelp-param|query+info|token}}",
        "apihelp-query+info-example-simple": "{{doc-apihelp-example|query+info}}",
        "apihelp-query+info-example-protection": "{{doc-apihelp-example|query+info}}",
        "apihelp-query+stashimageinfo-description": "{{doc-apihelp-description|query+stashimageinfo}}",
        "apihelp-query+stashimageinfo-param-filekey": "{{doc-apihelp-param|query+stashimageinfo|filekey}}",
        "apihelp-query+stashimageinfo-param-sessionkey": "{{doc-apihelp-param|query+stashimageinfo|sessionkey}}",
-       "apihelp-query+stashimageinfo-param-prop": "{{doc-apihelp-param|query+stashimageinfo|prop}}",
        "apihelp-query+stashimageinfo-example-simple": "{{doc-apihelp-example|query+stashimageinfo}}",
        "apihelp-query+stashimageinfo-example-params": "{{doc-apihelp-example|query+stashimageinfo}}",
        "apihelp-query+tags-description": "{{doc-apihelp-description|query+tags}}",
        "apihelp-xmlfm-description": "{{doc-apihelp-description|xmlfm|seealso=* {{msg-mw|apihelp-xml-description}}}}",
        "apihelp-yaml-description": "{{doc-apihelp-description|yaml|seealso=* {{msg-mw|apihelp-yamlfm-description}}}}",
        "apihelp-yamlfm-description": "{{doc-apihelp-description|yamlfm|seealso=* {{msg-mw|apihelp-yaml-description}}}}",
-       "api-format-title": "Page title when API output is pretty-printed in HTML.",
+       "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
        "api-orm-param-props": "{{doc-apihelp-param|orm|props|description=the \"props\" parameter in subclasses of ApiQueryORM}}",
        "api-orm-param-limit": "{{doc-apihelp-param|orm|limit|description=the \"limit\" parameter in subclasses of ApiQueryORM}}",
        "api-help-param-multi-max": "Used to indicate the maximum number of values accepted for a multi-valued parameter.\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
        "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}\n{{Identical|Default}}",
        "api-help-param-default-empty": "Used to display the default value for an API parameter when that default is an empty value\n\nSee also:\n* {{msg-mw|api-help-param-default}}",
-       "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=3|params=\n* $1 - Token type|noseealso=1}}",
+       "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=2|params=\n* $1 - Token type|noseealso=1}}",
        "api-help-param-token-webui": "{{doc-apihelp-param|description=additional text for any \"token\" parameter, explaining that web UI tokens are also accepted|noseealso=1}}",
        "api-help-param-disabled-in-miser-mode": "{{doc-apihelp-param|description=any parameter that is disabled when [[mw:Manual:$wgMiserMode|$wgMiserMode]] is set.|noseealso=1}}",
        "api-help-param-limited-in-miser-mode": "{{doc-apihelp-param|description=additional text for any parameter that may cause the module to return few results when [[mw:Manual:$wgMiserMode|$wgMiserMode]] is set.|noseealso=1}}",
diff --git a/includes/api/i18n/roa-tara.json b/includes/api/i18n/roa-tara.json
new file mode 100644 (file)
index 0000000..0706412
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Joetaras"
+               ]
+       },
+       "apihelp-block-param-reason": "Mutive pu blocche.",
+       "apihelp-createaccount-param-name": "Nome de l'utende.",
+       "apihelp-edit-param-text": "Vôsce.",
+       "apihelp-edit-example-edit": "Cange 'na pàgene"
+}
index 14e0015..a075a49 100644 (file)
@@ -66,5 +66,5 @@
        "api-help-permissions": "{{PLURAL:$1|අවසරය|අවසරයන්}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|\tප්‍රදානලාභියාට}}: $2",
        "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 වෙත යොමු කරන්න, පින්තූර හෝ ගොනු හරහා ගැටළු ඉදිරිපත් කිරීමට  https://bugzilla.wikimedia.org/ වෙත පිවිසෙන්න."
+       "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 වෙත යොමු කරන්න, පින්තූර හෝ ගොනු හරහා ගැටළු ඉදිරිපත් කිරීමට  https://phabricator.wikimedia.org/ වෙත පිවිසෙන්න."
 }
index 32a6765..cf3a4de 100644 (file)
@@ -4,5 +4,8 @@
                        "Milicevic01"
                ]
        },
-       "apihelp-block-param-reason": "Разлог блокирање."
+       "apihelp-block-description": "Блокирај корисника.",
+       "apihelp-block-param-reason": "Разлог за блокирање.",
+       "apihelp-delete-description": "Обриши страницу.",
+       "apihelp-edit-param-minor": "Мања измена."
 }
diff --git a/includes/api/i18n/sr-el.json b/includes/api/i18n/sr-el.json
new file mode 100644 (file)
index 0000000..55611f0
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Milicevic01"
+               ]
+       },
+       "apihelp-block-description": "Blokiraj korisnika.",
+       "apihelp-block-param-reason": "Razlog za blokiranje.",
+       "apihelp-delete-description": "Obriši stranicu.",
+       "apihelp-edit-param-minor": "Manja izmena."
+}
index 1475a84..ca690bf 100644 (file)
@@ -5,21 +5,37 @@
                        "Lokal Profil",
                        "WikiPhoenix",
                        "Victorsa",
-                       "Albinomamba"
+                       "Albinomamba",
+                       "Peki01",
+                       "Stens51"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlist]\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 https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Vilken åtgärd som ska utföras.",
        "apihelp-main-param-format": "Formatet för utdata.",
+       "apihelp-main-param-assert": "Bekräftar att användaren är inloggad om satt till \"user\", eller har bot-användarrättigheter om satt till \"bot\".",
+       "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-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 Origin:-headern exakt, så den måste sättas till något i stil med http://en.wikipedia.org eller https://meta.wikimedia.org. Om denna parameter inte överensstämmer med Origin:-headern, returneras ett 403-svar. Om denna parameter överensstämmer med Origin:-headern och källan är vitlistad, sätts en Access-Control-Allow-Origin-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 [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages, eller ange \"user\" för att använda den aktuella användarens språkpreferenser, eller ange \"content\" för att använda innehållsspråket.",
        "apihelp-block-description": "Blockera en användare.",
        "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall du vill blockera.",
+       "apihelp-block-param-expiry": "Förfallotid. Kan vara Kan vara relativt (t.ex. \"5 months\" eller \"2 weeks\") eller absolut (t.ex. 2014-09-18T12:34:56Z\"). Om satt till \"infinite\", \"indefinite\" eller \"never\", kommer blockeringen aldrig att löpa ut.",
        "apihelp-block-param-reason": "Orsak till blockering.",
        "apihelp-block-param-anononly": "Blockera endast anonyma användare (t.ex. inaktivera anonyma redigeringar för denna IP-adress).",
        "apihelp-block-param-nocreate": "Förhindra registrering av användarkonton.",
+       "apihelp-block-param-autoblock": "Blockera automatiskt den senast använda IP-adressen, och alla efterföljande IP-adresser de försöker logga in från.",
+       "apihelp-block-param-noemail": "Hindra användaren från att skicka e-post via wikin. (Kräver \"blockemail\"-rättigheten).",
        "apihelp-block-param-hidename": "Döljer användarnamnet från blockeringsloggen. (Kräver rättigheten \"hideuser\").",
        "apihelp-block-param-allowusertalk": "Låt användaren redigera sin egen diskussionssida (beror på $wgBlockAllowsUTEdit).",
        "apihelp-block-param-reblock": "Skriv över befintlig blockering om användaren redan är blockerad.",
        "apihelp-block-param-watchuser": "Bevaka användarens eller IP-adressens användarsida och diskussionssida",
+       "apihelp-block-example-ip-simple": "Blockera IP-adressen 192.0.2.5 i tre dagar med motivationen \"First strike\"",
+       "apihelp-block-example-user-complex": "Blockera användare Vandal på obegränsad tid med motivationen \"Vandalism\", och förhindra kontoskapande och e-post.",
+       "apihelp-clearhasmsg-description": "Rensa hasmsg-flaggan för den aktuella användaren.",
+       "apihelp-clearhasmsg-example-1": "Rensa hasmsg-flaggan för den aktuella användaren",
+       "apihelp-compare-description": "Hämta skillnaden mellan två sidor.\n\nDu behöver skicka ett versionsnummer, en sidtitel, eller ett sid-Id för både \"from\" och \"to\".",
        "apihelp-compare-param-fromtitle": "Första titeln att jämföra.",
        "apihelp-compare-param-fromid": "Första sid-ID att jämföra.",
        "apihelp-compare-param-fromrev": "Första version att jämföra.",
        "apihelp-createaccount-param-name": "Användarnamn.",
        "apihelp-createaccount-param-password": "Lösenord (ignoreras om $1mailpassword angetts).",
        "apihelp-createaccount-param-domain": "Domän för extern autentisering (frivillig).",
+       "apihelp-createaccount-param-token": "Nyckel för kontoskapande erhölls i första begäran.",
        "apihelp-createaccount-param-email": "Användarens e-postadress (valfritt).",
        "apihelp-createaccount-param-realname": "Användarens riktiga namn (valfritt).",
+       "apihelp-createaccount-param-mailpassword": "Om satt till ett värde, skickas ett slumpmässigt lösenord till användaren via e-post.",
+       "apihelp-createaccount-param-reason": "Valfri anledning för att skapa kontot för att läggas till i loggarna.",
+       "apihelp-createaccount-param-language": "Språkkod att använda som standard för användaren (valfri, standardvärdet är innehållsspråket).",
        "apihelp-createaccount-example-pass": "Skapa användaren \"testuser\" med lösenordet \"test123\"",
+       "apihelp-createaccount-example-mail": "Skapa användaren \"testmailuser\" och skicka ett slumpgenererat lösenord via e-post",
        "apihelp-delete-description": "Radera en sida.",
+       "apihelp-delete-param-title": "Titel på sidan du vill radera. Kan inte användas tillsammans med $1pageid.",
+       "apihelp-delete-param-pageid": "Sid-ID för sidan du vill radera. Kan inte användas tillsammans med $1titel.",
        "apihelp-delete-param-reason": "Orsak till radering. Om orsak inte ges kommer en orsak att automatiskt genereras och användas.",
        "apihelp-delete-param-watch": "Lägg till sidan i din bevakningslista.",
        "apihelp-delete-param-unwatch": "Ta bort sidan från din bevakningslista.",
        "apihelp-delete-example-reason": "Raderar huvudsidan med orsaken \"Förbereder flyttning\"",
        "apihelp-disabled-description": "Denna modul har inaktiverats.",
        "apihelp-edit-description": "Skapa och redigera sidor.",
+       "apihelp-edit-param-title": "Titel på sidan du vill redigera. Kan inte användas tillsammans med $1pageid.",
+       "apihelp-edit-param-pageid": "Sid-ID för sidan du vill redigera. Kan inte användas tillsammans med $1titel.",
+       "apihelp-edit-param-section": "Avsnittsnummer. 0 för det översta avsnittet, \"new\" för ett nytt avsnitt.",
        "apihelp-edit-param-sectiontitle": "Rubriken för ett nytt avsnitt.",
        "apihelp-edit-param-text": "Sidans innehåll.",
        "apihelp-edit-param-summary": "Redigeringssammanfattning. Även avsnittets rubrik när $1section=new och $1sectiontitle inte anges.",
        "apihelp-edit-param-minor": "Mindre redigering.",
+       "apihelp-edit-param-notminor": "Icke-mindre redigering.",
        "apihelp-edit-param-bot": "Markera denna redigering som robotredigering.",
+       "apihelp-edit-param-basetimestamp": "Tidsstämpel för grundversionen, används för att upptäcka redigeringskonflikter. Kan erhållas genom [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Tidsstämpel för när du började redigeringsprocessen, används för att upptäcka redigeringskonflikter. Ett lämpligt värde kan erhållas via  [[Special:ApiHelp/main|curtimestamp]] när redigeringsprocessen startas (t.ex. när sidans innehåll laddas för redigering).",
        "apihelp-edit-param-createonly": "Redigera inte sidan om den redan finns.",
        "apihelp-edit-param-nocreate": "Kasta ett fel om sidan inte finns.",
        "apihelp-edit-param-watch": "Lägg till sidan i din bevakningslista.",
        "apihelp-edit-param-unwatch": "Ta bort sidan från din bevakningslista.",
+       "apihelp-edit-param-md5": "MD5-hash för $1text-parametern, eller $1prependtext- och $1appendtext-parametrarna sammanfogade.",
+       "apihelp-edit-param-prependtext": "Lägg till denna text i början på sidan. Ersätter $1text.",
+       "apihelp-edit-param-appendtext": "Lägg till denna text i slutet på sidan. Ersätter $1text.\n\nAnvänd $1section=new för att lägga till en ny sektion, hellre än denna parameter.",
        "apihelp-edit-param-redirect": "Åtgärda automatiskt omdirigeringar.",
+       "apihelp-edit-param-token": "Token ska alltid skickas som sista parameter, eller åtminstone efter $1text-parametern",
        "apihelp-edit-example-edit": "Redigera en sida",
        "apihelp-emailuser-description": "Skicka e-post till en användare.",
        "apihelp-emailuser-param-target": "Användare att skicka e-post till.",
+       "apihelp-emailuser-param-subject": "Ämnesrubrik.",
        "apihelp-emailuser-param-text": "E-postmeddelandets innehåll.",
        "apihelp-emailuser-param-ccme": "Skicka en kopia av detta e-postmeddelande till mig.",
        "apihelp-emailuser-example-email": "Skicka ett e-postmeddelande till användaren \"WikiSysop\" med texten \"Content\"",
+       "apihelp-expandtemplates-description": "Expanderar alla mallar i wikitext.",
        "apihelp-expandtemplates-param-title": "Sidans rubrik.",
        "apihelp-expandtemplates-param-text": "Wikitext att konvertera.",
+       "apihelp-expandtemplates-param-revid": "Revision ID, för <nowiki>{{REVISIONID}}</nowiki> och liknande variabler.",
+       "apihelp-expandtemplates-example-simple": "Expandera wikitexten \"<nowiki>{{Projekt:Sandbox}}</nowiki>\"",
        "apihelp-feedcontributions-param-year": "Från år (och tidigare).",
        "apihelp-feedcontributions-param-month": "Från månad (och tidigare).",
+       "apihelp-feedcontributions-param-tagfilter": "Filtrera bidrag som har dessa taggar.",
+       "apihelp-feedcontributions-param-deletedonly": "Visa bara borttagna bidrag.",
+       "apihelp-feedcontributions-param-toponly": "Visa endast ändringar som är senaste revideringen.",
+       "apihelp-feedcontributions-param-newonly": "Visa endast redigeringar där sidor skapas.",
+       "apihelp-feedcontributions-param-showsizediff": "Visa skillnaden i storlek mellan revisioner.",
        "apihelp-feedcontributions-example-simple": "Returnera bidrag för [[User:Example]]",
        "apihelp-feedrecentchanges-param-days": "Dagar att begränsa resultaten till.",
        "apihelp-feedrecentchanges-param-limit": "Maximalt antal resultat att returnera.",
+       "apihelp-feedrecentchanges-param-from": "Visa förändringar sedan dess.",
        "apihelp-feedrecentchanges-param-hideminor": "Dölj mindre ändringar.",
        "apihelp-feedrecentchanges-param-hidebots": "Dölj robotändringar.",
        "apihelp-feedrecentchanges-param-hideanons": "Dölj ändringar av oinloggade användare.",
        "apihelp-feedrecentchanges-param-hidemyself": "Dölj mina ändringar.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.",
        "apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Visa ändringarna på sidor som är länkade till den valda sidan i stället.",
        "apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar",
        "apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn",
+       "apihelp-feedwatchlist-param-hours": "Lista sidor ändrade inom så här många timmar från nu.",
+       "apihelp-feedwatchlist-param-linktosections": "Länka direkt till ändrade avsnitt om möjligt.",
        "apihelp-filerevert-description": "Återställ en fil till en äldre version.",
        "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
        "apihelp-filerevert-example-revert": "Återställ Wiki.png till versionen från 2011-03-05T15:27:40Z",
        "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-query-param-list": "Vilka listor att hämta.",
+       "apihelp-query-param-meta": "Vilka metadata att hämta.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kan endast användas med $3user.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kan inte användas med $3user.",
        "apihelp-query+allfileusages-example-unique": "Lista unika filtitlar",
        "apihelp-query+allmessages-example-ipb": "Visa meddelanden som börjar med \"ipb-\"",
        "apihelp-query+allmessages-example-de": "Visa meddelandena \"august\" och \"mainpage\" på tyska",
        "apihelp-query+allpages-param-filterredir": "Vilka sidor att lista.",
+       "apihelp-query+allusers-param-dir": "Riktning att sortera i.",
+       "apihelp-query+allusers-example-Y": "Lista användare som börjar på Y",
+       "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av \"huvudsidan\" och som inte gjorts av anonym användare \"127.0.0.1\"",
        "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
        "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
index d9f89a4..6fd5514 100644 (file)
@@ -1,9 +1,26 @@
 {
        "@metadata": {
                "authors": [
-                       "Ата"
+                       "Ата",
+                       "A1"
                ]
        },
        "apihelp-main-param-action": "Яку дію виконати.",
-       "apihelp-main-param-format": "Формат виводу."
+       "apihelp-main-param-format": "Формат виводу.",
+       "apihelp-createaccount-param-name": "Ім'я користувача.",
+       "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено $1mailpassword).",
+       "apihelp-createaccount-param-domain": "Домен для зовнішньої аутентифікації (опціонально).",
+       "apihelp-edit-example-edit": "Редагувати сторінку",
+       "apihelp-edit-example-prepend": "Додати зміст на початок сторінки",
+       "apihelp-edit-example-undo": "Скасувати версії з 13579 по 13585 з автоматичним описом змін",
+       "apihelp-emailuser-description": "Надіслати електронного листа користувачеві",
+       "apihelp-emailuser-param-target": "Користувач, якому відправляється електронний лист.",
+       "apihelp-emailuser-param-subject": "Заголовок теми.",
+       "apihelp-emailuser-param-text": "Тіло листа.",
+       "apihelp-emailuser-param-ccme": "Надіслати копію цього повідомлення мені.",
+       "apihelp-emailuser-example-email": "Відправити листа користувачу \"WikiSysop\" з текстом \"Вміст\"",
+       "apihelp-expandtemplates-description": "Розгортає усі шаблони у вікітекст.",
+       "apihelp-expandtemplates-param-title": "Заголовок сторінки.",
+       "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.",
+       "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження"
 }
index 7c14404..01b2718 100644 (file)
@@ -6,13 +6,19 @@
                        "Liuxinyu970226",
                        "Papapasan",
                        "LNDDYL",
-                       "Shizhao"
+                       "Shizhao",
+                       "Yfdyh000",
+                       "JuneAugsut"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/zh 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ/zh 常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅 https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/zh 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ/zh 常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅 https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
        "apihelp-main-param-action": "要执行的操作。",
        "apihelp-main-param-format": "输出的格式。",
+       "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码“maxlag”会返回消息,例如“等待$host中:延迟$lag秒”。<br />参见https://www.mediawiki.org/wiki/Manual:Maxlag_parameter以获取更多信息。",
+       "apihelp-main-param-smaxage": "设置s-maxage页顶至这些秒。错误不会缓存。",
+       "apihelp-main-param-maxage": "设置max-age页顶至这些秒。错误不会缓存。",
        "apihelp-main-param-assert": "如果设置为“user”就验证用户是否登录,或如果设置为“bot”就验证是否有机器人用户权限。",
+       "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可能可以用以区别请求。",
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。这必须匹配Origin中的一个起点:从头到底,因此它已经设置为像http://zh.wikipedia.org或https://meta.wikimedia.org的东西。如果此参数不匹配Origin: header,就返回403错误响应。如果此参数匹配Origin: header并且起点被白名单,将设置一个Access-Control-Allow-Origin开头。",
        "apihelp-block-param-reason": "封禁的原因",
        "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此IP的匿名编辑)。",
        "apihelp-block-param-nocreate": "防止创建帐户。",
+       "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。",
        "apihelp-block-param-noemail": "阻止用户通过 wiki发送电子邮件。(要求\"blockemail\"权限)。",
        "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要“隐藏用户”权限)。",
        "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页 (取决于 $wgBlockAllowsUTEdit)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
        "apihelp-block-param-watchuser": "监视该用户或该 IP 的用户页和讨论页。",
-       "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因“首次罢工”",
+       "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因“首次处理”",
+       "apihelp-block-example-user-complex": "无限期封禁破坏用户,原因“纯破坏用户”,并阻止新账户创建和电子邮件",
        "apihelp-clearhasmsg-description": "清除当前用户的 hasmsg 标志。",
        "apihelp-clearhasmsg-example-1": "清除当前用户的 hasmsg 标志",
        "apihelp-compare-description": "获取2个页面之间的差别。\n\n您必须为\"from\"和\"to\"传递特定的修订版本号、 页面标题或页面ID。",
        "apihelp-delete-param-pageid": "你所希望删除的页面的页面ID。不能与$1title一起使用。",
        "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。",
        "apihelp-delete-param-watch": "将该页面加入您的监视列表。",
+       "apihelp-delete-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-delete-param-unwatch": "将该页面从您的监视列表删除。",
+       "apihelp-delete-param-oldimage": "由[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]]提供的要删除的旧图片名称。",
        "apihelp-delete-example-simple": "删除首页",
        "apihelp-delete-example-reason": "删除首页,原因“准备移动”",
        "apihelp-disabled-description": "此模块已禁用。",
        "apihelp-edit-description": "创建和编辑页面。",
        "apihelp-edit-param-title": "您希望编辑的页面标题。不能与$1pageid一起使用。",
        "apihelp-edit-param-pageid": "您希望编辑的页面ID。不能与$1title一起使用。",
+       "apihelp-edit-param-section": "段落数。0用于首段,“new”用于新的段落。",
        "apihelp-edit-param-sectiontitle": "新小节的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
        "apihelp-edit-param-minor": "小编辑。",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
+       "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。也许可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
+       "apihelp-edit-param-starttimestamp": "您开始编辑过程的时间戳,用于检测编辑冲突。当开始编辑过程时(例如当加载要编辑的页面时)使用[[Special:ApiHelp/main|curtimestamp]]可能取得一个适当的值。",
+       "apihelp-edit-param-recreate": "覆盖有关该页面在此期间已被删除的任何错误。",
        "apihelp-edit-param-createonly": "不要编辑页面,如果已经存在。",
        "apihelp-edit-param-nocreate": "如果该页面不存在,则抛出一个错误。",
        "apihelp-edit-param-watch": "将页面加入您的监视列表。",
        "apihelp-edit-param-unwatch": "将页面从您的监视列表移除。",
+       "apihelp-edit-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
+       "apihelp-edit-param-md5": "$1text参数或$1prependtext和$1appendtext级联参数的MD5哈希值。如果设置,除非哈希值正确否则编辑无法完成。",
        "apihelp-edit-param-prependtext": "将该文本添加到该页面的开始。覆盖$1text。",
        "apihelp-edit-param-appendtext": "将该文本添加到该页面的结尾。覆盖$1text。\n\n采用$1section=new来添加一个新的章节,而不是这个参数。",
        "apihelp-edit-param-undo": "撤销此次修订。覆盖$1text、$1prependtext和$1appendtext。",
+       "apihelp-edit-param-undoafter": "撤销从$1undo至此的所有修订。如果不设置就撤销一次修订。",
        "apihelp-edit-param-redirect": "自动解析重定向。",
        "apihelp-edit-param-contentformat": "用于输入文本的内容串行化格式。",
        "apihelp-edit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
        "apihelp-edit-example-edit": "编辑一个页面",
        "apihelp-edit-example-prepend": "页面中预置_&#95;NOTOC_&#95;",
        "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
        "apihelp-expandtemplates-param-title": "页面标题。",
        "apihelp-expandtemplates-param-text": "要转换的wiki文本。",
        "apihelp-expandtemplates-param-revid": "修订版本ID,用于<nowiki>{{REVISIONID}}</nowiki>和类似变体。",
+       "apihelp-expandtemplates-param-prop": "要获取的那条信息:\n;wikitext:展开的wiki文本。\n;categories:任何在不代表wiki文本输出的输入框出现的分类。\n;properties:由wiki文本中扩充的魔术字定义的页面属性。\n;volatile:输出是否不稳定,并且不应在任何页面中再度使用。\n;ttl:结果的哪个缓存后等待最长时间应无效化。\n;parsetree:输入的XML解析树。\n注意如果没有选定值,结果将包含wiki文本,但将以弃用的格式显示。",
+       "apihelp-expandtemplates-param-includecomments": "输出时是否包含HTML摘要。",
+       "apihelp-expandtemplates-param-generatexml": "生成XML解析树(取代自$1prop=parsetree)。",
        "apihelp-expandtemplates-example-simple": "展开wiki文本“<nowiki>{{Project:Sandbox}}</nowiki>”",
        "apihelp-feedcontributions-description": "返回用户贡献纲要。",
        "apihelp-feedcontributions-param-feedformat": "纲要的格式。",
+       "apihelp-feedcontributions-param-user": "获取哪些用户的贡献。",
+       "apihelp-feedcontributions-param-namespace": "过滤哪些命名空间的贡献。",
        "apihelp-feedcontributions-param-year": "起始年份(及更早)。",
        "apihelp-feedcontributions-param-month": "起始月份(及更早)。",
+       "apihelp-feedcontributions-param-tagfilter": "过滤有这些标签的贡献者。",
        "apihelp-feedcontributions-param-deletedonly": "仅显示已删除的贡献。",
        "apihelp-feedcontributions-param-toponly": "仅仅显示那些作为最新修订的编辑。",
        "apihelp-feedcontributions-param-newonly": "仅仅显示那些作为页面创建的编辑。",
        "apihelp-feedrecentchanges-param-feedformat": "纲要的格式。",
        "apihelp-feedrecentchanges-param-namespace": "用于限制结果的命名空间。",
        "apihelp-feedrecentchanges-param-invert": "除所选定者外的所有命名空间。",
+       "apihelp-feedrecentchanges-param-associated": "包括相关的命名空间(讨论页或主要)。",
        "apihelp-feedrecentchanges-param-days": "用于限制结果的天数。",
        "apihelp-feedrecentchanges-param-limit": "所要返回结果的最大数目。",
        "apihelp-feedrecentchanges-param-from": "显示自那时以来的更改。",
        "apihelp-filerevert-description": "回退一个文件至某一旧版本。",
        "apihelp-filerevert-param-filename": "目标文件名,不包含前缀“File:”。",
        "apihelp-filerevert-param-comment": "上传评论。",
+       "apihelp-filerevert-param-archivename": "恢复到修订版存档名称。",
        "apihelp-filerevert-example-revert": "回退Wiki.png至2011-03-05T15:27:40Z的版本",
+       "apihelp-help-description": "显示指定模块的帮助。",
+       "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-imagerotate-example-generator": "将[[:Category:Flip]]之中的所有图像旋转180度",
        "apihelp-import-param-summary": "导入摘要。",
        "apihelp-import-param-xml": "上传的XML文件。",
+       "apihelp-import-param-interwikisource": "用于跨wiki导入:导入的来源wiki。",
        "apihelp-import-param-interwikipage": "用于跨wiki导入:导入的页面。",
+       "apihelp-import-param-fullhistory": "用于跨wiki导入:完整导入历史,而不只是最新版本。",
+       "apihelp-import-param-templates": "用于跨wiki导入:连带导入所有包含的模板。",
+       "apihelp-import-param-namespace": "用于跨wiki导入:导入到此名字空间。",
        "apihelp-import-param-rootpage": "导入作为此页面的子页面。",
        "apihelp-import-example-import": "将页面[[meta:Help:Parserfunctions]]连带完整历史导入至100名字空间。",
+       "apihelp-login-description": "登录并获得身份验证Cookie。\n\n在成功登录的情况下,所需的Cookie将包含在HTTP响应头中。在登录失败的情况下,进一步的尝试可能会被自动密码猜解攻击的限制所遏制。",
        "apihelp-login-param-name": "用户名。",
        "apihelp-login-param-password": "密码。",
        "apihelp-login-param-domain": "域名(可选)。",
+       "apihelp-login-param-token": "在首个请求中获得的登录令牌。",
        "apihelp-login-example-gettoken": "检索登录令牌",
        "apihelp-login-example-login": "登录",
+       "apihelp-logout-description": "退出并清除会话数据。",
        "apihelp-logout-example-logout": "退出当前用户",
        "apihelp-move-description": "移动一个页面。",
        "apihelp-move-param-from": "您希望移动的页面标题。不能与$1fromid一起使用。",
        "apihelp-move-param-fromid": "您希望移动的页面ID。不能与$1from一起使用。",
+       "apihelp-move-param-to": "您重命名操作的目标页面标题。",
        "apihelp-move-param-reason": "移动原因。",
        "apihelp-move-param-movetalk": "移动讨论页,如果存在。",
        "apihelp-move-param-movesubpages": "移动子页面,如果可以。",
        "apihelp-move-param-noredirect": "不要创建重定向。",
+       "apihelp-move-param-watch": "将页面和重定向加入至您的监视列表中。",
+       "apihelp-move-param-unwatch": "从您的监视列表中移除页面及重定向。",
+       "apihelp-move-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-move-param-ignorewarnings": "忽略任何警告。",
+       "apihelp-move-example-move": "移动“坏标题”到“好标题”并且不留下重定向",
+       "apihelp-opensearch-description": "使用OpenSearch协议搜索本wiki。",
        "apihelp-opensearch-param-search": "搜索字符串。",
        "apihelp-opensearch-param-limit": "要返回的结果最大数。",
        "apihelp-opensearch-param-namespace": "搜索的名字空间。",
        "apihelp-opensearch-param-suggest": "如果[https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest]设置为false则不做任何事情。",
+       "apihelp-opensearch-param-redirects": "如何处理重定向:\n;return:返回重定向本身。\n;resolve:返回目标页面。可能返回少于$1limit个结果。\n由于历史原因,$1format=json默认为\"return\",其他格式默认为\"resolve\"",
        "apihelp-opensearch-param-format": "输出格式。",
        "apihelp-opensearch-example-te": "查找以“Te”开头的页面",
+       "apihelp-options-description": "更改当前用户的偏好设置。\n\n只有注册在核心或者已安装扩展中的选项,或者具有\"userjs-\"键值前缀(旨在被用户脚本使用)的选项可被设置。",
+       "apihelp-options-param-reset": "重置偏好设置到网站默认设置。",
        "apihelp-options-example-reset": "重置所有用户设置",
        "apihelp-options-example-change": "更改“皮肤”和“hideminot”设置",
        "apihelp-options-example-complex": "重置所有设置,之后设置“皮肤”和“昵称”",
        "apihelp-parse-param-pageid": "解析此页的内容。覆盖 $1 页。",
        "apihelp-parse-param-redirects": "如果 $1page 或 $1 pageid 参数被设置为一个重定向,则解析它。",
        "apihelp-parse-param-oldid": "解析该修订版本的内容。覆盖 $1page 和 $1 pageid。",
+       "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型\"$1\")。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中禁用目录。",
        "apihelp-protect-param-protections": "保护等级列表,格式:action=level(例如edit=sysop)。\n\n'''注意:'''未列出的操作将移除限制。",
        "apihelp-protect-param-reason": "(解除)保护的原因。",
        "apihelp-protect-example-protect": "保护一个页面",
+       "apihelp-protect-example-unprotect": "通过设置限制为“all”解除保护一个页面",
+       "apihelp-protect-example-unprotect2": "通过设置没有限制解除保护一个页面",
        "apihelp-purge-param-forcelinkupdate": "更新链接表。",
        "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。",
        "apihelp-purge-example-simple": "刷新“首页”和“API”页面",
        "apihelp-purge-example-generator": "刷新主名字空间的前10个页面",
+       "apihelp-query-description": "获取来自和有关MediaWiki的数据。\n\n所有数据修改将首先要使用查询以获得令牌以阻止来自恶意网站的滥用破坏。",
        "apihelp-query-param-list": "要获取的列表。",
        "apihelp-query-param-meta": "要获取的元数据。",
        "apihelp-query-example-revisions": "获取首页的[[Special:ApiHelp/query+siteinfo|站点信息]]和[[Special:ApiHelp/query+revisions|修订版本]]",
        "apihelp-query+allimages-param-minsize": "限于至少这么多字节的图像。",
        "apihelp-query+allimages-param-maxsize": "限于顶多这么多字节的图像。",
        "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
+       "apihelp-query+allimages-param-mime": "要搜索的MIME类型,例如<kbd>image/jpeg</kbd>。",
        "apihelp-query+allimages-param-limit": "共计要返回多少图像。",
        "apihelp-query+allimages-example-B": "显示以字母“B”开始的文件列表",
+       "apihelp-query+allimages-example-mimetypes": "显示带MIME类型<kbd>image/png</kbd>或<kbd>image/gif</kbd>的文件列表",
        "apihelp-query+allimages-example-generator": "显示有关4个以“T”开头的文件的信息",
+       "apihelp-query+alllinks-param-namespace": "要列举的名字空间。",
+       "apihelp-query+alllinks-param-limit": "总共要返回多少个项目。",
+       "apihelp-query+alllinks-param-dir": "列出方向。",
+       "apihelp-query+alllinks-example-unique": "列出唯一的链接标题",
        "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
        "apihelp-query+allmessages-description": "返回来自该站点的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的哪些消息。\"*\" (默认值) 表示所有消息。",
        "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。",
        "apihelp-query+allmessages-example-ipb": "显示以“ipb-”开始的消息",
        "apihelp-query+allmessages-example-de": "显示德语版的“八月”和“首页”消息",
+       "apihelp-query+allpages-param-namespace": "要列举的名字空间。",
        "apihelp-query+allpages-param-filterredir": "要列出哪些页面。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
        "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
+       "apihelp-query+allredirects-example-unique": "列出孤立目标页面",
        "apihelp-query+allredirects-example-unique-generator": "获得所有目标页面,标记丢失的",
        "apihelp-query+allredirects-example-generator": "获得包含重定向的页面",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
+       "apihelp-query+alltransclusions-example-unique": "列出孤立嵌入标题",
        "apihelp-query+allusers-param-dir": "排序方向。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
        "apihelp-query+contributors-param-limit": "返回的贡献数。",
        "apihelp-query+contributors-example-simple": "显示[[首页]]的贡献",
        "apihelp-query+deletedrevisions-example-titles": "列出[[首页]]和[[Talk:首页]]的已删除修订,包含内容",
+       "apihelp-query+deletedrevisions-example-revids": "列出已删除修订123456的信息",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
        "apihelp-query+deletedrevs-param-from": "从此标题开始列出。",
        "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
        "apihelp-query+embeddedin-param-title": "要搜索的标题。不能与$1pageid一起使用。",
        "apihelp-query+embeddedin-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+embeddedin-param-namespace": "列举的名字空间。",
+       "apihelp-query+embeddedin-param-filterredir": "如何过滤重定向。",
+       "apihelp-query+embeddedin-param-limit": "返回的总计页面数。",
        "apihelp-query+embeddedin-example-simple": "显示嵌入[[Template:Stub]]的页面",
        "apihelp-query+embeddedin-example-generator": "获取有关显示嵌入[[Template:Stub]]的页面的信息",
        "apihelp-query+extlinks-param-limit": "返回多少链接。",
        "apihelp-query+fileusage-example-simple": "获取使用[[:File:Example.jpg]]的页面列表",
        "apihelp-query+fileusage-example-generator": "获取有关使用[[:File:Example.jpg]]的页面的信息",
        "apihelp-query+imageinfo-description": "返回文件信息和上传历史。",
+       "apihelp-query+imageinfo-param-prop": "要获取的文件信息:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "添加时间戳至上传的版本。",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "此版本的摘要。",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "大小别名。",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "为文件加入SHA-1哈希值。",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "添加文件的MIME类型。",
        "apihelp-query+imageinfo-param-urlheight": "与$1urlwidth类似。",
        "apihelp-query+imageinfo-example-simple": "获取有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息",
        "apihelp-query+imageinfo-example-dated": "获取有关[[:File:Albert Einstein Head.jpg]]自2008年以来版本的信息",
        "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面",
        "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息",
        "apihelp-query+info-description": "获取基本页面信息。",
+       "apihelp-query+info-param-prop": "要获取的额外属性:",
        "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "获取有关[[首页]]的信息",
        "apihelp-query+info-example-protection": "获取[[首页]]的一般和保护信息",
        "apihelp-query+links-example-namespaces": "获取用户和模板名字空间中来自[[首页]]的链接",
        "apihelp-query+linkshere-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+linkshere-param-limit": "返回多少。",
-       "apihelp-query+linkshere-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirects:只显示非重定向。",
+       "apihelp-query+linkshere-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "apihelp-query+linkshere-example-simple": "获取链接至[[首页]]的页面列表",
        "apihelp-query+linkshere-example-generator": "获取有关链接至[[首页]]的页面的信息",
        "apihelp-query+logevents-description": "从日志获取事件。",
        "apihelp-query+logevents-example-simple": "列出最近日志活动",
+       "apihelp-query+pagepropnames-description": "列出wiki中所有使用中的页面属性名称。",
        "apihelp-query+pagepropnames-example-simple": "获取前10个常用名称",
        "apihelp-query+pageprops-example-simple": "获取用于[[:Category:Foo]]的属性",
        "apihelp-query+pageswithprop-example-simple": "列出前10个使用&#123;&#123;DISPLAYTITLE:&#125;&#125;的页面",
        "apihelp-query+search-param-search": "搜索所有拥有此值的页面标题(或内容)。",
        "apihelp-query+search-param-namespace": "只在这些名字空间搜索。",
        "apihelp-query+search-param-info": "要返回的元数据。",
+       "apihelp-query+search-param-limit": "返回的总计页面数。",
        "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。",
        "apihelp-query+search-example-simple": "搜索“意义”",
        "apihelp-query+search-example-text": "搜索文本“意义”",
        "apihelp-query+users-example-simple": "返回[[User:Example]]的信息",
        "apihelp-query+watchlist-param-user": "只列出此用户的更改。",
        "apihelp-query+watchlist-param-excludeuser": "不要列出此用户的更改。",
+       "apihelp-query+watchlist-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlistraw-description": "获取登录用户的监视列表的所有页面。",
        "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。",
+       "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
        "apihelp-revisiondelete-param-hide": "每次修订要隐藏的东西。",
        "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
        "apihelp-yaml-description": "输出数据为YAML格式。",
        "apihelp-yamlfm-description": "输出数据为YAML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
+       "api-format-prettyprint-header": "您正在查看$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定格式参数以更改输出格式。要查看$1格式的非HTML表示,设置format=$2。\n\n参见[https://www.mediawiki.org/wiki/Special:MyLanguage/API 完整文档],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
        "api-orm-param-props": "要查询的字段。",
+       "api-orm-param-limit": "返回的总行数。",
        "api-help-title": "MediaWiki API 帮助",
        "api-help-lead": "这是自动生成的MediaWiki API文档页面。\n\n文档和例子:https://www.mediawiki.org/wiki/API:Main_page/zh",
        "api-help-main-header": "主模块",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
        "api-help-param-disabled-in-miser-mode": "由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式]而禁用。",
        "api-help-param-limited-in-miser-mode": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],使用这个可能导致继续前返回少于“$1limit”个结果;极端情况下可能不会返回任何结果。",
-       "api-help-param-continue": "什么时候更多结果可用什么时候继续使用。",
+       "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。",
+       "api-help-param-continue": "当更多结果可用时,使用这个继续。",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(没有说明)</span>",
        "api-help-examples": "{{PLURAL:$1|例子}}:",
        "api-help-permissions": "{{PLURAL:$1|权限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "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,或提交错误请求在https://bugzilla.wikimedia.org/。"
+       "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,或提交错误请求在https://phabricator.wikimedia.org/。"
 }
index 1dedfdd..460ee1f 100644 (file)
        "apihelp-expandtemplates-description": "展開所有於 wikitext 中模板。",
        "apihelp-expandtemplates-param-title": "頁面標題。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
+       "apihelp-feedrecentchanges-example-simple": "顯示近期變動",
+       "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動",
+       "apihelp-filerevert-param-comment": "上載意見。",
+       "apihelp-help-example-main": "主模組使用說明",
+       "apihelp-import-param-xml": "上載的 XML 檔。",
+       "apihelp-import-param-interwikisource": "用於跨 wiki 匯入:匯入的來源 wiki。",
+       "apihelp-import-param-interwikipage": "用於跨 wiki 匯入:匯入的頁面。",
+       "apihelp-import-param-fullhistory": "用於跨 wiki 匯入:完整匯入歷史,而不只是最新版本。",
+       "apihelp-import-param-templates": "用於跨 wiki 匯入:匯入一切包含的模板。",
+       "apihelp-import-param-namespace": "用於跨 wiki 匯入:匯入至此命名空間。",
+       "apihelp-import-param-rootpage": "匯入作為此頁面的子頁面。",
        "apihelp-login-param-name": "使用者名稱。",
+       "apihelp-login-param-password": "密碼。",
+       "apihelp-login-param-domain": "網域名稱(可選)。",
        "apihelp-login-example-login": "登入",
+       "apihelp-logout-description": "登出並清除 session 資料。",
+       "apihelp-logout-example-logout": "登出當前使用者",
        "apihelp-move-description": "移動頁面。",
        "apihelp-opensearch-param-search": "搜尋字串。",
        "apihelp-options-example-reset": "重設所有偏好設定",
index 753263c..c6d9a18 100644 (file)
@@ -176,7 +176,6 @@ class BacklinkCache {
         * @return ResultWrapper
         */
        protected function queryLinks( $table, $startId, $endId, $max, $select = 'all' ) {
-               wfProfileIn( __METHOD__ );
 
                $fromField = $this->getPrefix( $table ) . '_from';
 
@@ -231,8 +230,6 @@ class BacklinkCache {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $res;
        }
 
index 48c063f..77e4d49 100644 (file)
@@ -128,11 +128,9 @@ class LinkBatch {
         * @return array Remaining IDs
         */
        protected function executeInto( &$cache ) {
-               wfProfileIn( __METHOD__ );
                $res = $this->doQuery();
                $this->doGenderQuery();
                $ids = $this->addResultToCache( $cache, $res );
-               wfProfileOut( __METHOD__ );
 
                return $ids;
        }
@@ -185,7 +183,6 @@ class LinkBatch {
                if ( $this->isEmpty() ) {
                        return false;
                }
-               wfProfileIn( __METHOD__ );
 
                // This is similar to LinkHolderArray::replaceInternal
                $dbr = wfGetDB( DB_SLAVE );
@@ -205,7 +202,6 @@ class LinkBatch {
                        $caller .= " (for {$this->caller})";
                }
                $res = $dbr->select( $table, $fields, $conds, $caller );
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
index 82fb12d..eace1ee 100644 (file)
@@ -218,23 +218,18 @@ class LinkCache {
        public function addLinkObj( $nt ) {
                global $wgContentHandlerUseDB;
 
-               wfProfileIn( __METHOD__ );
-
                $key = $nt->getPrefixedDBkey();
                if ( $this->isBadLink( $key ) || $nt->isExternal() ) {
-                       wfProfileOut( __METHOD__ );
 
                        return 0;
                }
                $id = $this->getGoodLinkID( $key );
                if ( $id != 0 ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $id;
                }
 
                if ( $key === '' ) {
-                       wfProfileOut( __METHOD__ );
 
                        return 0;
                }
@@ -263,8 +258,6 @@ class LinkCache {
                        $id = 0;
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $id;
        }
 
index 03162c0..e270f5f 100644 (file)
@@ -257,9 +257,7 @@ class LocalisationCache {
         */
        public function getItem( $code, $key ) {
                if ( !isset( $this->loadedItems[$code][$key] ) ) {
-                       wfProfileIn( __METHOD__ . '-load' );
                        $this->loadItem( $code, $key );
-                       wfProfileOut( __METHOD__ . '-load' );
                }
 
                if ( $key === 'fallback' && isset( $this->shallowFallbacks[$code] ) ) {
@@ -280,9 +278,7 @@ class LocalisationCache {
                if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) &&
                        !isset( $this->loadedItems[$code][$key] )
                ) {
-                       wfProfileIn( __METHOD__ . '-load' );
                        $this->loadSubitem( $code, $key, $subkey );
-                       wfProfileOut( __METHOD__ . '-load' );
                }
 
                if ( isset( $this->data[$code][$key][$subkey] ) ) {
@@ -509,7 +505,6 @@ class LocalisationCache {
         * @return array
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
-               wfProfileIn( __METHOD__ );
                // Disable APC caching
                wfSuppressWarnings();
                $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
@@ -526,10 +521,8 @@ class LocalisationCache {
                } elseif ( $_fileType == 'aliases' ) {
                        $data = compact( 'aliases' );
                } else {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
                }
-               wfProfileOut( __METHOD__ );
 
                return $data;
        }
@@ -541,24 +534,20 @@ class LocalisationCache {
         * @return array Array with a 'messages' key, or empty array if the file doesn't exist
         */
        public function readJSONFile( $fileName ) {
-               wfProfileIn( __METHOD__ );
 
                if ( !is_readable( $fileName ) ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array();
                }
 
                $json = file_get_contents( $fileName );
                if ( $json === false ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array();
                }
 
                $data = FormatJson::decode( $json, true );
                if ( $data === null ) {
-                       wfProfileOut( __METHOD__ );
 
                        throw new MWException( __METHOD__ . ": Invalid JSON file: $fileName" );
                }
@@ -570,8 +559,6 @@ class LocalisationCache {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                // The JSON format only supports messages, none of the other variables, so wrap the data
                return array( 'messages' => $data );
        }
@@ -654,10 +641,16 @@ class LocalisationCache {
         * rules, and save the compiled rules in a process-local cache.
         *
         * @param string $fileName
+        * @throws MWException
         */
        protected function loadPluralFile( $fileName ) {
+               // Use file_get_contents instead of DOMDocument::load (T58439)
+               $xml = file_get_contents( $fileName );
+               if ( !$xml ) {
+                       throw new MWException( "Unable to read plurals file $fileName" );
+               }
                $doc = new DOMDocument;
-               $doc->load( $fileName );
+               $doc->loadXML( $xml );
                $rulesets = $doc->getElementsByTagName( "pluralRules" );
                foreach ( $rulesets as $ruleset ) {
                        $codes = $ruleset->getAttribute( 'locales' );
@@ -691,7 +684,6 @@ class LocalisationCache {
         */
        protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
                global $IP;
-               wfProfileIn( __METHOD__ );
 
                // This reads in the PHP i18n file with non-messages l10n data
                $fileName = Language::getMessagesFileName( $code );
@@ -712,8 +704,6 @@ class LocalisationCache {
                $deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
                $deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
 
-               wfProfileOut( __METHOD__ );
-
                return $data;
        }
 
@@ -817,10 +807,8 @@ class LocalisationCache {
         */
        public function recache( $code ) {
                global $wgExtensionMessagesFiles;
-               wfProfileIn( __METHOD__ );
 
                if ( !$code ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Invalid language code requested" );
                }
                $this->recachedLangs[$code] = true;
@@ -865,8 +853,6 @@ class LocalisationCache {
                $codeSequence = array_merge( array( $code ), $coreData['fallbackSequence'] );
                $messageDirs = $this->getMessagesDirs();
 
-               wfProfileIn( __METHOD__ . '-fallbacks' );
-
                # Load non-JSON localisation data for extensions
                $extensionData = array_combine(
                        $codeSequence,
@@ -963,8 +949,6 @@ class LocalisationCache {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-fallbacks' );
-
                # Add cache dependencies for any referenced globals
                $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
                // $wgMessagesDirs is used in LocalisationCache::getMessagesDirs()
@@ -1006,7 +990,6 @@ class LocalisationCache {
                Hooks::run( 'LocalisationCacheRecache', array( $this, $code, &$allData, &$purgeBlobs ) );
 
                if ( is_null( $allData['namespaceNames'] ) ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
                                'Check that your languages/messages/MessagesEn.php file is intact.' );
                }
@@ -1021,7 +1004,6 @@ class LocalisationCache {
                }
 
                # Save to the persistent cache
-               wfProfileIn( __METHOD__ . '-write' );
                $this->store->startWrite( $code );
                foreach ( $allData as $key => $value ) {
                        if ( in_array( $key, self::$splitKeys ) ) {
@@ -1033,7 +1015,6 @@ class LocalisationCache {
                        }
                }
                $this->store->finishWrite();
-               wfProfileOut( __METHOD__ . '-write' );
 
                # Clear out the MessageBlobStore
                # HACK: If using a null (i.e. disabled) storage backend, we
@@ -1042,7 +1023,6 @@ class LocalisationCache {
                        MessageBlobStore::getInstance()->clear();
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index 532236e..04f5887 100644 (file)
@@ -266,7 +266,6 @@ class MessageCache {
                }
 
                # Loading code starts
-               wfProfileIn( __METHOD__ );
                $success = false; # Keep track of success
                $staleCache = false; # a cache array with expired data, or false if none has been loaded
                $where = array(); # Debug info, delayed to avoid spamming debug log too much
@@ -276,7 +275,6 @@ class MessageCache {
                # Hash of the contents is stored in memcache, to detect if local cache goes
                # out of date (e.g. due to replace() on some other server)
                if ( $wgUseLocalMessageCache ) {
-                       wfProfileIn( __METHOD__ . '-fromlocal' );
 
                        $hash = $this->mMemc->get( wfMemcKey( 'messages', $code, 'hash' ) );
                        if ( $hash ) {
@@ -292,7 +290,6 @@ class MessageCache {
                                        $this->mCache[$code] = $cache;
                                }
                        }
-                       wfProfileOut( __METHOD__ . '-fromlocal' );
                }
 
                if ( !$success ) {
@@ -300,7 +297,6 @@ class MessageCache {
                        # the lock can't be acquired, wait for the other thread to finish
                        # and then try the global cache a second time.
                        for ( $failedAttempts = 0; $failedAttempts < 2; $failedAttempts++ ) {
-                               wfProfileIn( __METHOD__ . '-fromcache' );
                                $cache = $this->mMemc->get( $cacheKey );
                                if ( !$cache ) {
                                        $where[] = 'global cache is empty';
@@ -314,8 +310,6 @@ class MessageCache {
                                        $success = true;
                                }
 
-                               wfProfileOut( __METHOD__ . '-fromcache' );
-
                                if ( $success ) {
                                        # Done, no need to retry
                                        break;
@@ -423,7 +417,6 @@ class MessageCache {
                }
                $info = implode( ', ', $where );
                wfDebugLog( 'MessageCache', __METHOD__ . ": Loading $code... $info\n" );
-               wfProfileOut( __METHOD__ );
 
                return $success;
        }
@@ -437,7 +430,6 @@ class MessageCache {
         * @return array Loaded messages for storing in caches.
         */
        function loadFromDB( $code ) {
-               wfProfileIn( __METHOD__ );
                global $wgMaxMsgCacheEntrySize, $wgLanguageCode, $wgAdaptiveMessageCache;
                $dbr = wfGetDB( DB_SLAVE );
                $cache = array();
@@ -511,7 +503,6 @@ class MessageCache {
 
                $cache['VERSION'] = MSG_CACHE_VERSION;
                $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
-               wfProfileOut( __METHOD__ );
 
                return $cache;
        }
@@ -524,10 +515,8 @@ class MessageCache {
         */
        public function replace( $title, $text ) {
                global $wgMaxMsgCacheEntrySize;
-               wfProfileIn( __METHOD__ );
 
                if ( $this->mDisable ) {
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -577,7 +566,6 @@ class MessageCache {
 
                Hooks::run( 'MessageCacheReplace', array( $title, $text ) );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -610,7 +598,6 @@ class MessageCache {
         * @return bool
         */
        protected function saveToCaches( $cache, $dest, $code = false ) {
-               wfProfileIn( __METHOD__ );
                global $wgUseLocalMessageCache;
 
                $cacheKey = wfMemcKey( 'messages', $code );
@@ -629,8 +616,6 @@ class MessageCache {
                        $this->saveToLocal( $serialized, $hash, $code );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $success;
        }
 
@@ -708,8 +693,6 @@ class MessageCache {
        function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
                global $wgContLang;
 
-               $section = new ProfileSection( __METHOD__ );
-
                if ( is_int( $key ) ) {
                        // Fix numerical strings that somehow become ints
                        // on their way here
@@ -1056,10 +1039,9 @@ class MessageCache {
                $popts->setInterfaceMessage( $interface );
                $popts->setTargetLanguage( $language );
 
-               wfProfileIn( __METHOD__ );
                if ( !$title || !$title instanceof Title ) {
                        global $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.' );
                        $title = $wgTitle;
                }
                // Sometimes $wgTitle isn't set either...
@@ -1073,8 +1055,6 @@ class MessageCache {
                $res = $parser->parse( $text, $title, $popts, $linestart );
                $this->mInParser = false;
 
-               wfProfileOut( __METHOD__ );
-
                return $res;
        }
 
index 7f36f5a..8a42489 100644 (file)
@@ -80,7 +80,6 @@ class UserCache {
         * @param string $caller The calling method
         */
        public function doQuery( array $userIds, $options = array(), $caller = '' ) {
-               wfProfileIn( __METHOD__ );
 
                $usersToCheck = array();
                $usersToQuery = array();
@@ -134,7 +133,6 @@ class UserCache {
                }
                $lb->execute();
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index 627f4f0..6ecaacb 100644 (file)
@@ -60,6 +60,7 @@ abstract class BloomCache {
         *               It should only consist of alphanumberic, '-', and '_' characters.
         *               This ID is what avoids collisions if multiple logical caches
         *               use the same storage system, so this should be set carefully.
+        * @throws MWException
         */
        public function __construct( array $config ) {
                $this->cacheID = $config['cacheId'];
@@ -93,7 +94,7 @@ abstract class BloomCache {
         * @return bool True if set, false if not (also returns true on error)
         */
        final public function check( $domain, $type, $member ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
                        try {
@@ -113,7 +114,7 @@ abstract class BloomCache {
                                if ( $useFilter ) {
                                        return ( $this->isHit( 'shared', "$virtualKey:$member" ) !== false );
                                }
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                return true;
                        }
@@ -131,7 +132,7 @@ abstract class BloomCache {
         * @return bool Success
         */
        final public function insert( $domain, $type, $members ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
                        try {
@@ -142,7 +143,7 @@ abstract class BloomCache {
                                }
 
                                return $this->add( 'shared', $prefixedMembers );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                return false;
                        }
@@ -160,7 +161,7 @@ abstract class BloomCache {
         * @return bool Success
         */
        final public function init( $key, $size = 1000000, $precision = .001 ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                return $this->doInit( "{$this->cacheID}:$key", $size, min( .1, $precision ) );
        }
@@ -173,7 +174,7 @@ abstract class BloomCache {
         * @return bool Success
         */
        final public function add( $key, $members ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                return $this->doAdd( "{$this->cacheID}:$key", (array)$members );
        }
@@ -192,7 +193,7 @@ abstract class BloomCache {
         * @return bool|null True if set, false if not, null on error
         */
        final public function isHit( $key, $member ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                return $this->doIsHit( "{$this->cacheID}:$key", $member );
        }
@@ -204,7 +205,7 @@ abstract class BloomCache {
         * @return bool Success
         */
        final public function delete( $key ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                return $this->doDelete( "{$this->cacheID}:$key" );
        }
@@ -217,7 +218,7 @@ abstract class BloomCache {
         * @return bool Success
         */
        final public function setStatus( $virtualKey, array $values ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                return $this->doSetStatus( "{$this->cacheID}:$virtualKey", $values );
        }
@@ -235,7 +236,7 @@ abstract class BloomCache {
         * @return array|bool False on failure
         */
        final public function getStatus( $virtualKey ) {
-               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
 
                return $this->doGetStatus( "{$this->cacheID}:$virtualKey" );
        }
index 2d3b919..28c2f7e 100644 (file)
@@ -167,14 +167,12 @@ class ChangesFeed {
         * @param Feed $feed
         */
        public static function generateFeed( $rows, &$feed ) {
-               wfProfileIn( __METHOD__ );
                $items = self::buildItems( $rows );
                $feed->outHeader();
                foreach ( $items as $item ) {
                        $feed->outItem( $item );
                }
                $feed->outFooter();
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -183,7 +181,6 @@ class ChangesFeed {
         * @return array
         */
        public static function buildItems( $rows ) {
-               wfProfileIn( __METHOD__ );
                $items = array();
 
                # Merge adjacent edits by one user
@@ -234,7 +231,6 @@ class ChangesFeed {
                        );
                }
 
-               wfProfileOut( __METHOD__ );
                return $items;
        }
 }
index 4ab7729..2cee726 100644 (file)
@@ -34,6 +34,7 @@ class EnhancedChangesList extends ChangesList {
 
        /**
         * @param IContextSource|Skin $obj
+        * @throws MWException
         */
        public function __construct( $obj ) {
                if ( $obj instanceof Skin ) {
@@ -88,7 +89,6 @@ class EnhancedChangesList extends ChangesList {
         * @return string
         */
        public function recentChangesLine( &$baseRC, $watched = false ) {
-               wfProfileIn( __METHOD__ );
 
                $date = $this->getLanguage()->userDate(
                        $baseRC->mAttribs['rc_timestamp'],
@@ -109,8 +109,6 @@ class EnhancedChangesList extends ChangesList {
                $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
                $this->addCacheEntry( $cacheEntry );
 
-               wfProfileOut( __METHOD__ );
-
                return $ret;
        }
 
@@ -160,7 +158,6 @@ class EnhancedChangesList extends ChangesList {
         * @return string
         */
        protected function recentChangesBlockGroup( $block ) {
-               wfProfileIn( __METHOD__ );
 
                # Add the namespace and title of the block as part of the class
                $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
@@ -468,8 +465,6 @@ class EnhancedChangesList extends ChangesList {
 
                $this->rcCacheIndex++;
 
-               wfProfileOut( __METHOD__ );
-
                return $r;
        }
 
@@ -480,7 +475,6 @@ class EnhancedChangesList extends ChangesList {
         * @return string A HTML formatted line (generated using $r)
         */
        protected function recentChangesBlockLine( $rcObj ) {
-               wfProfileIn( __METHOD__ );
                $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
 
                $type = $rcObj->mAttribs['rc_type'];
@@ -552,8 +546,6 @@ class EnhancedChangesList extends ChangesList {
 
                $r .= "</td></tr></table>\n";
 
-               wfProfileOut( __METHOD__ );
-
                return $r;
        }
 
@@ -568,8 +560,6 @@ class EnhancedChangesList extends ChangesList {
                        return '';
                }
 
-               wfProfileIn( __METHOD__ );
-
                $blockOut = '';
                foreach ( $this->rc_cache as $block ) {
                        if ( count( $block ) < 2 ) {
@@ -579,8 +569,6 @@ class EnhancedChangesList extends ChangesList {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return '<div>' . $blockOut . '</div>';
        }
 
index 5067886..4ce564d 100644 (file)
@@ -32,7 +32,6 @@ class OldChangesList extends ChangesList {
         * @return string|bool
         */
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
-               wfProfileIn( __METHOD__ );
 
                $classes = array();
                // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
@@ -57,13 +56,9 @@ class OldChangesList extends ChangesList {
                }
 
                if ( !Hooks::run( 'OldChangesListRecentChangesLine', array( &$this, &$html, $rc, &$classes ) ) ) {
-                       wfProfileOut( __METHOD__ );
-
                        return false;
                }
 
-               wfProfileOut( __METHOD__ );
-
                $dateheader = ''; // $html now contains only <li>...</li>, for hooks' convenience.
                $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
 
index c719d8d..86cd1d7 100644 (file)
@@ -450,7 +450,7 @@ class RecentChange {
                }
                // Users without the 'autopatrol' right can't patrol their
                // own revisions
-               if ( $user->getName() == $this->getAttribute( 'rc_user_text' )
+               if ( $user->getName() === $this->getAttribute( 'rc_user_text' )
                        && !$user->isAllowed( 'autopatrol' )
                ) {
                        $errors[] = array( 'markedaspatrollederror-noautopatrol' );
index 447a2a7..694b633 100644 (file)
@@ -58,6 +58,7 @@ abstract class CodeContentHandler extends TextContentHandler {
 
        /**
         * @return string
+        * @throws MWException
         */
        protected function getContentClass() {
                throw new MWException( 'Subclass must override' );
index b36827c..1d9ee33 100644 (file)
  */
 class JsonContent extends TextContent {
 
+       /**
+        * @since 1.25
+        * @var Status
+        */
+       protected $jsonParse;
+
+       /**
+        * @param string $text JSON
+        */
        public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) {
                parent::__construct( $text, $modelId );
        }
 
        /**
         * Decodes the JSON into a PHP associative array.
-        * @return array
+        *
+        * @deprecated since 1.25 Use getData instead.
+        * @return array|null
         */
        public function getJsonData() {
+               wfDeprecated( __METHOD__, '1.25' );
                return FormatJson::decode( $this->getNativeData(), true );
        }
 
        /**
-        * @return bool Whether content is valid JSON.
+        * Decodes the JSON string.
+        *
+        * Note that this parses it without casting objects to associative arrays.
+        * Objects and arrays are kept as distinguishable types in the PHP values.
+        *
+        * @return Status
+        */
+       public function getData() {
+               if ( $this->jsonParse === null ) {
+                       $this->jsonParse = FormatJson::parse( $this->getNativeData() );
+               }
+               return $this->jsonParse;
+       }
+
+       /**
+        * @return bool Whether content is valid.
         */
        public function isValid() {
-               return $this->getJsonData() !== null;
+               return $this->getData()->isGood();
        }
 
        /**
-        * Pretty-print JSON
+        * Pretty-print JSON.
         *
-        * @return bool|null|string
+        * If called before validation, it may return JSON "null".
+        *
+        * @return string
         */
        public function beautifyJSON() {
-               $decoded = FormatJson::decode( $this->getNativeData(), true );
-               if ( !is_array( $decoded ) ) {
-                       return null;
-               }
-               return FormatJson::encode( $decoded, true );
-
+               return FormatJson::encode( $this->getData()->getValue(), true );
        }
 
        /**
         * Beautifies JSON prior to save.
+        *
         * @param Title $title Title
         * @param User $user User
         * @param ParserOptions $popts
         * @return JsonContent
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               // FIXME: WikiPage::doEditContent invokes PST before validation. As such, native data
+               // may be invalid (though PST result is discarded later in that case).
+               if ( !$this->isValid() ) {
+                       return $this;
+               }
+
                return new static( $this->beautifyJSON() );
        }
 
        /**
-        * Set the HTML and add the appropriate styles
-        *
+        * Set the HTML and add the appropriate styles.
         *
         * @param Title $title
         * @param int $revId
@@ -71,50 +101,150 @@ class JsonContent extends TextContent {
        protected function fillParserOutput( Title $title, $revId,
                ParserOptions $options, $generateHtml, ParserOutput &$output
        ) {
-               if ( $generateHtml ) {
-                       $output->setText( $this->objectTable( $this->getJsonData() ) );
+               // FIXME: WikiPage::doEditContent generates parser output before validation.
+               // As such, native data may be invalid (though output is discarded later in that case).
+               if ( $generateHtml && $this->isValid() ) {
+                       $output->setText( $this->rootValueTable( $this->getData()->getValue() ) );
                        $output->addModuleStyles( 'mediawiki.content.json' );
                } else {
                        $output->setText( '' );
                }
        }
+
        /**
-        * Constructs an HTML representation of a JSON object.
-        * @param array $mapping
+        * Construct HTML table representation of any JSON value.
+        *
+        * See also valueCell, which is similar.
+        *
+        * @param mixed $val
+        * @return string HTML.
+        */
+       protected function rootValueTable( $val ) {
+               if ( is_object( $val ) ) {
+                       return self::objectTable( $val );
+               }
+
+               if ( is_array( $val ) ) {
+                       // Wrap arrays in another array so that they're visually boxed in a container.
+                       // Otherwise they are visually indistinguishable from a single value.
+                       return self::arrayTable( array( $val ) );
+               }
+
+               return Html::rawElement( 'table', array( 'class' => 'mw-json mw-json-single-value' ),
+                       Html::rawElement( 'tbody', array(),
+                               Html::rawElement( 'tr', array(),
+                                       Html::element( 'td', array(), self::primitiveValue( $val ) )
+                               )
+                       )
+               );
+       }
+
+       /**
+        * Create HTML table representing a JSON object.
+        *
+        * @param stdClass $mapping
         * @return string HTML
         */
        protected function objectTable( $mapping ) {
                $rows = array();
+               $empty = true;
 
                foreach ( $mapping as $key => $val ) {
                        $rows[] = $this->objectRow( $key, $val );
+                       $empty = false;
+               }
+               if ( $empty ) {
+                       $rows[] = Html::rawElement( 'tr', array(),
+                               Html::element( 'td', array( 'class' => 'mw-json-empty' ),
+                                       wfMessage( 'content-json-empty-object' )->text()
+                               )
+                       );
                }
-               return Xml::tags( 'table', array( 'class' => 'mw-json' ),
-                       Xml::tags( 'tbody', array(), join( "\n", $rows ) )
+               return Html::rawElement( 'table', array( 'class' => 'mw-json' ),
+                       Html::rawElement( 'tbody', array(), join( '', $rows ) )
                );
        }
 
        /**
-        * Constructs HTML representation of a single key-value pair.
+        * Create HTML table row representing one object property.
+        *
         * @param string $key
         * @param mixed $val
         * @return string HTML.
         */
        protected function objectRow( $key, $val ) {
-               $th = Xml::elementClean( 'th', array(), $key );
-               if ( is_array( $val ) ) {
-                       $td = Xml::tags( 'td', array(), self::objectTable( $val ) );
-               } else {
-                       if ( is_string( $val ) ) {
-                               $val = '"' . $val . '"';
-                       } else {
-                               $val = FormatJson::encode( $val );
-                       }
+               $th = Html::element( 'th', array(), $key );
+               $td = self::valueCell( $val );
+               return Html::rawElement( 'tr', array(), $th . $td );
+       }
 
-                       $td = Xml::elementClean( 'td', array( 'class' => 'value' ), $val );
+       /**
+        * Create HTML table representing a JSON array.
+        *
+        * @param array $mapping
+        * @return string HTML
+        */
+       protected function arrayTable( $mapping ) {
+               $rows = array();
+               $empty = true;
+
+               foreach ( $mapping as $val ) {
+                       $rows[] = $this->arrayRow( $val );
+                       $empty = false;
+               }
+               if ( $empty ) {
+                       $rows[] = Html::rawElement( 'tr', array(),
+                               Html::element( 'td', array( 'class' => 'mw-json-empty' ),
+                                       wfMessage( 'content-json-empty-array' )->text()
+                               )
+                       );
                }
+               return Html::rawElement( 'table', array( 'class' => 'mw-json' ),
+                       Html::rawElement( 'tbody', array(), join( "\n", $rows ) )
+               );
+       }
 
-               return Xml::tags( 'tr', array(), $th . $td );
+       /**
+        * Create HTML table row representing the value in an array.
+        *
+        * @param mixed $val
+        * @return string HTML.
+        */
+       protected function arrayRow( $val ) {
+               $td = self::valueCell( $val );
+               return Html::rawElement( 'tr', array(), $td );
        }
 
+       /**
+        * Construct HTML table cell representing any JSON value.
+        *
+        * @param mixed $val
+        * @return string HTML.
+        */
+       protected function valueCell( $val ) {
+               if ( is_object( $val ) ) {
+                       return Html::rawElement( 'td', array(), self::objectTable( $val ) );
+               }
+
+               if ( is_array( $val ) ) {
+                       return Html::rawElement( 'td', array(), self::arrayTable( $val ) );
+               }
+
+               return Html::element( 'td', array( 'class' => 'value' ), self::primitiveValue( $val ) );
+       }
+
+       /**
+        * Construct text representing a JSON primitive value.
+        *
+        * @param mixed $val
+        * @return string Text.
+        */
+       protected function primitiveValue( $val ) {
+               if ( is_string( $val ) ) {
+                       // Don't FormatJson::encode for strings since we want quotes
+                       // and new lines to render visually instead of escaped.
+                       return '"' . $val . '"';
+               }
+               return FormatJson::encode( $val );
+       }
 }
index c479f20..baea812 100644 (file)
@@ -37,6 +37,7 @@ class TextContent extends AbstractContent {
        /**
         * @param string $text
         * @param string $model_id
+        * @throws MWException
         */
        public function __construct( $text, $model_id = CONTENT_MODEL_TEXT ) {
                parent::__construct( $model_id );
index 7593d7c..dbe09f9 100644 (file)
@@ -68,13 +68,11 @@ class WikitextContent extends TextContent {
         * @see Content::replaceSection()
         */
        public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
-               wfProfileIn( __METHOD__ );
 
                $myModelId = $this->getModel();
                $sectionModelId = $with->getModel();
 
                if ( $sectionModelId != $myModelId ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Incompatible content model for section: " .
                                "document uses $myModelId but " .
                                "section uses $sectionModelId." );
@@ -84,7 +82,6 @@ class WikitextContent extends TextContent {
                $text = $with->getNativeData();
 
                if ( strval( $sectionId ) === '' ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $with; # XXX: copy first?
                }
@@ -107,8 +104,6 @@ class WikitextContent extends TextContent {
 
                $newContent = new static( $text );
 
-               wfProfileOut( __METHOD__ );
-
                return $newContent;
        }
 
index 2a610a3..89ccd0b 100644 (file)
@@ -140,7 +140,7 @@ class RequestContext implements IContextSource {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.' );
                }
 
                return $this->title;
@@ -182,9 +182,8 @@ class RequestContext implements IContextSource {
         * @param WikiPage $p
         */
        public function setWikiPage( WikiPage $p ) {
-               $contextTitle = $this->getTitle();
                $pageTitle = $p->getTitle();
-               if ( !$contextTitle || !$pageTitle->equals( $contextTitle ) ) {
+               if ( !$this->hasTitle() || !$pageTitle->equals( $this->getTitle() ) ) {
                        $this->setTitle( $pageTitle );
                }
                // Defer this to the end since setTitle sets it to null.
@@ -298,8 +297,8 @@ class RequestContext implements IContextSource {
        /**
         * Get the Language object.
         * Initialization of user or request objects can depend on this.
-        *
         * @return Language
+        * @throws Exception
         * @since 1.19
         */
        public function getLanguage() {
@@ -319,7 +318,10 @@ class RequestContext implements IContextSource {
                                $request = $this->getRequest();
                                $user = $this->getUser();
 
-                               $code = $request->getVal( 'uselang', $user->getOption( 'language' ) );
+                               $code = $request->getVal( 'uselang', 'user' );
+                               if ( $code === 'user' ) {
+                                       $code = $user->getOption( 'language' );
+                               }
                                $code = self::sanitizeLangCode( $code );
 
                                Hooks::run( 'UserGetLanguageObject', array( $user, &$code, $this ) );
@@ -359,7 +361,6 @@ class RequestContext implements IContextSource {
         */
        public function getSkin() {
                if ( $this->skin === null ) {
-                       wfProfileIn( __METHOD__ . '-createskin' );
 
                        $skin = null;
                        Hooks::run( 'RequestContextCreateSkin', array( $this, &$skin ) );
@@ -397,7 +398,6 @@ class RequestContext implements IContextSource {
 
                        // After all that set a context on whatever skin got created
                        $this->skin->setContext( $this );
-                       wfProfileOut( __METHOD__ . '-createskin' );
                }
 
                return $this->skin;
index 93ce61f..054f27a 100644 (file)
@@ -46,6 +46,9 @@ abstract class DatabaseBase implements IDatabase {
        /** Maximum time to wait before retry */
        const DEADLOCK_DELAY_MAX = 1500000;
 
+       /** How many row changes in a write query trigger a log entry */
+       const LOG_WRITE_THRESHOLD = 300;
+
        protected $mLastQuery = '';
        protected $mDoneWrites = false;
        protected $mPHPError = false;
@@ -1036,6 +1039,20 @@ abstract class DatabaseBase implements IDatabase {
                return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
        }
 
+       /**
+        * Determine whether a SQL statement is sensitive to isolation level.
+        * A SQL statement is considered transactable if its result could vary
+        * depending on the transaction isolation level. Operational commands
+        * such as 'SET' and 'SHOW' are not considered to be transactable.
+        *
+        * @param string $sql
+        * @return bool
+        */
+       public function isTransactableQuery( $sql ) {
+               $verb = substr( $sql, 0, strcspn( $sql, " \t\r\n" ) );
+               return !in_array( $verb, array( 'BEGIN', 'COMMIT', 'ROLLBACK', 'SHOW', 'SET' ) );
+       }
+
        /**
         * Run an SQL query and return the result. Normally throws a DBQueryError
         * on failure. If errors are ignored, returns false instead.
@@ -1062,7 +1079,9 @@ abstract class DatabaseBase implements IDatabase {
                global $wgUser, $wgDebugDBTransactions, $wgDebugDumpSqlLength;
 
                $this->mLastQuery = $sql;
-               if ( $this->isWriteQuery( $sql ) ) {
+
+               $isWriteQuery = $this->isWriteQuery( $sql );
+               if ( $isWriteQuery ) {
                        # Set a flag indicating that writes have been done
                        wfDebug( __METHOD__ . ': Writes done: ' . DatabaseBase::generalizeSQL( $sql ) . "\n" );
                        $this->mDoneWrites = microtime( true );
@@ -1083,25 +1102,16 @@ abstract class DatabaseBase implements IDatabase {
                // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
                $commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
 
-               # If DBO_TRX is set, start a transaction
-               if ( ( $this->mFlags & DBO_TRX ) && !$this->mTrxLevel &&
-                       $sql != 'BEGIN' && $sql != 'COMMIT' && $sql != 'ROLLBACK'
-               ) {
-                       # Avoid establishing transactions for SHOW and SET statements too -
-                       # that would delay transaction initializations to once connection
-                       # is really used by application
-                       $sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
-                       if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 ) {
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction start.\n" );
-                               }
-                               $this->begin( __METHOD__ . " ($fname)" );
-                               $this->mTrxAutomatic = true;
+               if ( !$this->mTrxLevel && $this->getFlag( DBO_TRX ) && $this->isTransactableQuery( $sql ) ) {
+                       if ( $wgDebugDBTransactions ) {
+                               wfDebug( "Implicit transaction start.\n" );
                        }
+                       $this->begin( __METHOD__ . " ($fname)" );
+                       $this->mTrxAutomatic = true;
                }
 
                # Keep track of whether the transaction has write queries pending
-               if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
+               if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $isWriteQuery ) {
                        $this->mTrxDoneWrites = true;
                        Profiler::instance()->getTransactionProfiler()->transactionWritingIn(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
@@ -1196,6 +1206,13 @@ abstract class DatabaseBase implements IDatabase {
 
                if ( false === $ret ) {
                        $this->reportQueryError( $this->lastError(), $this->lastErrno(), $sql, $fname, $tempIgnore );
+               } else {
+                       $n = $this->affectedRows();
+                       if ( $isWriteQuery && $n > self::LOG_WRITE_THRESHOLD && PHP_SAPI !== 'cli' ) {
+                               wfDebugLog( 'DBPerformance',
+                                       "Query affected $n rows:\n" .
+                                       DatabaseBase::generalizeSQL( $sql ) . "\n" . wfBacktrace( true ) );
+                       }
                }
 
                $res = $this->resultObject( $ret );
@@ -2143,16 +2160,36 @@ abstract class DatabaseBase implements IDatabase {
                        } elseif ( ( $mode == LIST_SET ) && is_numeric( $field ) ) {
                                $list .= "$value";
                        } elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
-                               if ( count( $value ) == 0 ) {
+                               // Remove null from array to be handled separately if found
+                               $includeNull = false;
+                               foreach ( array_keys( $value, null, true ) as $nullKey ) {
+                                       $includeNull = true;
+                                       unset( $value[$nullKey] );
+                               }
+                               if ( count( $value ) == 0 && !$includeNull ) {
                                        throw new MWException( __METHOD__ . ": empty input for field $field" );
-                               } elseif ( count( $value ) == 1 ) {
-                                       // Special-case single values, as IN isn't terribly efficient
-                                       // Don't necessarily assume the single key is 0; we don't
-                                       // enforce linear numeric ordering on other arrays here.
-                                       $value = array_values( $value );
-                                       $list .= $field . " = " . $this->addQuotes( $value[0] );
+                               } elseif ( count( $value ) == 0 ) {
+                                       // only check if $field is null
+                                       $list .= "$field IS NULL";
                                } else {
-                                       $list .= $field . " IN (" . $this->makeList( $value ) . ") ";
+                                       // IN clause contains at least one valid element
+                                       if ( $includeNull ) {
+                                               // Group subconditions to ensure correct precedence
+                                               $list .= '(';
+                                       }
+                                       if ( count( $value ) == 1 ) {
+                                               // Special-case single values, as IN isn't terribly efficient
+                                               // Don't necessarily assume the single key is 0; we don't
+                                               // enforce linear numeric ordering on other arrays here.
+                                               $value = array_values( $value );
+                                               $list .= $field . " = " . $this->addQuotes( $value[0] );
+                                       } else {
+                                               $list .= $field . " IN (" . $this->makeList( $value ) . ") ";
+                                       }
+                                       // if null present in array, append IS NULL
+                                       if ( $includeNull ) {
+                                               $list .= " OR $field IS NULL)";
+                                       }
                                }
                        } elseif ( $value === null ) {
                                if ( $mode == LIST_AND || $mode == LIST_OR ) {
@@ -3645,6 +3682,7 @@ abstract class DatabaseBase implements IDatabase {
         *   calling rollback when no transaction is in progress. This will silently
         *   break any ongoing explicit transaction. Only set the flush flag if you
         *   are sure that it is safe to ignore these warnings in your context.
+        * @throws DBUnexpectedError
         * @since 1.23 Added $flush parameter
         */
        final public function rollback( $fname = __METHOD__, $flush = '' ) {
@@ -3924,7 +3962,7 @@ abstract class DatabaseBase implements IDatabase {
 
                try {
                        $error = $this->sourceStream( $fp, $lineCallback, $resultCallback, $fname, $inputCallback );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        fclose( $fp );
                        throw $e;
                }
index 2dfec41..86950a8 100644 (file)
@@ -168,12 +168,12 @@ class DBConnectionError extends DBExpectedError {
                if ( $wgShowHostnames || $wgShowSQLErrors ) {
                        $info = str_replace(
                                '$1', Html::element( 'span', array( 'dir' => 'ltr' ), $this->error ),
-                               htmlspecialchars( $this->msg( 'dberr-info', '(Cannot contact the database server: $1)' ) )
+                               htmlspecialchars( $this->msg( 'dberr-info', '(Cannot access the database: $1)' ) )
                        );
                } else {
                        $info = htmlspecialchars( $this->msg(
                                'dberr-info-hidden',
-                               '(Cannot contact the database server)'
+                               '(Cannot access the database)'
                        ) );
                }
 
@@ -229,7 +229,7 @@ class DBConnectionError extends DBExpectedError {
 
                                        return;
                                }
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // Do nothing, just use the default page
                        }
                }
index 669525a..a7bc6dd 100644 (file)
@@ -380,6 +380,9 @@ class DatabaseMssql extends DatabaseBase {
         *   (optional) (e.g. array( 'page' => array('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 = array(), $join_conds = array()
@@ -574,8 +577,8 @@ class DatabaseMssql extends DatabaseBase {
         * @param array $arrToInsert
         * @param string $fname
         * @param array $options
-        * @throws DBQueryError
         * @return bool
+        * @throws Exception
         */
        public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = array() ) {
                # No rows to insert, easy just return now
@@ -713,8 +716,8 @@ class DatabaseMssql extends DatabaseBase {
         * @param string $fname
         * @param array $insertOptions
         * @param array $selectOptions
-        * @throws DBQueryError
         * @return null|ResultWrapper
+        * @throws Exception
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
                $insertOptions = array(), $selectOptions = array()
@@ -761,6 +764,9 @@ class DatabaseMssql extends DatabaseBase {
         *                   - IGNORE: Ignore unique key conflicts
         *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
         * @return bool
+        * @throws DBUnexpectedError
+        * @throws Exception
+        * @throws MWException
         */
        function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                $table = $this->tableName( $table );
@@ -893,6 +899,7 @@ class DatabaseMssql extends DatabaseBase {
         * @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 ) {
index 430b20c..7b903d6 100644 (file)
@@ -58,7 +58,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         */
        function open( $server, $user, $password, $dbName ) {
                global $wgAllDBsAreLocalhost, $wgSQLMode;
-               wfProfileIn( __METHOD__ );
 
                # Debugging hack -- fake cluster
                if ( $wgAllDBsAreLocalhost ) {
@@ -72,8 +71,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                $this->mPassword = $password;
                $this->mDBname = $dbName;
 
-               wfProfileIn( "dbconnect-$server" );
-
                # The kernel's default SYN retransmission period is far too slow for us,
                # so we use a short timeout plus a manual retry. Retrying means that a small
                # but finite rate of SYN packet loss won't cause user-visible errors.
@@ -82,15 +79,11 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                try {
                        $this->mConn = $this->mysqlConnect( $realServer );
                } catch ( Exception $ex ) {
-                       wfProfileOut( "dbconnect-$server" );
-                       wfProfileOut( __METHOD__ );
                        $this->restoreErrorHandler();
                        throw $ex;
                }
                $error = $this->restoreErrorHandler();
 
-               wfProfileOut( "dbconnect-$server" );
-
                # Always log connection errors
                if ( !$this->mConn ) {
                        if ( !$error ) {
@@ -107,8 +100,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                                "Server: $server, User: $user, Password: " .
                                substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
 
-                       wfProfileOut( __METHOD__ );
-
                        $this->reportConnectionError( $error );
                }
 
@@ -126,8 +117,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                                wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
                                        "from client host " . wfHostname() . "\n" );
 
-                               wfProfileOut( __METHOD__ );
-
                                $this->reportConnectionError( "Error selecting database $dbName" );
                        }
                }
@@ -137,25 +126,29 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        $this->reportConnectionError( "Error setting character set" );
                }
 
+               // Abstract over any insane MySQL defaults
+               $set = array( 'group_concat_max_len = 262144' );
                // Set SQL mode, default is turning them all off, can be overridden or skipped with null
                if ( is_string( $wgSQLMode ) ) {
-                       $mode = $this->addQuotes( $wgSQLMode );
+                       $set[] = 'sql_mode = ' . $this->addQuotes( $wgSQLMode );
+               }
+
+               if ( $set ) {
                        // Use doQuery() to avoid opening implicit transactions (DBO_TRX)
-                       $success = $this->doQuery( "SET sql_mode = $mode", __METHOD__ );
+                       $success = $this->doQuery( 'SET ' . implode( ', ', $set ), __METHOD__ );
                        if ( !$success ) {
                                wfLogDBError(
-                                       "Error setting sql_mode to $mode on server {db_server}",
+                                       'Error setting MySQL variables on server {db_server} (check $wgSQLMode)',
                                        $this->getLogContext( array(
                                                'method' => __METHOD__,
                                        ) )
                                );
-                               wfProfileOut( __METHOD__ );
-                               $this->reportConnectionError( "Error setting sql_mode to $mode" );
+                               $this->reportConnectionError(
+                                       'Error setting MySQL variables on server {db_server} (check $wgSQLMode)' );
                        }
                }
 
                $this->mOpened = true;
-               wfProfileOut( __METHOD__ );
 
                return true;
        }
@@ -671,7 +664,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        return '0'; // http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
                }
 
-               wfProfileIn( __METHOD__ );
                # Commit any open transactions
                $this->commit( __METHOD__, 'flush' );
 
@@ -680,18 +672,15 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
                        if ( $wait > $timeout * 1e6 ) {
                                wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
-                               wfProfileOut( __METHOD__ );
 
                                return -1;
                        } elseif ( $wait > 0 ) {
                                wfDebug( "Fake slave waiting $wait us\n" );
                                usleep( $wait );
-                               wfProfileOut( __METHOD__ );
 
                                return 1;
                        } else {
                                wfDebug( "Fake slave up to date ($wait us)\n" );
-                               wfProfileOut( __METHOD__ );
 
                                return 0;
                        }
@@ -711,8 +700,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $status;
        }
 
index 6e262e8..b2527f9 100644 (file)
@@ -94,7 +94,7 @@ interface IORMTable {
        public function getSummaryFields();
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @see DatabaseBase::select()
@@ -113,7 +113,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @since 1.20
@@ -145,7 +145,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as associative arrays.
         * Provided field names get prefixed.
         * Returned field names will not have a prefix.
@@ -170,7 +170,7 @@ interface IORMTable {
                array $options = array(), $collapse = true, $functionName = null );
 
        /**
-        * Selects the the specified fields of the first matching record.
+        * Selects the specified fields of the first matching record.
         * Field names get prefixed.
         *
         * @since 1.20
@@ -186,7 +186,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions. Field names do NOT get prefixed.
         *
         * @since 1.20
@@ -202,7 +202,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the first record matching the provided
+        * Selects the specified fields of the first record matching the provided
         * conditions and returns it as an associative array, or false when nothing matches.
         * This method makes use of selectFields and expects the same parameters and
         * returns the same results (if there are any, if there are none, this method returns false).
index f1b3238..4c9fd32 100644 (file)
@@ -58,9 +58,14 @@ class LoadBalancer {
        private $mLaggedSlaveMode;
        /** @var string The last DB selection or connection error */
        private $mLastError = 'Unknown error';
+       /** @var integer Total connections opened */
+       private $connsOpened = 0;
        /** @var ProcessCacheLRU */
        private $mProcCache;
 
+       /** @var integer Warn when this many connection are held */
+       const CONN_HELD_WARN_THRESHOLD = 10;
+
        /**
         * @param array $params Array with keys:
         *   servers           Required. Array of server info structures.
@@ -224,8 +229,6 @@ class LoadBalancer {
                        return $this->mReadIndex;
                }
 
-               new ProfileSection( __METHOD__ );
-
                # Find the relevant load array
                if ( $group !== false ) {
                        if ( isset( $this->mGroupLoads[$group] ) ) {
@@ -340,7 +343,6 @@ class LoadBalancer {
         * @param DBMasterPos $pos
         */
        public function waitFor( $pos ) {
-               wfProfileIn( __METHOD__ );
                $this->mWaitForPos = $pos;
                $i = $this->mReadIndex;
 
@@ -350,7 +352,6 @@ class LoadBalancer {
                                $this->mLaggedSlaveMode = true;
                        }
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -360,7 +361,6 @@ class LoadBalancer {
         * @return bool Success (able to connect and no timeouts reached)
         */
        public function waitForAll( $pos, $timeout = null ) {
-               wfProfileIn( __METHOD__ );
                $this->mWaitForPos = $pos;
                $serverCount = count( $this->mServers );
 
@@ -370,7 +370,6 @@ class LoadBalancer {
                                $ok = $this->doWait( $i, true, $timeout ) && $ok;
                        }
                }
-               wfProfileOut( __METHOD__ );
 
                return $ok;
        }
@@ -457,10 +456,7 @@ class LoadBalancer {
         * @return DatabaseBase
         */
        public function getConnection( $i, $groups = array(), $wiki = false ) {
-               wfProfileIn( __METHOD__ );
-
                if ( $i === null || $i === false ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Attempt to call ' . __METHOD__ .
                                ' with invalid server index' );
                }
@@ -498,7 +494,6 @@ class LoadBalancer {
                        # Couldn't find a working server in getReaderIndex()?
                        if ( $i === false ) {
                                $this->mLastError = 'No working slave server: ' . $this->mLastError;
-                               wfProfileOut( __METHOD__ );
 
                                return $this->reportConnectionError();
                        }
@@ -507,13 +502,10 @@ class LoadBalancer {
                # Now we have an explicit index into the servers array
                $conn = $this->openConnection( $i, $wiki );
                if ( !$conn ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $this->reportConnectionError();
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $conn;
        }
 
@@ -613,10 +605,8 @@ class LoadBalancer {
         * @access private
         */
        public function openConnection( $i, $wiki = false ) {
-               wfProfileIn( __METHOD__ );
                if ( $wiki !== false ) {
                        $conn = $this->openForeignConnection( $i, $wiki );
-                       wfProfileOut( __METHOD__ );
 
                        return $conn;
                }
@@ -635,7 +625,6 @@ class LoadBalancer {
                                $conn = false;
                        }
                }
-               wfProfileOut( __METHOD__ );
 
                return $conn;
        }
@@ -659,7 +648,6 @@ class LoadBalancer {
         * @return DatabaseBase
         */
        private function openForeignConnection( $i, $wiki ) {
-               wfProfileIn( __METHOD__ );
                list( $dbName, $prefix ) = wfSplitWikiID( $wiki );
                if ( isset( $this->mConns['foreignUsed'][$i][$wiki] ) ) {
                        // Reuse an already-used connection
@@ -712,7 +700,6 @@ class LoadBalancer {
                        $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
                        $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
                }
-               wfProfileOut( __METHOD__ );
 
                return $conn;
        }
@@ -752,6 +739,14 @@ class LoadBalancer {
                        $server['dbname'] = $dbNameOverride;
                }
 
+               // Log when many connection are made on requests
+               if ( ++$this->connsOpened >= self::CONN_HELD_WARN_THRESHOLD ) {
+                       $masterAddr = $this->getServerName( 0 );
+                       wfDebugLog( 'DBPerformance', __METHOD__ . ": " .
+                               "{$this->connsOpened}+ connections made (master=$masterAddr)\n" .
+                               wfBacktrace( true ) );
+               }
+
                # Create object
                try {
                        $db = DatabaseBase::factory( $server['type'], $server );
@@ -923,6 +918,7 @@ class LoadBalancer {
                        'foreignFree' => array(),
                        'foreignUsed' => array(),
                );
+               $this->connsOpened = 0;
        }
 
        /**
@@ -939,6 +935,7 @@ class LoadBalancer {
                                        if ( $conn === $candidateConn ) {
                                                $conn->close();
                                                unset( $this->mConns[$i1][$i2][$i3] );
+                                               --$this->connsOpened;
                                                $done = true;
                                                break;
                                        }
index b694a6f..91840dd 100644 (file)
@@ -93,8 +93,6 @@ class LoadMonitorMySQL implements LoadMonitor {
                        return array( 0 => 0 );
                }
 
-               $section = new ProfileSection( __METHOD__ );
-
                $expiry = 5;
                $requestRate = 10;
 
index b22df39..562a810 100644 (file)
@@ -190,7 +190,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @since 1.20
@@ -211,7 +211,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @since 1.20
@@ -248,8 +248,8 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $options
         * @param null|string $functionName
         * @return ResultWrapper
-        * @throws DBQueryError If the query failed (even if the database was in
-        *   ignoreErrors mode).
+        * @throws Exception
+        * @throws MWException
         */
        public function rawSelect( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null
@@ -296,7 +296,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as associative arrays.
         * Provided field names get prefixed.
         * Returned field names will not have a prefix.
@@ -346,7 +346,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the first matching record.
+        * Selects the specified fields of the first matching record.
         * Field names get prefixed.
         *
         * @since 1.20
@@ -369,7 +369,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions. Field names do NOT get prefixed.
         *
         * @since 1.20
@@ -400,7 +400,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the first record matching the provided
+        * Selects the specified fields of the first record matching the provided
         * conditions and returns it as an associative array, or false when nothing matches.
         * This method makes use of selectFields and expects the same parameters and
         * returns the same results (if there are any, if there are none, this method returns false).
diff --git a/includes/debug/logger/Factory.php b/includes/debug/logger/Factory.php
new file mode 100644 (file)
index 0000000..2660b92
--- /dev/null
@@ -0,0 +1,115 @@
+<?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
+ */
+
+
+/**
+ * PSR-3 logger instance factory.
+ *
+ * Creation of \Psr\Log\LoggerInterface instances is managed via the
+ * MWLoggerFactory::getInstance() static method which in turn delegates to the
+ * currently registered service provider.
+ *
+ * A service provider is any class implementing the MWLoggerSpi interface.
+ * There are two possible methods of registering a service provider. The
+ * MWLoggerFactory::registerProvider() static method can be called at any time
+ * to change the service provider. If MWLoggerFactory::getInstance() is called
+ * before any service provider has been registered, it will attempt to use the
+ * $wgMWLoggerDefaultSpi global to bootstrap MWLoggerSpi registration.
+ * $wgMWLoggerDefaultSpi is expected to be an array usable by
+ * ObjectFactory::getObjectFromSpec() to create a class.
+ *
+ * @see MWLoggerSpi
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class MWLoggerFactory {
+
+       /**
+        * Service provider.
+        * @var MWLoggerSpi $spi
+        */
+       private static $spi;
+
+
+       /**
+        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * instances.
+        *
+        * @param MWLoggerSpi $provider Provider to register
+        */
+       public static function registerProvider( MWLoggerSpi $provider ) {
+               self::$spi = $provider;
+       }
+
+
+       /**
+        * Get the registered service provider.
+        *
+        * If called before any service provider has been registered, it will
+        * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
+        * MWLoggerSpi registration. $wgMWLoggerDefaultSpi is expected to be an
+        * array usable by ObjectFactory::getObjectFromSpec() to create a class.
+        *
+        * @return MWLoggerSpi
+        * @see registerProvider()
+        * @see ObjectFactory::getObjectFromSpec()
+        */
+       public static function getProvider() {
+               if ( self::$spi === null ) {
+                       global $wgMWLoggerDefaultSpi;
+                       $provider = ObjectFactory::getObjectFromSpec(
+                               $wgMWLoggerDefaultSpi
+                       );
+                       self::registerProvider( $provider );
+               }
+               return self::$spi;
+       }
+
+
+       /**
+        * Get a named logger instance from the currently configured logger factory.
+        *
+        * @param string $channel Logger channel (name)
+        * @return \Psr\Log\LoggerInterface
+        */
+       public static function getInstance( $channel ) {
+               if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
+                       $message = <<<TXT
+MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging library</a> to be present. This library is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
+
+Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
+TXT;
+                       echo $message;
+                       trigger_error( $message, E_USER_ERROR );
+                       die( 1 );
+               }
+
+               return self::getProvider()->getLogger( $channel );
+       }
+
+
+       /**
+        * Construction of utility class is not allowed.
+        */
+       private function __construct() {
+               // no-op
+       }
+}
index 7417c6b..27cf0cd 100644 (file)
  * @file
  */
 
-if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
-       $message = <<<TXT
-MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging library</a> to be present. This library is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
-
-Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
-TXT;
-       echo $message;
-       trigger_error( $message, E_USER_ERROR );
-       die( 1 );
-}
 
 /**
- * PSR-3 logging service.
- *
- * This class provides a service interface for logging system events. The
- * MWLogger class itself is intended to be a thin wrapper around another PSR-3
- * compliant logging library. Creation of MWLogger instances is managed via
- * the MWLogger::getInstance() static method which in turn delegates to the
- * currently registered service provider.
+ * Backwards compatibility stub for usage from before the introduction of
+ * MWLoggerFactory.
  *
- * A service provider is any class implementing the MWLoggerSpi interface.
- * There are two possible methods of registering a service provider. The
- * MWLogger::registerProvider() static method can be called at any time to
- * change the service provider. If MWLogger::getInstance() is called before
- * any service provider has been registered, it will attempt to use the
- * $wgMWLoggerDefaultSpi global to bootstrap MWLoggerSpi registration.
- * $wgMWLoggerDefaultSpi can either be the name of a class implementing the
- * MWLoggerSpi interface with a zero argument constructor or a callable that
- * will return an MWLoggerSpi instance.
- *
- * @see MWLoggerSpi
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @deprecated since 1.25 Use MWLoggerFactory
+ * @todo This class should be removed before the 1.25 final release.
  */
-class MWLogger implements \Psr\Log\LoggerInterface {
-
-       /**
-        * Service provider.
-        * @var MWLoggerSpi $spi
-        */
-       protected static $spi;
-
-
-       /**
-        * Wrapped PSR-3 logger instance.
-        *
-        * @var \Psr\Log\LoggerInterface $delegate
-        */
-       protected $delegate;
-
-
-       /**
-        * @param \Psr\Log\LoggerInterface $logger
-        */
-       public function __construct( \Psr\Log\LoggerInterface $logger ) {
-               $this->delegate = $logger;
-       }
-
-
-       /**
-        * Logs with an arbitrary level.
-        *
-        * @param string|int $level
-        * @param string $message
-        * @param array $context
-        */
-       public function log( $level, $message, array $context = array() ) {
-               $this->delegate->log( $level, $message, $context );
-       }
-
-
-       /**
-        * System is unusable.
-        *
-        * @param string $message
-        * @param array $context
-        */
-       public function emergency( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::EMERGENCY, $message, $context );
-       }
-
-
-       /**
-        * Action must be taken immediately.
-        *
-        * Example: Entire website down, database unavailable, etc. This should
-        * trigger the SMS alerts and wake you up.
-        *
-        * @param string $message
-        * @param array $context
-        */
-       public function alert( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::ALERT, $message, $context );
-       }
-
+class MWLogger {
 
        /**
-        * Critical conditions.
+        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * instances.
         *
-        * Example: Application component unavailable, unexpected exception.
-        *
-        * @param string $message
-        * @param array $context
-        */
-       public function critical( $message, array $context = array( ) ) {
-               $this->log( \Psr\Log\LogLevel::CRITICAL, $message, $context );
-       }
-
-
-       /**
-        * Runtime errors that do not require immediate action but should typically
-        * be logged and monitored.
-        *
-        * @param string $message
-        * @param array $context
-        */
-       public function error( $message, array $context = array( ) ) {
-               $this->log( \Psr\Log\LogLevel::ERROR, $message, $context );
-       }
-
-
-       /**
-        * Exceptional occurrences that are not errors.
-        *
-        * Example: Use of deprecated APIs, poor use of an API, undesirable things
-        * that are not necessarily wrong.
-        *
-        * @param string $message
-        * @param array $context
-        */
-       public function warning( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::WARNING, $message, $context );
-       }
-
-
-       /**
-        * Normal but significant events.
-        *
-        * @param string $message
-        * @param array $context
-        */
-       public function notice( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::NOTICE, $message, $context );
-       }
-
-
-       /**
-        * Interesting events.
-        *
-        * Example: User logs in, SQL logs.
-        *
-        * @param string $message
-        * @param array $context
+        * @param MWLoggerSpi $provider Provider to register
+        * @deprecated since 1.25 Use MWLoggerFactory::registerProvider()
         */
-       public function info( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::INFO, $message, $context );
+       public static function registerProvider( MWLoggerSpi $provider ) {
+               MWLoggerFactory::registerProvider( $provider );
        }
 
 
        /**
-        * Detailed debug information.
+        * Get the registered service provider.
         *
-        * @param string $message
-        * @param array $context
-        */
-       public function debug( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::DEBUG, $message, $context );
-       }
-
-
-       /**
-        * Register a service provider to create new MWLogger instances.
+        * If called before any service provider has been registered, it will
+        * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
+        * MWLoggerSpi registration. $wgMWLoggerDefaultSpi is expected to be an
+        * array usable by ObjectFactory::getObjectFromSpec() to create a class.
         *
-        * @param MWLoggerSpi $provider Provider to register
+        * @return MWLoggerSpi
+        * @see registerProvider()
+        * @see ObjectFactory::getObjectFromSpec()
+        * @deprecated since 1.25 Use MWLoggerFactory::getProvider()
         */
-       public static function registerProvider( MWLoggerSpi $provider ) {
-               self::$spi = $provider;
+       public static function getProvider() {
+               return MWLoggerFactory::getProvider();
        }
 
 
@@ -203,18 +62,11 @@ class MWLogger implements \Psr\Log\LoggerInterface {
         * Get a named logger instance from the currently configured logger factory.
         *
         * @param string $channel Logger channel (name)
-        * @return MWLogger
+        * @return \Psr\Log\LoggerInterface
+        * @deprecated since 1.25 Use MWLoggerFactory::getInstance()
         */
        public static function getInstance( $channel ) {
-               if ( self::$spi === null ) {
-                       global $wgMWLoggerDefaultSpi;
-                       $provider = ObjectFactory::getObjectFromSpec(
-                               $wgMWLoggerDefaultSpi
-                       );
-                       self::registerProvider( $provider );
-               }
-
-               return self::$spi->getLogger( $channel );
+               return MWLoggerFactory::getInstance( $channel );
        }
 
 }
index f725b64..617842c 100644 (file)
  * @file
  */
 
+
 /**
- * MWLogger service provider that creates \Psr\Log\NullLogger instances.
- * A NullLogger silently discards all log events sent to it.
+ * MWLoggerFactory service provider that creates \Psr\Log\NullLogger
+ * instances. A NullLogger silently discards all log events sent to it.
  *
  * Usage:
  * @code
@@ -29,7 +30,7 @@
  * );
  * @endcode
  *
- * @see MWLogger
+ * @see MWLoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -51,7 +52,7 @@ class MWLoggerNullSpi implements MWLoggerSpi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return MWLogger Logger instance
+        * @return \Psr\Log\NullLogger Logger instance
         */
        public function getLogger( $channel ) {
                return $this->singleton;
index cd4af9c..cd9f17f 100644 (file)
  */
 
 /**
- * Service provider interface for MWLogger implementation libraries.
+ * Service provider interface for \Psr\Log\LoggerInterface implementation
+ * libraries.
  *
  * MediaWiki can be configured to use a class implementing this interface to
- * create new MWLogger instances via either the $wgMWLoggerDefaultSpi global
- * variable or code that constructs an instance and registeres it via the
- * MWLogger::registerProvider() static method.
+ * create new \Psr\Log\LoggerInterface instances via either the
+ * $wgMWLoggerDefaultSpi global variable or code that constructs an instance
+ * and registers it via the MWLoggerFactory::registerProvider() static method.
  *
- * @see MWLogger
+ * @see MWLoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -37,7 +38,7 @@ interface MWLoggerSpi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return MWLogger Logger instance
+        * @return \Psr\Log\LoggerInterface Logger instance
         */
        public function getLogger( $channel );
 
index e7c69b8..be46c27 100644 (file)
  * See documentation in DefaultSettings.php for detailed explanations of each
  * variable.
  *
- * @see MWLogger
+ * @see MWLoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
  */
-class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
+use Psr\Log\AbstractLogger;
+use Psr\Log\LogLevel;
+
+class MWLoggerLegacyLogger extends AbstractLogger {
 
        /**
         * @var string $channel
         */
        protected $channel;
 
+       /**
+        * Convert Psr\Log\LogLevel constants into int for sane comparisons
+        * These are the same values that Monlog uses
+        *
+        * @var array
+        */
+       protected static $levelMapping = array(
+               LogLevel::DEBUG => 100,
+               LogLevel::INFO => 200,
+               LogLevel::NOTICE => 250,
+               LogLevel::WARNING => 300,
+               LogLevel::ERROR => 400,
+               LogLevel::CRITICAL => 500,
+               LogLevel::ALERT => 550,
+               LogLevel::EMERGENCY => 600,
+       );
+
 
        /**
         * @param string $channel
@@ -59,7 +79,7 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
         * @param array $context
         */
        public function log( $level, $message, array $context = array() ) {
-               if ( self::shouldEmit( $this->channel, $message, $context ) ) {
+               if ( self::shouldEmit( $this->channel, $message, $level, $context ) ) {
                        $text = self::format( $this->channel, $message, $context );
                        $destination = self::destination( $this->channel, $message, $context );
                        self::emit( $text, $destination );
@@ -72,11 +92,12 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
         *
         * @param string $channel
         * @param string $message
+        * @param string|int $level Psr\Log\LogEvent constant or Monlog level int
         * @param array $context
         * @return bool True if message should be sent to disk/network, false
         * otherwise
         */
-       public static function shouldEmit( $channel, $message, $context ) {
+       public static function shouldEmit( $channel, $message, $level, $context ) {
                global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
 
                if ( $channel === 'wfLogDBError' ) {
@@ -91,10 +112,19 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
                } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
                        $logConfig = $wgDebugLogGroups[$channel];
 
-                       if ( is_array( $logConfig ) && isset( $logConfig['sample'] ) ) {
-                               // Emit randomly with a 1 in 'sample' chance for each message.
-                               $shouldEmit = mt_rand( 1, $logConfig['sample'] ) === 1;
+                       if ( is_array( $logConfig ) ) {
+                               $shouldEmit = true;
+                               if ( isset( $logConfig['sample'] ) ) {
+                                       // Emit randomly with a 1 in 'sample' chance for each message.
+                                       $shouldEmit = mt_rand( 1, $logConfig['sample'] ) === 1;
+                               }
 
+                               if ( isset( $logConfig['level'] ) ) {
+                                       if ( is_string( $level ) ) {
+                                               $level = self::$levelMapping[$level];
+                                       }
+                                       $shouldEmit = $level >= self::$levelMapping[$logConfig['level']];
+                               }
                        } else {
                                // Emit unless the config value is explictly false.
                                $shouldEmit = $logConfig !== false;
@@ -107,7 +137,7 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
                        // and no explicit wgDebugLogGroups configuration.
                        $shouldEmit = false;
                } else {
-                       // Default return value is the the same as the historic wfDebug
+                       // Default return value is the same as the historic wfDebug
                        // method: emit if $wgDebugLogFile has been set.
                        $shouldEmit = $wgDebugLogFile != '';
                }
@@ -324,48 +354,8 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
        */
        public static function emit( $text, $file ) {
                if ( substr( $file, 0, 4 ) == 'udp:' ) {
-                       # Needs the sockets extension
-                       if ( preg_match( '!^udp:(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $file, $m ) ) {
-                               // IPv6 bracketed host
-                               $host = $m[1];
-                               $port = intval( $m[2] );
-                               $prefix = isset( $m[3] ) ? $m[3] : false;
-                               $domain = AF_INET6;
-                       } elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) {
-                               $host = $m[1];
-                               if ( !IP::isIPv4( $host ) ) {
-                                       $host = gethostbyname( $host );
-                               }
-                               $port = intval( $m[2] );
-                               $prefix = isset( $m[3] ) ? $m[3] : false;
-                               $domain = AF_INET;
-                       } else {
-                               throw new MWException( __METHOD__ . ': Invalid UDP specification' );
-                       }
-
-                       // Clean it up for the multiplexer
-                       if ( strval( $prefix ) !== '' ) {
-                               $text = preg_replace( '/^/m', $prefix . ' ', $text );
-
-                               // Limit to 64KB
-                               if ( strlen( $text ) > 65506 ) {
-                                       $text = substr( $text, 0, 65506 );
-                               }
-
-                               if ( substr( $text, -1 ) != "\n" ) {
-                                       $text .= "\n";
-                               }
-                       } elseif ( strlen( $text ) > 65507 ) {
-                               $text = substr( $text, 0, 65507 );
-                       }
-
-                       $sock = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
-                       if ( !$sock ) {
-                               return;
-                       }
-
-                       socket_sendto( $sock, $text, strlen( $text ), 0, $host, $port );
-                       socket_close( $sock );
+                       $transport = UDPTransport::newFromString( $file );
+                       $transport->emit( $text );
                } else {
                        wfSuppressWarnings();
                        $exists = file_exists( $file );
index b8813aa..79d4f24 100644 (file)
@@ -19,7 +19,8 @@
  */
 
 /**
- * MWLogger service provider that creates MWLoggerLegacyLogger instances.
+ * MWLoggerFactory service provider that creates MWLoggerLegacyLogger
+ * instances.
  *
  * Usage:
  * @code
@@ -28,7 +29,7 @@
  * );
  * @endcode
  *
- * @see MWLogger
+ * @see MWLoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -45,7 +46,7 @@ class MWLoggerLegacySpi implements MWLoggerSpi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return MWLogger Logger instance
+        * @return \Psr\Log\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons[$channel] ) ) {
index 42ab797..05ac64e 100644 (file)
@@ -101,7 +101,7 @@ class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler
                $levelOk = parent::isHandling( $record );
                if ( $levelOk && $this->useLegacyFilter ) {
                        return MWLoggerLegacyLogger::shouldEmit(
-                               $record['channel'], $record['message'], $record
+                               $record['channel'], $record['message'], $record['level'], $record
                        );
                }
                return $levelOk;
index c9545fa..67acf57 100644 (file)
@@ -21,7 +21,7 @@
 /**
  * Log message formatter that mimics the legacy log message formatting of
  * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * deligating the formatting to MWLoggerLegacyLogger.
+ * delegating the formatting to MWLoggerLegacyLogger.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
diff --git a/includes/debug/logger/monolog/SamplingHandler.php b/includes/debug/logger/monolog/SamplingHandler.php
new file mode 100644 (file)
index 0000000..a9f83b0
--- /dev/null
@@ -0,0 +1,123 @@
+<?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 Monolog\Handler\HandlerInterface;
+use Monolog\Formatter\FormatterInterface;
+
+/**
+ * Wrapper for another HandlerInterface that will only handle a percentage of
+ * records offered to it.
+ *
+ * When HandlerInterface::handle() is called for a given record, it will be
+ * handled or ignored with a one in N chance based on the sample factor given
+ * for the handler.
+ *
+ * Usage with MWLoggerMonologSpi:
+ * @code
+ * $wgMWLoggerDefaultSpi = array(
+ *   'class' => 'MWLoggerMonologSpi',
+ *   'args' => array( array(
+ *     'handlers' => array(
+ *       'some-handler' => array( ... ),
+ *       'sampled-some-handler' => array(
+ *         'class' => 'MWLoggerMonologSamplingHandler',
+ *         'args' => array(
+ *           function() {
+ *             return MWLoggerFactory::getProvider()->getHandler( 'some-handler');
+ *           },
+ *           2, // emit logs with a 1:2 chance
+ *         ),
+ *       ),
+ *     ),
+ *   ) ),
+ * );
+ * @endcode
+ *
+ * A sampled event stream can be useful for logging high frequency events in
+ * a production environment where you only need an idea of what is happening
+ * and are not concerned with capturing every occurence. Since the decision to
+ * handle or not handle a particular event is determined randomly, the
+ * resulting sampled log is not guaranteed to contain 1/N of the events that
+ * occurred in the application but based on [[Law of large numbers]] it will
+ * tend to be close to this ratio with a large number of attempts.
+ *
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class MWLoggerMonologSamplingHandler implements HandlerInterface {
+
+       /**
+        * @var HandlerInterface $delegate
+        */
+       protected $delegate;
+
+       /**
+        * @var int $factor
+        */
+       protected $factor;
+
+       /**
+        * @param HandlerInterface $handler Wrapped handler
+        * @param int $factor Sample factor
+        */
+       public function __construct( HandlerInterface $handler, $factor ) {
+               $this->delegate = $handler;
+               $this->factor = $factor;
+       }
+
+       public function isHandling( array $record ) {
+               return $this->delegate->isHandling( $record );
+       }
+
+       public function handle( array $record ) {
+               if ( $this->isHandling( $record )
+                       && mt_rand( 1, $this->factor ) === 1
+               ) {
+                       return $this->delegate->handle( $record );
+               }
+               return false;
+       }
+
+       public function handleBatch( array $records ) {
+               foreach ( $records as $record ) {
+                       $this->handle( $record );
+               }
+       }
+
+       public function pushProcessor( $callback ) {
+               $this->delegate->pushProcessor( $callback );
+               return $this;
+       }
+
+       public function popProcessor() {
+               return $this->delegate->popProcessor();
+       }
+
+       public function setFormatter( FormatterInterface $formatter ) {
+               $this->delegate->setFormatter( $formatter );
+               return $this;
+       }
+
+       public function getFormatter() {
+               return $this->delegate->getFormatter();
+       }
+
+}
index c43e3d6..68acf1d 100644 (file)
@@ -19,7 +19,8 @@
  */
 
 /**
- * MWLogger service provider that creates loggers implemented by Monolog.
+ * MWLoggerFactory service provider that creates loggers implemented by
+ * Monolog.
  *
  * Configured using an array of configuration data with the keys 'loggers',
  * 'processors', 'handlers' and 'formatters'.
@@ -29,8 +30,8 @@
  * section.
  *
  * Configuration will most typically be provided in the $wgMWLoggerDefaultSpi
- * global configuration variable used by MWLogger to construct its default SPI
- * provider:
+ * global configuration variable used by MWLoggerFactory to construct its
+ * default SPI provider:
  * @code
  * $wgMWLoggerDefaultSpi = array(
  *   'class' => 'MWLoggerMonologSpi',
@@ -152,7 +153,7 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
         * name will return the cached instance.
         *
         * @param string $channel Logging channel
-        * @return MWLogger Logger instance
+        * @return \Psr\Log\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons['loggers'][$channel] ) ) {
@@ -163,7 +164,7 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
                                $this->config['loggers']['@default'];
 
                        $monolog = $this->createLogger( $channel, $spec );
-                       $this->singletons['loggers'][$channel] = new MWLogger( $monolog );
+                       $this->singletons['loggers'][$channel] = $monolog;
                }
 
                return $this->singletons['loggers'][$channel];
@@ -199,7 +200,7 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
         * @param string $name Processor name
         * @return callable
         */
-       protected function getProcessor( $name ) {
+       public function getProcessor( $name ) {
                if ( !isset( $this->singletons['processors'][$name] ) ) {
                        $spec = $this->config['processors'][$name];
                        $processor = ObjectFactory::getObjectFromSpec( $spec );
@@ -214,11 +215,15 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
         * @param string $name Processor name
         * @return \Monolog\Handler\HandlerInterface
         */
-       protected function getHandler( $name ) {
+       public function getHandler( $name ) {
                if ( !isset( $this->singletons['handlers'][$name] ) ) {
                        $spec = $this->config['handlers'][$name];
                        $handler = ObjectFactory::getObjectFromSpec( $spec );
-                       $handler->setFormatter( $this->getFormatter( $spec['formatter'] ) );
+                       if ( isset( $spec['formatter'] ) ) {
+                               $handler->setFormatter(
+                                       $this->getFormatter( $spec['formatter'] )
+                               );
+                       }
                        $this->singletons['handlers'][$name] = $handler;
                }
                return $this->singletons['handlers'][$name];
@@ -230,7 +235,7 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
         * @param string $name Formatter name
         * @return \Monolog\Formatter\FormatterInterface
         */
-       protected function getFormatter( $name ) {
+       public function getFormatter( $name ) {
                if ( !isset( $this->singletons['formatters'][$name] ) ) {
                        $spec = $this->config['formatters'][$name];
                        $formatter = ObjectFactory::getObjectFromSpec( $spec );
index b0c1899..42816dd 100644 (file)
@@ -82,13 +82,10 @@ class DeferredUpdates {
        public static function doUpdates( $commit = '' ) {
                global $wgDeferredUpdateList;
 
-               wfProfileIn( __METHOD__ );
-
                $updates = array_merge( $wgDeferredUpdateList, self::$updates );
 
                // No need to get master connections in case of empty updates array
                if ( !count( $updates ) ) {
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -110,7 +107,7 @@ class DeferredUpdates {
                                        if ( $doCommit && $dbw->trxLevel() ) {
                                                $dbw->commit( __METHOD__, 'flush' );
                                        }
-                               } catch ( MWException $e ) {
+                               } catch ( Exception $e ) {
                                        // We don't want exceptions thrown during deferred updates to
                                        // be reported to the user since the output is already sent.
                                        // Instead we just log them.
@@ -122,7 +119,6 @@ class DeferredUpdates {
                        $updates = array_merge( $wgDeferredUpdateList, self::$updates );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index 54fa594..e02cfbc 100644 (file)
@@ -43,7 +43,6 @@ class HTMLCacheUpdate implements DeferrableUpdate {
        }
 
        public function doUpdate() {
-               wfProfileIn( __METHOD__ );
 
                $job = new HTMLCacheUpdateJob(
                        $this->mTitle,
@@ -65,6 +64,5 @@ class HTMLCacheUpdate implements DeferrableUpdate {
                        } );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 }
index 4e5af0b..9c377df 100644 (file)
@@ -58,12 +58,6 @@ class LinksUpdate extends SqlDataUpdate {
        /** @var array Map of arbitrary name to value */
        public $mProperties;
 
-       /** @var DatabaseBase Database connection reference */
-       public $mDb;
-
-       /** @var array SELECT options to be used */
-       public $mOptions;
-
        /** @var bool Whether to queue jobs for recursive updates */
        public $mRecursive;
 
@@ -153,7 +147,6 @@ class LinksUpdate extends SqlDataUpdate {
        }
 
        protected function doIncrementalUpdate() {
-               wfProfileIn( __METHOD__ );
 
                # Page links
                $existing = $this->getExistingLinks();
@@ -227,7 +220,6 @@ class LinksUpdate extends SqlDataUpdate {
                        $this->queueRecursiveJobs();
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -251,7 +243,6 @@ class LinksUpdate extends SqlDataUpdate {
         * @param string $table Table to use (e.g. 'templatelinks')
         */
        public static function queueRecursiveJobsForTable( Title $title, $table ) {
-               wfProfileIn( __METHOD__ );
                if ( $title->getBacklinkCache()->hasLinks( $table ) ) {
                        $job = new RefreshLinksJob(
                                $title,
@@ -265,7 +256,6 @@ class LinksUpdate extends SqlDataUpdate {
                        JobQueueGroup::singleton()->push( $job );
                        JobQueueGroup::singleton()->deduplicateRootJob( $job );
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index 8808c20..ba14f09 100644 (file)
@@ -78,8 +78,6 @@ class SearchUpdate implements DeferrableUpdate {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
-
                $page = WikiPage::newFromID( $this->id, WikiPage::READ_LATEST );
 
                foreach ( SearchEngine::getSearchTypes() as $type ) {
@@ -108,7 +106,6 @@ class SearchUpdate implements DeferrableUpdate {
                        $search->update( $this->id, $normalTitle, $search->normalizeText( $text ) );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -125,7 +122,6 @@ class SearchUpdate implements DeferrableUpdate {
                $text = $wgContLang->normalizeForSearch( $text );
                $lc = SearchEngine::legalSearchChars() . '&#;';
 
-               wfProfileIn( __METHOD__ . '-regexps' );
                $text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
                        ' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
                $text = preg_replace( "/(^|\\n)==\\s*([^\\n]+)\\s*==(\\s)/sD",
@@ -172,7 +168,6 @@ class SearchUpdate implements DeferrableUpdate {
 
                # Strip wiki '' and '''
                $text = preg_replace( "/''[']*/", " ", $text );
-               wfProfileOut( __METHOD__ . '-regexps' );
 
                return $text;
        }
index 7ec61ea..5823b2e 100644 (file)
@@ -31,7 +31,7 @@
  *       the beginTransaction() and commitTransaction() methods.
  */
 abstract class SqlDataUpdate extends DataUpdate {
-       /** @var DatabaseBase Database connection reference */
+       /** @var IDatabase Database connection reference */
        protected $mDb;
 
        /** @var array SELECT options to be used (array) */
@@ -53,9 +53,7 @@ abstract class SqlDataUpdate extends DataUpdate {
        public function __construct( $withTransaction = true ) {
                parent::__construct();
 
-               // @todo Get connection only when it's needed? Make sure that doesn't
-               // break anything, especially transactions!
-               $this->mDb = wfGetDB( DB_MASTER );
+               $this->mDb = wfGetLB()->getLazyConnectionRef( DB_MASTER );
 
                $this->mWithTransaction = $withTransaction;
                $this->mHasTransaction = false;
index d4fc7a0..950a264 100644 (file)
@@ -110,8 +110,6 @@ class SquidUpdate {
                        self::HTCPPurge( $urlArr );
                }
 
-               wfProfileIn( __METHOD__ );
-
                // Remove duplicate URLs
                $urlArr = array_unique( $urlArr );
                // Maximum number of parallel connections per squid
@@ -137,7 +135,6 @@ class SquidUpdate {
                }
                $pool->run();
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -148,7 +145,6 @@ class SquidUpdate {
         */
        public static function HTCPPurge( $urlArr ) {
                global $wgHTCPRouting, $wgHTCPMulticastTTL;
-               wfProfileIn( __METHOD__ );
 
                // HTCP CLR operation
                $htcpOpCLR = 4;
@@ -166,7 +162,6 @@ class SquidUpdate {
                        $errstr = socket_strerror( socket_last_error() );
                        wfDebugLog( 'squid', __METHOD__ .
                                ": Error opening UDP socket: $errstr" );
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -188,7 +183,6 @@ class SquidUpdate {
 
                foreach ( $urlArr as $url ) {
                        if ( !is_string( $url ) ) {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( 'Bad purge URL' );
                        }
                        $url = self::expand( $url );
@@ -205,7 +199,6 @@ class SquidUpdate {
                        }
                        foreach ( $conf as $subconf ) {
                                if ( !isset( $subconf['host'] ) || !isset( $subconf['port'] ) ) {
-                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( "Invalid HTCP rule for URL $url\n" );
                                }
                        }
@@ -237,7 +230,6 @@ class SquidUpdate {
                                        $subconf['host'], $subconf['port'] );
                        }
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index a4c0168..d327433 100644 (file)
@@ -189,7 +189,7 @@ class DiffOpChange extends DiffOp {
  * More ideas are taken from:
  *     http://www.ics.uci.edu/~eppstein/161/960229.html
  *
- * Some ideas are (and a bit of code) are from from analyze.c, from GNU
+ * Some ideas (and a bit of code) are from analyze.c, from GNU
  * diffutils-2.7, which can be found at:
  *     ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
  *
@@ -222,7 +222,6 @@ class DiffEngine {
         * @return DiffOp[]
         */
        public function diff( $from_lines, $to_lines ) {
-               wfProfileIn( __METHOD__ );
 
                // Diff and store locally
                $this->diffLocal( $from_lines, $to_lines );
@@ -272,7 +271,6 @@ class DiffEngine {
                                $edits[] = new DiffOpAdd( $add );
                        }
                }
-               wfProfileOut( __METHOD__ );
 
                return $edits;
        }
@@ -283,7 +281,6 @@ class DiffEngine {
         */
        private function diffLocal( $from_lines, $to_lines ) {
                global $wgExternalDiffEngine;
-               wfProfileIn( __METHOD__ );
 
                if ( $wgExternalDiffEngine == 'wikidiff3' ) {
                        // wikidiff3
@@ -346,7 +343,6 @@ class DiffEngine {
                        // Find the LCS.
                        $this->compareSeq( 0, count( $this->xv ), 0, count( $this->yv ) );
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -582,7 +578,6 @@ class DiffEngine {
         * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
         */
        private function shiftBoundaries( $lines, &$changed, $other_changed ) {
-               wfProfileIn( __METHOD__ );
                $i = 0;
                $j = 0;
 
@@ -697,7 +692,6 @@ class DiffEngine {
                                assert( '$j >= 0 && !$other_changed[$j]' );
                        }
                }
-               wfProfileOut( __METHOD__ );
        }
 }
 
@@ -858,7 +852,6 @@ class MappedDiff extends Diff {
         */
        public function __construct( $from_lines, $to_lines,
                $mapped_from_lines, $mapped_to_lines ) {
-               wfProfileIn( __METHOD__ );
 
                assert( 'count( $from_lines ) == count( $mapped_from_lines )' );
                assert( 'count( $to_lines ) == count( $mapped_to_lines )' );
@@ -880,7 +873,6 @@ class MappedDiff extends Diff {
                                $yi += count( $closing );
                        }
                }
-               wfProfileOut( __METHOD__ );
        }
 }
 
@@ -981,14 +973,12 @@ class WordLevelDiff extends MappedDiff {
         * @param string[] $closing_lines
         */
        public function __construct( $orig_lines, $closing_lines ) {
-               wfProfileIn( __METHOD__ );
 
                list( $orig_words, $orig_stripped ) = $this->split( $orig_lines );
                list( $closing_words, $closing_stripped ) = $this->split( $closing_lines );
 
                parent::__construct( $orig_words, $closing_words,
                        $orig_stripped, $closing_stripped );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -997,7 +987,6 @@ class WordLevelDiff extends MappedDiff {
         * @return array[]
         */
        private function split( $lines ) {
-               wfProfileIn( __METHOD__ );
 
                $words = array();
                $stripped = array();
@@ -1028,7 +1017,6 @@ class WordLevelDiff extends MappedDiff {
                                }
                        }
                }
-               wfProfileOut( __METHOD__ );
 
                return array( $words, $stripped );
        }
@@ -1037,7 +1025,6 @@ class WordLevelDiff extends MappedDiff {
         * @return string[]
         */
        public function orig() {
-               wfProfileIn( __METHOD__ );
                $orig = new HWLDFWordAccumulator;
 
                foreach ( $this->edits as $edit ) {
@@ -1048,7 +1035,6 @@ class WordLevelDiff extends MappedDiff {
                        }
                }
                $lines = $orig->getLines();
-               wfProfileOut( __METHOD__ );
 
                return $lines;
        }
@@ -1057,7 +1043,6 @@ class WordLevelDiff extends MappedDiff {
         * @return string[]
         */
        public function closing() {
-               wfProfileIn( __METHOD__ );
                $closing = new HWLDFWordAccumulator;
 
                foreach ( $this->edits as $edit ) {
@@ -1068,7 +1053,6 @@ class WordLevelDiff extends MappedDiff {
                        }
                }
                $lines = $closing->getLines();
-               wfProfileOut( __METHOD__ );
 
                return $lines;
        }
index 40df0d7..33ca931 100644 (file)
@@ -57,7 +57,6 @@ abstract class DiffFormatter {
         * @return string The formatted output.
         */
        public function format( $diff ) {
-               wfProfileIn( __METHOD__ );
 
                $xi = $yi = 1;
                $block = false;
@@ -115,7 +114,6 @@ abstract class DiffFormatter {
                }
 
                $end = $this->endDiff();
-               wfProfileOut( __METHOD__ );
 
                return $end;
        }
@@ -130,7 +128,6 @@ abstract class DiffFormatter {
         * @throws MWException If the edit type is not known.
         */
        protected function block( $xbeg, $xlen, $ybeg, $ylen, &$edits ) {
-               wfProfileIn( __METHOD__ );
                $this->startBlock( $this->blockHeader( $xbeg, $xlen, $ybeg, $ylen ) );
                foreach ( $edits as $edit ) {
                        if ( $edit->type == 'copy' ) {
@@ -146,7 +143,6 @@ abstract class DiffFormatter {
                        }
                }
                $this->endBlock();
-               wfProfileOut( __METHOD__ );
        }
 
        protected function startDiff() {
index c887193..7b2ba0d 100644 (file)
@@ -232,7 +232,6 @@ class DifferenceEngine extends ContextSource {
        }
 
        public function showDiffPage( $diffOnly = false ) {
-               wfProfileIn( __METHOD__ );
 
                # Allow frames except in certain special cases
                $out = $this->getOutput();
@@ -241,7 +240,6 @@ class DifferenceEngine extends ContextSource {
 
                if ( !$this->loadRevisionData() ) {
                        $this->showMissingRevision();
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -253,7 +251,6 @@ class DifferenceEngine extends ContextSource {
                                $this->mOldPage->getUserPermissionsErrors( 'read', $user ) );
                }
                if ( count( $permErrors ) ) {
-                       wfProfileOut( __METHOD__ );
                        throw new PermissionsError( 'read', $permErrors );
                }
 
@@ -454,7 +451,6 @@ class DifferenceEngine extends ContextSource {
                                $this->renderNewRevision();
                        }
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -491,7 +487,7 @@ class DifferenceEngine extends ContextSource {
                                        array( 'USE INDEX' => 'rc_timestamp' )
                                );
 
-                               if ( $change && $change->getPerformer()->getName() !== $user->getName() ) {
+                               if ( $change && !$change->getPerformer()->equals( $user ) ) {
                                        $rcid = $change->getAttribute( 'rc_id' );
                                } else {
                                        // None found or the page has been created by the current user.
@@ -547,7 +543,6 @@ class DifferenceEngine extends ContextSource {
         * Show the new revision of the page.
         */
        public function renderNewRevision() {
-               wfProfileIn( __METHOD__ );
                $out = $this->getOutput();
                $revHeader = $this->getRevisionHeader( $this->mNewRev );
                # Add "current version as of X" title
@@ -605,7 +600,6 @@ class DifferenceEngine extends ContextSource {
                # Add redundant patrol link on bottom...
                $out->addHTML( $this->markPatrolledLink() );
 
-               wfProfileOut( __METHOD__ );
        }
 
        protected function getParserOutput( WikiPage $page, Revision $rev ) {
@@ -684,23 +678,19 @@ class DifferenceEngine extends ContextSource {
         */
        public function getDiffBody() {
                global $wgMemc;
-               wfProfileIn( __METHOD__ );
                $this->mCacheHit = true;
                // Check if the diff should be hidden from this user
                if ( !$this->loadRevisionData() ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                } elseif ( $this->mOldRev &&
                        !$this->mOldRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
                ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                } elseif ( $this->mNewRev &&
                        !$this->mNewRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
                ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -708,7 +698,6 @@ class DifferenceEngine extends ContextSource {
                if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
                        && $this->mOldRev->getID() == $this->mNewRev->getID() )
                ) {
-                       wfProfileOut( __METHOD__ );
 
                        return '';
                }
@@ -724,7 +713,6 @@ class DifferenceEngine extends ContextSource {
                                        wfIncrStats( 'diff_cache_hit' );
                                        $difftext = $this->localiseLineNumbers( $difftext );
                                        $difftext .= "\n<!-- diff cache key $key -->\n";
-                                       wfProfileOut( __METHOD__ );
 
                                        return $difftext;
                                }
@@ -734,7 +722,6 @@ class DifferenceEngine extends ContextSource {
 
                // Loadtext is permission safe, this just clears out the diff
                if ( !$this->loadText() ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -754,7 +741,6 @@ class DifferenceEngine extends ContextSource {
                if ( $difftext !== false ) {
                        $difftext = $this->localiseLineNumbers( $difftext );
                }
-               wfProfileOut( __METHOD__ );
 
                return $difftext;
        }
@@ -840,8 +826,6 @@ class DifferenceEngine extends ContextSource {
        public function generateTextDiffBody( $otext, $ntext ) {
                global $wgExternalDiffEngine, $wgContLang;
 
-               wfProfileIn( __METHOD__ );
-
                $otext = str_replace( "\r\n", "\n", $otext );
                $ntext = str_replace( "\r\n", "\n", $ntext );
 
@@ -850,7 +834,6 @@ class DifferenceEngine extends ContextSource {
                        # input text to be HTML-escaped already
                        $otext = htmlspecialchars( $wgContLang->segmentForDiff( $otext ) );
                        $ntext = htmlspecialchars( $wgContLang->segmentForDiff( $ntext ) );
-                       wfProfileOut( __METHOD__ );
 
                        return $wgContLang->unsegmentForDiff( wikidiff_do_diff( $otext, $ntext, 2 ) ) .
                        $this->debug( 'wikidiff1' );
@@ -859,11 +842,8 @@ class DifferenceEngine extends ContextSource {
                if ( $wgExternalDiffEngine == 'wikidiff2' && function_exists( 'wikidiff2_do_diff' ) ) {
                        # Better external diff engine, the 2 may some day be dropped
                        # This one does the escaping and segmenting itself
-                       wfProfileIn( 'wikidiff2_do_diff' );
                        $text = wikidiff2_do_diff( $otext, $ntext, 2 );
                        $text .= $this->debug( 'wikidiff2' );
-                       wfProfileOut( 'wikidiff2_do_diff' );
-                       wfProfileOut( __METHOD__ );
 
                        return $text;
                }
@@ -875,13 +855,11 @@ class DifferenceEngine extends ContextSource {
 
                        $tempFile1 = fopen( $tempName1, "w" );
                        if ( !$tempFile1 ) {
-                               wfProfileOut( __METHOD__ );
 
                                return false;
                        }
                        $tempFile2 = fopen( $tempName2, "w" );
                        if ( !$tempFile2 ) {
-                               wfProfileOut( __METHOD__ );
 
                                return false;
                        }
@@ -890,13 +868,10 @@ class DifferenceEngine extends ContextSource {
                        fclose( $tempFile1 );
                        fclose( $tempFile2 );
                        $cmd = wfEscapeShellArg( $wgExternalDiffEngine, $tempName1, $tempName2 );
-                       wfProfileIn( __METHOD__ . "-shellexec" );
                        $difftext = wfShellExec( $cmd );
                        $difftext .= $this->debug( "external $wgExternalDiffEngine" );
-                       wfProfileOut( __METHOD__ . "-shellexec" );
                        unlink( $tempName1 );
                        unlink( $tempName2 );
-                       wfProfileOut( __METHOD__ );
 
                        return $difftext;
                }
@@ -906,8 +881,7 @@ class DifferenceEngine extends ContextSource {
                $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) );
                $diffs = new Diff( $ota, $nta );
                $formatter = new TableDiffFormatter();
-               $difftext = $wgContLang->unsegmentForDiff( $formatter->format( $diffs ) ) .
-                       wfProfileOut( __METHOD__ );
+               $difftext = $wgContLang->unsegmentForDiff( $formatter->format( $diffs ) );
 
                return $difftext;
        }
@@ -988,7 +962,7 @@ class DifferenceEngine extends ContextSource {
                        $users = $this->mNewPage->getAuthorsBetween( $oldRev, $newRev, $limit );
                        $numUsers = count( $users );
 
-                       if ( $numUsers == 1 && $users[0] == $newRev->getRawUserText() ) {
+                       if ( $numUsers == 1 && $users[0] == $newRev->getUserText( Revision::RAW ) ) {
                                $numUsers = 0; // special case to say "by the same user" instead of "by one other user"
                        }
 
@@ -1062,7 +1036,7 @@ class DifferenceEngine extends ContextSource {
                        $key = $title->quickUserCan( 'edit', $user ) ? 'editold' : 'viewsourceold';
                        $msg = $this->msg( $key )->escaped();
                        $editLink = $this->msg( 'parentheses' )->rawParams(
-                               Linker::linkKnown( $title, $msg, array( ), $editQuery ) )->plain();
+                               Linker::linkKnown( $title, $msg, array( ), $editQuery ) )->escaped();
                        $header .= ' ' . Html::rawElement(
                                'span',
                                array( 'class' => 'mw-diff-edit' ),
index db7318f..e5155bf 100644 (file)
@@ -190,7 +190,6 @@ class TableDiffFormatter extends DiffFormatter {
         * @param string[] $closing
         */
        protected function changed( $orig, $closing ) {
-               wfProfileIn( __METHOD__ );
 
                $diff = new WordLevelDiff( $orig, $closing );
                $del = $diff->orig();
@@ -208,7 +207,6 @@ class TableDiffFormatter extends DiffFormatter {
                        echo '<tr>' . $this->emptyLine() .
                                $this->addedLine( $line ) . "</tr>\n";
                }
-               wfProfileOut( __METHOD__ );
        }
 
 }
index 83801b6..77ab6ad 100644 (file)
@@ -83,8 +83,7 @@ class MWExceptionHandler {
                                }
                        }
                } else {
-                       $message = "Unexpected non-MediaWiki exception encountered, of type \"" .
-                               get_class( $e ) . "\"";
+                       $message = "Exception encountered, of type \"" . get_class( $e ) . "\"";
 
                        if ( $wgShowExceptionDetails ) {
                                $message .= "\n" . MWExceptionHandler::getLogMessage( $e ) . "\nBacktrace:\n" .
@@ -142,7 +141,7 @@ class MWExceptionHandler {
         *
         *   try {
         *       ...
-        *   } catch ( MWException $e ) {
+        *   } catch ( Exception $e ) {
         *       $e->report();
         *   } catch ( Exception $e ) {
         *       echo $e->__toString();
@@ -437,6 +436,11 @@ TXT;
                        'message' => $e->getMessage(),
                );
 
+               if ( $e instanceof ErrorException && ( error_reporting() & $e->getSeverity() ) === 0 ) {
+                       // Flag surpressed errors
+                       $exceptionData['suppressed'] = true;
+               }
+
                // Because MediaWiki is first and foremost a web application, we set a
                // 'url' key unconditionally, but set it to null if the exception does
                // not occur in the context of a web request, as a way of making that
@@ -482,16 +486,26 @@ TXT;
         * Log an exception that wasn't thrown but made to wrap an error.
         *
         * @since 1.25
-        * @param Exception $e
+        * @param ErrorException $e
        */
-       protected static function logError( Exception $e ) {
+       protected static function logError( ErrorException $e ) {
                global $wgLogExceptionBacktrace;
 
-               $log = self::getLogMessage( $e );
-               if ( $wgLogExceptionBacktrace ) {
-                       wfDebugLog( 'error', $log . "\n" . $e->getTraceAsString() );
-               } else {
-                       wfDebugLog( 'error', $log );
+               // The set_error_handler callback is independent from error_reporting.
+               // Filter out unwanted errors manually (e.g. when wfSuppressWarnings is active).
+               if ( ( error_reporting() & $e->getSeverity() ) !== 0 ) {
+                       $log = self::getLogMessage( $e );
+                       if ( $wgLogExceptionBacktrace ) {
+                               wfDebugLog( 'error', $log . "\n" . $e->getTraceAsString() );
+                       } else {
+                               wfDebugLog( 'error', $log );
+                       }
+               }
+
+               // Include all errors in the json log (surpressed errors will be flagged)
+               $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
+               if ( $json !== false ) {
+                       wfDebugLog( 'error-json', $json, 'private' );
                }
        }
 }
index 688130e..ea04cc8 100644 (file)
@@ -197,7 +197,7 @@ class ExternalStore {
                        }
                        try {
                                $url = $store->store( $path, $data ); // Try to save the object
-                       } catch ( MWException $error ) {
+                       } catch ( Exception $error ) {
                                $url = false;
                        }
                        if ( strlen( $url ) ) {
index 1659c62..6ee9b2e 100644 (file)
@@ -104,7 +104,6 @@ class FSFile {
         * @return array
         */
        public function getProps( $ext = true ) {
-               wfProfileIn( __METHOD__ );
                wfDebug( __METHOD__ . ": Getting file info for $this->path\n" );
 
                $info = self::placeholderProps();
@@ -146,8 +145,6 @@ class FSFile {
                        wfDebug( __METHOD__ . ": $this->path NOT FOUND!\n" );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $info;
        }
 
@@ -201,10 +198,8 @@ class FSFile {
         * @return bool|string False on failure
         */
        public function getSha1Base36( $recache = false ) {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->sha1Base36 !== null && !$recache ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $this->sha1Base36;
                }
@@ -217,8 +212,6 @@ class FSFile {
                        $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $this->sha1Base36;
        }
 
index 8c0a61a..9504112 100644 (file)
@@ -1491,7 +1491,7 @@ abstract class FileBackend {
  * @ingroup FileBackend
  * @since 1.23
  */
-class FileBackendException extends MWException {
+class FileBackendException extends Exception {
 }
 
 /**
index 8b6eaca..f2d13ee 100644 (file)
@@ -299,7 +299,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Check that a set of files are consistent across all internal backends
-        * and re-synchronize those files againt the "multi master" if needed.
+        * and re-synchronize those files against the "multi master" if needed.
         *
         * @param array $paths List of storage paths
         * @return Status
index 495ac3c..a3b0009 100644 (file)
@@ -118,7 +118,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function createInternal( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
                        $status = Status::newFatal( 'backend-fail-maxsize',
                                $params['dst'], $this->maxFileSizeInternal() );
@@ -159,7 +159,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function storeInternal( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
                        $status = Status::newFatal( 'backend-fail-maxsize',
                                $params['dst'], $this->maxFileSizeInternal() );
@@ -201,7 +201,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function copyInternal( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = $this->doCopyInternal( $params );
                $this->clearCache( array( $params['dst'] ) );
                if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
@@ -233,7 +233,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function deleteInternal( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = $this->doDeleteInternal( $params );
                $this->clearCache( array( $params['src'] ) );
                $this->deleteFileCache( $params['src'] ); // persistent cache
@@ -267,7 +267,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function moveInternal( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = $this->doMoveInternal( $params );
                $this->clearCache( array( $params['src'], $params['dst'] ) );
                $this->deleteFileCache( $params['src'] ); // persistent cache
@@ -313,7 +313,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function describeInternal( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                if ( count( $params['headers'] ) ) {
                        $status = $this->doDescribeInternal( $params );
                        $this->clearCache( array( $params['src'] ) );
@@ -346,7 +346,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function concatenate( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Try to lock the source files for the scope of this function
@@ -439,7 +439,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doPrepare( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
@@ -474,7 +474,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doSecure( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
@@ -509,7 +509,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doPublish( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
@@ -544,7 +544,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doClean( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Recursive: first delete all empty subdirs recursively
@@ -600,21 +600,21 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function fileExists( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
 
                return ( $stat === null ) ? null : (bool)$stat; // null => failure
        }
 
        final public function getFileTimestamp( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
 
                return $stat ? $stat['mtime'] : false;
        }
 
        final public function getFileSize( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
 
                return $stat ? $stat['size'] : false;
@@ -625,7 +625,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $path === null ) {
                        return false; // invalid storage path
                }
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
                        $this->primeFileCache( array( $path ) ); // check persistent cache
@@ -644,9 +644,7 @@ abstract class FileBackendStore extends FileBackend {
                                }
                        }
                }
-               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
                $stat = $this->doGetFileStat( $params );
-               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                if ( is_array( $stat ) ) { // file exists
                        // Strongly consistent backends can automatically set "latest"
                        $stat['latest'] = isset( $stat['latest'] ) ? $stat['latest'] : $latest;
@@ -679,7 +677,7 @@ abstract class FileBackendStore extends FileBackend {
        abstract protected function doGetFileStat( array $params );
 
        public function getFileContentsMulti( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
                $contents = $this->doGetFileContentsMulti( $params );
@@ -708,7 +706,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $path === null ) {
                        return false; // invalid storage path
                }
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( $this->cheapCache->has( $path, 'xattr', self::CACHE_TTL ) ) {
                        $stat = $this->cheapCache->get( $path, 'xattr' );
@@ -718,12 +716,8 @@ abstract class FileBackendStore extends FileBackend {
                                return $stat['map'];
                        }
                }
-               wfProfileIn( __METHOD__ . '-miss' );
-               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
                $fields = $this->doGetFileXAttributes( $params );
                $fields = is_array( $fields ) ? self::normalizeXAttributes( $fields ) : false;
-               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
-               wfProfileOut( __METHOD__ . '-miss' );
                $this->cheapCache->set( $path, 'xattr', array( 'map' => $fields, 'latest' => $latest ) );
 
                return $fields;
@@ -742,7 +736,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $path === null ) {
                        return false; // invalid storage path
                }
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
                        $stat = $this->cheapCache->get( $path, 'sha1' );
@@ -752,9 +746,7 @@ abstract class FileBackendStore extends FileBackend {
                                return $stat['hash'];
                        }
                }
-               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
                $hash = $this->doGetFileSha1Base36( $params );
-               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                $this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
 
                return $hash;
@@ -775,7 +767,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getFileProps( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $fsFile = $this->getLocalReference( $params );
                $props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
 
@@ -783,7 +775,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getLocalReferenceMulti( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
 
@@ -826,7 +818,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getLocalCopyMulti( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
                $tmpFiles = $this->doGetLocalCopyMulti( $params );
@@ -851,7 +843,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function streamFile( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                $info = $this->getFileStat( $params );
@@ -865,9 +857,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $res == StreamFile::NOT_MODIFIED ) {
                        // do nothing; client cache is up to date
                } elseif ( $res == StreamFile::READY_STREAM ) {
-                       wfProfileIn( __METHOD__ . '-send-' . $this->name );
                        $status = $this->doStreamFile( $params );
-                       wfProfileOut( __METHOD__ . '-send-' . $this->name );
                        if ( !$status->isOK() ) {
                                // Per bug 41113, nasty things can happen if bad cache entries get
                                // stuck in cache. It's also possible that this error can come up
@@ -1071,7 +1061,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doOperationsInternal( array $ops, array $opts ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
@@ -1137,7 +1127,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doQuickOperationsInternal( array $ops ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
@@ -1204,7 +1194,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return array Map of Status objects
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
@@ -1300,7 +1290,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function preloadFileStat( array $params ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $success = true; // no network errors
 
                $params['concurrency'] = ( $this->parallelize !== 'off' ) ? $this->concurrency : 1;
@@ -1372,7 +1362,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Check if a container name is valid.
-        * This checks for for length and illegal characters.
+        * This checks for length and illegal characters.
         *
         * @param string $container
         * @return bool
@@ -1623,7 +1613,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $items
         */
        final protected function primeContainerCache( array $items ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $paths = array(); // list of storage paths
                $contNames = array(); // (cache key => resolved container name)
@@ -1733,7 +1723,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $items List of storage paths
         */
        final protected function primeFileCache( array $items ) {
-               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $paths = array(); // list of storage paths
                $pathNames = array(); // (cache key => storage path)
index b0d83e0..faa1314 100644 (file)
@@ -55,7 +55,6 @@ class FileOpBatch {
         * @return Status
         */
        public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
-               $section = new ProfileSection( __METHOD__ );
                $status = Status::newGood();
 
                $n = count( $performOps );
index 7234474..836fd49 100644 (file)
@@ -647,7 +647,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $timestamp = new MWTimestamp( $ts );
 
                        return $timestamp->getTimestamp( $format );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        throw new FileBackendError( $e->getMessage() );
                }
        }
@@ -664,7 +664,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $objHdrs; // nothing to do
                }
 
-               $section = new ProfileSection( __METHOD__ . '-' . $this->name );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
 
                $auth = $this->getAuthentication();
@@ -798,7 +798,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $dirs; // nothing more
                }
 
-               $section = new ProfileSection( __METHOD__ . '-' . $this->name );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $prefix = ( $dir == '' ) ? null : "{$dir}/";
                // Non-recursive: only list dirs right under $dir
@@ -878,7 +878,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $files; // nothing more
                }
 
-               $section = new ProfileSection( __METHOD__ . '-' . $this->name );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                $prefix = ( $dir == '' ) ? null : "{$dir}/";
                // $objects will contain a list of unfiltered names or CF_Object items
@@ -937,6 +937,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        // Convert various random Swift dates to TS_MW
                                        'mtime'  => $this->convertSwiftDate( $object->last_modified, TS_MW ),
                                        'size'   => (int)$object->bytes,
+                                       'sha1'   => null,
                                        // Note: manifiest ETags are not an MD5 of the file
                                        'md5'    => ctype_xdigit( $object->hash ) ? $object->hash : null,
                                        'latest' => false // eventually consistent
@@ -1064,6 +1065,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $tmpFiles[$path] = $tmpFile;
                }
 
+               $isLatest = ( $this->isRGW || !empty( $params['latest'] ) );
                $opts = array( 'maxConnsPerHost' => $params['concurrency'] );
                $reqs = $this->http->runMulti( $reqs, $opts );
                foreach ( $reqs as $path => $op ) {
@@ -1078,6 +1080,10 @@ class SwiftFileBackend extends FileBackendStore {
                                        $this->onError( null, __METHOD__,
                                                array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
                                }
+                               // Set the file stat process cache in passing
+                               $stat = $this->getStatFromHeaders( $rhdrs );
+                               $stat['latest'] = $isLatest;
+                               $this->cheapCache->set( $path, 'stat', $stat );
                        } elseif ( $rcode === 404 ) {
                                $tmpFiles[$path] = false;
                        } else {
@@ -1272,7 +1278,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @return array|bool|null False on 404, null on failure
         */
        protected function getContainerStat( $container, $bypassCache = false ) {
-               $section = new ProfileSection( __METHOD__ . '-' . $this->name );
+               $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
 
                if ( $bypassCache ) { // purge cache
                        $this->containerStatCache->clear( $container );
@@ -1285,13 +1291,11 @@ class SwiftFileBackend extends FileBackendStore {
                                return null;
                        }
 
-                       wfProfileIn( __METHOD__ . "-{$this->name}-miss" );
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
                                'method' => 'HEAD',
                                'url' => $this->storageUrl( $auth, $container ),
                                'headers' => $this->authTokenHeaders( $auth )
                        ) );
-                       wfProfileOut( __METHOD__ . "-{$this->name}-miss" );
 
                        if ( $rcode === 204 ) {
                                $stat = array(
@@ -1512,25 +1516,8 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $rcode === 200 || $rcode === 204 ) {
                                // Update the object if it is missing some headers
                                $rhdrs = $this->addMissingMetadata( $rhdrs, $path );
-                               // Fetch all of the custom metadata headers
-                               $metadata = array();
-                               foreach ( $rhdrs as $name => $value ) {
-                                       if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
-                                               $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
-                                       }
-                               }
-                               // Fetch all of the custom raw HTTP headers
-                               $headers = $this->sanitizeHdrs( array( 'headers' => $rhdrs ) );
-                               $stat = array(
-                                       // Convert various random Swift dates to TS_MW
-                                       'mtime' => $this->convertSwiftDate( $rhdrs['last-modified'], TS_MW ),
-                                       // Empty objects actually return no content-length header in Ceph
-                                       'size'  => isset( $rhdrs['content-length'] ) ? (int)$rhdrs['content-length'] : 0,
-                                       'sha1'  => $rhdrs['x-object-meta-sha1base36'],
-                                       // Note: manifiest ETags are not an MD5 of the file
-                                       'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
-                                       'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
-                               );
+                               // Load the stat array from the headers
+                               $stat = $this->getStatFromHeaders( $rhdrs );
                                if ( $this->isRGW ) {
                                        $stat['latest'] = true; // strong consistency
                                }
@@ -1546,6 +1533,34 @@ class SwiftFileBackend extends FileBackendStore {
                return $stats;
        }
 
+       /**
+        * @param array $rhdrs
+        * @return array
+        */
+       protected function getStatFromHeaders( array $rhdrs ) {
+               // Fetch all of the custom metadata headers
+               $metadata = array();
+               foreach ( $rhdrs as $name => $value ) {
+                       if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
+                               $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
+                       }
+               }
+               // Fetch all of the custom raw HTTP headers
+               $headers = $this->sanitizeHdrs( array( 'headers' => $rhdrs ) );
+               return array(
+                       // Convert various random Swift dates to TS_MW
+                       'mtime' => $this->convertSwiftDate( $rhdrs['last-modified'], TS_MW ),
+                       // Empty objects actually return no content-length header in Ceph
+                       'size'  => isset( $rhdrs['content-length'] ) ? (int)$rhdrs['content-length'] : 0,
+                       'sha1'  => isset( $rhdrs['x-object-meta-sha1base36'] )
+                               ? $rhdrs['x-object-meta-sha1base36']
+                               : null,
+                       // Note: manifiest ETags are not an MD5 of the file
+                       'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
+                       'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
+               );
+       }
+
        /**
         * @return array|null Credential map
         */
@@ -1600,7 +1615,7 @@ class SwiftFileBackend extends FileBackendStore {
                        }
                        // Ceph RGW does not use <account> in URLs (OpenStack Swift uses "/v1/<account>")
                        if ( substr( $this->authCreds['storage_url'], -3 ) === '/v1' ) {
-                               $this->isRGW = true; // take advantage of strong consistency
+                               $this->isRGW = true; // take advantage of strong consistency in Ceph
                        }
                }
 
index 1b68130..791be7f 100644 (file)
@@ -55,7 +55,6 @@ class TempFSFile extends FSFile {
         * @return TempFSFile|null
         */
        public static function factory( $prefix, $extension = '' ) {
-               wfProfileIn( __METHOD__ );
                $base = wfTempDir() . '/' . $prefix . wfRandomString( 12 );
                $ext = ( $extension != '' ) ? ".{$extension}" : "";
                for ( $attempt = 1; true; $attempt++ ) {
@@ -68,14 +67,12 @@ class TempFSFile extends FSFile {
                                break; // got it
                        }
                        if ( $attempt >= 5 ) {
-                               wfProfileOut( __METHOD__ );
 
                                return null; // give up
                        }
                }
                $tmpFile = new self( $path );
                $tmpFile->autocollect(); // safely instantiated
-               wfProfileOut( __METHOD__ );
 
                return $tmpFile;
        }
index c065148..4ee5222 100644 (file)
@@ -57,14 +57,14 @@ abstract class FileJournal {
         *
         * @param array $config
         * @param string $backend A registered file backend name
-        * @throws MWException
+        * @throws Exception
         * @return FileJournal
         */
        final public static function factory( array $config, $backend ) {
                $class = $config['class'];
                $jrn = new $class( $config );
                if ( !$jrn instanceof self ) {
-                       throw new MWException( "Class given is not an instance of FileJournal." );
+                       throw new Exception( "Class given is not an instance of FileJournal." );
                }
                $jrn->backend = $backend;
 
index 450ccc8..39a5563 100644 (file)
@@ -52,7 +52,7 @@ abstract class DBLockManager extends QuorumLockManager {
        /**
         * Construct a new instance from configuration.
         *
-        * @param array $config Paramaters include:
+        * @param array $config Parameters include:
         *   - dbServers   : Associative array of DB names to server configuration.
         *                   Configuration is an associative array that includes:
         *                     - host        : DB server name
@@ -97,7 +97,7 @@ abstract class DBLockManager extends QuorumLockManager {
                                // connection timeouts. This is useless if each bucket has one peer.
                                try {
                                        $this->statusCache = ObjectCache::newAccelerator( array() );
-                               } catch ( MWException $e ) {
+                               } catch ( Exception $e ) {
                                        trigger_error( __CLASS__ .
                                                " using multiple DB peers without apc, xcache, or wincache." );
                                }
index 762bc66..615ba77 100644 (file)
@@ -64,7 +64,7 @@ abstract class LockManager {
        /**
         * Construct a new instance from configuration
         *
-        * @param array $config Paramaters include:
+        * @param array $config Parameters include:
         *   - domain  : Domain (usually wiki ID) that all resources are relative to [optional]
         *   - lockTTL : Age (in seconds) at which resource locks should expire.
         *               This only applies if locks are not tied to a connection/process.
@@ -102,7 +102,6 @@ abstract class LockManager {
         * @since 1.22
         */
        final public function lockByType( array $pathsByType, $timeout = 0 ) {
-               wfProfileIn( __METHOD__ );
                $status = Status::newGood();
                $pathsByType = $this->normalizePathsByType( $pathsByType );
                $msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
@@ -116,7 +115,6 @@ abstract class LockManager {
                        usleep( 1e3 * ( next( $msleep ) ?: 1000 ) ); // use 1 sec after enough times
                        $elapsed = microtime( true ) - $start;
                } while ( $elapsed < $timeout && $elapsed >= 0 );
-               wfProfileOut( __METHOD__ );
 
                return $status;
        }
@@ -140,10 +138,8 @@ abstract class LockManager {
         * @since 1.22
         */
        final public function unlockByType( array $pathsByType ) {
-               wfProfileIn( __METHOD__ );
                $pathsByType = $this->normalizePathsByType( $pathsByType );
                $status = $this->doUnlockByType( $pathsByType );
-               wfProfileOut( __METHOD__ );
 
                return $status;
        }
index 19fc4fe..c72863e 100644 (file)
@@ -78,17 +78,17 @@ class LockManagerGroup {
         * Register an array of file lock manager configurations
         *
         * @param array $configs
-        * @throws MWException
+        * @throws Exception
         */
        protected function register( array $configs ) {
                foreach ( $configs as $config ) {
                        $config['domain'] = $this->domain;
                        if ( !isset( $config['name'] ) ) {
-                               throw new MWException( "Cannot register a lock manager with no name." );
+                               throw new Exception( "Cannot register a lock manager with no name." );
                        }
                        $name = $config['name'];
                        if ( !isset( $config['class'] ) ) {
-                               throw new MWException( "Cannot register lock manager `{$name}` with no class." );
+                               throw new Exception( "Cannot register lock manager `{$name}` with no class." );
                        }
                        $class = $config['class'];
                        unset( $config['class'] ); // lock manager won't need this
@@ -105,11 +105,11 @@ class LockManagerGroup {
         *
         * @param string $name
         * @return LockManager
-        * @throws MWException
+        * @throws Exception
         */
        public function get( $name ) {
                if ( !isset( $this->managers[$name] ) ) {
-                       throw new MWException( "No lock manager defined with the name `$name`." );
+                       throw new Exception( "No lock manager defined with the name `$name`." );
                }
                // Lazy-load the actual lock manager instance
                if ( !isset( $this->managers[$name]['instance'] ) ) {
@@ -126,11 +126,11 @@ class LockManagerGroup {
         *
         * @param string $name
         * @return array
-        * @throws MWException
+        * @throws Exception
         */
        public function config( $name ) {
                if ( !isset( $this->managers[$name] ) ) {
-                       throw new MWException( "No lock manager defined with the name `$name`." );
+                       throw new Exception( "No lock manager defined with the name `$name`." );
                }
                $class = $this->managers[$name]['class'];
 
@@ -155,7 +155,7 @@ class LockManagerGroup {
         * Throws an exception if no lock manager could be found.
         *
         * @return LockManager
-        * @throws MWException
+        * @throws Exception
         */
        public function getAny() {
                return isset( $this->managers['default'] )
index 9bb01c2..24d96e0 100644 (file)
@@ -55,13 +55,13 @@ class MemcLockManager extends QuorumLockManager {
        /**
         * Construct a new instance from configuration.
         *
-        * @param array $config Paramaters include:
+        * @param array $config Parameters include:
         *   - lockServers  : Associative array of server names to "<IP>:<port>" strings.
         *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
         *                    each having an odd-numbered list of server names (peers) as values.
         *   - memcConfig   : Configuration array for ObjectCache::newFromParams. [optional]
         *                    If set, this must use one of the memcached classes.
-        * @throws MWException
+        * @throws Exception
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
@@ -80,7 +80,7 @@ class MemcLockManager extends QuorumLockManager {
                        if ( $cache instanceof MemcachedBagOStuff ) {
                                $this->bagOStuffs[$name] = $cache;
                        } else {
-                               throw new MWException(
+                               throw new Exception(
                                        'Only MemcachedBagOStuff classes are supported by MemcLockManager.' );
                        }
                }
index 90e0581..90e62e6 100644 (file)
@@ -62,7 +62,7 @@ class RedisLockManager extends QuorumLockManager {
         *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
         *                    each having an odd-numbered list of server names (peers) as values.
         *   - redisConfig  : Configuration for RedisConnectionPool::__construct().
-        * @throws MWException
+        * @throws Exception
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
index 58311d3..df85f9c 100644 (file)
@@ -138,10 +138,10 @@ abstract class File {
        /** @var Title */
        protected $redirectTitle;
 
-       /** @var bool Wether the output of transform() for this file is likely to be valid. */
+       /** @var bool Whether the output of transform() for this file is likely to be valid. */
        protected $canRender;
 
-       /** @var bool Wether this media file is in a format that is unlikely to
+       /** @var bool Whether this media file is in a format that is unlikely to
         *    contain viruses or malicious content
         */
        protected $isSafeFile;
@@ -471,8 +471,6 @@ abstract class File {
        public function getThumbnailBucket( $desiredWidth, $page = 1 ) {
                global $wgThumbnailBuckets, $wgThumbnailMinimumBucketDistance;
 
-               wfDebugLog( 'thumbnail', 'thumbnail buckets ' . json_encode( $wgThumbnailBuckets ) );
-
                $imageWidth = $this->getWidth( $page );
 
                if ( $imageWidth === false ) {
@@ -998,7 +996,6 @@ abstract class File {
        function transform( $params, $flags = 0 ) {
                global $wgThumbnailEpoch;
 
-               wfProfileIn( __METHOD__ );
                do {
                        if ( !$this->canRender() ) {
                                $thumb = $this->iconThumb();
@@ -1071,8 +1068,6 @@ abstract class File {
                        }
                } while ( false );
 
-               wfProfileOut( __METHOD__ );
-
                return is_object( $thumb ) ? $thumb : false;
        }
 
@@ -1102,9 +1097,7 @@ abstract class File {
                }
 
                // Actually render the thumbnail...
-               wfProfileIn( __METHOD__ . '-doTransform' );
                $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
-               wfProfileOut( __METHOD__ . '-doTransform' );
                $tmpFile->bind( $thumb ); // keep alive with $thumb
 
                if ( !$thumb ) { // bad params?
@@ -1460,7 +1453,7 @@ abstract class File {
 
        /**
         * Get the path of the file relative to the public zone root.
-        * This function is overriden in OldLocalFile to be like getArchiveRel().
+        * This function is overridden in OldLocalFile to be like getArchiveRel().
         *
         * @return string
         */
@@ -1504,7 +1497,7 @@ abstract class File {
 
        /**
         * Get urlencoded path of the file relative to the public zone root.
-        * This function is overriden in OldLocalFile to be like getArchiveUrl().
+        * This function is overridden in OldLocalFile to be like getArchiveUrl().
         *
         * @return string
         */
index f1f8af4..b2e5b00 100644 (file)
@@ -247,13 +247,11 @@ class LocalFile extends File {
        function loadFromCache() {
                global $wgMemc;
 
-               wfProfileIn( __METHOD__ );
                $this->dataLoaded = false;
                $this->extraDataLoaded = false;
                $key = $this->getCacheKey();
 
                if ( !$key ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -280,8 +278,6 @@ class LocalFile extends File {
                        wfIncrStats( 'image_cache_miss' );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $this->dataLoaded;
        }
 
@@ -382,9 +378,7 @@ class LocalFile extends File {
         * @param int $flags
         */
        function loadFromDB( $flags = 0 ) {
-               # Polymorphic function name to distinguish foreign and local fetches
                $fname = get_class( $this ) . '::' . __FUNCTION__;
-               wfProfileIn( $fname );
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->dataLoaded = true;
@@ -402,8 +396,6 @@ class LocalFile extends File {
                } else {
                        $this->fileExists = false;
                }
-
-               wfProfileOut( $fname );
        }
 
        /**
@@ -411,9 +403,7 @@ class LocalFile extends File {
         * This covers fields that are sometimes not cached.
         */
        protected function loadExtraFromDB() {
-               # Polymorphic function name to distinguish foreign and local fetches
                $fname = get_class( $this ) . '::' . __FUNCTION__;
-               wfProfileIn( $fname );
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->extraDataLoaded = true;
@@ -428,11 +418,8 @@ class LocalFile extends File {
                                $this->$name = $value;
                        }
                } else {
-                       wfProfileOut( $fname );
                        throw new MWException( "Could not find data for image '{$this->getName()}'." );
                }
-
-               wfProfileOut( $fname );
        }
 
        /**
@@ -587,7 +574,6 @@ class LocalFile extends File {
         * Fix assorted version-related problems with the image row by reloading it from the file
         */
        function upgradeRow() {
-               wfProfileIn( __METHOD__ );
 
                $this->lock(); // begin
 
@@ -597,7 +583,6 @@ class LocalFile extends File {
                if ( !$this->fileExists ) {
                        $this->unlock();
                        wfDebug( __METHOD__ . ": file does not exist, aborting\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -607,7 +592,6 @@ class LocalFile extends File {
 
                if ( wfReadOnly() ) {
                        $this->unlock();
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -633,7 +617,6 @@ class LocalFile extends File {
 
                $this->unlock(); // done
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -672,7 +655,7 @@ class LocalFile extends File {
        /** getURL inherited */
        /** getViewURL inherited */
        /** getPath inherited */
-       /** isVisible inhereted */
+       /** isVisible inherited */
 
        /**
         * @return bool
@@ -889,7 +872,6 @@ class LocalFile extends File {
         * @note This used to purge old thumbnails by default as well, but doesn't anymore.
         */
        function purgeCache( $options = array() ) {
-               wfProfileIn( __METHOD__ );
                // Refresh metadata cache
                $this->purgeMetadataCache();
 
@@ -898,7 +880,6 @@ class LocalFile extends File {
 
                // Purge squid cache for this file
                SquidUpdate::purge( array( $this->getURL() ) );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -907,7 +888,6 @@ class LocalFile extends File {
         */
        function purgeOldThumbnails( $archiveName ) {
                global $wgUseSquid;
-               wfProfileIn( __METHOD__ );
 
                // Get a list of old thumbnails and URLs
                $files = $this->getThumbnails( $archiveName );
@@ -927,7 +907,6 @@ class LocalFile extends File {
                        SquidUpdate::purge( $urls );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -936,7 +915,6 @@ class LocalFile extends File {
         */
        function purgeThumbnails( $options = array() ) {
                global $wgUseSquid;
-               wfProfileIn( __METHOD__ );
 
                // Delete thumbnails
                $files = $this->getThumbnails();
@@ -968,7 +946,6 @@ class LocalFile extends File {
                        SquidUpdate::purge( $urls );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -1146,7 +1123,6 @@ class LocalFile extends File {
                }
 
                if ( !$props ) {
-                       wfProfileIn( __METHOD__ . '-getProps' );
                        if ( $this->repo->isVirtualUrl( $srcPath )
                                || FileBackend::isStoragePath( $srcPath )
                        ) {
@@ -1154,7 +1130,6 @@ class LocalFile extends File {
                        } else {
                                $props = FSFile::getPropsFromPath( $srcPath );
                        }
-                       wfProfileOut( __METHOD__ . '-getProps' );
                }
 
                $options = array();
@@ -1236,7 +1211,6 @@ class LocalFile extends File {
        function recordUpload2( $oldver, $comment, $pageText, $props = false, $timestamp = false,
                $user = null
        ) {
-               wfProfileIn( __METHOD__ );
 
                if ( is_null( $user ) ) {
                        global $wgUser;
@@ -1247,9 +1221,7 @@ class LocalFile extends File {
                $dbw->begin( __METHOD__ );
 
                if ( !$props ) {
-                       wfProfileIn( __METHOD__ . '-getProps' );
                        $props = $this->repo->getFileProps( $this->getVirtualUrl() );
-                       wfProfileOut( __METHOD__ . '-getProps' );
                }
 
                # Imports or such might force a certain timestamp; otherwise we generate
@@ -1271,7 +1243,6 @@ class LocalFile extends File {
                if ( !$this->fileExists ) {
                        wfDebug( __METHOD__ . ": File " . $this->getRel() . " went missing!\n" );
                        $dbw->rollback( __METHOD__ );
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -1406,12 +1377,14 @@ class LocalFile extends File {
                        // Page exists, do RC entry now (otherwise we wait for later).
                        $logEntry->publish( $logId );
                }
-               wfProfileIn( __METHOD__ . '-edit' );
 
                if ( $exists ) {
                        # Create a null revision
                        $latest = $descTitle->getLatestRevID();
-                       $editSummary = LogFormatter::newFromEntry( $logEntry )->getPlainActionText();
+                       // Use own context to get the action text in content language
+                       $formatter = LogFormatter::newFromEntry( $logEntry );
+                       $formatter->setContext( RequestContext::newExtraneousContext( $descTitle ) );
+                       $editSummary = $formatter->getPlainActionText();
 
                        $nullRevision = Revision::newNullRevision(
                                $dbw,
@@ -1470,22 +1443,16 @@ class LocalFile extends File {
                        $dbw->commit( __METHOD__ ); // commit before anything bad can happen
                }
 
-               wfProfileOut( __METHOD__ . '-edit' );
-
                if ( $reupload ) {
                        # Delete old thumbnails
-                       wfProfileIn( __METHOD__ . '-purge' );
                        $this->purgeThumbnails();
-                       wfProfileOut( __METHOD__ . '-purge' );
 
                        # Remove the old file from the squid cache
                        SquidUpdate::purge( array( $this->getURL() ) );
                }
 
                # Hooks, hooks, the magic of hooks...
-               wfProfileIn( __METHOD__ . '-hooks' );
                Hooks::run( 'FileUpload', array( $this, $reupload, $descTitle->exists() ) );
-               wfProfileOut( __METHOD__ . '-hooks' );
 
                # Invalidate cache for all pages using this file
                $update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
@@ -1494,8 +1461,6 @@ class LocalFile extends File {
                        LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return true;
        }
 
@@ -1987,7 +1952,7 @@ class LocalFileDeleteBatch {
        /** @var array Items to be processed in the deletion batch */
        private $deletionBatch;
 
-       /** @var bool Wether to suppress all suppressable fields when deleting */
+       /** @var bool Whether to suppress all suppressable fields when deleting */
        private $suppress;
 
        /** @var FileRepoStatus */
@@ -2240,26 +2205,9 @@ class LocalFileDeleteBatch {
         * @return FileRepoStatus
         */
        function execute() {
-               wfProfileIn( __METHOD__ );
 
                $this->file->lock();
-               // Leave private files alone
-               $privateFiles = array();
-               list( $oldRels, ) = $this->getOldRels();
-               $dbw = $this->file->repo->getMasterDB();
-
-               if ( !empty( $oldRels ) ) {
-                       $res = $dbw->select( 'oldimage',
-                               array( 'oi_archive_name' ),
-                               array( 'oi_name' => $this->file->getName(),
-                                       'oi_archive_name' => array_keys( $oldRels ),
-                                       $dbw->bitAnd( 'oi_deleted', File::DELETED_FILE ) => File::DELETED_FILE ),
-                               __METHOD__ );
 
-                       foreach ( $res as $row ) {
-                               $privateFiles[$row->oi_archive_name] = 1;
-                       }
-               }
                // Prepare deletion batch
                $hashes = $this->getHashes();
                $this->deletionBatch = array();
@@ -2267,9 +2215,8 @@ class LocalFileDeleteBatch {
                $dotExt = $ext === '' ? '' : ".$ext";
 
                foreach ( $this->srcRels as $name => $srcRel ) {
-                       // Skip files that have no hash (missing source).
-                       // Keep private files where they are.
-                       if ( isset( $hashes[$name] ) && !array_key_exists( $name, $privateFiles ) ) {
+                       // Skip files that have no hash (e.g. missing DB record, or sha1 field and file source)
+                       if ( isset( $hashes[$name] ) ) {
                                $hash = $hashes[$name];
                                $key = $hash . $dotExt;
                                $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
@@ -2286,6 +2233,7 @@ class LocalFileDeleteBatch {
                $this->doDBInserts();
 
                // Removes non-existent file from the batch, so we don't get errors.
+               // This also handles files in the 'deleted' zone deleted via revision deletion.
                $checkStatus = $this->removeNonexistentFiles( $this->deletionBatch );
                if ( !$checkStatus->isGood() ) {
                        $this->status->merge( $checkStatus );
@@ -2305,7 +2253,6 @@ class LocalFileDeleteBatch {
                        // Roll back inserts, release lock and abort
                        // TODO: delete the defunct filearchive rows if we are using a non-transactional DB
                        $this->file->unlockAndRollback();
-                       wfProfileOut( __METHOD__ );
 
                        return $this->status;
                }
@@ -2315,7 +2262,6 @@ class LocalFileDeleteBatch {
 
                // Commit and return
                $this->file->unlock();
-               wfProfileOut( __METHOD__ );
 
                return $this->status;
        }
@@ -2368,7 +2314,7 @@ class LocalFileRestoreBatch {
        /** @var bool Add all revisions of the file */
        private $all;
 
-       /** @var bool Wether to remove all settings for suppressed fields */
+       /** @var bool Whether to remove all settings for suppressed fields */
        private $unsuppress = false;
 
        /**
index 710058f..73c614a 100644 (file)
@@ -175,7 +175,6 @@ class OldLocalFile extends LocalFile {
        }
 
        function loadFromDB( $flags = 0 ) {
-               wfProfileIn( __METHOD__ );
 
                $this->dataLoaded = true;
 
@@ -194,14 +193,12 @@ class OldLocalFile extends LocalFile {
                        $this->fileExists = false;
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
         * Load lazy file metadata from the DB
         */
        protected function loadExtraFromDB() {
-               wfProfileIn( __METHOD__ );
 
                $this->extraDataLoaded = true;
                $dbr = $this->repo->getSlaveDB();
@@ -226,11 +223,9 @@ class OldLocalFile extends LocalFile {
                                $this->$name = $value;
                        }
                } else {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Could not find data for image '{$this->archive_name}'." );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -260,13 +255,11 @@ class OldLocalFile extends LocalFile {
        }
 
        function upgradeRow() {
-               wfProfileIn( __METHOD__ );
                $this->loadFromFile();
 
                # Don't destroy file info of missing files
                if ( !$this->fileExists ) {
                        wfDebug( __METHOD__ . ": file does not exist, aborting\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -291,7 +284,6 @@ class OldLocalFile extends LocalFile {
                                'oi_archive_name' => $this->archive_name ),
                        __METHOD__
                );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index bb9a903..2a888a5 100644 (file)
@@ -120,7 +120,7 @@ abstract class ImageGalleryBase extends ContextSource {
                                'packed-overlay' => 'PackedOverlayImageGallery',
                        );
                        // Allow extensions to make a new gallery format.
-                       Hooks::run( 'GalleryGetModes', self::$modeMapping );
+                       Hooks::run( 'GalleryGetModes', array( &self::$modeMapping ) );
                }
        }
 
index 5f70362..e54f748 100644 (file)
@@ -20,28 +20,19 @@ class HTMLCheckField extends HTMLFormField {
                        $attr['class'] = $this->mClass;
                }
 
-               if ( $this->mParent->isVForm() ) {
-                       // Nest checkbox inside label.
-                       return Html::rawElement( 'label',
-                               array(
-                                       'class' => 'mw-ui-checkbox-label'
-                               ),
-                               Xml::check( $this->mName, $value, $attr ) . $this->mLabel );
-               } else {
-                       $chkLabel = Xml::check( $this->mName, $value, $attr )
-                       . '&#160;'
-                       . Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
-
-                       if ( $wgUseMediaWikiUIEverywhere ) {
-                               $chkLabel = Html::rawElement(
-                                       'div',
-                                       array( 'class' => 'mw-ui-checkbox' ),
-                                       $chkLabel
-                               );
-                       }
+               $chkLabel = Xml::check( $this->mName, $value, $attr )
+               . '&#160;'
+               . Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
 
-                       return $chkLabel;
+               if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
+                       $chkLabel = Html::rawElement(
+                               'div',
+                               array( 'class' => 'mw-ui-checkbox' ),
+                               $chkLabel
+                       );
                }
+
+               return $chkLabel;
        }
 
        /**
index 62345b8..908fdf2 100644 (file)
@@ -207,9 +207,40 @@ class HTMLForm extends ContextSource {
                'table',
                'div',
                'raw',
+       );
+
+       /**
+        * Available formats in which to display the form
+        * @var array
+        */
+       protected $availableSubclassDisplayFormats = array(
                'vform',
        );
 
+       /**
+        * Construct a HTMLForm object for given display type. May return a HTMLForm subclass.
+        *
+        * @throws MWException When the display format requested is not known
+        * @param string $displayFormat
+        * @param mixed $arguments... Additional arguments to pass to the constructor.
+        * @return HTMLForm
+        */
+       public static function factory( $displayFormat/*, $arguments...*/ ) {
+               $arguments = func_get_args();
+               array_shift( $arguments );
+
+               switch ( $displayFormat ) {
+                       case 'vform':
+                               $reflector = new ReflectionClass( 'VFormHTMLForm' );
+                               return $reflector->newInstanceArgs( $arguments );
+                       default:
+                               $reflector = new ReflectionClass( 'HTMLForm' );
+                               $form = $reflector->newInstanceArgs( $arguments );
+                               $form->setDisplayFormat( $displayFormat );
+                               return $form;
+               }
+       }
+
        /**
         * Build a new HTMLForm from an array of field attributes
         *
@@ -233,6 +264,11 @@ class HTMLForm extends ContextSource {
                        $this->mMessagePrefix = $context;
                }
 
+               // Evil hack for mobile :(
+               if ( !$this->getConfig()->get( 'HTMLFormAllowTableFormat' ) && $this->displayFormat === 'table' ) {
+                       $this->displayFormat = 'div';
+               }
+
                // Expand out into a tree.
                $loadedDescriptor = array();
                $this->mFlatFields = array();
@@ -246,15 +282,7 @@ class HTMLForm extends ContextSource {
                                $this->mUseMultipart = true;
                        }
 
-                       $field = self::loadInputFromParameters( $fieldname, $info );
-                       // FIXME During field's construct, the parent form isn't available!
-                       // could add a 'parent' name-value to $info, could add a third parameter.
-                       $field->mParent = $this;
-
-                       // vform gets too much space if empty labels generate HTML.
-                       if ( $this->isVForm() ) {
-                               $field->setShowEmptyLabel( false );
-                       }
+                       $field = static::loadInputFromParameters( $fieldname, $info, $this );
 
                        $setSection =& $loadedDescriptor;
                        if ( $section ) {
@@ -289,10 +317,24 @@ class HTMLForm extends ContextSource {
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setDisplayFormat( $format ) {
+               if (
+                       in_array( $format, $this->availableSubclassDisplayFormats ) ||
+                       in_array( $this->displayFormat, $this->availableSubclassDisplayFormats )
+               ) {
+                       throw new MWException( 'Cannot change display format after creation, ' .
+                               'use HTMLForm::factory() instead' );
+               }
+
                if ( !in_array( $format, $this->availableDisplayFormats ) ) {
                        throw new MWException( 'Display format must be one of ' .
                                print_r( $this->availableDisplayFormats, true ) );
                }
+
+               // Evil hack for mobile :(
+               if ( !$this->getConfig()->get( 'HTMLFormAllowTableFormat' ) && $format === 'table' ) {
+                       $format = 'div';
+               }
+
                $this->displayFormat = $format;
 
                return $this;
@@ -304,20 +346,17 @@ class HTMLForm extends ContextSource {
         * @return string
         */
        public function getDisplayFormat() {
-               $format = $this->displayFormat;
-               if ( !$this->getConfig()->get( 'HTMLFormAllowTableFormat' ) && $format === 'table' ) {
-                       $format = 'div';
-               }
-               return $format;
+               return $this->displayFormat;
        }
 
        /**
         * Test if displayFormat is 'vform'
         * @since 1.22
+        * @deprecated since 1.25
         * @return bool
         */
        public function isVForm() {
-               return $this->displayFormat === 'vform';
+               return false;
        }
 
        /**
@@ -340,7 +379,7 @@ class HTMLForm extends ContextSource {
                if ( isset( $descriptor['class'] ) ) {
                        $class = $descriptor['class'];
                } elseif ( isset( $descriptor['type'] ) ) {
-                       $class = self::$typeMappings[$descriptor['type']];
+                       $class = static::$typeMappings[$descriptor['type']];
                        $descriptor['class'] = $class;
                } else {
                        $class = null;
@@ -359,14 +398,18 @@ class HTMLForm extends ContextSource {
         *
         * @param string $fieldname Name of the field
         * @param array $descriptor Input Descriptor, as described above
+        * @param HTMLForm|null $parent Parent instance of HTMLForm
         *
         * @throws MWException
         * @return HTMLFormField Instance of a subclass of HTMLFormField
         */
-       public static function loadInputFromParameters( $fieldname, $descriptor ) {
-               $class = self::getClassFromDescriptor( $fieldname, $descriptor );
+       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+               $class = static::getClassFromDescriptor( $fieldname, $descriptor );
 
                $descriptor['fieldname'] = $fieldname;
+               if ( $parent ) {
+                       $descriptor['parent'] = $parent;
+               }
 
                # @todo This will throw a fatal error whenever someone try to use
                # 'class' to feed a CSS class instead of 'cssclass'. Would be
@@ -789,19 +832,6 @@ class HTMLForm extends ContextSource {
                # For good measure (it is the default)
                $this->getOutput()->preventClickjacking();
                $this->getOutput()->addModules( 'mediawiki.htmlform' );
-               if ( $this->isVForm() ) {
-                       // This is required for VForm HTMLForms that use that style regardless
-                       // of wgUseMediaWikiUIEverywhere (since they pre-date it).
-                       // When wgUseMediaWikiUIEverywhere is removed, this should be consolidated
-                       // with the addModuleStyles in SpecialPage->setHeaders.
-                       $this->getOutput()->addModuleStyles( array(
-                               'mediawiki.ui',
-                               'mediawiki.ui.button',
-                               'mediawiki.ui.input',
-                       ) );
-                       // @todo Should vertical form set setWrapperLegend( false )
-                       // to hide ugly fieldsets?
-               }
 
                $html = ''
                        . $this->getErrors( $submitResult )
@@ -817,18 +847,10 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Wrap the form innards in an actual "<form>" element
-        *
-        * @param string $html HTML contents to wrap.
-        *
-        * @return string Wrapped HTML.
+        * Get HTML attributes for the `<form>` tag.
+        * @return array
         */
-       function wrapForm( $html ) {
-
-               # Include a <fieldset> wrapper for style, if requested.
-               if ( $this->mWrapperLegend !== false ) {
-                       $html = Xml::fieldset( $this->mWrapperLegend, $html );
-               }
+       protected function getFormAttributes() {
                # Use multipart/form-data
                $encType = $this->mUseMultipart
                        ? 'multipart/form-data'
@@ -843,12 +865,23 @@ class HTMLForm extends ContextSource {
                if ( !empty( $this->mId ) ) {
                        $attribs['id'] = $this->mId;
                }
+               return $attribs;
+       }
 
-               if ( $this->isVForm() ) {
-                       array_push( $attribs['class'], 'mw-ui-vform', 'mw-ui-container' );
+       /**
+        * Wrap the form innards in an actual "<form>" element
+        *
+        * @param string $html HTML contents to wrap.
+        *
+        * @return string Wrapped HTML.
+        */
+       function wrapForm( $html ) {
+               # Include a <fieldset> wrapper for style, if requested.
+               if ( $this->mWrapperLegend !== false ) {
+                       $html = Xml::fieldset( $this->mWrapperLegend, $html );
                }
 
-               return Html::rawElement( 'form', $attribs, $html );
+               return Html::rawElement( 'form', $this->getFormAttributes(), $html );
        }
 
        /**
@@ -904,21 +937,10 @@ class HTMLForm extends ContextSource {
 
                        $attribs['class'] = array( 'mw-htmlform-submit' );
 
-                       if ( $this->isVForm() || $useMediaWikiUIEverywhere ) {
+                       if ( $useMediaWikiUIEverywhere ) {
                                array_push( $attribs['class'], 'mw-ui-button', $this->mSubmitModifierClass );
                        }
 
-                       if ( $this->isVForm() ) {
-                               // mw-ui-block is necessary because the buttons aren't necessarily in an
-                               // immediate child div of the vform.
-                               // @todo Let client specify if the primary submit button is progressive or destructive
-                               array_push(
-                                       $attribs['class'],
-                                       'mw-ui-big',
-                                       'mw-ui-block'
-                               );
-                       }
-
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
                }
 
@@ -927,7 +949,8 @@ class HTMLForm extends ContextSource {
                                'input',
                                array(
                                        'type' => 'reset',
-                                       'value' => $this->msg( 'htmlform-reset' )->text()
+                                       'value' => $this->msg( 'htmlform-reset' )->text(),
+                                       'class' => ( $useMediaWikiUIEverywhere ? 'mw-ui-button' : null ),
                                )
                        ) . "\n";
                }
@@ -947,15 +970,9 @@ class HTMLForm extends ContextSource {
                                $attrs['id'] = $button['id'];
                        }
 
-                       if ( $this->isVForm() || $useMediaWikiUIEverywhere ) {
-                               if ( isset( $attrs['class'] ) ) {
-                                       $attrs['class'] .= ' mw-ui-button';
-                               } else {
-                                       $attrs['class'] = 'mw-ui-button';
-                               }
-                               if ( $this->isVForm() ) {
-                                       $attrs['class'] .= ' mw-ui-big mw-ui-block';
-                               }
+                       if ( $useMediaWikiUIEverywhere ) {
+                               $attrs['class'] = isset( $attrs['class'] ) ? (array)$attrs['class'] : array();
+                               $attrs['class'][] = 'mw-ui-button';
                        }
 
                        $buttons .= Html::element( 'input', $attrs ) . "\n";
@@ -964,13 +981,6 @@ class HTMLForm extends ContextSource {
                $html = Html::rawElement( 'span',
                        array( 'class' => 'mw-htmlform-submit-buttons' ), "\n$buttons" ) . "\n";
 
-               // Buttons are top-level form elements in table and div layouts,
-               // but vform wants all elements inside divs to get spaced-out block
-               // styling.
-               if ( $this->mShowSubmit && $this->isVForm() ) {
-                       $html = Html::rawElement( 'div', null, "\n$html" ) . "\n";
-               }
-
                return $html;
        }
 
@@ -1014,7 +1024,7 @@ class HTMLForm extends ContextSource {
         *
         * @return string HTML, a "<ul>" list of errors
         */
-       public static function formatErrors( $errors ) {
+       public function formatErrors( $errors ) {
                $errorstr = '';
 
                foreach ( $errors as $error ) {
@@ -1028,7 +1038,7 @@ class HTMLForm extends ContextSource {
                        $errorstr .= Html::rawElement(
                                'li',
                                array(),
-                               wfMessage( $msg, $error )->parse()
+                               $this->msg( $msg, $error )->parse()
                        );
                }
 
@@ -1283,20 +1293,8 @@ class HTMLForm extends ContextSource {
                $subsectionHtml = '';
                $hasLabel = false;
 
-               switch ( $displayFormat ) {
-                       case 'table':
-                               $getFieldHtmlMethod = 'getTableRow';
-                               break;
-                       case 'vform':
-                               // Close enough to a div.
-                               $getFieldHtmlMethod = 'getDiv';
-                               break;
-                       case 'div':
-                               $getFieldHtmlMethod = 'getDiv';
-                               break;
-                       default:
-                               $getFieldHtmlMethod = 'get' . ucfirst( $displayFormat );
-               }
+               // Conveniently, PHP method names are case-insensitive.
+               $getFieldHtmlMethod = $displayFormat == 'table' ? 'getTableRow' : ( 'get' . $displayFormat );
 
                foreach ( $fields as $key => $value ) {
                        if ( $value instanceof HTMLFormField ) {
@@ -1368,7 +1366,7 @@ class HTMLForm extends ContextSource {
                                $html = Html::rawElement( 'table',
                                                $attribs,
                                                Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
-                       } elseif ( $displayFormat === 'div' || $displayFormat === 'vform' ) {
+                       } else {
                                $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
                        }
                }
index 4cf2394..645b507 100644 (file)
@@ -13,6 +13,7 @@ abstract class HTMLFormField {
        protected $mLabel; # String label.  Set on construction
        protected $mID;
        protected $mClass = '';
+       protected $mVFormClass = '';
        protected $mHelpClass = false;
        protected $mDefault;
        protected $mOptions = false;
@@ -126,6 +127,7 @@ abstract class HTMLFormField {
         * @param array $alldata
         * @param array $params
         * @return bool
+        * @throws MWException
         */
        protected function isHiddenRecurse( array $alldata, array $params ) {
                $origParams = $params;
@@ -217,7 +219,7 @@ abstract class HTMLFormField {
                                default:
                                        throw new MWException( "Unknown operation" );
                        }
-               } catch ( MWException $ex ) {
+               } catch ( Exception $ex ) {
                        throw new MWException(
                                "Invalid hide-if specification for $this->mName: " .
                                $ex->getMessage() . " in " . var_export( $origParams, true ),
@@ -343,6 +345,10 @@ abstract class HTMLFormField {
        function __construct( $params ) {
                $this->mParams = $params;
 
+               if ( isset( $params['parent'] ) && $params['parent'] instanceof HTMLForm ) {
+                       $this->mParent = $params['parent'];
+               }
+
                # Generate the label from a message, if possible
                if ( isset( $params['label-message'] ) ) {
                        $msgInfo = $params['label-message'];
@@ -354,7 +360,7 @@ abstract class HTMLFormField {
                                $msgInfo = array();
                        }
 
-                       $this->mLabel = wfMessage( $msg, $msgInfo )->parse();
+                       $this->mLabel = $this->msg( $msg, $msgInfo )->parse();
                } elseif ( isset( $params['label'] ) ) {
                        if ( $params['label'] === '&#160;' ) {
                                // Apparently some things set &nbsp directly and in an odd format
@@ -507,10 +513,7 @@ abstract class HTMLFormField {
                        array( 'class' => $outerDivClass ) + $cellAttributes,
                        $inputHtml . "\n$errors"
                );
-               $divCssClasses = array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass );
-               if ( $this->mParent->isVForm() ) {
-                       $divCssClasses[] = 'mw-ui-vform-field';
-               }
+               $divCssClasses = array( "mw-htmlform-field-$fieldType", $this->mClass, $this->mVFormClass, $errorClass );
 
                $wrapperAttributes = array(
                        'class' => $divCssClasses,
@@ -549,6 +552,20 @@ abstract class HTMLFormField {
                return $html;
        }
 
+       /**
+        * Get the complete field for the input, including help text,
+        * labels, and whatever. Fall back from 'vform' to 'div' when not overridden.
+        *
+        * @since 1.25
+        * @param string $value The value to set the input to.
+        * @return string Complete HTML field.
+        */
+       public function getVForm( $value ) {
+               // Ewwww
+               $this->mVFormClass = ' mw-ui-vform-field';
+               return $this->getDiv( $value );
+       }
+
        /**
         * Generate help text HTML in table format
         * @since 1.20
index 5dadaf8..b06f10d 100644 (file)
@@ -96,8 +96,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        } else {
                                $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
                        }
-                       $field = HTMLForm::loadInputFromParameters( $name, $info );
-                       $field->mParent = $this->mParent;
+                       $field = HTMLForm::loadInputFromParameters( $name, $info, $this->mParent );
                        $fields[$fieldname] = $field;
                }
                return $fields;
@@ -263,17 +262,8 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        ? $this->mParams['format']
                        : $this->mParent->getDisplayFormat();
 
-               switch ( $displayFormat ) {
-                       case 'table':
-                               $getFieldHtmlMethod = 'getTableRow';
-                               break;
-                       case 'vform':
-                               // Close enough to a div.
-                               $getFieldHtmlMethod = 'getDiv';
-                               break;
-                       default:
-                               $getFieldHtmlMethod = 'get' . ucfirst( $displayFormat );
-               }
+               // Conveniently, PHP method names are case-insensitive.
+               $getFieldHtmlMethod = $displayFormat == 'table' ? 'getTableRow' : ( 'get' . $displayFormat );
 
                $html = '';
                $hidden = '';
@@ -310,8 +300,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
                                'cssclass' => 'mw-htmlform-cloner-delete-button',
                                'default' => $this->msg( $label )->text(),
-                       ) );
-                       $field->mParent = $this->mParent;
+                       ), $this->mParent );
                        $v = $field->getDefault();
 
                        if ( $displayFormat === 'table' ) {
@@ -338,7 +327,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                $html = Html::rawElement( 'table',
                                        $attribs,
                                        Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
-                       } elseif ( $displayFormat === 'div' || $displayFormat === 'vform' ) {
+                       } else {
                                $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
                        }
                }
@@ -383,8 +372,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
                        'cssclass' => 'mw-htmlform-cloner-create-button',
                        'default' => $this->msg( $label )->text(),
-               ) );
-               $field->mParent = $this->mParent;
+               ), $this->mParent );
                $html .= $field->getInputHTML( $field->getDefault() );
 
                return $html;
diff --git a/includes/htmlform/VFormHTMLForm.php b/includes/htmlform/VFormHTMLForm.php
new file mode 100644 (file)
index 0000000..7826a0c
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * HTML form generation and submission handling, vertical-form style.
+ *
+ * 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
+ */
+
+/**
+ * Compact stacked vertical format for forms.
+ */
+class VFormHTMLForm extends HTMLForm {
+       /**
+        * Wrapper and its legend are never generated in VForm mode.
+        * @var boolean
+        */
+       protected $mWrapperLegend = false;
+
+       /**
+        * Symbolic display format name.
+        * @var string
+        */
+       protected $displayFormat = 'vform';
+
+       public function isVForm() {
+               return true;
+       }
+
+       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+               $field = parent::loadInputFromParameters( $fieldname, $descriptor, $parent );
+               $field->setShowEmptyLabel( false );
+               return $field;
+       }
+
+       function getHTML( $submitResult ) {
+               // This is required for VForm HTMLForms that use that style regardless
+               // of wgUseMediaWikiUIEverywhere (since they pre-date it).
+               // When wgUseMediaWikiUIEverywhere is removed, this should be consolidated
+               // with the addModuleStyles in SpecialPage->setHeaders.
+               $this->getOutput()->addModuleStyles( array(
+                       'mediawiki.ui',
+                       'mediawiki.ui.button',
+                       'mediawiki.ui.input',
+                       'mediawiki.ui.checkbox',
+               ) );
+
+               return parent::getHTML( $submitResult );
+       }
+
+       protected function getFormAttributes() {
+               $attribs = parent::getFormAttributes();
+               array_push( $attribs['class'], 'mw-ui-vform', 'mw-ui-container' );
+               return $attribs;
+       }
+
+       function wrapForm( $html ) {
+               // Always discard $this->mWrapperLegend
+               return Html::rawElement( 'form', $this->getFormAttributes(), $html );
+       }
+
+       function getButtons() {
+               $buttons = '';
+
+               if ( $this->mShowSubmit ) {
+                       $attribs = array();
+
+                       if ( isset( $this->mSubmitID ) ) {
+                               $attribs['id'] = $this->mSubmitID;
+                       }
+
+                       if ( isset( $this->mSubmitName ) ) {
+                               $attribs['name'] = $this->mSubmitName;
+                       }
+
+                       if ( isset( $this->mSubmitTooltip ) ) {
+                               $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
+                       }
+
+                       $attribs['class'] = array(
+                               'mw-htmlform-submit',
+                               'mw-ui-button mw-ui-big mw-ui-block',
+                               $this->mSubmitModifierClass,
+                       );
+
+                       $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+               }
+
+               if ( $this->mShowReset ) {
+                       $buttons .= Html::element(
+                               'input',
+                               array(
+                                       'type' => 'reset',
+                                       'value' => $this->msg( 'htmlform-reset' )->text(),
+                                       'class' => 'mw-ui-button mw-ui-big mw-ui-block',
+                               )
+                       ) . "\n";
+               }
+
+               foreach ( $this->mButtons as $button ) {
+                       $attrs = array(
+                               'type' => 'submit',
+                               'name' => $button['name'],
+                               'value' => $button['value']
+                       );
+
+                       if ( $button['attribs'] ) {
+                               $attrs += $button['attribs'];
+                       }
+
+                       if ( isset( $button['id'] ) ) {
+                               $attrs['id'] = $button['id'];
+                       }
+
+                       $attrs['class'] = isset( $attrs['class'] ) ? (array)$attrs['class'] : array();
+                       $attrs['class'][] = 'mw-ui-button mw-ui-big mw-ui-block';
+
+                       $buttons .= Html::element( 'input', $attrs ) . "\n";
+               }
+
+               $html = Html::rawElement( 'div',
+                       array( 'class' => 'mw-htmlform-submit-buttons' ), "\n$buttons" ) . "\n";
+
+               return $html;
+       }
+}
index 31b93c8..f36bac1 100644 (file)
@@ -305,7 +305,7 @@ abstract class DatabaseInstaller {
                $up = DatabaseUpdater::newForDB( $this->db );
                try {
                        $up->doUpdates();
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        echo "\nAn error occurred:\n";
                        echo $e->getText();
                        $ret = false;
index ea1213c..b676f45 100644 (file)
@@ -612,7 +612,7 @@ abstract class DatabaseUpdater {
         * Append a line to the open filehandle.  The line is assumed to
         * be a complete SQL statement.
         *
-        * This is used as a callback for for sourceLine().
+        * This is used as a callback for sourceLine().
         *
         * @param string $line Text to append to the file
         * @return bool False to skip actually executing the file
index 760254d..dc52554 100644 (file)
@@ -674,7 +674,6 @@ abstract class Installer {
                        'site_stats',
                        array(
                                'ss_row_id' => 1,
-                               'ss_total_views' => 0,
                                'ss_total_edits' => 0,
                                'ss_good_articles' => 0,
                                'ss_total_pages' => 0,
@@ -728,7 +727,7 @@ abstract class Installer {
                }
                $databases = array_flip( $databases );
                if ( !$databases ) {
-                       $this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
+                       $this->showError( 'config-no-db', $wgLang->commaList( $allNames ), count( $allNames ) );
 
                        // @todo FIXME: This only works for the web installer!
                        return false;
@@ -1378,7 +1377,7 @@ abstract class Installer {
 
                                try {
                                        $text = Http::get( $url . $file, array( 'timeout' => 3 ) );
-                               } catch ( MWException $e ) {
+                               } catch ( Exception $e ) {
                                        // Http::get throws with allow_url_fopen = false and no curl extension.
                                        $text = null;
                                }
@@ -1470,15 +1469,16 @@ abstract class Installer {
        }
 
        /**
-        * Returns a default value to be used for $wgDefaultSkin: the preferred skin, if available among
-        * the installed skins, or any other one otherwise.
+        * Returns a default value to be used for $wgDefaultSkin: normally the one set in DefaultSettings,
+        * but will fall back to another if the default skin is missing and some other one is present
+        * instead.
         *
         * @param string[] $skinNames Names of installed skins.
         * @return string
         */
        public function getDefaultSkin( array $skinNames ) {
                $defaultSkin = $GLOBALS['wgDefaultSkin'];
-               if ( in_array( $defaultSkin, $skinNames ) ) {
+               if ( !$skinNames || in_array( $defaultSkin, $skinNames ) ) {
                        return $defaultSkin;
                } else {
                        return $skinNames[0];
@@ -1754,7 +1754,7 @@ abstract class Installer {
                                false,
                                User::newFromName( 'MediaWiki default' )
                        );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        //using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
                }
index ed11f8b..5eef335 100644 (file)
@@ -42,6 +42,11 @@ class MssqlUpdater extends DatabaseUpdater {
 
                        // 1.24
                        array( 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql'),
+
+                       // 1.25
+                       array( 'dropTable', 'hitcounter' ),
+                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
+                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                        // Constraint updates
                        array( 'updateConstraints', 'category_types', 'categorylinks', 'cl_type' ),
                        array( 'updateConstraints', 'major_mime', 'filearchive', 'fa_major_mime' ),
index c3dedbc..7a36f01 100644 (file)
@@ -266,6 +266,11 @@ class MysqlUpdater extends DatabaseUpdater {
                                'patch-oi_major_mime-chemical.sql' ),
                        array( 'modifyField', 'filearchive', 'fa_major_mime',
                                'patch-fa_major_mime-chemical.sql' ),
+
+                       // 1.25
+                       array( 'dropTable', 'hitcounter' ),
+                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
+                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                );
        }
 
@@ -516,7 +521,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        page_namespace int NOT NULL,
                        page_title varchar(255) binary NOT NULL,
                        page_restrictions tinyblob NOT NULL,
-                       page_counter bigint(20) unsigned NOT NULL default '0',
                        page_is_redirect tinyint(1) unsigned NOT NULL default '0',
                        page_is_new tinyint(1) unsigned NOT NULL default '0',
                        page_random real unsigned NOT NULL,
@@ -598,9 +602,9 @@ class MysqlUpdater extends DatabaseUpdater {
                $this->output( "......Setting up page table.\n" );
                $this->db->query(
                        "INSERT INTO $page (page_id, page_namespace, page_title,
-                               page_restrictions, page_counter, page_is_redirect, page_is_new, page_random,
+                               page_restrictions, page_is_redirect, page_is_new, page_random,
                                page_touched, page_latest, page_len)
-                       SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter,
+                       SELECT cur_id, cur_namespace, cur_title, cur_restrictions,
                                cur_is_redirect, cur_is_new, cur_random, cur_touched, rev_id, LENGTH(cur_text)
                        FROM $cur,$revision
                        WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}",
index 1846854..03dbd1c 100644 (file)
@@ -103,6 +103,11 @@ class OracleUpdater extends DatabaseUpdater {
                        // 1.24
                        array( 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql' ),
 
+                       // 1.25
+                       array( 'dropTable', 'hitcounter' ),
+                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
+                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
+
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
 
@@ -172,7 +177,6 @@ class OracleUpdater extends DatabaseUpdater {
                        'page_id' => 0,
                        'page_namespace' => 0,
                        'page_title' => ' ',
-                       'page_counter' => 0,
                        'page_is_redirect' => 0,
                        'page_is_new' => 0,
                        'page_random' => 0,
index 9e8ee94..bc25455 100644 (file)
@@ -418,6 +418,11 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'pagelinks', 'pl_from_namespace', 'INTEGER NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'templatelinks', 'tl_from_namespace', 'INTEGER NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'imagelinks', 'il_from_namespace', 'INTEGER NOT NULL DEFAULT 0' ),
+
+                       // 1.25
+                       array( 'dropTable', 'hitcounter' ),
+                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
+                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                );
        }
 
index 91cbb04..81304c4 100644 (file)
@@ -137,6 +137,11 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ),
                        array( 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ),
                        array( 'addField', 'imagelinks', 'il_from_namespace', 'patch-il_from_namespace.sql' ),
+
+                       // 1.25
+                       array( 'dropTable', 'hitcounter' ),
+                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
+                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                );
        }
 
index 9ecb24b..038c2be 100644 (file)
@@ -1033,14 +1033,15 @@ class WebInstallerOptions extends WebInstallerPage {
                $skins = $this->parent->findExtensions( 'skins' );
                $skinHtml = $this->getFieldSetStart( 'config-skins' );
 
-               if ( $skins ) {
-                       $skinNames = array_map( 'strtolower', $skins );
+               $skinNames = array_map( 'strtolower', $skins );
+               $chosenSkinName = $this->getVar( 'wgDefaultSkin', $this->parent->getDefaultSkin( $skinNames ) );
 
+               if ( $skins ) {
                        $radioButtons = $this->parent->getRadioElements( array(
                                'var' => 'wgDefaultSkin',
                                'itemLabels' => array_fill_keys( $skinNames, 'config-skins-use-as-default' ),
                                'values' => $skinNames,
-                               'value' => $this->getVar( 'wgDefaultSkin', $this->parent->getDefaultSkin( $skinNames ) ),
+                               'value' => $chosenSkinName,
                        ) );
 
                        foreach ( $skins as $skin ) {
@@ -1055,7 +1056,9 @@ class WebInstallerOptions extends WebInstallerPage {
                                        '</div>';
                        }
                } else {
-                       $skinHtml .= $this->parent->getWarningBox( wfMessage( 'config-skins-missing' )->plain() );
+                       $skinHtml .=
+                               $this->parent->getWarningBox( wfMessage( 'config-skins-missing' )->plain() ) .
+                               Html::hidden( 'config_wgDefaultSkin', $chosenSkinName );
                }
 
                $skinHtml .= $this->parent->getHelpBox( 'config-skins-help' ) .
index 0ce76fa..3568258 100644 (file)
@@ -4,5 +4,8 @@
                        "Gazimagomedov"
                ]
        },
-       "config-page-options": "Рекъезаби"
+       "config-page-welcome": "ЛъикI щварал МедиаВикиялда!",
+       "config-page-name": "ЦӀар",
+       "config-page-options": "Рекъезаби",
+       "config-page-complete": "ЛъугӀана!"
 }
index 8688fe4..8fda8d4 100644 (file)
@@ -23,7 +23,7 @@
        "config-mysql-myisam": "MyISAM",
        "config-mysql-utf8": "UTF-8",
        "config-ns-generic": "Layihə",
-       "config-admin-name": "Sizin adınız:",
+       "config-admin-name": "Sizin istifadəçi adınız:",
        "config-admin-password": "Parol:",
        "config-admin-email": "E-poçt ünvanı",
        "config-license-pd": "İctimai istifadə",
index 0aeae7f..c131a78 100644 (file)
@@ -56,7 +56,7 @@
        "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі",
        "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведваемасьцю, раім пачытаць пра [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
        "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць зь Unicode.",
-       "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\nПадтрымліваюцца наступныя тыпы базаў зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба таксама ўсталяваць, напрыклад, пакунак <code>php5-mysql</code>.",
+       "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\n{{PLURAL:$2|Падтрымліваецца наступны тып базы|Падтрымліваюцца наступныя тыпы базаў}} зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба дадаткова ўсталяваць, напрыклад, пакунак <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Папярэджаньне''': усталяваны SQLite $1, у той час, калі мінімальная сумяшчальная вэрсія — $2. SQLite ня будзе даступны.",
        "config-no-fts3": "'''Папярэджаньне''': SQLite створаны без модуля [//sqlite.org/fts3.html FTS3], для гэтага ўнутранага інтэрфэйсу ня будзе даступная магчымасьць пошуку.",
        "config-register-globals-error": "<strong>Памылка: парамэтар PHP <code>[http://php.net/register_globals register_globals]</code> уключаны.\nЁн павінен быць адключаны, каб працягнуць усталяваньне.</strong>\nГлядзіце [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] дзеля дапамогі, як зрабіць гэта.",
index 1301e92..51fe74f 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "DCLXVI",
                        "아라",
-                       "StanProg"
+                       "StanProg",
+                       "Vodnokon4e"
                ]
        },
        "config-desc": "Инсталатор на МедияУики",
        "config-env-good": "Средата беше проверена.\nИнсталирането на МедияУики е възможно.",
        "config-env-bad": "Средата беше проверена.\nНе е възможна инсталация на МедияУики.",
        "config-env-php": "Инсталирана е версия на PHP $1.",
+       "config-env-hhvm": "HHVM $1 е инсталиран.",
        "config-unicode-using-utf8": "Използване на utf8_normalize.so от Brion Vibber за нормализация на Уникод.",
        "config-unicode-using-intl": "Използване на разширението [http://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
        "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
        "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.",
-       "config-no-db": "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82 Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89 Ð´Ñ\80айвеÑ\80 Ð·Ð° Ð±Ð°Ð·Ð° Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸! Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ñ\81е Ð¸Ð½Ñ\81Ñ\82алиÑ\80а Ð´Ñ\80айвеÑ\80 Ð·Ð° Ð±Ð°Ð·Ð° Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° PHP.\nÐ\9fоддÑ\8aÑ\80жаÑ\82 Ñ\81е Ñ\81ледниÑ\82е Ñ\82ипове Ð±Ð°Ð·Ð½Ð¸ Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸: $1.\n\nÐ\90ко Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82е Ñ\81поделен Ñ\85оÑ\81Ñ\82инг, Ð¿Ð¾Ð¼Ð¾Ð»ÐµÑ\82е Ð´Ð¾Ñ\81Ñ\82авÑ\87ика Ð½Ð° Ñ\83Ñ\81лÑ\83гаÑ\82а Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80а Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89 Ð´Ñ\80айвеÑ\80 Ð·Ð° Ð±Ð°Ð·Ð° Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸.\nÐ\90ко Ñ\81ами Ñ\81Ñ\82е ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸Ñ\80али PHP, Ð¿Ñ\80еконÑ\84игÑ\83Ñ\80иÑ\80айÑ\82е Ð³Ð¾ Ñ\81 Ð²ÐºÐ»Ñ\8eÑ\87ен ÐºÐ»Ð¸ÐµÐ½Ñ\82 Ð·Ð° Ð±Ð°Ð·Ð° Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸, Ð½Ð°Ð¿Ñ\80имеÑ\80 Ñ\87Ñ\80ез Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ðµ Ð½Ð° <code>./configure --with-mysql</code>.\nÐ\90ко Ñ\81Ñ\82е Ð¸Ð½Ñ\81Ñ\82алиÑ\80али PHP Ð¾Ñ\82 Ð¿Ð°ÐºÐµÑ\82 Ð·Ð° Debian Ð¸Ð»Ð¸ Ð£Ð±Ñ\83нÑ\82Ñ\83, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ, Ñ\81Ñ\8aÑ\89о Ñ\82ака, Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\82е Ð¸ Ð¼Ð¾Ð´Ñ\83ла php5-mysql.",
+       "config-no-db": "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82 Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89 Ð´Ñ\80айвеÑ\80 Ð·Ð° Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð½Ð¸! Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\82е Ð´Ñ\80айвеÑ\80 Ð·Ð° Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° PHP.\nÐ\9fоддÑ\8aÑ\80жаÑ\82 Ñ\81е Ñ\81ледниÑ\82е Ñ\82ипове Ð±Ð°Ð·Ð½Ð¸ Ð´Ð°Ð½Ð½Ð¸: $1.\n\nÐ\90ко Ñ\81ами Ñ\81Ñ\82е ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸Ñ\80али PHP, Ð¿Ñ\80еконÑ\84игÑ\83Ñ\80иÑ\80айÑ\82е Ð³Ð¾ Ñ\81 Ð²ÐºÐ»Ñ\8eÑ\87ен ÐºÐ»Ð¸ÐµÐ½Ñ\82 Ð·Ð° Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð½Ð¸, Ð½Ð°Ð¿Ñ\80имеÑ\80 Ñ\87Ñ\80ез Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ðµ Ð½Ð° <code>./configure --with-mysql</code>.\nÐ\90ко Ñ\81Ñ\82е Ð¸Ð½Ñ\81Ñ\82алиÑ\80али PHP Ð¾Ñ\82 Ð¿Ð°ÐºÐµÑ\82 Ð·Ð° Debian Ð¸Ð»Ð¸ Ubuntu, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ Ñ\81Ñ\8aÑ\89о Ñ\82ака Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\82е Ð¸ Ð¼Ð¾Ð´Ñ\83ла <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Предупреждение:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
        "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
        "config-magic-quotes-runtime": "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
        "config-license-gfdl": "Лиценз за свободна документация на GNU 1.3 или по-нов",
        "config-license-pd": "Обществено достояние",
        "config-license-cc-choose": "Избиране на друг лиценз от Криейтив Комънс",
-       "config-license-help": "Много публични уикита поставят всички приноси под [http://freedomdefined.org/Definition/Bg свободен лиценз].\nТова помага създаване на усещане за общност и насърчава дългосрочните приноси.\nТова не е необходимо за частни или корпоративни уикита.\n\nАко е необходимо да се използват текстове от Уикипедия, както и Уикипедия да може да използва текстове от уикито, необходимо е да се избере лиценз '''Криейтив Комънс Признание-Споделяне на споделеното'''.\n\nЛицензът за свободна документация на GNU е старият лиценз на съдържанието на Уикипедия.\nТой все още е валиден лиценз, но някои негови условия са трудни за разбиране и правят по-сложни повторното използване и интерпретацията.",
+       "config-license-help": "Много публични уикита поставят всички приноси под [http://freedomdefined.org/Definition/Bg свободен лиценз].\nТова помага за създаването на усещане за общност и насърчава дългосрочните приноси. \nТова не е необходимо като цяло за частно или корпоративно уики.\n\nАко искате да използвате текстове от Уикипедия, и искате Уикипедия да може да приема текстове, копирани от вашето уики, трябва да изберете лиценз <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nЛицензът за свободна документация на GNU е старият лиценз на съдържанието на Уикипедия.\nТой все още е валиден лиценз, но някои негови условия са трудни за разбиране и правят по-сложни повторното използване и интерпретацията.",
        "config-email-settings": "Настройки за е-поща",
        "config-enable-email": "Разрешаване на изходящи е-писма",
        "config-enable-email-help": "За да работят възможностите за използване на е-поща, необходимо е [http://www.php.net/manual/en/mail.configuration.php настройките за поща на PHP] да бъдат конфигурирани правилно.\nАко няма да се използват услугите за е-поща в уикито, те могат да бъдат изключени тук.",
        "config-extensions": "Разширения",
        "config-extensions-help": "Разширенията от списъка по-горе бяха открити в директорията <code>./extensions</code>.\n\nВъзможно е те да изискват допълнително конфигуриране, но сега могат да бъдат включени.",
        "config-skins": "Облици",
+       "config-skins-help": "По-горе са посочени облиците, които са открити във вашата директория <code>./skins</code>. Необходимо е да изберете поне един, който да се използва по подразбиране.",
        "config-skins-use-as-default": "Използване на този облик по подразбиране",
        "config-install-alreadydone": "'''Предупреждение:''' Изглежда вече сте инсталирали МедияУики и се опитвате да го инсталирате отново.\nПродължете към следващата страница.",
        "config-install-begin": "Инсталацията на МедияУики ще започне след натискане на бутона „{{int:config-continue}}“.\nВ случай, че е необходимо да се направят промени, използва се бутона „{{int:config-back}}“.",
diff --git a/includes/installer/i18n/bgn.json b/includes/installer/i18n/bgn.json
new file mode 100644 (file)
index 0000000..a3dde2e
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Baloch Afghanistan"
+               ]
+       },
+       "config-sidebar": "* [//www.mediawiki.org میڈیاویکی ئی بُنیادین تاکدیم]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents کار زوروکانی کومک و رهنمایی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents مدیر ئی رهنمایی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ رواجین سوج و سوالان]\n----\n* <doclink href=Readme>نا بووان</doclink>\n* <doclink href=ReleaseNotes>شینک بوته ئین یاداشتان</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
+       "config-env-good": "محیط بررسی بوته.\nشما ئه توانیت میڈیاویکی ئا نصب کنیت."
+}
index 212c599..0aecb70 100644 (file)
@@ -4,7 +4,8 @@
                        "Bellayet",
                        "Wikitanvir",
                        "Aftab1995",
-                       "Tauhid16"
+                       "Tauhid16",
+                       "Aftabuzzaman"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
@@ -46,7 +47,7 @@
        "config-db-name": "উপাত্তসংগ্রহশালা নামঃ",
        "config-db-install-account": "ইন্সটলের জন্য ব্যবহারকারী অ্যাকাউন্ট",
        "config-db-username": "ডেটাবেজের ব্যবহারকারী নাম:",
-       "config-db-password": "ডà§\87à¦\9fাবà§\87à¦\9cà§\87র à¦¶à¦¬à§\8dদà¦\9aাবি:",
+       "config-db-password": "ডà§\87à¦\9fাবà§\87à¦\9cà§\87র à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড:",
        "config-db-username-empty": "আপনাকে অবশ্যই \"{{int:config-db-username}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
        "config-db-wiki-account": "সাধারণ অভিযানের জন্য ব্যবহারকারী একাউন্ট",
        "config-db-prefix": "উপাত্তশালা ছক প্রিফিক্স:",
@@ -66,7 +67,7 @@
        "config-missing-db-name": "আপনাকে অবশ্যই \"{{int:config-db-name}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
        "config-missing-db-host": "আপনাকে অবশ্যই \"{{int:config-db-host}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
        "config-missing-db-server-oracle": "আপনাকে অবশ্যই \"{{int:config-db-host-oracle}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
-       "config-connection-error": "$1।\n\n\nদয়া à¦\95রà§\87 à¦ªà§\8dরসà§\8dতাবà¦\95ারà§\80, à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦® à¦\93 à¦¶à¦¬à§\8dদà¦\9aাবি দেখুন এবং পুনরায় চেষ্টা করুন।",
+       "config-connection-error": "$1।\n\n\nদয়া à¦\95রà§\87 à¦ªà§\8dরসà§\8dতাবà¦\95ারà§\80, à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦® à¦\93 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড দেখুন এবং পুনরায় চেষ্টা করুন।",
        "config-mysql-engine": "সংরক্ষণ ইঞ্জিন:",
        "config-mysql-innodb": "ইনোডিবি",
        "config-mysql-myisam": "মাইআইএসএএম",
        "config-ns-other-default": "মাইউইকি",
        "config-admin-box": "প্রশাসক অ্যাকাউন্ট",
        "config-admin-name": "আপনার ব্যবহারকারী নাম:",
-       "config-admin-password": "শবà§\8dদà¦\9aাবি:",
-       "config-admin-password-confirm": "শবà§\8dদà¦\9aাবি আবারও প্রবেশ করান:",
+       "config-admin-password": "পাসà¦\93য়ারà§\8dড:",
+       "config-admin-password-confirm": "পাসà¦\93য়ারà§\8dড আবারও প্রবেশ করান:",
        "config-admin-name-blank": "একটি প্রশাসক ব্যবহারকারী নাম প্রবেশ করান",
        "config-admin-password-blank": "প্রশাসক অ্যাকাউন্টের জন্য পাসওয়ার্ড প্রবেশ করান।",
-       "config-admin-password-mismatch": "à¦\86পনি à¦¯à§\87 à¦¦à§\81à¦\9fি à¦¶à¦¬à§\8dদà¦\9aাবি দিয়েছেন তারা পরস্পর মেলেনি।",
+       "config-admin-password-mismatch": "à¦\86পনি à¦¯à§\87 à¦¦à§\81à¦\9fি à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড দিয়েছেন তারা পরস্পর মেলেনি।",
        "config-admin-email": "ইমেইল ঠিকানা:",
        "config-optional-continue": "আরও প্রশ্ন জিজ্ঞেস করুন।",
        "config-optional-skip": "আমি ইতিমধ্যেই বিরক্ত হয়ে গেছি, উইকিটি ইন্সটল করো।",
index 28b14fa..668fbff 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "CERminator"
+                       "CERminator",
+                       "Palapa"
                ]
        },
        "config-desc": "Instalacija za MediaWiki",
@@ -9,6 +10,7 @@
        "config-information": "Informacija",
        "config-localsettings-upgrade": "Otkrivena je datoteka <code>LocalSettings.php</code>.\nDa biste unaprijedili vaš softver, molimo vas upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.\nNaći ćete ga u <code>LocalSettings.php</code>.",
        "config-localsettings-key": "Ključ za nadgradnju:",
+       "config-localsettings-badkey": "Ključ koji ste dali je pogrešan.",
        "config-session-error": "Greška pri pokretanju sesije: $1",
        "config-no-session": "Vaši podaci sesije su izgubljeni!\nProvjerite vaš php.ini i provjerite da li je <code>session.save_path</code> postavljen na pravilni direktorijum.",
        "config-your-language": "Vaš jezik:",
        "config-page-releasenotes": "Bilješke izdanja",
        "config-page-copying": "Kopiram",
        "config-page-upgradedoc": "Nadograđujem",
+       "config-page-existingwiki": "Postojeća wiki",
        "config-help-restart": "Da li želite očistiti sve spremljene podatke koje ste unijeli i da započnete ponovo proces instalacije?",
        "config-restart": "Da, pokreni ponovo",
        "config-sidebar": "* [//www.mediawiki.org MediaWiki Početna strana]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ NPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Napomene izdanja</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Poboljšavanje</doclink>",
        "config-env-good": "Okruženje je provjereno.\nMožete instalirati MediaWiki.",
        "config-env-php": "PHP $1 je instaliran.",
-       "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSlijedeće vrste baza podataka su podržane: $1.\n\nAko se na dijeljenom serveru, tražite od vašeg pružaoca usluga da instalira pogodan driver za bazu podataka.\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer <code>./configure --with-mysql</code>.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, možda morate instalirati i modul php5-mysql.",
+       "config-env-hhvm": "HHVM $1 je instaliran.",
+       "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSljedeće vrste baza podataka su podržane: $1.\n\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer, <code>./configure --with-mysqli</code>.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, tada morate instalirati, naprimjer, i paket <code>php5-mysql</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instaliran",
        "config-apc": "[http://www.php.net/apc APC] je instaliran",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran",
        "config-db-wiki-settings": "Identificiraj ovu wiki",
        "config-db-name": "Naziv baze podataka:",
        "config-db-name-oracle": "Šema baze podataka:",
+       "config-db-username": "Korisničko ime baze podataka:",
+       "config-db-password": "Pasvord baze podataka:",
+       "config-db-port": "Port baze podataka:",
        "config-header-mysql": "Postavke MySQL",
        "config-header-postgres": "Postavke PostgreSQL",
        "config-header-sqlite": "Postavke SQLite",
        "config-header-oracle": "Postavke Oracle",
+       "config-header-mssql": "Postavke za Microsoft SQL Server",
        "config-invalid-db-type": "Nevaljana vrsta baze podataka",
+       "config-missing-db-name": "Morate unijeti vrijednost za \"{{int:config-db-name}}\".",
        "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti vašu wiki].\n\nAko želite regenerisati vašu datoteku <code>LocalSettings.php</code>, kliknite na dugme ispod.\nOvo '''nije preporučeno''' osim ako nemate problema s vašom wiki.",
-       "config-admin-name": "Vaše ime:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-binary": "Binarni",
+       "config-site-name": "Ime wiki:",
+       "config-ns-other-default": "MyWiki",
+       "config-admin-name": "Vaše korisničko ime:",
        "config-admin-password": "Šifra:",
+       "config-admin-password-confirm": "Ponovno unesite pasvord:",
+       "config-admin-email": "E-mail adresa:",
+       "config-profile-wiki": "Otvori wiki",
+       "config-profile-private": "Privatna wiki",
+       "config-license-pd": "Javno vlasništvo",
+       "config-logo": "Logo URL:",
+       "config-cc-again": "Odaberi ponovno...",
+       "config-install-step-done": "završeno",
+       "config-install-step-failed": "neuspješno",
+       "config-install-extensions": "Uključujući ekstenzije",
+       "config-install-tables": "Kreiranje tabela",
+       "config-help": "pomoć",
+       "config-help-tooltip": "klikni za proširenje",
        "mainpagetext": "'''MediaViki softver is uspješno instaliran.'''",
        "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
 }
index 2b8a08e..d41924c 100644 (file)
@@ -6,7 +6,9 @@
                        "Kippelboy",
                        "Toniher",
                        "Fitoschido",
-                       "Jmarchn"
+                       "Jmarchn",
+                       "Alvaro Vidal-Abarca",
+                       "ESM"
                ]
        },
        "config-desc": "L'instal·lador del MediaWiki",
        "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
        "config-env-php": "El PHP $1 està instal·lat.",
        "config-env-hhvm": "L’HHVM $1 és instal·lat.",
+       "config-unicode-using-utf8": "Utilitzant la utf8_normalise.so d'en Brion Vibber per a la normalització de l'Unicode.",
        "config-memory-raised": "El <code>memory_limit</code> del PHP és $1 i s'ha aixecat a $2.",
        "config-memory-bad": "<strong>Avís:</strong> El <code>memory_limit</code> del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] està instal·lat",
        "config-apc": "L’[http://www.php.net/apc APC] està instal·lat",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] està instal·lat",
        "config-diff3-bad": "No s'ha trobat el GNU diff3.",
        "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
        "config-git-bad": "No s'ha trobat el programari de control de versions Git.",
        "config-db-install-account": "Compte d'usuari per a la instal·lació",
        "config-db-username": "Nom d'usuari de la base de dades:",
        "config-db-password": "Contrasenya de la base de dades:",
+       "config-db-password-empty": "Si us plau, introduïu una contrasenya pel nou usuari de la base de dades $1. Tot i que es poden crear usuaris sense contrasenyes, no és segur.",
        "config-db-username-empty": "Heu d'introduir un valor per a «{{int:config-db-username}}»",
+       "config-db-install-username": "Introduïu el nom d'usuari que s'utilitzarà per connectar a la base de dades durant el procés d'instal·lació. Aquest no és el nom d'usuari de MediaWiki, és el nom d'usuari de la vostra base de dades.",
+       "config-db-install-password": "Introduïu la contrasenya que s'utilitzarà per connectar a la base de dades durant el procés d'instal·lació. Aquesta no és la contrasenya del vostre compte a MediaWiki, és la contrasenya de la vostra base de dades.",
+       "config-db-install-help": "Introduïu el nom d'usuari i la contrasenya que s'empraran per connectar a la base de dades durant el procés d'instal·lació.",
        "config-db-account-lock": "Utilitzeu el mateix nom d'usuari i contrasenya durant una operació normal",
        "config-db-wiki-account": "Compte d'usuari per al funcionament normal",
        "config-db-wiki-help": "Introduïu el nom d'usuari i la contrasenya que s'utilitzarà per connectar-se a la base de dades durant l'operació normal del wiki.\nSi el compte no existeix, i el compte d'instal·lació té prou privilegis, es crearà aquest compte d'usuari amb els privilegis mínims necessaris per operar el wiki.",
@@ -82,6 +91,7 @@
        "config-db-charset": "Joc de caràcters de la base de dades",
        "config-charset-mysql5-binary": "Binari de MySQL 4.1/5.0",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 compatible cap enrere amb UTF-8",
        "config-mysql-old": "Cal el MySQL $1 o posterior. Teniu el $2.",
        "config-db-port": "Port de la base de dades:",
        "config-db-schema": "Esquema per a MediaWiki:",
        "config-oracle-temp-ts": "Espai de taules temporal:",
        "config-type-mysql": "MySQL (o compatible)",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki és compatible amb els següents sistemes de bases de dades:\n$1\nSi el sistema de bases de dades que intenteu utilitzar no apareix a la llista, seguiu les instruccions enllaçades més amunt per habilitar el suport.",
        "config-header-mysql": "Paràmetres de MySQL",
        "config-header-postgres": "Paràmetres del PostgreSQL",
        "config-header-sqlite": "Paràmetres de l'SQLite",
        "config-missing-db-name": "Heu d'introduir un valor per a «{{int:config-db-name}}».",
        "config-missing-db-host": "Heu d'introduir un valor per a «{{int:config-db-host}}».",
        "config-missing-db-server-oracle": "Heu d’introduir un valor per a «{{int:config-db-host-oracle}}».",
+       "config-connection-error": "$1.\n\nComproveu el servidor central, el nom d'usuari i la contrasenya i torneu-ho a provar.",
+       "config-db-sys-create-oracle": "L'instal·lador només accepta emprar un compte SYSDBA per a la creació d'un nou compte.",
        "config-db-sys-user-exists-oracle": "El compte d’usuari «$1» ja existeix. SYSDBA només es pot fer servir per crear comptes nous.",
+       "config-postgres-old": "Cal el PostgreSQL $1 o posterior. Teniu el $2.",
        "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
        "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
        "config-upgrade-done-no-regenerate": "S'ha completat l'actualització.\n\nJa podeu [$1 començar a utilitzar el wiki].",
        "config-upload-settings": "Imatges i càrregues de fitxers",
        "config-upload-enable": "Habilita la càrrega de fitxers",
        "config-upload-deleted": "Directori pels arxius suprimits:",
+       "config-upload-deleted-help": "Trieu un directori on arxivar els fitxers suprimits.\nIdealment no hauria de ser accessible des del web.",
        "config-logo": "URL del logo:",
        "config-instantcommons": "Habilita Instant Commons",
        "config-cc-error": "El selector de llicència Creative Commons no ha donat cap resultat.\nIntroduïu la llicència manualment.",
index 5ead1dc..ff7afaa 100644 (file)
@@ -7,6 +7,9 @@
                ]
        },
        "config-desc": "Y gosodwr ar gyfer MediaWiki",
+       "config-title": "Gosod MediaWiki $1",
+       "config-information": "Gwybodaeth",
+       "config-localsettings-upgrade": "Rydym wedi canfod ffeil <code>LocalSettings.php</code>.\nI uwchraddio'r gosodiad yma, rhowch fanylion y<code>$wgUpgradeKey</code> yn y blwch isod.\nFe'i cewch yn <code>LocalSettings.php</code>.",
        "mainpagetext": "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
        "mainpagedocfooter": "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.\n\n==Cychwyn arni==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]"
 }
index ab750a5..b0b2ebe 100644 (file)
@@ -64,7 +64,7 @@
        "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [http://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.",
        "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
        "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
-       "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\nDie folgenden Datenbanksysteme werden unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php5-mysql</code>-Paket installieren.",
+       "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\n{{PLURAL:$2|Das folgende Datenbanksystem wird|Die folgenden Datenbanksysteme werden}} unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php5-mysql</code>-Paket installieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
        "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
        "config-register-globals-error": "<strong>Fehler: Die PHP-Option <code>[http://php.net/register_globals register_globals]</code> ist aktiviert.\nSie muss deaktiviert sein, um mit der Installation fortzufahren.</strong>\nSiehe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] für Hilfe.",
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObzwar es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.",
+       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObwohl es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies nicht sicher.",
        "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
-       "config-support-info": "MediaWiki unterstützt die folgenden Datenbanksysteme:\n\n$1\n\nSofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt es oben einen Link zur Anleitung mit Informationen, wie dieses aktiviert werden kann.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] ist das von MediaWiki primär unterstützte Datenbanksystem. MediaWiki funktioniert auch mit [{{int:version-db-mariadb-url}} MariaDB] und [{{int:version-db-percona-url}} Percona Server], die MySQL-kompatibel sind. ([http://www.php.net/manual/en/mysqli.installation.php Anleitung zur Kompilierung von PHP mit MySQL-Unterstützung] [englische Sprache])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL. Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird. ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])",
-       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] ist eine gewerbliche Unternehmensdatenbank für Windows. ([http://www.php.net/manual/de/sqlsrv.installation.php Anleitung zur Kompilierung von PHP mithilfe SQLSRV-Unterstützung])",
+       "config-support-info": "MediaWiki unterstützt die folgenden Datenbanksysteme:\n\n$1\n\nSofern unterhalb nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, muss dieses noch verfügbar gemacht werden. Oben ist zu jedem unterstützten Datenbanksystem ein Link zur entsprechenden Anleitung vorhanden.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] ist das von MediaWiki primär unterstützte Datenbanksystem. MediaWiki funktioniert auch mit [{{int:version-db-mariadb-url}} MariaDB] und [{{int:version-db-percona-url}} Percona Server], die MySQL-kompatibel sind. ([https://www.php.net/manual/en/mysqli.installation.php Anleitung zur Kompilierung von PHP mit MySQL-Unterstützung])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL. Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird. ([https://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([https://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] ist eine kommerzielle Unternehmensdatenbank ([https://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] ist eine gewerbliche Unternehmensdatenbank für Windows. ([https://www.php.net/manual/de/sqlsrv.installation.php Anleitung zur Kompilierung von PHP mit SQLSRV-Unterstützung])",
        "config-header-mysql": "MySQL-Einstellungen",
        "config-header-postgres": "PostgreSQL-Einstellungen",
        "config-header-sqlite": "SQLite-Einstellungen",
index 843fe2f..2cc85ce 100644 (file)
@@ -42,7 +42,7 @@
        "config-ns-other": "Zewbi (keyfiyo)",
        "config-ns-other-default": "MyWiki",
        "config-admin-box": "Hesabê Administratori",
-       "config-admin-name": "Namey  karberdé to:",
+       "config-admin-name": "Nameyê şımayê karberi:",
        "config-admin-password": "Parola:",
        "config-admin-password-confirm": "Fına parola:",
        "config-admin-email": "Adresa e-postey:",
index 4857495..d6737a3 100644 (file)
@@ -49,7 +49,7 @@
        "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.",
        "config-unicode-pure-php-warning": "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-unicode-update-warning": "<strong>Warning:</strong> The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
-       "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database types are supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
+       "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database {{PLURAL:$2|type is|types are}} supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
        "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
        "config-register-globals-error": "<strong>Error: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nIt must be disabled to continue with the installation.</strong>\nSee [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for help on how to do so.",
        "config-db-sys-user-exists-oracle": "User account \"$1\" already exists. SYSDBA can only be used for creating of a new account!",
        "config-postgres-old": "PostgreSQL $1 or later is required. You have $2.",
        "config-mssql-old": "Microsoft SQL Server $1 or later is required. You have $2.",
-       "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data file name.",
+       "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data filename.",
        "config-sqlite-parent-unwritable-group": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer has determined the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory writable by it to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-sqlite-parent-unwritable-nogroup": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer could not determine the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Error creating the data directory \"$1\".\nCheck the location and try again.",
index 8fae026..4bf1268 100644 (file)
@@ -38,7 +38,7 @@
        "config-project-namespace": "Projekti nimeruum:",
        "config-ns-generic": "Projekt",
        "config-admin-box": "Administraatorikonto",
-       "config-admin-name": "Sinu nimi:",
+       "config-admin-name": "Sinu kasutajanimi:",
        "config-admin-password": "Parool:",
        "config-admin-password-confirm": "Parool uuesti:",
        "config-admin-name-blank": "Sisesta administraatori kasutajanimi.",
index 4b32743..baab24a 100644 (file)
@@ -30,6 +30,7 @@
        "config-restart": "Bai, berriz hasi",
        "config-sidebar": "* [//www.mediawiki.org MediaWiki nagusia]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Erabiltzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MEG]\n----\n* <doclink href=Readme>Irakur nazazu</doclink>\n* <doclink href=ReleaseNotes>Oharren argitalpena</doclink>\n* <doclink href=Copying>Kopiaketa</doclink>\n* <doclink href=UpgradeDoc>Eguneratzea</doclink>",
        "config-env-php": "PHP $1 instalatuta dago.",
+       "config-env-hhvm": "HHVM $1 instalatuta dago.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalatuta dago",
        "config-apc": "[http://www.php.net/apc APC] instalatuta dago",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago",
        "config-db-password": "Datu-base pasahitza:",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 bitarra",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-type-mysql": "MySQL",
+       "config-type-mysql": "MySQL (edo bateragarria)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MySQL hobespenak",
        "config-header-postgres": "PostgreSQL hobespenak",
        "config-header-sqlite": "SQLite hobespenak",
@@ -67,6 +69,7 @@
        "config-profile-wiki": "Wikia ireki",
        "config-profile-private": "Wiki pribatua",
        "config-license": "Copyright eta lizentzia:",
+       "config-license-cc-0": "Creative Commons Zero (Jabari Publikoa)",
        "config-license-pd": "Domeinu Askea",
        "config-email-settings": "E-posta hobespenak",
        "config-logo": "Logo URL:",
index e05cd25..ac60dea 100644 (file)
@@ -1,5 +1,24 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Hangmanwa7id"
+               ]
+       },
+       "config-your-language": "Ton langue:",
+       "config-page-name": "Nom",
+       "config-page-options": "Options",
+       "config-page-install": "Installer",
+       "config-page-complete": "Terminé!",
+       "config-sqlite-name-help": "Choisir un nom qui identifie ton wiki.\nFait user pas ni d'espaces ni des traits d'union\nIl va user pour fichier de données SQLite.",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-binary": "Binaire",
+       "config-mysql-utf8": "UTF-8",
+       "config-ns-generic": "Projet",
+       "config-ns-other-default": "MonWiki",
+       "config-admin-name": "Ton nom d'useur:",
+       "config-admin-password": "Mot de passe:",
+       "config-admin-email": "Adresse d'email:",
        "mainpagetext": "'''Vous avez bien installé MediaWiki.'''",
        "mainpagedocfooter": "Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.\n\n== Pour Commencer ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Réglage]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki: Questions Souvent Posées]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]"
 }
diff --git a/includes/installer/i18n/gor.json b/includes/installer/i18n/gor.json
new file mode 100644 (file)
index 0000000..b080848
--- /dev/null
@@ -0,0 +1,48 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Marwan Mohamad"
+               ]
+       },
+       "config-information": "habari",
+       "config-wiki-language": "bahasa wiki",
+       "config-back": "Mohalingo",
+       "config-continue": "Turusi",
+       "config-page-language": "Bahasa",
+       "config-page-dbconnect": "mohumbuto ode database",
+       "config-page-upgrade": "Popobohuwa umapilopohuli",
+       "config-page-dbsettings": "Aturu lo database",
+       "config-page-name": "Tanggulo",
+       "config-page-options": "Tulawotolo",
+       "config-page-install": "Mopohuli",
+       "config-page-complete": "Yilapato",
+       "config-page-restart": "Ulangiya instalasi",
+       "config-page-readme": "Pobacawa Wau",
+       "config-page-releasenotes": "Tuladu mopolopato",
+       "config-page-copying": "Mohemi",
+       "config-page-upgradedoc": "Mopobohu",
+       "config-page-existingwiki": "Wiki uwoluwo",
+       "config-help-restart": "Yio mohuto moluluta ngaamila data utahu-tahu ma pilopomaso wawu mopobohu upasi-pasi",
+       "config-restart": "Jo, potumula ulangi",
+       "config-env-good": "Yio mowali mopopasi MediaWiki",
+       "config-env-bad": "Yio dilamowali mopopasi MediaWiki",
+       "config-env-php": "PHP$1 mayilepasi",
+       "config-env-hhvm": "HHVM $1 mayilepasi",
+       "config-apc": "[http://www.php.net/apc APC] mayilepasi",
+       "config-diff3-bad": "GNU diff3 ja yilotapu",
+       "config-using-server": "Momake tanggulo server \"<nowiki>$1<nowiki>\"",
+       "config-using-uri": "Momake server URL \"<nowiki>$1$2</nowiki>\"",
+       "config-db-host": "Tiyombu lo basis data",
+       "config-db-host-oracle": "Basis data TNS",
+       "config-db-wiki-settings": "Lolohe wiki botiye",
+       "config-db-name": "Tanggulo basis data",
+       "config-db-name-oracle": "Skema lo basis data",
+       "config-db-username": "Basis data lo tanggulo user",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UFT-8",
+       "config-type-mysql": "MySQL (meyalo umopasiya)",
+       "config-header-mysql": "Aturangi lo MySQL",
+       "config-header-postgres": "Aturangi lo PostgreSQL",
+       "config-header-sqlite": "Aturangi lo SQLite",
+       "config-header-oracle": "Aturangi lo Oracle",
+       "config-header-mssql": "Aturangi lo Server Microsoft SQL"
+}
index dd14e63..3419089 100644 (file)
@@ -56,7 +56,7 @@
        "config-unicode-using-intl": "משתמש ב[http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד.",
        "config-unicode-pure-php-warning": "'''אזהרה''': [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.",
-       "config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\nנתמכים הסוגים הבאים של מסדי נתונים: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות <code dir=\"ltr\">./configure --with-mysqli</code>.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול <code dir=\"ltr\">php5-mysql</code>.",
+       "config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\n{{PLURAL:$2|נתמך הסוג הבא של מסד נתונים|נתמכים הסוגים הבאים של מסדי נתונים}}: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות <code dir=\"ltr\">./configure --with-mysqli</code>.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול <code dir=\"ltr\">php5-mysql</code>.",
        "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
        "config-no-fts3": "'''אזהרה''': SQLite מקומפל ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
        "config-register-globals-error": "<strong>שגיאה: האפשרות <code>[http://php.net/register_globals register_globals]</code> של PHP מופעלת.\nצריך לכבות אותה כדי להמשיך בהתקנה.</strong>\nר' [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] להסבר איך לעשות את זה.",
index 081f50f..5fe2e81 100644 (file)
@@ -9,7 +9,7 @@
                        "Revi"
                ]
        },
-       "config-desc": "미디어위키 설치 프로그램",
+       "config-desc": "미디어위키를 위한 설치 관리자",
        "config-title": "미디어위키 $1 설치",
        "config-information": "정보",
        "config-localsettings-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면, 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력하세요.\n<code>LocalSettings.php</code>에서 찾을 수 있습니다.",
        "config-db-schema-help": "보통 이 스키마는 문제가 없습니다.\n필요한 경우에만 바꾸세요.",
        "config-pg-test-error": "'''$1''' 데이터베이스에 연결할 수 없습니다: $2",
        "config-sqlite-dir": "SQLite 데이터 디렉터리:",
-       "config-sqlite-dir-help": "SQLite는 하나의 파일에 모든 데이터를 저장합니다.\n\n입력한 디렉토리는 설치하는 동안 웹 서버가 쓸 수 있어야 합니다.\n\n이 디렉토리는 웹을 통해 접근할 수 '''없어야''' 하는데, PHP 파일이 있는 곳에 넣을 수 없는 것은 이 때문입니다.\n\n설치 프로그램은 <code>.htaccess</code> 파일을 작성하지만, 이것이 실패하면 누군가가 원본 데이터베이스에 접근할 수 있습니다.\n데이터베이스는 원본 사용자 데이터(이메일 주소, 해시한 비밀번호)뿐만 아니라 삭제된 판과 위키의 다른 제한된 데이터를 포함합니다.\n\n예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
+       "config-sqlite-dir-help": "SQLite는 하나의 파일에 모든 데이터를 저장합니다.\n\n입력한 디렉토리는 설치하는 동안 웹 서버가 쓸 수 있어야 합니다.\n\n이 디렉토리는 웹을 통해 접근할 수 <strong>없어야</strong> 합니다. PHP 파일이 있는 곳에 넣을 수 없는 것은 이 때문입니다.\n\n설치 관리자는 <code>.htaccess</code> 파일을 작성하지만, 이것이 실패하면 누군가가 원본 데이터베이스에 접근할 수 있습니다.\n데이터베이스는 원본 사용자 데이터(이메일 주소, 해시한 비밀번호)뿐만 아니라 삭제된 판과 위키의 다른 제한된 데이터를 포함합니다.\n\n예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
        "config-oracle-def-ts": "기본 테이블공간:",
        "config-oracle-temp-ts": "임시 테이블공간:",
        "config-type-mysql": "MySQL (또는 호환되는 데이터베이스 시스템)",
        "config-invalid-db-prefix": "\"$1\" 데이터베이스 접두어가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-connection-error": "$1.\n\n호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.",
        "config-invalid-schema": "미디어위키 \"$1\"에 대한 스키마가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
-       "config-db-sys-create-oracle": "설치 프로그램은 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.",
+       "config-db-sys-create-oracle": "설치 관리자는 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.",
        "config-db-sys-user-exists-oracle": "\"$1\" 사용자 계정이 이미 존재합니다. SYSDBA는 새 계정을 만드는 데에만 사용할 수 있습니다!",
        "config-postgres-old": "PostgreSQL $1 이상이 필요하나 $2(이)가 있습니다.",
        "config-mssql-old": "Microsoft SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
        "config-sqlite-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이나 하이픈을 사용하지 마십시오.\nSQLite 데이터 파일 이름에 사용됩니다.",
-       "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버가 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 그 외 서버!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 관리자는 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버가 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 관리자는 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 그 외 서버!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "\"$1\" 데이터 디렉터리를 만드는 도중 오류가 발생했습니다.\n경로를 확인하고 다시 시도하세요.",
        "config-sqlite-dir-unwritable": "\"$1\" 디렉토리에 쓸 수 없습니다.\n웹 서버를 쓸 수 있도록 권한을 바꾸고 다시 시도하세요.",
        "config-sqlite-connection-error": "$1.\n\n호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.",
        "config-install-mainpage": "기본 내용으로 대문을 만드는 중",
        "config-install-extension-tables": "활성화된 확장 기능을 위한 테이블을 만드는 중",
        "config-install-mainpage-failed": "대문을 삽입할 수 없습니다: $1",
-       "config-install-done": "'''축하합니다!'''\n미디어위키가 성공적으로 설치되었습니다.\n\n설치 프로그램이 <code>LocalSettings.php</code> 파일을 만들었습니다.\n모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n'''참고:''' 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
+       "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>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> 다운로드",
        "config-help": "도움말",
        "config-help-tooltip": "확장하려면 클릭",
index 4aeba75..7d5fab7 100644 (file)
@@ -5,7 +5,8 @@
                        "Pizza1016",
                        "SNN95",
                        "MaxSem",
-                       "Aviator"
+                       "Aviator",
+                       "Macofe"
                ]
        },
        "config-desc": "Pemasang MediaWiki",
@@ -88,6 +89,7 @@
        "config-oracle-def-ts": "Ruang jadual lalai:",
        "config-oracle-temp-ts": "Ruang jadual sementara:",
        "config-type-mysql": "MySQL (atau yang serasi)",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "Keutamaan MySQL",
        "config-header-postgres": "Keutamaan PostgreSQL",
        "config-header-sqlite": "Keutamaan SQLite",
index c459010..b8a68a7 100644 (file)
@@ -41,7 +41,7 @@
        "config-help-restart": "Vulite scancellà tutt' 'e date astipate c'avite nzertato e riabbià 'o prucesso d'installazione?",
        "config-restart": "Sì, riabbìa",
        "config-welcome": "=== Cuntrollo 'e ll'ambiente ===\nSarranno eseguite 'e cuntrolle bbase pe' putè vedè si st'ambiente è adatto pe' ne ffà l'installazione 'e MediaWiki.\nArricurdateve d'includere sti nfurmaziune si spiate assistenza ncopp' 'a maniera 'e cumpletà l'installazione.",
-       "config-copyright": "=== Copyright e termine ===\n\n$1\n\nChistu programma è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nChistu programma è destribbuito c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICOLARE.\nIate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nCu stu programma avísseve 'a ricevere <doclink href=Copying>na copia d' 'a Licienza GNU GPL</doclink> cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html liggite sta paggena ncopp' 'a l'Internet].",
+       "config-copyright": "=== Copyright e termine ===\n\n$1\n\nChistu programma è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nChistu programma è destribbuito c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICULARE.\nIate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nCu stu programma avísseve 'a ricevere <doclink href=Copying>na copia d' 'a Licienza GNU GPL</doclink> cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html liggite sta paggena ncopp' 'a l'Internet].",
        "config-sidebar": "* [//www.mediawiki.org Paggina prencepale MediaWiki]\n* [//www.mediawiki.org/wiki/Aiuto:Guida a 'e cuntenute pe' l'utente]\n* [//www.mediawiki.org/wiki/Manuale:Guida a 'e cuntenute pe l'ammenistrature]\n* [//www.mediawiki.org/wiki/Manuale:FAQ FAQ]\n----\n* <doclink href=Readme>Lieggeme</doclink>\n* <doclink href=ReleaseNotes>Note 'e verziona</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Agghiurnamento</doclink>",
        "config-env-good": "L'ambiente è stato cuntrullato.\nÈ pussibbele installare MediaWiki.",
        "config-env-bad": "L'ambiente è stato cuntrullato.\nNun se può installà MediaWiki.",
@@ -51,7 +51,7 @@
        "config-unicode-using-intl": "Aúsa [http://pecl.php.net/intl l'estensione PECL intl] pe' ne fà 'a normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "<strong>Attenziò:</strong> L' [http://pecl.php.net/intl estensione intl PECL] nun è a disposizione pe' gestire 'a normalizzazione Unicode, accussì se ausasse n'imprementazziona llenta 'n puro PHP.\nSi state a gestire nu pizzo ad alto traffico, avisseve a lieggere cocche considerazione ncopp' 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzaziona Unicode].",
        "config-unicode-update-warning": "<strong>Attenziò:</strong> 'A verziona installata 'e normalizzazione Unicode aùsa 'a verziona viecchia d' 'o [http://site.icu-project.org/ pruggetto ICU].\nV'avite 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agghiurnà] si state a penzà ncopp' 'o fatto d'ausà Unicode.",
-       "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n'E furmatte 'e database ccà annanze songo suppurtate: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo <code>./configure --with-mysqli</code>.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto <code>php5-mysql</code>.",
+       "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n{{PLURAL:$2|'O furmatto suppurtato|'E furmatte suppurtate}} 'e database ccà annanze: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo <code>./configure --with-mysqli</code>.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenziò''': tenite 'o SQLite $1 pe' tramente ca ce vulesse 'a verziona $2, SQLite nun sarrà a disposizione.",
        "config-no-fts3": "'''Attenziò''': SQLite è cumpilato senza 'o [//sqlite.org/fts3.html modulo FTS3], 'e funziune 'e p'ascià dinto nun sarranno a disposizione ncopp'a stu backend.",
        "config-register-globals-error": "<strong>Errore: l'opzione PHP <code>[http://php.net/register_globals register_globals]</code> è apicciata.\nS'avesse 'a stutà pe' cuntinuà c' 'a installazione.</strong>\nVide [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pe' n'avé n'aiuto ncopp'a comme s'avess'a ffà.",
        "config-memory-bad": "<strong>Attenziò:</strong> 'o valore 'e PHP <code>memory_limit</code> è $1.\nProbabbilmente troppo basso.\n'A installazione se putesse scassà!",
        "config-ctype": "'''Errore''': 'o PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
        "config-iconv": "<strong>Fatale:</strong> PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].",
+       "config-json": "'''Errore:''' PHP è stato compilato senza 'o supporto pe' JSON. E' necessario installà l'estensione PHP pe' JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] apprimm' 'e installà MediaWiki.\n* L'estensione PHP sta dint'a Red Hat Enterprise Linux (CentOS) 5 e 6, ma s'avess'abbià 'n <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Cocche distribuzione 'e Linux pubblicata aropp'a majo 'e 2013 lèvano l'estensione PHP, e a pizzo sujo aúsano l'estensione PECL comme <code>php5-json</code> o <code>php-pecl-jsonc</code>",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
        "config-apc": "[http://www.php.net/apc APC] è installato",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato",
        "config-no-cache": "'''Attenziò:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
+       "config-mod-security": "<strong>Attenziò:</strong> 'O servitore web vuosto téne [http://modsecurity.org/ mod_security]/mod_security2 appicciato. Ce stanno tante mpustaziune commune ca 'o facessero causà prubbleme a MediaWiki e ll'ati software ca permettessero ll'utente 'e pubbrecà cuntenute.\nSi putite, stutate sta funziona. Sinò, riferite 'a [http://modsecurity.org/documentation/ documentaziona ncopp' 'o mod_security] o cuntattate 'o host vuosto pe' ve dà supporto quanno se scummogliasse cocch'errore.",
        "config-diff3-bad": "GNU diff3 nun truvato.",
        "config-git": "Truvato software 'e cuntrollo d' 'a verziona Git: <code>$1</code>.",
        "config-git-bad": "Software 'e cuntrollo d' 'a verziona Git nun truvato.",
        "config-gd": "Truvata 'a bibblioteca ntegrata GD Graphics.\n'E miniature 'e ll'immaggene sarranno prisente si l'upload se song'abbiàte.",
        "config-no-scaling": "Nun se può truvà 'a bibblioteca GD o ImageMagick.\n'E miniature 'e l'immaggene sarranno stutate.",
        "config-no-uri": "<strong>Errore:</strong> Nun se può determina l'URI 'e mmò.\nInstallazione spezzata.",
+       "config-no-cli-uri": "'''Attenziò''': <code>--scriptpath</code> nun specificato, s'aùsa 'o valore predefinito: <code>$1</code>.",
        "config-using-server": "Nomme d' 'o server ca se stà ausanno \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "URL d' 'o server ca se stà ausanno \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Attenziò:</strong> 'a cartella predefinita p' 'e carreche <code>$1</code> è vulnerabbele all'esecuzione arbitraria 'e script.\nPure si MediaWiki cuntrolla tutt' 'e file carrecate pe' rischio 'a sicurezza se raccumanna 'e [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security nchiure sta vulnerabbilità 'e sicurezza] apprimm'appiccià 'a funcione 'e carreche.",
+       "config-no-cli-uploads-check": "<strong>Attenziò:</strong> 'a cartella predefinita p' 'e carreche (<code>$1</code>) nun è stata cuntrullata p' 'a vulnerabbelità ncopp'a l'esecuzione arbitraria 'e script pe' tramente ca se fà l'installazione 'a linea 'e commando.",
        "config-brokenlibxml": "'O sistema vuosto ave na combinazione 'e verziune 'e PHP e libxml2 nguacchiata ca putesse scassà 'e date 'e MediaWiki 'n manera annascunnusa e pure l'ati apprecaziune p' 'o web.\nAgghiurnate a libxml2 2.7.3 o cchiù muderno ([https://bugs.php.net/bug.php?id=45996 'o bug studiato d' 'o lato PHP]).\nInstallaziona spezzata.",
+       "config-suhosin-max-value-length": "Suhosin è installato e miette lemmeto 'o parametro GET <code>length</code> a $1 byte.\n'O componente MediaWiki ResourceLoader funzionarrà aggirann'a stu lemmeto, ma luvanno prestaziune.\nSi pussibile, avit'a mpustà <code>suhosin.get.max_value_length</code> a 1024 o cchiù auto 'n <code>php.ini</code>, e mpustà <code>$wgResourceLoaderMaxQueryLength</code> a 'o stesso valore 'n <code>LocalSettings.php</code>.",
        "config-db-type": "Tipo 'e database:",
        "config-db-host": "Host d' 'o database:",
+       "config-db-host-help": "Si 'o server database vuosto stà mpizzato dint' 'a nu server differente, miette 'o nomme d' 'o host o l'indirizzo IP sujo.\n\nSi state ausanno nu servizio spartuto web hosting, 'aggenzia 'e hosting v'avess'a dà 'o nomme buono 'e nomme host dint' 'a documentaziona suoja.\n\nSi state installanno chisto dint'a nu server Windows cu MySQL, ausanno \"localhost\" può darse ca nun funziona p' 'o nomme server. Si chisto nun funziona, mettite \"127.0.0.1\" p' 'o ndirizzo locale vuosto.\n\nSi state ausanno PostgreSQL, lassate abbacante stu campo pe' v'accucchià cu nu socket Unix.",
        "config-db-host-oracle": "TNS d' 'o database:",
+       "config-db-host-oracle-help": "Mettite nu valido [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nomme 'e conessione lucale]; nu file \"tnsnames.ora\" adda essere vesibbele dint'a sta installazione.<br />Si state ausanno 'a libbreria cliente 10g o cchiù ricente putite pure ausà 'o metodo 'e denominazione [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifica stu wiki",
        "config-db-name": "Nomme d' 'o database:",
        "config-db-name-help": "Sciglite nu nomme ca identificasse 'a wiki vosta.\nNun avess'a cuntenè spazie.\n\nSi ausate nu web hosting spartuto, 'o furnitore d' 'o hosting v'avesse 'a specificà nu nomme 'e database specifico pe' ve permettere 'e crià database pe' bbìa 'e nu pannello 'e cuntrollo.",
        "config-db-name-oracle": "Schema d' 'o database:",
+       "config-db-account-oracle-warn": "Ce stanno tre scenarie suppurtate p' 'a installazione d'Oracle comme database 'e backend:\n\nSi vulite crià n'utenza 'e database comme parte d' 'o prucesso 'e installazione, dàte nu cunto c' 'o ruolo SYSDBA comme utenza d' 'o database pe ne fà installazione e specificate 'e credenziale vulute pe' ne fà l'utenza d'acciesso web, sinò è possibbele crià manualmente l'utenza d'accesso web e dà surtanto chillu cunto (si tenite autorizzaziune neccessarie pe' crià oggette 'e stu schema) po dà dduje utenze divierze, una ch' 'e permesse 'e criazione e n'ata pe ne putè trasì ô web.\n\n'O script p' 'a criazione 'e n'utenza cu tutte st'autorizzaziune neccessarie 'o putite truvà dint' 'a cartella \"maintenance/oracle\" 'e sta installazione. Tenite a mmente che l'uso 'e n'utenza cu sti restriziune stutarrà tutt' 'e funziune 'e manutenzione c' 'o cunto predefinito.",
        "config-db-install-account": "Cunto utente pe' l'installazione",
        "config-db-username": "Nomme utente p' 'o database:",
        "config-db-password": "Password d' 'o database:",
        "config-db-password-empty": "Avita nzertà na password pe' l'utente nuovo d' 'o database: $1.\nPure si fosse possibbele 'e crià ll'utente senza password chisto nun fosse sicuro.",
        "config-db-username-empty": "Avita miette nu valore p' 'o \"{{int:config-db-username}}\"",
+       "config-db-install-username": "Nzertate 'o nomme utente ca s'aussarrà pe' ve cullegà ô database pe' tramente ca se fà l'installazione. Chistu nun è 'o nomme utente d' 'o cunto MediaWiki; ma chillo p' 'o database vuosto.",
+       "config-db-install-password": "Nzertate 'a password che s'ausarrà pe' ve putè cullegà ô database pe' tramente ca se fa l'installazione.\nChista nun è 'a password d' 'o cunto 'e MediaWiki; ma chilla p' 'o database vuosto.",
+       "config-db-install-help": "Miette 'o nomme utente e 'a password ca sarrà usata quanno ve cullegate ô database pe' tramente ca facite 'a installazione.",
+       "config-db-account-lock": "Aúsa 'o stisso nomme utente e password pe' l'operazione normale.",
        "config-db-wiki-account": "Account utente p' 'o funzionamento nurmale",
+       "config-db-wiki-help": "Miette 'o nomme utente e 'a password ca sarrà ausata pe' se cullegà ô database pe' l'operazione normale d' 'o wiki. Si 'o cunto nun esiste, e 'o cunto e installazione téne diritte sufficiente, sarrà criato ch' 'e diritte minime necessarie pe' putè faticà ncopp' 'o wiki.",
        "config-db-prefix": "Prefisso d' 'a tavolozza d' 'o database:",
+       "config-db-prefix-help": "Si tenite abbesuogno 'e spartì nu database nfra cchiù wiki, o nfra MediaWiki e n'at'apprecazione web, putite scegliere d'azzeccà nu prefisso a tutte 'e nomme 'e tabbella, pe putè evità cunflitte.\nNun ausate abbacante.\n\n'O solito, stu campo se lassasse abbacante.",
        "config-db-charset": "Nzieme 'e carattere d' 'o database",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-oracle-temp-ts": "Tablespace temporaneo:",
        "config-type-mysql": "MySQL (o compatibbele)",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki supporta 'e sisteme 'e database ccà abbascio:\n\n$1\n\nSi nfra chiste ccà nun vedite 'o sistema 'e database ca vulite ausà, allora avite liegge 'e instruziune ccà ncoppa pe' ne dà supporto.",
        "config-header-mysql": "Mpustaziune MySQL",
        "config-header-postgres": "Mpustaziune PostgreSQL",
        "config-header-sqlite": "Mpustaziune SQLite",
        "config-missing-db-name": "Avita miette nu valore p' 'o \"{{int:config-db-name}}\"",
        "config-missing-db-host": "Avita miette nu valore p' 'o \"{{int:config-db-host}}\"",
        "config-missing-db-server-oracle": "Avita miette nu valore p' 'o \"{{int:config-db-host-oracle}}\"",
+       "config-connection-error": "$1.\n\nCuntrullate 'o host, nomme utente e password e tentate n'ata vota.",
+       "config-invalid-schema": "Schema MediaWiki \"$1\" nun è buono.\nAusate surtanto 'e lettere ASCII (a-z, A-Z), nummere (0-9) e carattere 'e sottolineatura (_).",
+       "config-db-sys-create-oracle": "'O prugramma 'e installazione supporta surtanto l'uso 'e nu cunto SYSDBA pe' putè crià nu cunto nuovo.",
+       "config-sqlite-readonly": "'O file <code>$1</code> nun è scrivibbele.",
+       "config-sqlite-cant-create-db": "Nun se può crià 'o file database <code>$1</code>.",
+       "config-sqlite-fts3-downgrade": "'O PHP è mancante d' 'o suppuorto FTS3, declassamento tabbelle 'n curzo",
+       "config-regenerate": "Rigennera LocalSettings.php →",
+       "config-show-table-status": "'A query <code>SHOW TABLE STATUS</code> è fallita!",
+       "config-unknown-collation": "<strong>Attenziò:</strong> 'O database sta ausanno reule 'e cunfronto nun ricanusciute.",
+       "config-db-web-account": "Account d' 'o database pe' ne fà acciesso web",
+       "config-db-web-help": "Scigliete 'o nomme utente e passwrod ca 'o web server ausarrà pe' se cullegà 'o server database, pe' tramente ca se fa' operazione normale d' 'o wiki.",
+       "config-db-web-account-same": "Aúsa 'o stisso cunto comme quanno s'è fatta 'a installazione",
+       "config-db-web-create": "Crìa 'o cunto si nun esiste ancora",
+       "config-db-web-no-create-privs": "'O cunto ausato pe' ne fà l'installazione nun tene diritte necessarie pe' ne putè crià n'atu cunto.\n'O cunto zegnàto ccà adda esistere già.",
+       "config-mysql-engine": "Mutore d'astipo:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Nzieme 'e carattere d' 'o database:",
+       "config-mysql-binary": "Binario",
+       "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Tipo d'autenticazione:",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
        "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d' 'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
+       "config-mssql-sqlauth": "Autenticazione 'e SQL Server",
+       "config-mssql-windowsauth": "Autenticazione 'e Windows",
+       "config-site-name": "Nomme d' 'o wiki:",
+       "config-site-name-help": "Chisto cumparerrà dint' 'a barra d' 'o titolo d' 'o navigatore e pure dint'a n'ati pizze.",
+       "config-site-name-blank": "Scrive 'o nomme d' 'o sito.",
+       "config-project-namespace": "Namespace d' 'o pruggetto:",
+       "config-ns-generic": "Pruggetto",
        "config-install-updates": "Mpiccià ll'agghiurnamiente ca nun fossero necessarie"
 }
index bc8caed..5cf71c4 100644 (file)
@@ -68,7 +68,7 @@
        "config-unicode-using-intl": "Korzystanie z [http://pecl.php.net/intl rozszerzenia intl PECL] do normalizacji Unicode.",
        "config-unicode-pure-php-warning": "'''Uwaga!''' [http://pecl.php.net/intl Rozszerzenie intl PECL] do obsługi normalizacji Unicode nie jest dostępne. Użyta zostanie mało wydajna zwykła implementacja w PHP.\nJeśli prowadzisz stronę o dużym natężeniu ruchu, powinieneś zapoznać się z informacjami o [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizacji Unicode].",
        "config-unicode-update-warning": "'''Uwaga''' – zainstalowana wersja normalizacji Unicode korzysta z nieaktualnej biblioteki [http://site.icu-project.org/ projektu ICU].\nPowinieneś [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations zrobić aktualizację] jeśli chcesz korzystać w pełni z Unicode.",
-       "config-no-db": "Nie można odnaleźć właściwego sterownika bazy danych! Musisz zainstalować sterownik bazy danych dla PHP.\nMożna użyć następujących typów baz danych: $1.\n\nJeśli skompilowałeś PHP samodzielnie, skonfiguruj je ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia <code>./configure --with-mysqli</code>.\nJeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować np. moduł <code>php5-mysql</code>.",
+       "config-no-db": "Nie można odnaleźć właściwego sterownika bazy danych! Musisz zainstalować sterownik bazy danych dla PHP.\nMożna użyć {{PLURAL:$2|następującego typu bazy|następujących typów baz} danych: $1.\n\nJeśli skompilowałeś PHP samodzielnie, skonfiguruj je ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia <code>./configure --with-mysqli</code>.\nJeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować np. moduł <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite  $1, która jest niższa od minimalnej wymaganej wersji  $2 . SQLite będzie niedostępne.",
        "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.",
        "config-register-globals-error": "<strong>Błąd: dyrektywa PHP <code>[http://php.net/register_globals register_globals]</code> jest włączona.\nAby kontynuować instalację musi zostać wyłączona.</strong>\nPrzeczytaj [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals], aby dowiedzieć się, jak to zrobić.",
index 835cf9b..b63905b 100644 (file)
@@ -64,7 +64,7 @@
        "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 [//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 [//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 ''(driver)'' apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. 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-mysql</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-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-mysql</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-magic-quotes-runtime": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
index 772ce96..3a9f267 100644 (file)
@@ -67,7 +67,7 @@
        "config-unicode-using-intl": "Status message in the MediaWiki installer environment checks.",
        "config-unicode-pure-php-warning": "PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.",
        "config-unicode-update-warning": "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
-       "config-no-db": "{{doc-important|Do not translate \"<code>./configure --with-mysqli</code>\" and \"<code>php5-mysql</code>\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.",
+       "config-no-db": "{{doc-important|Do not translate \"<code>./configure --with-mysqli</code>\" and \"<code>php5-mysql</code>\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.\n* $2 is the count of items in $1 - for use in plural.",
        "config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version",
        "config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
        "config-register-globals-error": "Error message in the MediaWiki installer environment checks.",
index 8220337..8b82db0 100644 (file)
        "config-page-copying": "Stoche a copie",
        "config-page-upgradedoc": "Aggiornamende",
        "config-page-existingwiki": "Uicchi esistende",
+       "config-restart": "Sìne, falle repartì",
+       "config-env-php": "PHP $1 ha state installate.",
+       "config-env-hhvm": "HHVM $1 ha state installate.",
        "config-db-type": "Tipe de database:",
+       "config-db-host-oracle": "Database TNS:",
+       "config-db-name-oracle": "Scheme d'u database:",
        "config-db-charset": "'Nzieme de carattere d'u database",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
        "config-db-port": "Porte d'u database:",
        "config-db-schema": "Scheme pe MediaUicchi:",
-       "config-type-mysql": "MySQL",
+       "config-type-mysql": "MySQL (o combatibbile)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-header-mysql": "'Mbostaziune de MySQL",
+       "config-header-postgres": "'Mbostaziune de PostgreSQL",
+       "config-header-sqlite": "'Mbostaziune de SQLite",
+       "config-header-oracle": "'Mbostaziune de Oracle",
+       "config-header-mssql": "'Mbostaziune de Microsoft SQL Server",
+       "config-invalid-db-type": "Tipe de database invalide.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-admin-email": "Indirizze e-mail:",
@@ -51,6 +63,7 @@
        "config-install-schema": "Stoche a creje 'u scheme",
        "config-install-pg-schema-not-exist": "'U scheme PostgreSQL non g'esiste.",
        "config-help": "ajute",
+       "config-help-tooltip": "cazze pe spannere",
        "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''",
        "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
 }
index 7dd0baa..27b7b93 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Singhalawap",
                        "පසිඳු කාවින්ද",
-                       "Sahan.ssw"
+                       "Sahan.ssw",
+                       "Thirsty"
                ]
        },
        "config-desc": "මාධ්‍යවිකි සඳහා වූ ස්ථාපකය",
@@ -60,6 +61,7 @@
        "config-missing-db-name": "\"දත්ත සංචිත නාමය\" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ",
        "config-missing-db-host": "\"දත්ත සංචිත ධාරකය\" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ",
        "config-missing-db-server-oracle": "\"දත්ත සංචිත TNS\" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ",
+       "config-sqlite-name-help": "ඔබගේ විකිය හදුන්වාදෙන නමක් තෝරාගන්න. \nහිස්තැන් හෝ විරාම ලක්ෂණ ‍නොයොදන්න.\nමෙය SQLite දත්ත ගොනුනාමය සදහා යොදා ගනු ඇත.",
        "config-regenerate": "නැවත ජනිත කරන්න LocalSettings.php →",
        "config-db-web-account": "ජාල ප්‍රවේශනය සඳහා දත්ත සංචිත ගිණුම",
        "config-mysql-engine": "ආචයන එන්ජිම:",
index 8b4136e..e9b05cf 100644 (file)
@@ -7,7 +7,8 @@
                        "SiLveRLeaD",
                        "Trncmvsr",
                        "Sayginer",
-                       "Trockya"
+                       "Trockya",
+                       "Aşilleus"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
        "config-git": "Sürüm kontrol yazılımı Git bulundu: <code>$1</code>.",
        "config-git-bad": "Sürüm kontrol yazılımı Git bulunamadı.",
        "config-imagemagick": "ImageMagick bulundu: <code>$1</code>.\nEğer yüklemeleri etkinleştirirseniz, küçük resimler etkinleştirilecektir.",
+       "config-db-type": "Veritabanı tipi:",
        "config-db-host": "Veritabanı sunucusu:",
        "config-db-host-help": "Veritabanı sunucunuz farklı bir sunucu üzerinde ise, ana bilgisayar adını veya IP adresini buraya girin.\n\nPaylaşılan ağ barındırma hizmeti kullanıyorsanız, barındırma sağlayıcınız size doğru bir ana bilgisayar adını kendi belgelerinde vermiştir.\n\nEğer MySQL kullanan bir Windows sunucusuna yükleme yapıyorsanız, sunucu adı olarak \"localhost\" kullanırsanız çalışmayabilir. Çalışmazsa, yerel IP adresi için \"127.0.0.1\" deneyin.\n\nPostgreSQL kullanıyorsanız, bu alanı bir Unix soketi ile bağlanmak için boş bırakın.",
+       "config-db-host-oracle": "Veritabanı TNS:",
        "config-db-wiki-settings": "Bu wikiyi tanımla",
        "config-db-name": "Veritabanı adı:",
        "config-db-name-oracle": "Veritabanı şeması:",
index 923a80d..fd87b15 100644 (file)
        "config-desc": "Trình cài đặt MediaWiki",
        "config-title": "Cài đặt MediaWiki $1",
        "config-information": "Thông tin",
-       "config-localsettings-upgrade": "Một file <code>LocalSettings.php</code> đã được phát hiện.\nĐể nâng cấp cài đặt này, xin nhập giá trị của  <code>$wgUpgradeKey</code> trong hộp thoại bên dưới đây.\nBạn sẽ tìm thấy nó trong<code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "Một file <code>LocalSettings.php</code> đã được phát hiện.\nĐể nâng cấp cài đặt này, hãy chạy <code>update.php</code>",
+       "config-localsettings-upgrade": "Một tập tin <code>LocalSettings.php</code> đã được phát hiện.\nĐể nâng cấp bản cài đặt này, xin nhập giá trị của <code>$wgUpgradeKey</code> trong hộp thoại bên dưới đây.\nBạn sẽ tìm thấy nó trong <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Một tập tin <code>LocalSettings.php</code> đã được phát hiện.\nĐể nâng cấp bản cài đặt này, hãy chạy <code>update.php</code> thay thế.",
        "config-localsettings-key": "Chìa khóa nâng cấp:",
        "config-localsettings-badkey": "Bạn đã cung cấp một chìa khóa sai.",
-       "config-upgrade-key-missing": "Có một bản cài đặt của MediaWiki sẵn trước đó đã được phát hiện.\nĐể nâng cấp cài đặt này, hãy đặt dòng sau vào dưới của của <code>LocalSettings.php</code>:\n\n$1",
+       "config-upgrade-key-missing": "Một bản cài đặt MediaWiki sẵn đã được phát hiện.\nĐể nâng cấp bản cài đặt này, hãy thêm dòng sau vào cuối <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Tập tin <code>LocalSettings.php</code> đã tồn tại hình như không hoàn chỉnh.\nBiến $1 chưa được đặt.\nXin hãy thay đổi <code>LocalSettings.php</code> để đặt biến này, rồi bấm “{{int:Config-continue}}”.",
+       "config-localsettings-connection-error": "Đã xuất hiện lỗi khi kết nối với cơ sở dữ liệu dùng cấu hình trong <code>LocalSettings.php</code>. Xin hãy sửa lại cấu hình và thử lại.\n\n$1",
        "config-session-error": "Lỗi khi bắt đầu phiên làm việc: $1",
+       "config-session-expired": "Dữ liệu phiên làm việc của bạn dường như đã hết hạn. Các phiên làm việc được cấu hình để kéo dài $1. Để tăng thời gian này, đặt <code>session.gc_maxlifetime</code> trong php.ini, rồi khởi động lại quá trình cài đặt.",
+       "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng <code>session.save_path</code> đã được đặt thành một thư mục thích hợp.",
        "config-your-language": "Ngôn ngữ của bạn:",
        "config-your-language-help": "Chọn một ngôn ngữ để sử dụng trong quá trình cài đặt.",
        "config-wiki-language": "Ngôn ngữ wiki:",
        "config-page-copying": "Sao chép",
        "config-page-upgradedoc": "Nâng cấp",
        "config-page-existingwiki": "Wiki đã tồn tại",
+       "config-help-restart": "Bạn có muốn xóa tất cả dữ liệu được lưu mà bạn vừa nhập và khởi động lại quá trình cài đặt?",
        "config-restart": "Có, khởi động lại nó",
        "config-welcome": "=== Kiểm tra môi trường ===\nBây giờ sẽ kiểm tra sơ qua môi trường này có phù hợp cho việc cài đặt MediaWiki.\nHãy nhớ bao gồm thông tin này khi nào xin hỗ trợ hoàn thành việc cài đặt.",
+       "config-copyright": "=== Bản quyền và Điều khoản ===\n\n$1\n\nChương trình này là phần mềm tự do; bạn có thể phân phối lại và/hoặc chỉnh sửa nó dưới điều khoản của Giấy phép Công cộng GNU (GNU General Public License) do Quỹ Phần mềm Tự do (Free Software Foundation) xuất bản; hoặc phiên bản 2 của giấy phép đó, hoặc (tùy theo ý bạn) bất kỳ phiên bản nào sau này.\n\nChương trình này được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng <strong>không có bất kỳ bảo hành nào</strong>; không có thậm chí bảo hành bao hàm về <strong>khả năng thương mại</strong> hoặc <strong>sự thích hợp với một mục đích cụ thể</strong>.\nXem Giấy phép Công cộng GNU để biết thêm chi tiết.\n\nBạn phải nhận <doclink href=Copying>một bản sao của Giấy phép Công cộng GNU</doclink> đi kèm chương trình này; nếu không, hãy viết thư cho Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Hoa Kỳ, hoặc [http://www.gnu.org/copyleft/gpl.html đọc nó trên mạng].",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/Special:MyLanguage/MediaWiki Trang chủ MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Hướng dẫn sử dụng]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hướng dẫn quản lý]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Câu thường hỏi]\n----\n* <doclink href=Readme>Cần đọc trước</doclink>\n* <doclink href=ReleaseNotes>Ghi chú phát hành</doclink>\n* <doclink href=Copying>Sao chép</doclink>\n* <doclink href=UpgradeDoc>Nâng cấp</doclink>",
        "config-env-good": "Đã kiểm tra môi trường.\nBạn có thể cài đặt MediaWiki.",
        "config-env-bad": "Đã kiểm tra môi trường.\nBạn không thể cài đặt MediaWiki.",
        "config-env-php": "PHP $1 đã được cài đặt.",
        "config-env-hhvm": "HHVM $1 được cài đặt.",
        "config-unicode-using-utf8": "Đang sử dụng utf8_normalize.so của Brion Vibber để chuẩn hóa văn bản Unicode.",
        "config-unicode-using-intl": "Sẽ sử dụng [http://pecl.php.net/intl phần mở rộng PECL intl] để chuẩn hóa Unicode.",
+       "config-unicode-pure-php-warning": "<strong>Cảnh báo:</strong>  [http://pecl.php.net/intl intl PECL extension] không được phép xử lý Unicode chuẩn hóa, trả lại thực thi PHP-gốc chậm.\nNếu bạn chạy một site lưu lượng lớn, bạn phải để ý qua một chút trên  [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
+       "config-unicode-update-warning": "<strong>Cảnh báo:</strong> Phiên bản cài đặt của gói Unicode chuẩn hóa sử dụng một phiên bản cũ của thư viện [http://site.icu-project.org/ the ICU project].\nBạn phải [//www.mediawiki.org/wiki/Special:MyLanguage/nâng cấp Unicode_normalization_considerations] nếu bạn quan tâm đến việc sử dụng Unicode.",
+       "config-no-db": "Không tìm thấy một trình điều khiển cơ sở dữ liệu phù hợp! Bạn cần phải cài một trình điều khiển cơ sở dữ liệu cho PHP.\n{{PLURAL:$2|Loại|Các loại}} cơ sở dữ liệu sau đây được hỗ trợ: $1.\n\nNếu bạn đã biên dịch PHP lấy, cấu hình lại nó mà kích hoạt một trình khách cơ sở dữ liệu, ví dụ bằng lệnh <code>./configure --with-mysqli</code>.\nNếu bạn đã cài PHP từ một gói Debian hoặc Ubuntu, thì bạn cũng cần phải cài ví dụ gói <code>php5-mysql</code>.",
+       "config-outdated-sqlite": "<strong>Chú ý:</strong> Bạn có SQLite $1, phiên bản này thấp hơn phiên bản yêu câu tối thiểu $2. SQLite sẽ không có tác dụng.",
+       "config-no-fts3": "<strong>Chú ý:</strong> SQLite được biên dịch mà không có [//sqlite.org/fts3.html mô đun FTS3], nên các chức năng tìm kiếm sẽ bị vô hiệu trên hệ thống phía sau này.",
+       "config-register-globals-error": "<strong>Lỗi: Tùy chọn <code>[http://php.net/register_globals register_globals]</code> của PHP đã được kích hoạt.\nNó phải bị vô hiệu để tiếp tục quá trình cài đặt.</strong>\nXem [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] để biết cách thực hiện.",
+       "config-magic-quotes-gpc": "<strong>Sai lầm: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] đang hoạt động!</strong>\nTùy chọn này sẽ làm hỏng dữ liệu nhập một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
+       "config-magic-quotes-runtime": "<strong>Sai lầm: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] đang hoạt động!</strong>\nTùy chọn này sẽ làm hỏng dữ liệu nhập một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
+       "config-magic-quotes-sybase": "<strong>Sai lầm: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] đang hoạt động!</strong>\nTùy chọn này sẽ làm hỏng dữ liệu nhập một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
+       "config-mbstring": "<strong>Sai lầm: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] được kích hoạt!</strong>\nTùy chọn này gây lỗi và có thể làm hỏng dữ liệu một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
+       "config-safe-mode": "<strong>Cảnh báo:</strong> [http://www.php.net/features.safe-mode Chế độ an toàn] của PHP đang được kích hoạt.\nNó có thể gây vấn đề, nhất là nếu dùng các chức năng tải lên tập tin và <code>math</code>.",
+       "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nNếu bạn đang chạy Mandrake, hãy cài đặt gói php-xml.",
+       "config-pcre-old": "<strong>Sai lầm:</strong> PCRE $1 trở lên được yêu cầu phải có.\nBản nhị phân PHP của bạn dang được liên kết với PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Thông tin bổ sung].",
+       "config-pcre-no-utf8": "<strong>Sai lầm:</strong> Mô đun PCRE của PHP dường như được biên dịch mà không có hỗ trợ PCRE_UTF8.\nMediaWiki yêu cầu phải có hỗ trợ UTF-8 để hoạt động chính xác.",
+       "config-memory-raised": "<code>memory_limit</code> của PHP là $1, tăng lên $2.",
+       "config-memory-bad": "<strong>Cảnh báo:</strong> <code>memory_limit</code> của PHP là $1.\nGiá trị này có lẽ quá thấp.\nCài đặt có thể bị thất bại!",
+       "config-ctype": "<strong>Sai lầm:</strong> PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/ctype.installation.php phần mở rộng Ctype].",
+       "config-iconv": "<strong>Sai lầm:</strong> PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/iconv.installation.php phần mở rộng iconv].",
+       "config-json": "<strong>Sai lầm:</strong> PHP được biên dịch mà không có hỗ trợ cho JSON.\nBạn phải cài đặt hoặc phần mở rộng JSON PHP hoặc phần mở rộng [http://pecl.php.net/package/jsonc PECL jsonc] trước khi cài đặt MediaWiki.\n* Phần mở rộng PHP có sẵn trong Red Hat Enterprise Linux (CentOS) 5 và 6 nhưng phải được kích hoạt trong <code>/etc/php.ini</code> hoặc <code>/etc/php.d/json.ini</code>.\n* Một số phiên bản Linux được phát hành sau tháng 5 năm 2013 bỏ qua phần mở rộng PHP và gói lại phần mở rộng PECL là <code>php5-json</code> hoặc <code>php-pecl-jsonc</code> thay thế.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] đã được cài đặt",
        "config-apc": "[http://www.php.net/apc APC] đã được cài đặt",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] đã được cài đặt",
+       "config-no-cache": "<strong>Cảnh báo:</strong> Không tìm thấy [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] hoặc [http://www.iis.net/download/WinCacheForPhp WinCache].\nVùng nhớ đệm đối tượng không được kích hoạt.",
+       "config-mod-security": "<strong>Cảnh báo:</strong> [http://modsecurity.org/ mod_security]/mod_security2 đã được kích hoạt trên máy chủ Web của bạn. Nhiều cấu hình phổ biến của phần mềm này sẽ gây vấn đề cho MediaWiki và những phần mềm khác cho phép người dùng đăng các nội dung tùy tiện.\nNếu có thể, bạn nên vô hiệu nó. Còn không, tra cứu [http://modsecurity.org/documentation/ tài liệu mod_security] hoặc liên hệ với nhà cung cấp hỗ trợ cho máy chủ nếu bạn gặp những lỗi ngẫu nhiên nào đó.",
        "config-diff3-bad": "Không tìm thấy GNU diff3.",
        "config-git": "Đã tìm thấy phần mềm điều khiển phiên bản Git: <code>$1</code>.",
        "config-git-bad": "Không tìm thấy phần mềm điều khiển phiên bản Git.",
+       "config-imagemagick": "Đã tìm thấy ImageMagick: <code>$1</code>.\nChức năng thu nhỏ hình ảnh sẽ được kích hoạt nếu bạn cho phép tải lên.",
+       "config-gd": "Đã tìm thấy thư viện đồ họa GD đi kèm.\nChức năng thu nhỏ hình ảnh sẽ được kích hoạt nếu bạn cho phép tải lên.",
+       "config-no-scaling": "Không thể tìm thấy thư viện GD hoặc ImageMagic. Chức năng thu nhỏ hình ảnh sẽ bị vô hiệu.",
+       "config-no-uri": "<strong>Lỗi:</strong> Không thể xác định URI hiện tại. Cài đặt bị thất bại.",
+       "config-no-cli-uri": "<strong>Cảnh báo:</strong> Không có <code>--scriptpath</code> nào được xác định, nên sử dụng mặc định: <code>$1</code>.",
        "config-using-server": "Sẽ sử dụng tên máy chủ “<nowiki>$1</nowiki>”.",
        "config-using-uri": "Sẽ sử dụng URL máy chủ “<nowiki>$1$2</nowiki>”.",
+       "config-uploads-not-safe": "<strong>Cảnh báo:</strong> Thư mục tải lên mặc định của bạn, <code>$1</code>, đang có lỗ hỏng bảo mật, dễ bị khai thác bởi các đoạn mã thực thi xấu.\nMặc dù MediaWiki kiểm tra tất cả các tập tin tải lên để tránh nguy cơ bảo mật, chúng tôi đặc biệt khuyến cáo [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security đóng lỗ hỏng bảo mật này lại] trước khi kích hoạt tính năng tải lên.",
+       "config-no-cli-uploads-check": "<strong>Cảnh báo:</strong> Thư mục tải lên mặc định của bạn (<code>$1</code>) không được kiểm tra lỗ hỏng bảo mật dễ bị khai thác bởi các đoạn mã thực thi xấu trong quá trình cài đặt giao diện dòng lệnh.",
+       "config-brokenlibxml": "Hệ thống của bạn có kết hợp các phiên bản lỗi lầm của PHP và libxml2, điều này có thể gây ra tổn thương không nhìn thấy được đối với dữ liệu trong MediaWiki và các ứng dụng Web khác.\nHãy nâng cấp lên phiên bản libxml2 2.7.3 trở lên ([https://bugs.php.net/bug.php?id=45996 lỗi nộp PHP]).\nCài đặt bị hủy bỏ.",
+       "config-suhosin-max-value-length": "Suhosin được cài đặt và hạn chế tham số GET <code>length</code> (độ dài) không thể vượt quá $1 byte.\nThành phần ResourceLoader của MediaWiki sẽ khắc phục giới hạn này, nhưng điều này sẽ làm giảm hiệu suất.\nNếu có thể, bạn nên tăng <code>suhosin.get.max_value_length</code> lên 1024 trở lên trong <code>php.ini</code>, và đặt <code>$wgResourceLoaderMaxQueryLength</code> cùng giá trị trong <code>LocalSettings.php</code>.",
        "config-db-type": "Kiểu cơ sở dữ liệu:",
        "config-db-host": "Máy chủ của cơ sở dữ liệu:",
+       "config-db-host-help": "Nếu máy chủ cơ sở dữ liệu của bạn nằm trên máy chủ khác, hãy điền tên hoặc địa chỉ IP của máy chủ vào đây.\n\nNếu bạn đang dùng Web hosting chia sẻ, tài liệu của nhà cung cấp hosting của bạn sẽ có tên chính xác của máy chủ.\n\nNếu bạn đang cài đặt trên một máy chủ Windows và sử dụng MySQL, việc dùng “localhost” có thể không hợp với tên máy chủ. Nếu bị như vậy, hãy thử “127.0.0.1” tức địa chỉ IP địa phương.\n\nNếu bạn đang dùng PostgreSQL, hãy để trống mục này để kết nối với một ổ cắm Unix.",
        "config-db-host-oracle": "TNS cơ sở dữ liệu:",
+       "config-db-host-oracle-help": "Nhập một [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Tên Kết nối Địa phương] hợp lệ; một tập tin tnsnames.ora phải được hiển thị đối với cài đặt này.<br />Nếu bạn đang sử dụng các thư viện trình khách 10g trở lên, bạn cũng có thể sử dụng phương pháp đặt tên [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Dữ liệu để nhận ra wiki này",
        "config-db-name": "Tên cơ sở dữ liệu:",
+       "config-db-name-help": "Chọn một tên để chỉ thị wiki của bạn.\nKhông nên đưa dấu cách vào tên này.\n\nNếu bạn đang sử dụng Web hosting chia sẻ, nhà cung cấp hosting của bạn hoặc là sẽ cung cấp cho bạn một tên cơ sở dữ liệu cụ thể để sử dụng hoặc là sẽ cho phép bạn tạo ra các cơ sở dữ liệu thông qua một bảng điều khiển.",
        "config-db-name-oracle": "Giản đồ cơ sở dữ liệu:",
+       "config-db-account-oracle-warn": "Có ba trường hợp được hỗ trợ để cài đặt Oracle làm cơ sở dữ liệu phía sau:\n\nNếu bạn muốn tạo tài khoản cơ sở dữ liệu trong quá trình cài đặt, xin vui lòng cung cấp một tài khoản với vai trò SYSDBA là tài khoản cơ sở dữ liệu để cài đặt và xác định định danh mong muốn cho tài khoản truy cập Web, nếu không bạn có thể tạo tài khoản truy cập Web thủ công và chỉ cung cấp tài khoản đó (nếu nó có các quyền yêu cầu để tạo ra các đối tượng giản đồ) hoặc cung cấp hai tài khoản riêng, một có quyền tạo ra và một bị hạn chế có quyền truy cập Web.\n\nMột kịch bản để tạo một tài khoản với quyền yêu cầu có sẵn trong thư mục cài đặt “maintenance/oracle/”. Hãy nhớ rằng việc sử dụng một tài khoản bị hạn chế sẽ vô hiệu hóa tất cả các khả năng bảo trì với tài khoản mặc định.",
        "config-db-install-account": "Tài khoản người dùng để cài đặt",
        "config-db-username": "Tên người dùng cơ sở dữ liệu:",
        "config-db-password": "Mật khẩu cơ sở dữ liệu:",
+       "config-db-password-empty": "Xin nhập vào một mật khẩu cho người dùng cơ sở dữ liệu mới: $1. Tuy bạn có thể tạo một tài khoản người dùng mà không cần mật khẩu, nhưng khi đó sẽ không đảm bảo tính bảo mật cho bạn.",
        "config-db-username-empty": "Bạn phải nhập một giá trị cho “{{int:config-db-username}}”",
+       "config-db-install-username": "Nhập tên người dùng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nĐây không phải là tên người dùng của tài khoản MediaWiki; đây là tên người dùng cho cơ sở dữ liệu của bạn.",
+       "config-db-install-password": "Nhập mật khẩu để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nĐây không phải là mật khẩu của tài khoản MediaWiki; đây là mật khẩu cho cơ sở dữ liệu của bạn.",
+       "config-db-install-help": "Nhập tên người dùng và mật khẩu sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.",
+       "config-db-account-lock": "Sử dụng cùng tên người dùng và mật khẩu trong quá trình hoạt động bình thường",
        "config-db-wiki-account": "Tài khoản người dùng để hoạt động bình thường",
+       "config-db-wiki-help": "Nhập tên người dùng và mật khẩu sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình hoạt động bình thường của wiki.\nNếu tài khoản không tồn tại và tài khoản cài đặt có đủ quyền hạn, tài khoản người dùng này sẽ được tạo ra với những đặc quyền tối thiểu cần thiết để vận hành wiki.",
        "config-db-prefix": "Tiền tố bảng cơ sở dữ liệu:",
+       "config-db-prefix-help": "Nếu bạn cần phải chia sẻ một cơ sở dữ liệu chung với nhiều wiki, hay giữa MediaWiki và một ứng dụng Web, bạn có thể quyết định thêm một tiền tố cho tất cả các tên bảng để tránh xung đột.\nKhông sử dụng dấu cách.\n\nTrường này thường được bỏ trống.",
        "config-db-charset": "Bảng mã cơ sở dữ liệu",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 nhị phân",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 UTF-8 tương thích ngược",
+       "config-charset-help": "<strong>Cảnh báo:</strong> Nếu bạn sử dụng <strong>UTF-8 tương thích ngược</strong> trên MySQL 4.1+ và sau đó sao lưu cơ sở dữ liệu với <code>mysqldump</code>, việc này có thể phá hủy tất cả các ký tự không phải ASCII, không thể phục hồi sao lưu bị hỏng của bạn!\n\nTrong <strong>chế độ nhị phân</strong>, MediaWiki lưu trữ văn bản UTF-8 vào cơ sở dữ liệu trong các trường nhị phân.\nĐiều này hiệu quả hơn so với chế độ UTF-8 của MySQL và cho phép bạn sử dụng đầy đủ các ký tự của Unicode.\nTrong <strong>chế độ UTF-8</strong>, MySQL sẽ biết bảng mã của dữ liệu và có thể trình bày và chuyển đổi nó chính xác,\nnhưng nó sẽ không cho phép lưu các ký tự nằm cao hơn [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Mặt phẳng đa ngôn ngữ căn bản].",
        "config-mysql-old": "Cần MySQL $1 trở lên; bạn có $2.",
        "config-db-port": "Cổng cơ sở dữ liệu:",
        "config-db-schema": "Giản đồ cho MediaWiki:",
+       "config-db-schema-help": "Giản đồ này thường làm việc tốt.\nChỉ thay đổi nó nếu bạn biết cần phải làm như vậy.",
        "config-pg-test-error": "Không thể kết nối với cơ sở dữ liệu '''$1''': $2",
        "config-sqlite-dir": "Thư mục dữ liệu SQLite:",
+       "config-sqlite-dir-help": "SQLite lưu tất cả các dữ liệu trong một tập tin duy nhất.\n\nThư mục mà bạn cung cấp phải cho phép máy chủ Web ghi vào khi cài đặt.\n\n<strong>Không</strong> nên làm cho nó truy cập được qua Web; đây là lý do chúng tôi không đặt nó vào cùng thư mục với các tập tin PHP của bạn.\n\nTrình cài đặt sẽ ghi một tập tin <code>.htaccess</code> đi kèm, nhưng nếu thất bại người nào đó có thể truy cập vào cơ sở dữ liệu thô của bạn.\nĐiều đó bao gồm dữ liệu người dùng thô (địa chỉ thư điện tử, mật khẩu được băm) cũng như các phiên bản bị xóa và dữ liệu bị hạn chế khác trên wiki.\n\nXem xét đặt cơ sở dữ liệu tại nơi nào khác hẳn, ví dụ trong <code>/var/lib/mediawiki/wiki_cua_ban</code>.",
        "config-oracle-def-ts": "Không gian bảng mặc định:",
        "config-oracle-temp-ts": "Không gian bảng tạm:",
        "config-type-mysql": "MySQL (hoặc tương hợp)",
        "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-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-header-mysql": "Thiết lập MySQL",
        "config-header-postgres": "Thiết lập PostgreSQL",
        "config-header-sqlite": "Thiết lập SQLite",
        "config-missing-db-name": "Bạn phải nhập một giá trị cho “{{int:config-db-name}}”",
        "config-missing-db-host": "Bạn phải nhập một giá trị cho “{{int:config-db-host}}”",
        "config-missing-db-server-oracle": "Bạn phải nhập một giá trị cho “{{int:config-db-host-oracle}}”",
+       "config-invalid-db-server-oracle": "Cơ sở dữ liệu TNS không hợp lệ “$1”.\nHoặc sử dụng “TNS Name” hoặc một chuỗi “Easy Connect” ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Phương pháp đặt tên Oracle]).",
+       "config-invalid-db-name": "Tên cơ sở dữ liệu không hợp lệ “$1”.\nChỉ sử dụng các chữ cái ASCII (a–z, A–Z), số (0–9), dấu gạch dưới (_) và dấu gạch ngang (-).",
+       "config-invalid-db-prefix": "Tiền tố cơ sở dữ liệu không hợp lệ “$1”.\nChỉ sử dụng các chữ cái ASCII (a–z, A–Z), số (0–9), dấu gạch dưới (_) và dấu gạch ngang (-).",
+       "config-connection-error": "$1.\n\nKiểm tra máy chủ, tên người dùng, và mật khẩu và thử lại lần nữa.",
        "config-invalid-schema": "Giản đồ “$1” không hợp lệ cho MediaWiki.\nHãy chỉ sử dụng các chữ cái ASCII (a–z, A–Z), chữ số (0–9), và dấu gạch dưới (_).",
+       "config-db-sys-create-oracle": "Trình cài đặt chỉ hỗ trợ sử dụng một tài khoản SYSDBA để tạo một tài khoản mới.",
+       "config-db-sys-user-exists-oracle": "Tài khoản người dùng “$1” đã tồn tại. SYSDBA chỉ có thể được sử dụng để tạo một tài khoản mới!",
        "config-postgres-old": "Cần PostgreSQL $1 trở lên; bạn có $2.",
        "config-mssql-old": "Cần Microsoft SQL Server $1 trở lên. Bạn có $2.",
+       "config-sqlite-name-help": "Chọn một tên để chỉ thị wiki của bạn.\nKhông sử dụng các dấu cách ( ) hoặc dấu gạch nối (-).\nTên này sẽ được sử dụng cho tên tập tin dữ liệu SQLite.",
+       "config-sqlite-parent-unwritable-group": "Không thể tạo ra thư mục dữ liệu <code><nowiki>$1</nowiki></code>, bởi vì thư mục cha <code><nowiki>$2</nowiki></code> không cho phép máy chủ Web ghi vào.\n\nTrình cài đặt đã xác định người dùng mà máy chủ Web của bạn đang chạy.\n\nHãy thiết lập để thư mục <code><nowiki>$3</nowiki></code> có thể ghi được bởi nó để tiếp tục.\nTrong một hệ thống Unix/Linux làm theo như sau:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Không thể tạo ra thư mục dữ liệu <code><nowiki>$1</nowiki></code>, bởi vì thư mục cha <code><nowiki>$2</nowiki></code> không cho phép máy chủ Web ghi vào.\n\nTrình cài đặt không thể xác định người sử dụng mà máy chủ web của bạn đang chạy.\nThiết lập thư mục <code><nowiki>$3</nowiki></code> có thể ghi toàn cục bởi nó (và những người khác!) để tiếp tục.\nTrong một hệ thống Unix/Linux hãy đánh các dòng lệnh sau:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "Lỗi tạo thư mục dữ liệu “$1”.\nKiểm tra vị trí lưu và thử lại.",
+       "config-sqlite-dir-unwritable": "Không thể ghi vào thư mục “$1”.\nThay đổi quyền hạn của nó để máy chủ Web có thể ghi vào, và thử lại.",
+       "config-sqlite-connection-error": "$1.\n\nKiểm tra thư mục dữ liệu và tên cơ sở dữ liệu dưới đây và thử lại.",
        "config-sqlite-readonly": "Không thể ghi vào tập tin <code>$1</code>.",
        "config-sqlite-cant-create-db": "Không thể tạo ra tập tin cơ sở dữ liệu <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "PHP thiếu sự hỗ trợ cho FTS3; đang giáng cấp các bảng",
        "config-can-upgrade": "Cơ sở dữ liệu này có bảng MediaWiki.\nĐể nâng cấp các bảng đến MediaWiki $1, bấm <strong>Tiếp tục</strong>.",
+       "config-upgrade-done": "Nâng cấp đã hoàn thành.\n\nBạn có thể [$1 bắt đầu sử dụng wiki của bạn] ngay bây giờ.\n\nNếu bạn muốn tạo lại tập tin <code>LocalSettings.php</code> của bạn, bấm nút bên dưới.\nĐiều này <strong>không được khuyến khích</strong>, trừ khi bạn đang gặp vấn đề với wiki của bạn.",
+       "config-upgrade-done-no-regenerate": "Nâng cấp đã hoàn thành.\n\nBạn có thể [$1 bắt đầu sử dụng wiki của bạn] ngay bây giờ.",
        "config-regenerate": "Tạo lại LocalSettings.php →",
        "config-show-table-status": "Truy vấn <code>SHOW TABLE STATUS</code> bị thất bại!",
+       "config-unknown-collation": "<strong>Cảnh báo:</strong> Database đang sử dụng đối chiếu không được thừa nhận.",
        "config-db-web-account": "Tài khoản cơ sở dữ liệu để truy cập Web",
+       "config-db-web-help": "Chọn tên người dùng và mật khẩu mà máy chủ Web sẽ sử dụng để kết nối đến máy chủ cơ sở dữ liệu trong quá trình hoạt động bình thường của wiki.",
        "config-db-web-account-same": "Sử dụng lại tài khoản cài đặt",
        "config-db-web-create": "Mở tài khoản nếu chưa tồn tại",
+       "config-db-web-no-create-privs": "Tài khoản mà bạn xác định để cài đặt không có đủ quyền để tạo một tài khoản. Tài khoản mà bạn chỉ ra ở đây phải thực sự tồn tại trước đó.",
        "config-mysql-engine": "Máy lưu trữ:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Cảnh báo:</strong> Bạn đã chọn MyISAM làm động cơ lưu trữ cho MySQL, điều này không được khuyến khích sử dụng với MediaWiki, bởi vì:\n* Nó ít hỗ trợ đồng thời do việc khóa bảng\n* Nó dễ bị lỗi hơn so với các động cơ khác\n* Kho mã nguồn của MediaWiki không phải khi nào cũng xử lý MyISAM như mong muốn\n\nNếu cài đặt MySQL của bạn hỗ trợ InnoDB, đặc biệt khuyến cáo bạn nên chọn để thay thế.\nNếu cài đặt MySQL của bạn không hỗ trợ InnoDB, có lẽ đã đến lúc để nâng cấp.",
+       "config-mysql-only-myisam-dep": "<strong>Cảnh báo:</strong> MyISAM chỉ là công cụ lưu trữ có sẵn cho MySQL trên máy tính này, và điều này không được khuyến khích sử dụng với MediaWiki, bởi vì:\n* Nó ít hỗ trợ đồng thời do việc khóa khóa\n* Nó là dễ bị hư hỏng hơn các engine khác\n* Codebase MediaWiki không phải khi nào cũng xử lý MyISAM như mong muốn\n\nCài đặt MySQL của bạn không hỗ trợ InnoDB, có lẽ đã đến lúc để nâng cấp.",
        "config-mysql-charset": "Bảng mã cơ sở dữ liệu:",
        "config-mysql-binary": "Nhị phân",
        "config-mysql-utf8": "UTF-8",
index 47749b7..e1d2226 100644 (file)
@@ -2,14 +2,15 @@
        "@metadata": {
                "authors": [
                        "פוילישער",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "Har-wradim"
                ]
        },
        "config-desc": "דער אינסטאלירער פאר מעדיעוויקי",
        "config-title": "מעדיעוויקי $1 אינסטאלירונג",
        "config-information": "אינפֿארמאציע",
        "config-localsettings-badkey": "דעם שליסל וואס איר האט אײַנגעגעבן איז פאלש.",
-       "config-session-error": "פֿעלער ביים אנהייבן סעסיע:$1",
+       "config-session-error": "פֿעלער ביים אָנהייבן סעסיע: $1",
        "config-your-language": "אײַער שפראך:",
        "config-your-language-help": "קלויבט א שפראך צו ניצן ביים אינסטאלירונג פראצעס.",
        "config-wiki-language": "ווקי שפראך:",
index f4c3316..cbd48f1 100644 (file)
@@ -72,7 +72,7 @@
        "config-unicode-using-intl": "使用[http://pecl.php.net/intl intl PECL扩展程序]标准化Unicode。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong>因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。\n如果您运行着一个高流量的网站,请参阅 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode标准化]一文。",
        "config-unicode-update-warning": "'''警告''':Unicode正常化封装器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需要使用Unicode,请将其[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升级]。",
-       "config-no-db": "æ\89¾ä¸\8då\88°å\90\88é\80\82ç\9a\84æ\95°æ\8d®åº\93驱å\8a¨ï¼\81æ\82¨é\9c\80è¦\81为PHPå®\89è£\85æ\95°æ\8d®åº\93驱å\8a¨ã\80\82ç\9b®å\89\8dæ\94¯æ\8c\81以ä¸\8bæ\95°æ\8d®åº\93ï¼\9a$1ã\80\82å¦\82æ\9e\9cæ\82¨æ\98¯è\87ªå·±ç¼\96è¯\91ç\9a\84PHPï¼\8c请é\87\8dæ\96°é\85\8dç½®ä»\96ä¸\8eæ\95°æ\8d®åº\93客æ\88·ç«¯å°\86å\85¶å\90¯ç\94¨ï¼\8c诸å¦\82ï¼\8c使ç\94¨<code>./configure --with-mysqli</code>ã\80\82å¦\82æ\9e\9cæ\82¨ä»\8eDebianæ\88\96Ubuntuå\8c\85å®\89è£\85äº\86PHPï¼\8cä¹\8bå\90\8eæ\82¨ä»\8dé\9c\80è¦\81å®\89è£\85诸å¦\82<code>php5-mysql</code>包。",
+       "config-no-db": "æ\97 æ³\95æ\89¾å\88°å\90\88é\80\82ç\9a\84æ\95°æ\8d®åº\93驱å\8a¨ï¼\81æ\82¨é\9c\80è¦\81为PHPå®\89è£\85æ\95°æ\8d®åº\93驱å\8a¨ã\80\82ç\9b®å\89\8dæ\94¯æ\8c\81以ä¸\8bæ\95°æ\8d®åº\93{{PLURAL:$2|ç±»å\9e\8b}}ï¼\9a$1ã\80\82\n\nå¦\82æ\9e\9cæ\82¨è\87ªå·±ç¼\96è¯\91äº\86PHPï¼\8c请é\80\9aè¿\87å\90¯ç\94¨æ\95°æ\8d®åº\93客æ\88·ç«¯é\87\8dæ\96°é\85\8dç½®å®\83ï¼\8cä¾\8bå¦\82使ç\94¨ <code>./configure --with-mysqli</code>ã\80\82å¦\82æ\9e\9cæ\82¨ä»\8e Debian æ\88\96 Ubuntu å®\89è£\85å\8c\85å®\89è£\85äº\86PHPï¼\8cé\82£ä¹\88æ\82¨ä¹\9fé\9c\80è¦\81å®\89è£\85ï¼\8cä¾\8bå¦\82 <code>php5-mysql</code> å®\89è£\85包。",
        "config-outdated-sqlite": "'''警告''':您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
        "config-no-fts3": "'''警告''':已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
        "config-register-globals-error": "<strong>错误:PHP<code>[http://php.net/register_globals register_globals]</code>选项被启用。必须禁用它才能继续安装。</strong>关于如何禁用,参见[https://www.mediawiki.org/wiki/register_globals mediawiki.org此页]。",
index 56fd1c6..334d374 100644 (file)
@@ -135,7 +135,15 @@ abstract class Job implements IJobSpecification {
        }
 
        /**
-        * @return bool Whether only one of each identical set of jobs should be run
+        * Whether the queue should reject insertion of this job if a duplicate exists
+        *
+        * This can be used to avoid duplicated effort or combined with delayed jobs to
+        * coalesce updates into larger batches. Claimed jobs are never treated as
+        * duplicates of new jobs, and some queues may allow a few duplicates due to
+        * network partitions and fail-over. Thus, additional locking is needed to
+        * enforce mutual exclusion if this is really needed.
+        *
+        * @return bool
         */
        public function ignoreDuplicates() {
                return $this->removeDuplicates;
index c00d22e..53fcaee 100644 (file)
@@ -187,9 +187,7 @@ abstract class JobQueue {
         * @throws JobQueueError
         */
        final public function isEmpty() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doIsEmpty();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
@@ -210,9 +208,7 @@ abstract class JobQueue {
         * @throws JobQueueError
         */
        final public function getSize() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doGetSize();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
@@ -233,9 +229,7 @@ abstract class JobQueue {
         * @throws JobQueueError
         */
        final public function getAcquiredCount() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doGetAcquiredCount();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
@@ -257,9 +251,7 @@ abstract class JobQueue {
         * @since 1.22
         */
        final public function getDelayedCount() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doGetDelayedCount();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
@@ -282,9 +274,7 @@ abstract class JobQueue {
         * @throws JobQueueError
         */
        final public function getAbandonedCount() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doGetAbandonedCount();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
@@ -336,9 +326,7 @@ abstract class JobQueue {
                        }
                }
 
-               wfProfileIn( __METHOD__ );
                $this->doBatchPush( $jobs, $flags );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -366,9 +354,7 @@ abstract class JobQueue {
                        throw new MWException( "Unrecognized job type '{$this->type}'." );
                }
 
-               wfProfileIn( __METHOD__ );
                $job = $this->doPop();
-               wfProfileOut( __METHOD__ );
 
                // Flag this job as an old duplicate based on its "root" job...
                try {
@@ -376,7 +362,7 @@ abstract class JobQueue {
                                JobQueue::incrStats( 'job-pop-duplicate', $this->type, 1, $this->wiki );
                                $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
                        }
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        // don't lose jobs over this
                }
 
@@ -403,9 +389,7 @@ abstract class JobQueue {
                if ( $job->getType() !== $this->type ) {
                        throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
                }
-               wfProfileIn( __METHOD__ );
                $this->doAck( $job );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -449,9 +433,7 @@ abstract class JobQueue {
                if ( $job->getType() !== $this->type ) {
                        throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
                }
-               wfProfileIn( __METHOD__ );
                $ok = $this->doDeduplicateRootJob( $job );
-               wfProfileOut( __METHOD__ );
 
                return $ok;
        }
@@ -494,9 +476,7 @@ abstract class JobQueue {
                if ( $job->getType() !== $this->type ) {
                        throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
                }
-               wfProfileIn( __METHOD__ );
                $isDuplicate = $this->doIsRootJobOldDuplicate( $job );
-               wfProfileOut( __METHOD__ );
 
                return $isDuplicate;
        }
@@ -538,9 +518,7 @@ abstract class JobQueue {
         * @return void
         */
        final public function delete() {
-               wfProfileIn( __METHOD__ );
                $this->doDelete();
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -560,9 +538,7 @@ abstract class JobQueue {
         * @throws JobQueueError
         */
        final public function waitForBackups() {
-               wfProfileIn( __METHOD__ );
                $this->doWaitForBackups();
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -607,9 +583,7 @@ abstract class JobQueue {
         * @return void
         */
        final public function flushCaches() {
-               wfProfileIn( __METHOD__ );
                $this->doFlushCaches();
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -661,7 +635,6 @@ abstract class JobQueue {
         * @since 1.22
         */
        final public function getSiblingQueuesWithJobs( array $types ) {
-               $section = new ProfileSection( __METHOD__ );
 
                return $this->doGetSiblingQueuesWithJobs( $types );
        }
@@ -686,7 +659,6 @@ abstract class JobQueue {
         * @since 1.22
         */
        final public function getSiblingQueueSizes( array $types ) {
-               $section = new ProfileSection( __METHOD__ );
 
                return $this->doGetSiblingQueueSizes( $types );
        }
index 056e5a8..5e8399c 100644 (file)
@@ -221,7 +221,7 @@ class JobQueueDB extends JobQueue {
                }
 
                $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
-               $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+               $rowList = array(); // list of jobs for jobs that are not de-duplicated
                foreach ( $jobs as $job ) {
                        $row = $this->insertFields( $job );
                        if ( $job->ignoreDuplicates() ) {
index c4301ee..4186204 100644 (file)
@@ -72,7 +72,7 @@ class JobQueueFederated extends JobQueue {
         *                          have explicitly defined sections.
         *  - configByPartition   : Map of queue partition names to configuration arrays.
         *                          These configuration arrays are passed to JobQueue::factory().
-        *                          The options set here are overriden by those passed to this
+        *                          The options set here are overridden by those passed to this
         *                          the federated queue itself (e.g. 'order' and 'claimTTL').
         *  - partitionsNoPush    : List of partition names that can handle pop() but not push().
         *                          This can be used to migrate away from a certain partition.
index b0b35e9..dbb85d7 100644 (file)
@@ -220,12 +220,10 @@ class JobQueueGroup {
        public function waitForBackups() {
                global $wgJobTypeConf;
 
-               wfProfileIn( __METHOD__ );
                // Try to avoid doing this more than once per queue storage medium
                foreach ( $wgJobTypeConf as $type => $conf ) {
                        $this->get( $type )->waitForBackups();
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index 6b19340..ef0f087 100644 (file)
@@ -76,6 +76,12 @@ class JobRunner {
                        $this->runJobsLog( "Executed $count periodic queue task(s)." );
                }
 
+               // Bail out if in read-only mode
+               if ( wfReadOnly() ) {
+                       $response['reached'] = 'read-only';
+                       return $response;
+               }
+
                // Bail out if there is too much DB lag
                list( , $maxLag ) = wfGetLBFactory()->getMainLB( wfWikiID() )->getMaxLag();
                if ( $maxLag >= 5 ) {
@@ -129,21 +135,19 @@ class JobRunner {
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
                                // Run the job...
-                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
                                $jobStartTime = microtime( true );
                                try {
                                        ++$jobsRun;
                                        $status = $job->run();
                                        $error = $job->getLastError();
                                        wfGetLBFactory()->commitMasterChanges();
-                               } catch ( MWException $e ) {
+                               } catch ( Exception $e ) {
                                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
                                        $status = false;
                                        $error = get_class( $e ) . ': ' . $e->getMessage();
                                        MWExceptionHandler::logException( $e );
                                }
                                $timeMs = intval( ( microtime( true ) - $jobStartTime ) * 1000 );
-                               wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
                                $timeMsTotal += $timeMs;
 
                                // Mark the job as done on success or when the job cannot be retried
@@ -253,7 +257,6 @@ class JobRunner {
         * @return array Map of (job type => backoff expiry timestamp)
         */
        private function loadBackoffs( array $backoffs, $mode = 'wait' ) {
-               $section = new ProfileSection( __METHOD__ );
 
                $file = wfTempDir() . '/mw-runJobs-backoffs.json';
                if ( is_file( $file ) ) {
@@ -292,7 +295,6 @@ class JobRunner {
         * @return array The new backoffs account for $backoffs and the latest file data
         */
        private function syncBackoffDeltas( array $backoffs, array &$deltas, $mode = 'wait' ) {
-               $section = new ProfileSection( __METHOD__ );
 
                if ( !$deltas ) {
                        return $this->loadBackoffs( $backoffs, $mode );
index 8600eed..bd5c40d 100644 (file)
@@ -73,9 +73,7 @@ abstract class JobQueueAggregator {
         * @return bool Success
         */
        final public function notifyQueueEmpty( $wiki, $type ) {
-               wfProfileIn( __METHOD__ );
                $ok = $this->doNotifyQueueEmpty( $wiki, $type );
-               wfProfileOut( __METHOD__ );
 
                return $ok;
        }
@@ -93,9 +91,7 @@ abstract class JobQueueAggregator {
         * @return bool Success
         */
        final public function notifyQueueNonEmpty( $wiki, $type ) {
-               wfProfileIn( __METHOD__ );
                $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
-               wfProfileOut( __METHOD__ );
 
                return $ok;
        }
@@ -111,9 +107,7 @@ abstract class JobQueueAggregator {
         * @return array (job type => (list of wiki IDs))
         */
        final public function getAllReadyWikiQueues() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doGetAllReadyWikiQueues();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
@@ -129,9 +123,7 @@ abstract class JobQueueAggregator {
         * @return bool Success
         */
        final public function purge() {
-               wfProfileIn( __METHOD__ );
                $res = $this->doPurge();
-               wfProfileOut( __METHOD__ );
 
                return $res;
        }
index cc28a01..b7f09e7 100644 (file)
@@ -94,7 +94,7 @@ class AssembleUploadChunksJob extends Job {
                                        'status' => Status::newGood()
                                )
                        );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        UploadBase::setSessionStatus(
                                $user,
                                $this->params['filekey'],
index 4d1e72c..b4ddd11 100644 (file)
@@ -26,9 +26,9 @@
  *
  * This job comes in a few variants:
  *   - a) Recursive jobs to purge caches for backlink pages for a given title.
- *        These jobs have have (recursive:true,table:<table>) set.
+ *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to purge caches for a set of titles (the job title is ignored).
- *           These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *
  * @ingroup JobQueue
  */
@@ -67,7 +67,7 @@ class HTMLCacheUpdateJob extends Job {
                                array( 'params' => $this->getRootJobParams() )
                        );
                        JobQueueGroup::singleton()->push( $jobs );
-               // Job to purge pages for for a set of titles
+               // Job to purge pages for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
                        $this->invalidateTitles( $this->params['pages'] );
                // B/C for job to purge a range of backlink pages for a given page
index 55215b3..3d4cfae 100644 (file)
@@ -108,7 +108,7 @@ class PublishStashedFileJob extends Job {
                                        'status' => Status::newGood()
                                )
                        );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        UploadBase::setSessionStatus(
                                $user,
                                $this->params['filekey'],
index f82af27..5d95792 100644 (file)
@@ -26,9 +26,9 @@
  *
  * This job comes in a few variants:
  *   - a) Recursive jobs to update links for backlink pages for a given title.
- *        These jobs have have (recursive:true,table:<table>) set.
+ *        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 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.
  *
@@ -86,7 +86,7 @@ class RefreshLinksJob extends Job {
                                array( 'params' => $extraParams )
                        );
                        JobQueueGroup::singleton()->push( $jobs );
-               // Job to update link tables for for a set of titles
+               // Job to update link tables for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
                        foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
                                list( $ns, $dbKey ) = $nsAndKey;
@@ -157,7 +157,7 @@ class RefreshLinksJob extends Job {
                        $ellapsed = microtime( true ) - $start;
                        // If it took a long time to render, then save this back to the cache to avoid
                        // wasted CPU by other apaches or job runners. We don't want to always save to
-                       // cache as this cause cause high cache I/O and LRU churn when a template changes.
+                       // cache as this can cause high cache I/O and LRU churn when a template changes.
                        if ( $ellapsed >= self::PARSE_THRESHOLD_SEC
                                && $page->isParserCacheUsed( $parserOptions, $revision->getId() )
                                && $parserOutput->isCacheable()
index 56dc6ea..0fe9444 100644 (file)
@@ -48,7 +48,7 @@ class Cookie {
         *        expires A date string
         *        path    The path this cookie is used on
         *        domain  Domain this cookie is used on
-        * @throws MWException
+        * @throws InvalidArgumentException
         */
        public function set( $value, $attr ) {
                $this->value = $value;
diff --git a/includes/libs/DeferredStringifier.php b/includes/libs/DeferredStringifier.php
new file mode 100644 (file)
index 0000000..bd32949
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Class that defers a slow string generation until the string is actually needed.
+ *
+ * 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.25
+ */
+class DeferredStringifier {
+       /** @var callable Callback used for result string generation */
+       private $callback;
+       /** @var array */
+       private $params;
+       /** @var string */
+       private $result;
+
+       /**
+        * @param callable $callback Callback that gets called by __toString
+        * @param mixed $param,... Parameters to the callback
+        */
+       public function __construct( $callback /*...*/ ) {
+               $this->params = func_get_args();
+               array_shift( $this->params );
+               $this->callback = $callback;
+       }
+
+       /**
+        * Returns a string generated by callback
+        *
+        * @return string
+        */
+       public function __toString() {
+               if ( $this->result === null ) {
+                       $this->result = call_user_func_array( $this->callback, $this->params );
+               }
+               return $this->result;
+       }
+}
index 2a7ee2a..0b6db32 100644 (file)
@@ -94,6 +94,14 @@ class MapCacheLRU {
                }
        }
 
+       /**
+        * @return array
+        * @since 1.25
+        */
+       public function getAllKeys() {
+               return array_keys( $this->cache );
+       }
+
        /**
         * Clear one or several cache entries, or all cache entries
         *
index 8c982c4..fb2daa6 100644 (file)
@@ -34,6 +34,7 @@
  *                array bodies are encoded as multipart/form-data and strings
  *                use application/x-www-form-urlencoded (headers sent automatically)
  *   - stream   : resource to stream the HTTP response body to
+ *   - proxy    : HTTP proxy to use
  * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
  *
  * @author Aaron Schulz
@@ -52,13 +53,17 @@ class MultiHttpClient {
        protected $usePipelining = false;
        /** @var integer */
        protected $maxConnsPerHost = 50;
+       /** @var string|null proxy */
+       protected $proxy;
 
        /**
         * @param array $options
         *   - connTimeout     : default connection timeout
         *   - reqTimeout      : default request timeout
+        *   - proxy           : HTTP proxy to use
         *   - usePipelining   : whether to use HTTP pipelining if possible (for all hosts)
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
+        * @throws Exception
         */
        public function __construct( array $options ) {
                if ( isset( $options['caBundlePath'] ) ) {
@@ -67,7 +72,7 @@ class MultiHttpClient {
                                throw new Exception( "Cannot find CA bundle: " . $this->caBundlePath );
                        }
                }
-               static $opts = array( 'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost' );
+               static $opts = array( 'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy' );
                foreach ( $opts as $key ) {
                        if ( isset( $options[$key] ) ) {
                                $this->$key = $options[$key];
@@ -83,7 +88,7 @@ class MultiHttpClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $http->run( $req );
@@ -103,14 +108,14 @@ class MultiHttpClient {
         * Execute a set of HTTP(S) requests concurrently
         *
         * The maps are returned by this method with the 'response' field set to a map of:
-        *   - code    : HTTP response code or 0 if there was a serious cURL error
-        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
-        *   - headers : <header name/value associative array>
-        *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
-        * The map also stores integer-indexed copies of these values. This lets callers do:
-        *      <code>
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - error   : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *    <code>
+        *        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
         *  </code>
         * All headers in the 'headers' field are normalized to use lower case names.
         * This is true for the request headers and the response headers. Integer-indexed
@@ -123,6 +128,7 @@ class MultiHttpClient {
         *   - usePipelining   : whether to use HTTP pipelining if possible
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
         * @return array $reqs With response array populated for each
+        * @throws Exception
         */
        public function runMulti( array $reqs, array $opts = array() ) {
                $chm = $this->getCurlMulti();
@@ -244,12 +250,14 @@ class MultiHttpClient {
         *   - connTimeout    : default connection timeout
         *   - reqTimeout     : default request timeout
         * @return resource
+        * @throws Exception
         */
        protected function getCurlHandle( array &$req, array $opts = array() ) {
                $ch = curl_init();
 
                curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT,
                        isset( $opts['connTimeout'] ) ? $opts['connTimeout'] : $this->connTimeout );
+               curl_setopt( $ch, CURLOPT_PROXY, isset( $req['proxy'] ) ? $req['proxy'] : $this->proxy );
                curl_setopt( $ch, CURLOPT_TIMEOUT,
                        isset( $opts['reqTimeout'] ) ? $opts['reqTimeout'] : $this->reqTimeout );
                curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
index 96e195c..ec8c36a 100644 (file)
@@ -54,7 +54,7 @@ class ObjectFactory {
         * @throws InvalidArgumentException when object specification does not
         * contain 'class' or 'factory' keys
         * @throws ReflectionException when 'args' are supplied and 'class'
-        * constructor is non-public or non-existant
+        * constructor is non-public or non-existent
         */
        public static function getObjectFromSpec( $spec ) {
                $args = isset( $spec['args'] ) ? $spec['args'] : array();
index f09d101..8bd4656 100644 (file)
@@ -60,10 +60,10 @@ class RunningStat implements Countable {
        /** @var float The second central moment (or variance). **/
        public $m2 = 0.0;
 
-       /** @var float The least value in the the set. **/
+       /** @var float The least value in the set. **/
        public $min = INF;
 
-       /** @var float The most value in the set. **/
+       /** @var float The greatest value in the set. **/
        public $max = NEGATIVE_INF;
 
        /**
@@ -129,7 +129,7 @@ class RunningStat implements Countable {
         * Get the estimated standard deviation.
         *
         * The standard deviation of a statistical population is the square root of
-        * its variance. It shows shows how much variation from the mean exists. In
+        * its variance. It shows how much variation from the mean exists. In
         * addition to expressing the variability of a population, the standard
         * deviation is commonly used to measure confidence in statistical conclusions.
         *
index 629c269..1ec9eaa 100644 (file)
@@ -32,12 +32,12 @@ class ScopedCallback {
        protected $params;
 
        /**
-        * @param callable $callback
+        * @param callable|null $callback
         * @param array $params Callback arguments (since 1.25)
         * @throws Exception
         */
        public function __construct( $callback, array $params = array() ) {
-               if ( !is_callable( $callback ) ) {
+               if ( $callback !== null && !is_callable( $callback ) ) {
                        throw new InvalidArgumentException( "Provided callback is not valid." );
                }
                $this->callback = $callback;
diff --git a/includes/libs/UDPTransport.php b/includes/libs/UDPTransport.php
new file mode 100644 (file)
index 0000000..7fad882
--- /dev/null
@@ -0,0 +1,102 @@
+<?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
+ */
+
+/**
+ * A generic class to send a message over UDP
+ *
+ * If a message prefix is provided to the constructor or via
+ * UDPTransport::newFromString(), the payload of the UDP datagrams emitted
+ * will be formatted with the prefix and a single space at the start of each
+ * line. This is the payload format expected by the udp2log service.
+ *
+ * @since 1.25
+ */
+class UDPTransport {
+       private $host, $port, $prefix, $domain;
+
+       /**
+        * @param string $host IP address to send to
+        * @param int $port port number
+        * @param int $domain AF_INET or AF_INET6 constant
+        * @param string|bool $prefix Prefix to use, false for no prefix
+        */
+       public function __construct( $host, $port, $domain, $prefix = false ) {
+               $this->host = $host;
+               $this->port = $port;
+               $this->domain = $domain;
+               $this->prefix = $prefix;
+       }
+
+       /**
+        * @param string $info In the format of "udp://host:port/prefix"
+        * @return UDPTransport
+        * @throws InvalidArgumentException
+        */
+       public static function newFromString( $info ) {
+               if ( preg_match( '!^udp:(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $info, $m ) ) {
+                       // IPv6 bracketed host
+                       $host = $m[1];
+                       $port = intval( $m[2] );
+                       $prefix = isset( $m[3] ) ? $m[3] : false;
+                       $domain = AF_INET6;
+               } elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $info, $m ) ) {
+                       $host = $m[1];
+                       if ( !IP::isIPv4( $host ) ) {
+                               $host = gethostbyname( $host );
+                       }
+                       $port = intval( $m[2] );
+                       $prefix = isset( $m[3] ) ? $m[3] : false;
+                       $domain = AF_INET;
+               } else {
+                       throw new InvalidArgumentException( __METHOD__ . ': Invalid UDP specification' );
+               }
+
+               return new self( $host, $port, $domain, $prefix );
+       }
+
+       /**
+        * @param string $text
+        */
+       public function emit( $text ) {
+               // Clean it up for the multiplexer
+               if ( $this->prefix !== false ) {
+                       $text = preg_replace( '/^/m', $this->prefix . ' ', $text );
+
+                       // Limit to 64KB
+                       if ( strlen( $text ) > 65506 ) {
+                               $text = substr( $text, 0, 65506 );
+                       }
+
+                       if ( substr( $text, -1 ) != "\n" ) {
+                               $text .= "\n";
+                       }
+               } elseif ( strlen( $text ) > 65507 ) {
+                       $text = substr( $text, 0, 65507 );
+               }
+
+               $sock = socket_create( $this->domain, SOCK_DGRAM, SOL_UDP );
+               if ( !$sock ) { // @todo should this throw an exception?
+                       return;
+               }
+
+               socket_sendto( $sock, $text, strlen( $text ), 0, $this->host, $this->port );
+               socket_close( $sock );
+       }
+}
index 98ff675..5ed67c7 100644 (file)
@@ -321,7 +321,7 @@ class Xhprof {
                                $this->complete[$func]['subcalls'] = array();
                        }
 
-                       foreach( $this->hieraData as $key => $stats ) {
+                       foreach ( $this->hieraData as $key => $stats ) {
                                list( $parent, $child ) = self::splitKey( $key );
                                if ( $parent !== null ) {
                                        // Track call tree information
diff --git a/includes/libs/composer/ComposerJson.php b/includes/libs/composer/ComposerJson.php
new file mode 100644 (file)
index 0000000..49c9f23
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Reads a composer.json file and provides accessors to get
+ * its hash and the required dependencies
+ *
+ * @since 1.25
+ */
+class ComposerJson {
+
+       /**
+        * @param string $location
+        */
+       public function __construct( $location ) {
+               $this->hash = md5_file( $location );
+               $this->contents = json_decode( file_get_contents( $location ), true );
+       }
+
+       public function getHash() {
+               return $this->hash;
+       }
+
+       /**
+        * Dependencies as specified by composer.json
+        *
+        * @return array
+        */
+       public function getRequiredDependencies() {
+               $deps = array();
+               foreach ( $this->contents['require'] as $package => $version ) {
+                       if ( $package !== "php" ) {
+                               $deps[$package] = self::normalizeVersion( $version );
+                       }
+               }
+
+               return $deps;
+       }
+
+       /**
+        * Strip a leading "v" from the version name
+        *
+        * @param string $version
+        * @return string
+        */
+       public static function normalizeVersion( $version ) {
+               if ( strpos( $version, 'v' ) === 0 ) {
+                       // Composer auto-strips the "v" in front of the tag name
+                       $version = ltrim( $version, 'v' );
+               }
+
+               return $version;
+       }
+
+}
diff --git a/includes/libs/composer/ComposerLock.php b/includes/libs/composer/ComposerLock.php
new file mode 100644 (file)
index 0000000..9c7bf2f
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Reads a composer.lock file and provides accessors to get
+ * its hash and what is installed
+ *
+ * @since 1.25
+ */
+class ComposerLock {
+
+       /**
+        * @param string $location
+        */
+       public function __construct( $location ) {
+               $this->contents = json_decode( file_get_contents( $location ), true );
+       }
+
+       public function getHash() {
+               return $this->contents['hash'];
+       }
+
+       /**
+        * Dependencies currently installed according to composer.lock
+        *
+        * @return array
+        */
+       public function getInstalledDependencies() {
+               $deps = array();
+               foreach ( $this->contents['packages'] as $installed ) {
+                       $deps[$installed['name']] = array(
+                               'version' => ComposerJson::normalizeVersion( $installed['version'] ),
+                               'type' => $installed['type'],
+                       );
+               }
+
+               return $deps;
+       }
+}
diff --git a/includes/libs/virtualrest/ParsoidVirtualRESTService.php b/includes/libs/virtualrest/ParsoidVirtualRESTService.php
new file mode 100644 (file)
index 0000000..03bdf0d
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Virtual HTTP service client for Parsoid
+ *
+ * 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
+ */
+
+/**
+ * Virtual REST service for Parsoid
+ * @since 1.25
+ */
+class ParsoidVirtualRESTService extends VirtualRESTService {
+       /**
+        * Example requests:
+        *  GET /local/v1/page/$title/html/$oldid
+        *   * $oldid is optional
+        *  POST /local/v1/transform/html/to/wikitext/$title/$oldid
+        *   * body: array( 'html' => ... )
+        *   * $title and $oldid are optional
+        *  POST /local/v1/transform/wikitext/to/html/$title
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body' => true/false )
+        *   * $title is optional
+        * @param array $params Key/value map
+        *   - URL            : Parsoid server URL
+        *   - prefix         : Parsoid prefix for this wiki
+        *   - timeout        : Parsoid timeout (optional)
+        *   - forwardCookies : Cookies to forward to Parsoid, or false. (optional)
+        *   - HTTPProxy      : Parsoid HTTP proxy (optional)
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+       }
+
+       public function onRequests( array $reqs, Closure $idGeneratorFunc ) {
+               $result = array();
+               foreach ( $reqs as $key => $req ) {
+                       $parts = explode( '/', $req['url'] );
+
+                       list(
+                               $targetWiki, // 'local'
+                               $version, // 'v1'
+                               $reqType // 'page' or 'transform'
+                       ) = $parts;
+
+                       if ( $targetWiki !== 'local' ) {
+                               throw new Exception( "Only 'local' target wiki is currently supported" );
+                       } elseif ( $version !== 'v1' ) {
+                               throw new Exception( "Only version 1 exists" );
+                       } else if ( $reqType !== 'page' && $reqType !== 'transform' ) {
+                               throw new Exception( "Request type must be either 'page' or 'transform'" );
+                       }
+
+                       $req['url'] = $this->params['URL'] . '/' . urlencode( $this->params['prefix'] ) . '/';
+
+                       if ( $reqType === 'page' ) {
+                               $title = $parts[3];
+                               if ( $parts[4] !== 'html' ) {
+                                       throw new Exception( "Only 'html' output format is currently supported" );
+                               }
+                               if ( isset( $parts[5] ) ) {
+                                       $req['url'] .= $title . '?oldid=' . $parts[5];
+                               } else {
+                                       $req['url'] .= $title;
+                               }
+                       } elseif ( $reqType === 'transform' ) {
+                               if ( $parts[4] !== 'to' ) {
+                                       throw new Exception( "Part index 4 is not 'to'" );
+                               }
+
+                               if ( isset( $parts[6] ) ) {
+                                       $req['url'] .= $parts[6];
+                               }
+
+                               if ( $parts[3] === 'html' & $parts[5] === 'wikitext' ) {
+                                       if ( !isset( $req['body']['html'] ) ) {
+                                               throw new Exception( "You must set an 'html' body key for this request" );
+                                       }
+                                       if ( isset( $parts[7] ) ) {
+                                               $req['body']['oldid'] = $parts[7];
+                                       }
+                               } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
+                                       if ( !isset( $req['body']['wikitext'] ) ) {
+                                               throw new Exception( "You must set a 'wikitext' body key for this request" );
+                                       }
+                                       $req['body']['wt'] = $req['body']['wikitext'];
+                                       unset( $req['body']['wikitext'] );
+                               } else {
+                                       throw new Exception( "Transformation unsupported" );
+                               }
+                       }
+
+                       if ( isset( $this->params['HTTPProxy'] ) && $this->params['HTTPProxy'] ) {
+                               $req['proxy'] = $this->params['HTTPProxy'];
+                       }
+                       if ( isset( $this->params['timeout'] ) ) {
+                               $req['reqTimeout'] = $this->params['timeout'];
+                       }
+
+                       // Forward cookies
+                       if ( isset( $this->params['forwardCookies'] ) ) {
+                               $req['headers']['Cookie'] = $this->params['forwardCookies'];
+                       }
+
+                       $result[$key] = $req;
+               }
+               return $result;
+       }
+}
index 2d21d3c..e8bb38d 100644 (file)
@@ -125,17 +125,17 @@ class VirtualRESTServiceClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error   : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $client->run( $req );
         *  </code>
-        * @param array $req Virtual HTTP request array
+        * @param array $req Virtual HTTP request maps
         * @return array Response array for request
         */
        public function run( array $req ) {
-               $req = $this->runMulti( array( $req ) );
-               return $req[0]['response'];
+               $responses = $this->runMulti( array( $req ) );
+               return $responses[0];
        }
 
        /**
@@ -146,14 +146,15 @@ class VirtualRESTServiceClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error   : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
-        *      <code>
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $responses[0];
+        *    <code>
+        *        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $responses[0];
         *  </code>
         *
-        * @param array $req Map of Virtual HTTP request arrays
+        * @param array $reqs Map of Virtual HTTP request maps
         * @return array $reqs Map of corresponding response values with the same keys/order
+        * @throws Exception
         */
        public function runMulti( array $reqs ) {
                foreach ( $reqs as $index => &$req ) {
@@ -207,6 +208,9 @@ class VirtualRESTServiceClient {
                        if ( ++$rounds > 5 ) { // sanity
                                throw new Exception( "Too many replacement rounds detected. Aborting." );
                        }
+                       // Track requests executed this round that have a prefix/service.
+                       // Note that this also includes requests where 'response' was forced.
+                       $checkReqIndexesByPrefix = array();
                        // Resolve the virtual URLs valid and qualified HTTP(S) URLs
                        // and add any required authentication headers for the backend.
                        // Services can also replace requests with new ones, either to
@@ -219,7 +223,7 @@ class VirtualRESTServiceClient {
                                        if ( isset( $servReqs[$index] ) || isset( $origPending[$index] ) ) {
                                                // A current or original request which was not modified
                                        } else {
-                                               // Replacement requests with pre-set responses should not execute
+                                               // Replacement request that will convert to original requests
                                                $newReplaceReqsByService[$prefix][$index] = $req;
                                        }
                                        if ( isset( $req['response'] ) ) {
@@ -231,6 +235,7 @@ class VirtualRESTServiceClient {
                                                // Original or mangled request included
                                                $executeReqs[$index] = $req;
                                        }
+                                       $checkReqIndexesByPrefix[$prefix][$index] = 1;
                                }
                        }
                        // Update index of requests to inspect for replacement
@@ -245,12 +250,12 @@ class VirtualRESTServiceClient {
                        // defer the original or to set a proxy response to the original.
                        // Any replacement requests executed above will need to be replaced
                        // with new requests (eventually the original). The responses can be
-                       // forced instead of having the request sent over the wire.
+                       // forced by setting 'response' rather than actually be sent over the wire.
                        $newReplaceReqsByService = array();
-                       foreach ( $replaceReqsByService as $prefix => $servReqs ) {
+                       foreach ( $checkReqIndexesByPrefix as $prefix => $servReqIndexes ) {
                                $service = $this->instances[$prefix];
-                               // Only the request copies stored in $doneReqs actually have the response
-                               $servReqs = array_intersect_key( $doneReqs, $servReqs );
+                               // $doneReqs actually has the requests (with 'response' set)
+                               $servReqs = array_intersect_key( $doneReqs, $servReqIndexes );
                                foreach ( $service->onResponses( $servReqs, $idFunc ) as $index => $req ) {
                                        // Services use unique IDs for replacement requests
                                        if ( isset( $servReqs[$index] ) || isset( $origPending[$index] ) ) {
index 464b723..c6fcdb0 100644 (file)
@@ -355,8 +355,10 @@ class LogFormatter {
                                $element = $this->styleRestricedElement( $element );
                        }
                } else {
-                       $performer = $this->getPerformerElement() . $this->msg( 'word-separator' )->text();
-                       $element = $performer . $this->getRestrictedElement( 'rev-deleted-event' );
+                       $sep = $this->msg( 'word-separator' );
+                       $sep = $this->plaintext ? $sep->text() : $sep->escaped();
+                       $performer = $this->getPerformerElement();
+                       $element = $performer . $sep . $this->getRestrictedElement( 'rev-deleted-event' );
                }
 
                return $element;
@@ -731,7 +733,9 @@ class LegacyLogFormatter extends LogFormatter {
 
                $performer = $this->getPerformerElement();
                if ( !$this->irctext ) {
-                       $action = $performer . $this->msg( 'word-separator' )->text() . $action;
+                       $sep = $this->msg( 'word-separator' );
+                       $sep = $this->plaintext ? $sep->text() : $sep->escaped();
+                       $action = $performer . $sep . $action;
                }
 
                return $action;
index 256934e..bf489ab 100644 (file)
@@ -323,7 +323,6 @@ class LogPager extends ReverseChronologicalPager {
        }
 
        public function getStartBody() {
-               wfProfileIn( __METHOD__ );
                # Do a link batch query
                if ( $this->getNumRows() > 0 ) {
                        $lb = new LinkBatch;
@@ -339,7 +338,6 @@ class LogPager extends ReverseChronologicalPager {
                        $lb->execute();
                        $this->mResult->seek( 0 );
                }
-               wfProfileOut( __METHOD__ );
 
                return '';
        }
index 263d37a..6763dbd 100644 (file)
@@ -40,7 +40,8 @@ class MergeLogFormatter extends LogFormatter {
                $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
                $params[2] = Message::rawParam( $oldname );
                $params[3] = Message::rawParam( $newname );
-               $params[4] = $this->context->getLanguage()->timeanddate( $params[4] );
+               $params[4] = $this->context->getLanguage()
+                       ->userTimeAndDate( $params[4], $this->context->getUser() );
                return $params;
        }
 
index 220c6b1..81c4e38 100644 (file)
@@ -205,8 +205,6 @@ class EmailNotification {
                global $wgEnotifWatchlist;
                global $wgEnotifMinorEdits, $wgEnotifUserTalk;
 
-               wfProfileIn( __METHOD__ );
-
                # The following code is only run, if several conditions are met:
                # 1. EmailNotification for pages (other than user_talk pages) must be enabled
                # 2. minor edits (changes) are only regarded if the global flag indicates so
@@ -226,7 +224,6 @@ class EmailNotification {
 
                Hooks::run( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
                if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Not a valid page status!' );
                }
 
@@ -270,7 +267,6 @@ class EmailNotification {
                }
 
                $this->sendMails();
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index d8b0ba6..52f9518 100644 (file)
@@ -71,7 +71,7 @@ class BmpHandler extends BitmapHandler {
                try {
                        $w = wfUnpack( 'V', $w, 4 );
                        $h = wfUnpack( 'V', $h, 4 );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        return false;
                }
 
index 3c23ab9..eadcf94 100644 (file)
@@ -169,10 +169,8 @@ class BitmapHandler extends TransformationalImageHandler {
                        array( $this->escapeMagickOutput( $params['dstPath'] ) ) ) );
 
                wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
-               wfProfileIn( 'convert' );
                $retval = 0;
                $err = wfShellExecWithStderr( $cmd, $retval, $env );
-               wfProfileOut( 'convert' );
 
                if ( $retval !== 0 ) {
                        $this->logErrorForExternalProcess( $retval, $err, $cmd );
@@ -204,7 +202,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                        / ( $params['srcWidth'] + $params['srcHeight'] )
                                        < $wgSharpenReductionThreshold
                                ) {
-                                       // Hack, since $wgSharpenParamater is written specifically for the command line convert
+                                       // Hack, since $wgSharpenParameter is written specifically for the command line convert
                                        list( $radius, $sigma ) = explode( 'x', $wgSharpenParameter );
                                        $im->sharpenImage( $radius, $sigma );
                                }
@@ -280,10 +278,8 @@ class BitmapHandler extends TransformationalImageHandler {
                $cmd = str_replace( '%h', wfEscapeShellArg( $params['physicalHeight'] ),
                        str_replace( '%w', wfEscapeShellArg( $params['physicalWidth'] ), $cmd ) ); # Size
                wfDebug( __METHOD__ . ": Running custom convert command $cmd\n" );
-               wfProfileIn( 'convert' );
                $retval = 0;
                $err = wfShellExecWithStderr( $cmd, $retval );
-               wfProfileOut( 'convert' );
 
                if ( $retval !== 0 ) {
                        $this->logErrorForExternalProcess( $retval, $err, $cmd );
@@ -457,10 +453,8 @@ class BitmapHandler extends TransformationalImageHandler {
                                        " -rotate " . wfEscapeShellArg( "-$rotation" ) . " " .
                                        wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
                                wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
-                               wfProfileIn( 'convert' );
                                $retval = 0;
                                $err = wfShellExecWithStderr( $cmd, $retval );
-                               wfProfileOut( 'convert' );
                                if ( $retval !== 0 ) {
                                        $this->logErrorForExternalProcess( $retval, $err, $cmd );
 
index dd41c38..bb7a1e8 100644 (file)
@@ -61,7 +61,7 @@ class BitmapMetadataHandler {
        private function doApp13( $app13 ) {
                try {
                        $this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        // Error reading the iptc hash information.
                        // This probably means the App13 segment is something other than what we expect.
                        // However, still try to read it, and treat it as if the hash didn't exist.
index daeb475..1b0eb49 100644 (file)
@@ -221,11 +221,9 @@ class DjVuHandler extends ImageHandler {
                        $cmd .= " | {$wgDjvuPostProcessor}";
                }
                $cmd .= ' > ' . wfEscapeShellArg( $dstPath ) . ') 2>&1';
-               wfProfileIn( 'ddjvu' );
                wfDebug( __METHOD__ . ": $cmd\n" );
                $retval = '';
                $err = wfShellExec( $cmd, $retval );
-               wfProfileOut( 'ddjvu' );
 
                $removed = $this->removeBadFile( $dstPath, $retval );
                if ( $retval != 0 || $removed ) {
@@ -266,6 +264,7 @@ class DjVuHandler extends ImageHandler {
         *
         * @param File $file The DjVu file in question
         * @return string XML metadata as a string.
+        * @throws MWException
         */
        private function getUnserializedMetadata( File $file ) {
                $metadata = $file->getMetadata();
@@ -312,7 +311,6 @@ class DjVuHandler extends ImageHandler {
 
                        return false;
                }
-               wfProfileIn( __METHOD__ );
 
                wfSuppressWarnings();
                try {
@@ -338,7 +336,6 @@ class DjVuHandler extends ImageHandler {
                        wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
                }
                wfRestoreWarnings();
-               wfProfileOut( __METHOD__ );
                if ( $gettext ) {
                        return $image->djvuTextTree;
                } else {
index 596d3e8..016728d 100644 (file)
@@ -269,7 +269,6 @@ class DjVuImage {
         */
        function retrieveMetaData() {
                global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
-               wfProfileIn( __METHOD__ );
 
                if ( !$this->isValid() ) {
                        return false;
@@ -278,28 +277,22 @@ class DjVuImage {
                if ( isset( $wgDjvuDump ) ) {
                        # djvudump is faster as of version 3.5
                        # http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
-                       wfProfileIn( 'djvudump' );
                        $cmd = wfEscapeShellArg( $wgDjvuDump ) . ' ' . wfEscapeShellArg( $this->mFilename );
                        $dump = wfShellExec( $cmd );
                        $xml = $this->convertDumpToXML( $dump );
-                       wfProfileOut( 'djvudump' );
                } elseif ( isset( $wgDjvuToXML ) ) {
-                       wfProfileIn( 'djvutoxml' );
                        $cmd = wfEscapeShellArg( $wgDjvuToXML ) . ' --without-anno --without-text ' .
                                wfEscapeShellArg( $this->mFilename );
                        $xml = wfShellExec( $cmd );
-                       wfProfileOut( 'djvutoxml' );
                } else {
                        $xml = null;
                }
                # Text layer
                if ( isset( $wgDjvuTxt ) ) {
-                       wfProfileIn( 'djvutxt' );
                        $cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename );
                        wfDebug( __METHOD__ . ": $cmd\n" );
                        $retval = '';
                        $txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => self::DJVUTXT_MEMORY_LIMIT ) );
-                       wfProfileOut( 'djvutxt' );
                        if ( $retval == 0 ) {
                                # Strip some control characters
                                $txt = preg_replace( "/[\013\035\037]/", "", $txt );
@@ -320,7 +313,6 @@ EOR;
                                $xml = $xml . $txt . '</mw-djvu>';
                        }
                }
-               wfProfileOut( __METHOD__ );
 
                return $xml;
        }
index 8cf95dd..e8e73af 100644 (file)
@@ -1595,11 +1595,8 @@ class FormatMetadata extends ContextSource {
        public function fetchExtendedMetadata( File $file ) {
                global $wgMemc;
 
-               wfProfileIn( __METHOD__ );
-
                // If revision deleted, exit immediately
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array();
                }
@@ -1634,8 +1631,6 @@ class FormatMetadata extends ContextSource {
                        $wgMemc->set( $cacheKey, $valueToCache, $maxCacheTime );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $extendedMetadata;
        }
 
@@ -1657,8 +1652,6 @@ class FormatMetadata extends ContextSource {
                        return $file->getExtendedMetadata() ?: array();
                }
 
-               wfProfileIn( __METHOD__ );
-
                $uploadDate = wfTimestamp( TS_ISO_8601, $file->getTimestamp() );
 
                $fileMetadata = array(
@@ -1697,8 +1690,6 @@ class FormatMetadata extends ContextSource {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $fileMetadata;
        }
 
@@ -1715,7 +1706,6 @@ class FormatMetadata extends ContextSource {
        protected function getExtendedMetadataFromHook( File $file, array $extendedMetadata,
                &$maxCacheTime
        ) {
-               wfProfileIn( __METHOD__ );
 
                Hooks::run( 'GetExtendedMetadata', array(
                        &$extendedMetadata,
@@ -1732,8 +1722,6 @@ class FormatMetadata extends ContextSource {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $extendedMetadata;
        }
 
index fbdbdfe..5463922 100644 (file)
@@ -106,7 +106,7 @@ class JpegHandler extends ExifBitmapHandler {
                        $meta['MEDIAWIKI_EXIF_VERSION'] = Exif::version();
 
                        return serialize( $meta );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        // BitmapMetadataHandler throws an exception in certain exceptional
                        // cases like if file does not exist.
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
@@ -143,10 +143,8 @@ class JpegHandler extends ExifBitmapHandler {
                                " -outfile " . wfEscapeShellArg( $params['dstPath'] ) .
                                " " . wfEscapeShellArg( $params['srcPath'] );
                        wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
-                       wfProfileIn( 'jpegtran' );
                        $retval = 0;
                        $err = wfShellExecWithStderr( $cmd, $retval );
-                       wfProfileOut( 'jpegtran' );
                        if ( $retval !== 0 ) {
                                $this->logErrorForExternalProcess( $retval, $err, $cmd );
 
index a22cd1c..1dd8519 100644 (file)
@@ -352,6 +352,11 @@ class ThumbnailImage extends MediaTransformOutput {
 
                $query = isset( $options['desc-query'] ) ? $options['desc-query'] : '';
 
+               $attribs = array(
+                       'alt' => $alt,
+                       'src' => $this->url,
+               );
+
                if ( !empty( $options['custom-url-link'] ) ) {
                        $linkAttribs = array( 'href' => $options['custom-url-link'] );
                        if ( !empty( $options['title'] ) ) {
@@ -381,13 +386,11 @@ class ThumbnailImage extends MediaTransformOutput {
                        $linkAttribs = array( 'href' => $this->file->getURL() );
                } else {
                        $linkAttribs = false;
+                       if ( !empty( $options['title'] ) ) {
+                               $attribs['title'] = $options['title'];
+                       }
                }
 
-               $attribs = array(
-                       'alt' => $alt,
-                       'src' => $this->url,
-               );
-
                if ( empty( $options['no-dimensions'] ) ) {
                        $attribs['width'] = $this->width;
                        $attribs['height'] = $this->height;
@@ -474,3 +477,24 @@ class TransformParameterError extends MediaTransformError {
                        wfMessage( 'thumbnail_invalid_params' )->text() );
        }
 }
+
+/**
+ * Shortcut class for parameter file size errors
+ *
+ * @ingroup Media
+ * @since 1.25
+ */
+class TransformTooBigImageAreaError extends MediaTransformError {
+       function __construct( $params, $maxImageArea ) {
+               $msg = wfMessage( 'thumbnail_toobigimagearea' );
+
+               parent::__construct( 'thumbnail_error',
+                       max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
+                       max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
+                       $msg->rawParams(
+                               $msg->getLanguage()->formatComputingNumbers(
+                                       $maxImageArea, 1000, "size-$1pixel" )
+                               )->text()
+                       );
+       }
+}
index 74e5e04..53abfef 100644 (file)
@@ -272,10 +272,8 @@ class SvgHandler extends ImageHandler {
                                        $env['LANG'] = $lang;
                                }
 
-                               wfProfileIn( 'rsvg' );
                                wfDebug( __METHOD__ . ": $cmd\n" );
                                $err = wfShellExecWithStderr( $cmd, $retval, $env );
-                               wfProfileOut( 'rsvg' );
                        }
                }
                $removed = $this->removeBadFile( $dstPath, $retval );
@@ -364,7 +362,7 @@ class SvgHandler extends ImageHandler {
                $metadata = array( 'version' => self::SVG_METADATA_VERSION );
                try {
                        $metadata += SVGMetadataExtractor::getMetadata( $filename );
-               } catch ( MWException $e ) { // @todo SVG specific exceptions
+               } catch ( Exception $e ) { // @todo SVG specific exceptions
                        // File not found, broken, etc.
                        $metadata['error'] = array(
                                'message' => $e->getMessage(),
index 2a1091d..2037c33 100644 (file)
@@ -138,7 +138,7 @@ class SVGReader {
                $keepReading = $this->reader->read();
 
                /* Skip until first element */
-               while ( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
+               while ( $keepReading && $this->reader->nodeType != XMLReader::ELEMENT ) {
                        $keepReading = $this->reader->read();
                }
 
@@ -158,7 +158,7 @@ class SVGReader {
 
                        $this->debug( "$tag" );
 
-                       if ( $isSVG && $tag == 'svg' && $type == XmlReader::END_ELEMENT
+                       if ( $isSVG && $tag == 'svg' && $type == XMLReader::END_ELEMENT
                                && $this->reader->depth <= $exitDepth
                        ) {
                                break;
@@ -166,7 +166,7 @@ class SVGReader {
                                $this->readField( $tag, 'title' );
                        } elseif ( $isSVG && $tag == 'desc' ) {
                                $this->readField( $tag, 'description' );
-                       } elseif ( $isSVG && $tag == 'metadata' && $type == XmlReader::ELEMENT ) {
+                       } elseif ( $isSVG && $tag == 'metadata' && $type == XMLReader::ELEMENT ) {
                                $this->readXml( $tag, 'metadata' );
                        } elseif ( $isSVG && $tag == 'script' ) {
                                // We normally do not allow scripted svgs.
@@ -199,17 +199,17 @@ class SVGReader {
         */
        private function readField( $name, $metafield = null ) {
                $this->debug( "Read field $metafield" );
-               if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+               if ( !$metafield || $this->reader->nodeType != XMLReader::ELEMENT ) {
                        return;
                }
                $keepReading = $this->reader->read();
                while ( $keepReading ) {
                        if ( $this->reader->localName == $name
                                && $this->reader->namespaceURI == self::NS_SVG
-                               && $this->reader->nodeType == XmlReader::END_ELEMENT
+                               && $this->reader->nodeType == XMLReader::END_ELEMENT
                        ) {
                                break;
-                       } elseif ( $this->reader->nodeType == XmlReader::TEXT ) {
+                       } elseif ( $this->reader->nodeType == XMLReader::TEXT ) {
                                $this->metadata[$metafield] = trim( $this->reader->value );
                        }
                        $keepReading = $this->reader->read();
@@ -224,7 +224,7 @@ class SVGReader {
         */
        private function readXml( $metafield = null ) {
                $this->debug( "Read top level metadata" );
-               if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+               if ( !$metafield || $this->reader->nodeType != XMLReader::ELEMENT ) {
                        return;
                }
                // @todo Find and store type of xml snippet. metadata['metadataType'] = "rdf"
@@ -246,7 +246,7 @@ class SVGReader {
         */
        private function animateFilterAndLang( $name ) {
                $this->debug( "animate filter for tag $name" );
-               if ( $this->reader->nodeType != XmlReader::ELEMENT ) {
+               if ( $this->reader->nodeType != XMLReader::ELEMENT ) {
                        return;
                }
                if ( $this->reader->isEmptyElement ) {
@@ -256,11 +256,11 @@ class SVGReader {
                $keepReading = $this->reader->read();
                while ( $keepReading ) {
                        if ( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
-                               && $this->reader->nodeType == XmlReader::END_ELEMENT
+                               && $this->reader->nodeType == XMLReader::END_ELEMENT
                        ) {
                                break;
                        } elseif ( $this->reader->namespaceURI == self::NS_SVG
-                               && $this->reader->nodeType == XmlReader::ELEMENT
+                               && $this->reader->nodeType == XMLReader::ELEMENT
                        ) {
 
                                $sysLang = $this->reader->getAttribute( 'systemLanguage' );
index bea6cab..750528f 100644 (file)
@@ -88,7 +88,7 @@ class TiffHandler extends ExifBitmapHandler {
                                $meta['MEDIAWIKI_EXIF_VERSION'] = Exif::version();
 
                                return serialize( $meta );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // BitmapMetadataHandler throws an exception in certain exceptional
                                // cases like if file does not exist.
                                wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
index 5b9982d..fd8d81d 100644 (file)
@@ -61,29 +61,6 @@ abstract class TransformationalImageHandler extends ImageHandler {
                        }
                }
 
-               # Check if the file is smaller than the maximum image area for thumbnailing
-               # For historical reasons, hook starts with BitmapHandler
-               $checkImageAreaHookResult = null;
-               Hooks::run(
-                       'BitmapHandlerCheckImageArea',
-                       array( $image, &$params, &$checkImageAreaHookResult )
-               );
-
-               if ( is_null( $checkImageAreaHookResult ) ) {
-                       global $wgMaxImageArea;
-
-                       if ( $srcWidth * $srcHeight > $wgMaxImageArea
-                               && !( $image->getMimeType() == 'image/jpeg'
-                                       && $this->getScalerType( false, false ) == 'im' )
-                       ) {
-                               # Only ImageMagick can efficiently downsize jpg images without loading
-                               # the entire file in memory
-                               return false;
-                       }
-               } else {
-                       return $checkImageAreaHookResult;
-               }
-
                return true;
        }
 
@@ -190,6 +167,11 @@ abstract class TransformationalImageHandler extends ImageHandler {
                        return $this->getClientScalingThumbnailImage( $image, $scalerParams );
                }
 
+               if ( !$this->isImageAreaOkForThumbnaling( $image, $params ) ) {
+                       global $wgMaxImageArea;
+                       return new TransformTooBigImageAreaError( $params, $wgMaxImageArea );
+               }
+
                if ( $flags & self::TRANSFORM_LATER ) {
                        wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
                        $newParams = array(
@@ -596,4 +578,43 @@ abstract class TransformationalImageHandler extends ImageHandler {
        public function mustRender( $file ) {
                return $this->canRotate() && $this->getRotation( $file ) != 0;
        }
+
+       /**
+        * Check if the file is smaller than the maximum image area for thumbnailing.
+        *
+        * Runs the 'BitmapHandlerCheckImageArea' hook.
+        *
+        * @param File $file
+        * @param array $params
+        * @return bool
+        * @since 1.25
+        */
+       public function isImageAreaOkForThumbnaling( $file, &$params ) {
+               global $wgMaxImageArea;
+
+               # For historical reasons, hook starts with BitmapHandler
+               $checkImageAreaHookResult = null;
+               Hooks::run(
+                       'BitmapHandlerCheckImageArea',
+                       array( $file, &$params, &$checkImageAreaHookResult )
+               );
+
+               if ( !is_null( $checkImageAreaHookResult ) ) {
+                       // was set by hook, so return that value
+                       return (bool)$checkImageAreaHookResult;
+               }
+
+               $srcWidth = $file->getWidth( $params['page'] );
+               $srcHeight = $file->getHeight( $params['page'] );
+
+               if ( $srcWidth * $srcHeight > $wgMaxImageArea
+                       && !( $file->getMimeType() == 'image/jpeg'
+                               && $this->getScalerType( false, false ) == 'im' )
+               ) {
+                       # Only ImageMagick can efficiently downsize jpg images without loading
+                       # the entire file in memory
+                       return false;
+               }
+               return true;
+       }
 }
index 48b7a47..6544d5c 100644 (file)
@@ -130,7 +130,7 @@ class XCFHandler extends BitmapHandler {
                                        "/Nbase_type", # /
                                $binaryHeader
                        );
-               } catch ( MWException $mwe ) {
+               } catch ( Exception $mwe ) {
                        return false;
                }
 
index 5b46af1..0d341aa 100644 (file)
@@ -316,7 +316,7 @@ class XMPReader {
                                $this->results = array(); // blank if error.
                                return false;
                        }
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        wfDebugLog( 'XMP', 'XMP parse error: ' . $e );
                        $this->results = array();
 
index 0f718d2..fa70c63 100644 (file)
@@ -29,7 +29,7 @@ have been changed or you remove it.
 == Testing ==
 
 'make test' will run the conformance test (UtfNormalTest.php), fetching the
-data from from the net if necessary. If it reports failure, something is
+data from the net if necessary. If it reports failure, something is
 going wrong!
 
 You may have to set up PHPUnit first.
index 4cbb32d..d879ca8 100644 (file)
@@ -70,6 +70,7 @@ class APCBagOStuff extends BagOStuff {
         * @param mixed $value
         * @param int $exptime
         * @return bool
+        * @throws MWException
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
                // APC's CAS functions only work on integers
index 41eebfb..1e04d45 100644 (file)
@@ -413,7 +413,6 @@ class MWMemcached {
         * @return mixed
         */
        public function get( $key, &$casToken = null ) {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->_debug ) {
                        $this->_debugprint( "get($key)\n" );
@@ -421,19 +420,16 @@ class MWMemcached {
 
                if ( !is_array( $key ) && strval( $key ) === '' ) {
                        $this->_debugprint( "Skipping key which equals to an empty string" );
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
                if ( !$this->_active ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
                $sock = $this->get_sock( $key );
 
                if ( !is_resource( $sock ) ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -446,7 +442,6 @@ class MWMemcached {
 
                $cmd = "gets $key\r\n";
                if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -463,7 +458,6 @@ class MWMemcached {
                if ( isset( $val[$key] ) ) {
                        $value = $val[$key];
                }
-               wfProfileOut( __METHOD__ );
                return $value;
        }
 
index c853bcf..7c0a645 100644 (file)
@@ -43,6 +43,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         *                          values, but serialization is much slower unless the php.ini option
         *                          igbinary.compact_strings is off.
         * @param array $params
+        * @throws MWException
         */
        function __construct( $params ) {
                $params = $this->applyDefaultParams( $params );
@@ -119,11 +120,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return mixed
         */
        public function get( $key, &$casToken = null ) {
-               wfProfileIn( __METHOD__ );
                $this->debugLog( "get($key)" );
                $result = $this->client->get( $this->encodeKey( $key ), null, $casToken );
                $result = $this->checkResult( $key, $result );
-               wfProfileOut( __METHOD__ );
                return $result;
        }
 
@@ -242,11 +241,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return array
         */
        public function getMulti( array $keys ) {
-               wfProfileIn( __METHOD__ );
                $this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
                $callback = array( $this, 'encodeKey' );
                $result = $this->client->getMulti( array_map( $callback, $keys ) );
-               wfProfileOut( __METHOD__ );
                $result = $result ?: array(); // must be an array
                return $this->checkResult( false, $result );
        }
@@ -257,7 +254,6 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $exptime = 0 ) {
-               wfProfileIn( __METHOD__ );
                foreach ( $data as $key => $value ) {
                        $encKey = $this->encodeKey( $key );
                        if ( $encKey !== $key ) {
@@ -267,7 +263,6 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                }
                $this->debugLog( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
                $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
-               wfProfileOut( __METHOD__ );
                return $this->checkResult( false, $result );
        }
 }
index c2a4a27..04ed894 100644 (file)
@@ -81,6 +81,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @param mixed $value
         * @param mixed $exptime
         * @return bool
+        * @throws MWException
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
                throw new MWException( "CAS is not implemented in " . __CLASS__ );
index 633b34a..62856f9 100644 (file)
@@ -135,7 +135,7 @@ class ObjectCache {
                } elseif ( function_exists( 'wincache_ucache_get' ) ) {
                        $id = 'wincache';
                } else {
-                       if ( $fallback ) {
+                       if ( $fallback !== null ) {
                                return self::newFromId( $fallback );
                        }
                        throw new MWException( "CACHE_ACCEL requested but no suitable object " .
index ae8cc5b..6836f74 100644 (file)
@@ -73,7 +73,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function get( $key, &$casToken = null ) {
-               $section = new ProfileSection( __METHOD__ );
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -93,7 +92,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function set( $key, $value, $expiry = 0 ) {
-               $section = new ProfileSection( __METHOD__ );
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -117,7 +115,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function cas( $casToken, $key, $value, $expiry = 0 ) {
-               $section = new ProfileSection( __METHOD__ );
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -151,7 +148,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function delete( $key, $time = 0 ) {
-               $section = new ProfileSection( __METHOD__ );
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -171,7 +167,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function getMulti( array $keys ) {
-               $section = new ProfileSection( __METHOD__ );
 
                $batches = array();
                $conns = array();
@@ -217,7 +212,6 @@ class RedisBagOStuff extends BagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $expiry = 0 ) {
-               $section = new ProfileSection( __METHOD__ );
 
                $batches = array();
                $conns = array();
@@ -265,7 +259,6 @@ class RedisBagOStuff extends BagOStuff {
 
 
        public function add( $key, $value, $expiry = 0 ) {
-               $section = new ProfileSection( __METHOD__ );
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -303,7 +296,6 @@ class RedisBagOStuff extends BagOStuff {
         * @return int|bool New value or false on failure
         */
        public function incr( $key, $value = 1 ) {
-               $section = new ProfileSection( __METHOD__ );
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
index 3585e57..7524240 100644 (file)
@@ -118,6 +118,7 @@ class SqlBagOStuff extends BagOStuff {
         *
         * @param int $serverIndex
         * @return DatabaseBase
+        * @throws MWException
         */
        protected function getDB( $serverIndex ) {
                global $wgDebugDBTransactions;
index 8e2a160..d7603b1 100644 (file)
@@ -74,6 +74,7 @@ class XCacheBagOStuff extends BagOStuff {
         * @param mixed $value
         * @param int $exptime
         * @return bool
+        * @throws MWException
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
                // Can't find any documentation on xcache cas
index 0318f65..0fc251e 100644 (file)
@@ -226,7 +226,6 @@ class Article implements Page {
         * @since 1.21
         */
        protected function getContentObject() {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->mPage->getID() === 0 ) {
                        # If this is a MediaWiki:x message, then load the messages
@@ -247,7 +246,6 @@ class Article implements Page {
                        $content = $this->mContentObject;
                }
 
-               wfProfileOut( __METHOD__ );
                return $content;
        }
 
@@ -344,12 +342,9 @@ class Article implements Page {
                        return $this->mContent;
                }
 
-               wfProfileIn( __METHOD__ );
-
                $content = $this->fetchContentObject();
 
                if ( !$content ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -357,8 +352,6 @@ class Article implements Page {
                $this->mContent = ContentHandler::getContentText( $content );
                ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
 
-               wfProfileOut( __METHOD__ );
-
                return $this->mContent;
        }
 
@@ -379,8 +372,6 @@ class Article implements Page {
                        return $this->mContentObject;
                }
 
-               wfProfileIn( __METHOD__ );
-
                $this->mContentLoaded = true;
                $this->mContent = null;
 
@@ -397,7 +388,6 @@ class Article implements Page {
                                $this->mRevision = Revision::newFromId( $oldid );
                                if ( !$this->mRevision ) {
                                        wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
-                                       wfProfileOut( __METHOD__ );
                                        return false;
                                }
                        }
@@ -405,7 +395,6 @@ class Article implements Page {
                        if ( !$this->mPage->getLatest() ) {
                                wfDebug( __METHOD__ . " failed to find page data for title " .
                                        $this->getTitle()->getPrefixedText() . "\n" );
-                               wfProfileOut( __METHOD__ );
                                return false;
                        }
 
@@ -414,7 +403,6 @@ class Article implements Page {
                        if ( !$this->mRevision ) {
                                wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
                                        $this->mPage->getLatest() . "\n" );
-                               wfProfileOut( __METHOD__ );
                                return false;
                        }
                }
@@ -422,16 +410,22 @@ class Article implements Page {
                // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
                // We should instead work with the Revision object when we need it...
                // Loads if user is allowed
-               $this->mContentObject = $this->mRevision->getContent(
+               $content = $this->mRevision->getContent(
                        Revision::FOR_THIS_USER,
                        $this->getContext()->getUser()
                );
+
+               if ( !$content ) {
+                       wfDebug( __METHOD__ . " failed to retrieve content of revision " .
+                               $this->mRevision->getId() . "\n" );
+                       return false;
+               }
+
+               $this->mContentObject = $content;
                $this->mRevIdFetched = $this->mRevision->getId();
 
                Hooks::run( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
 
-               wfProfileOut( __METHOD__ );
-
                return $this->mContentObject;
        }
 
@@ -482,8 +476,6 @@ class Article implements Page {
        public function view() {
                global $wgUseFileCache, $wgUseETag, $wgDebugToolbar, $wgMaxRedirects;
 
-               wfProfileIn( __METHOD__ );
-
                # Get variables from query string
                # As side effect this will load the revision and update the title
                # in a revision ID is passed in the request, so this should remain
@@ -495,7 +487,6 @@ class Article implements Page {
                $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
                if ( count( $permErrors ) ) {
                        wfDebug( __METHOD__ . ": denied on secondary read check\n" );
-                       wfProfileOut( __METHOD__ );
                        throw new PermissionsError( 'read', $permErrors );
                }
 
@@ -504,7 +495,6 @@ class Article implements Page {
                if ( $this->mRedirectUrl ) {
                        $outputPage->redirect( $this->mRedirectUrl );
                        wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -513,7 +503,6 @@ class Article implements Page {
                if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
                        wfDebug( __METHOD__ . ": showing diff page\n" );
                        $this->showDiffPage();
-                       wfProfileOut( __METHOD__ );
 
                        return;
                }
@@ -568,7 +557,6 @@ class Article implements Page {
                        # Is it client cached?
                        if ( $outputPage->checkLastModified( $timestamp ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
-                               wfProfileOut( __METHOD__ );
 
                                return;
                        # Try file cache
@@ -577,7 +565,6 @@ class Article implements Page {
                                # tell wgOut that output is taken care of
                                $outputPage->disable();
                                $this->mPage->doViewUpdates( $user, $oldid );
-                               wfProfileOut( __METHOD__ );
 
                                return;
                        }
@@ -610,7 +597,6 @@ class Article implements Page {
                                                wfDebug( __METHOD__ . ": showing missing article\n" );
                                                $this->showMissingArticle();
                                                $this->mPage->doViewUpdates( $user );
-                                               wfProfileOut( __METHOD__ );
                                                return;
                                        }
 
@@ -649,7 +635,6 @@ class Article implements Page {
 
                                                if ( !$this->showDeletedRevisionHeader() ) {
                                                        wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
-                                                       wfProfileOut( __METHOD__ );
                                                        return;
                                                }
                                        }
@@ -696,7 +681,6 @@ class Article implements Page {
                                                        $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
                                                }
                                                # Connection or timeout error
-                                               wfProfileOut( __METHOD__ );
                                                return;
                                        }
 
@@ -755,7 +739,6 @@ class Article implements Page {
 
                $outputPage->addModules( 'mediawiki.action.view.postEdit' );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -835,7 +818,7 @@ class Article implements Page {
 
                if ( $showCacheHint ) {
                        $dir = $this->getContext()->getLanguage()->getDir();
-                       $lang = $this->getContext()->getLanguage()->getCode();
+                       $lang = $this->getContext()->getLanguage()->getHtmlCode();
 
                        $outputPage->wrapWikiMsg(
                                "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
@@ -1100,8 +1083,6 @@ class Article implements Page {
                        return false;
                }
 
-               wfProfileIn( __METHOD__ );
-
                // New page patrol: Get the timestamp of the oldest revison which
                // the revision table holds for the given page. Then we look
                // whether it's within the RC lifespan and if it is, we try
@@ -1110,7 +1091,6 @@ class Article implements Page {
 
                // Check for cached results
                if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -1119,7 +1099,6 @@ class Article implements Page {
                ) {
                        // The current revision is already older than what could be in the RC table
                        // 6h tolerance because the RC might not be cleaned out regularly
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -1155,14 +1134,12 @@ class Article implements Page {
                        // Don't cache in case we can patrol as this could change
                        $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
 
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
-               if ( $rc->getPerformer()->getName() == $user->getName() ) {
+               if ( $rc->getPerformer()->equals( $user ) ) {
                        // Don't show a patrol link for own creations. If the user could
                        // patrol them, they already would be patrolled
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -1192,7 +1169,6 @@ class Article implements Page {
                        '</div>'
                );
 
-               wfProfileOut( __METHOD__ );
                return true;
        }
 
@@ -1559,7 +1535,8 @@ class Article implements Page {
                # This code desperately needs to be totally rewritten
 
                $title = $this->getTitle();
-               $user = $this->getContext()->getUser();
+               $context = $this->getContext();
+               $user = $context->getUser();
 
                # Check permissions
                $permissionErrors = $title->getUserPermissionsErrors( 'delete', $user );
@@ -1576,8 +1553,8 @@ class Article implements Page {
                $this->mPage->loadPageData( 'fromdbmaster' );
                if ( !$this->mPage->exists() ) {
                        $deleteLogPage = new LogPage( 'delete' );
-                       $outputPage = $this->getContext()->getOutput();
-                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+                       $outputPage = $context->getOutput();
+                       $outputPage->setPageTitle( $context->msg( 'cannotdelete-title', $title->getPrefixedText() ) );
                        $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
                                );
@@ -1593,7 +1570,7 @@ class Article implements Page {
                        return;
                }
 
-               $request = $this->getContext()->getRequest();
+               $request = $context->getRequest();
                $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
                $deleteReason = $request->getText( 'wpReason' );
 
@@ -1625,7 +1602,7 @@ class Article implements Page {
                if ( !$reason ) {
                        try {
                                $reason = $this->generateReason( $hasHistory );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                # if a page is horribly broken, we still want to be able to
                                # delete it. So be lenient about errors here.
                                wfDebug( "Error while building auto delete summary: $e" );
@@ -1651,11 +1628,11 @@ class Article implements Page {
                        );
 
                        // @todo FIXME: i18n issue/patchwork message
-                       $this->getContext()->getOutput()->addHTML(
+                       $context->getOutput()->addHTML(
                                '<strong class="mw-delete-warning-revisions">' .
-                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
-                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
-                                       wfMessage( 'history' )->escaped(),
+                               $context->msg( 'historywarning' )->numParams( $revisions )->parse() .
+                               $context->msg( 'word-separator' )->escaped() . Linker::linkKnown( $title,
+                                       $context->msg( 'history' )->escaped(),
                                        array( 'rel' => 'archives' ),
                                        array( 'action' => 'history' ) ) .
                                '</strong>'
@@ -1663,10 +1640,10 @@ class Article implements Page {
 
                        if ( $title->isBigDeletion() ) {
                                global $wgDeleteRevisionsLimit;
-                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+                               $context->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
                                        array(
                                                'delete-warning-toobig',
-                                               $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
+                                               $context->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
                                        )
                                );
                        }
index b9f99c8..b8f67c2 100644 (file)
@@ -175,7 +175,7 @@ class ImagePage extends Article {
 
                # Show shared description, if needed
                if ( $this->mExtraDescription ) {
-                       $fol = wfMessage( 'shareddescriptionfollows' );
+                       $fol = $this->getContext()->msg( 'shareddescriptionfollows' );
                        if ( !$fol->isDisabled() ) {
                                $out->addWikiText( $fol->plain() );
                        }
@@ -188,7 +188,7 @@ class ImagePage extends Article {
 
                $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
-                       wfMessage( 'imagelinks' )->text() ) . "\n" );
+                               $this->getContext()->msg( 'imagelinks' )->text() ) . "\n" );
                $this->imageDupes();
                # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
                # Yet we return metadata about the target. Definitely an issue in the FileRepo
@@ -205,7 +205,7 @@ class ImagePage extends Article {
                        $out->addHTML( Xml::element(
                                'h2',
                                array( 'id' => 'metadata' ),
-                               wfMessage( 'metadata' )->text() ) . "\n" );
+                                       $this->getContext()->msg( 'metadata' )->text() ) . "\n" );
                        $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
                        $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
@@ -237,16 +237,17 @@ class ImagePage extends Article {
         */
        protected function showTOC( $metadata ) {
                $r = array(
-                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
+                       '<li><a href="#file">' . $this->getContext()->msg( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . $this->getContext()->msg( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . $this->getContext()->msg( 'imagelinks' )->escaped() . '</a></li>',
                );
-               if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
-               }
 
                Hooks::run( 'ImagePageShowTOC', array( $this, &$r ) );
 
+               if ( $metadata ) {
+                       $r[] = '<li><a href="#metadata">' . $this->getContext()->msg( 'metadata' )->escaped() . '</a></li>';
+               }
+
                return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
        }
 
@@ -260,7 +261,7 @@ class ImagePage extends Article {
         */
        protected function makeMetadataTable( $metadata ) {
                $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMessage( 'metadata-help' )->plain();
+               $r .= $this->getContext()->msg( 'metadata-help' )->plain();
                $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
                foreach ( $metadata as $type => $stuff ) {
                        foreach ( $stuff as $v ) {
@@ -341,14 +342,14 @@ class ImagePage extends Article {
                        if ( $this->displayImg->allowInlineDisplay() ) {
                                # image
                                # "Download high res version" link below the image
-                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+                               # $msgsize = $this->getContext()->msg( 'file-info-size', $width_orig, $height_orig,
                                #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight || $this->displayImg->isVectorized() ) {
                                        list( $width, $height ) = $this->getDisplayWidthHeight(
                                                $maxWidth, $maxHeight, $width, $height
                                        );
-                                       $linktext = wfMessage( 'show-big-image' )->escaped();
+                                       $linktext = $this->getContext()->msg( 'show-big-image' )->escaped();
 
                                        $thumbSizes = $this->getThumbSizes( $width, $height, $width_orig, $height_orig );
                                        # Generate thumbnails or thumbnail links as needed...
@@ -377,14 +378,14 @@ class ImagePage extends Article {
                                        $msgsmall = '';
                                        $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
                                        if ( $sizeLinkBigImagePreview ) {
-                                               $msgsmall .= wfMessage( 'show-big-image-preview' )->
+                                               $msgsmall .= $this->getContext()->msg( 'show-big-image-preview' )->
                                                        rawParams( $sizeLinkBigImagePreview )->
                                                        parse();
                                        }
                                        if ( count( $otherSizes ) ) {
                                                $msgsmall .= ' ' .
                                                Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
+                                                       $this->getContext()->msg( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
                                                        params( count( $otherSizes ) )->parse()
                                                );
                                        }
@@ -394,7 +395,7 @@ class ImagePage extends Article {
                                        $msgsmall = '';
                                } else {
                                        # Image is small enough to show full size on image page
-                                       $msgsmall = wfMessage( 'file-nohires' )->parse();
+                                       $msgsmall = $this->getContext()->msg( 'file-nohires' )->parse();
                                }
 
                                $params['width'] = $width;
@@ -428,7 +429,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+                                               $label = $out->parse( $this->getContext()->msg( 'imgmultipageprev' )->text(), false );
                                                // on the client side, this link is generated in ajaxifyPageNavigation()
                                                // in the mediawiki.page.image.pagination module
                                                $link = Linker::linkKnown(
@@ -450,7 +451,7 @@ class ImagePage extends Article {
                                        }
 
                                        if ( $page < $count ) {
-                                               $label = wfMessage( 'imgmultipagenext' )->text();
+                                               $label = $this->getContext()->msg( 'imgmultipagenext' )->text();
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -487,8 +488,8 @@ class ImagePage extends Article {
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
-                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
+                                               $this->getContext()->msg( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( $this->getContext()->msg( 'imgmultigo' )->text() ) .
                                                Xml::closeElement( 'form' ) .
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
                                        );
@@ -502,12 +503,12 @@ class ImagePage extends Article {
                                        "</div>\n" );
                        }
 
-                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+                       $longDesc = $this->getContext()->msg( 'parentheses', $this->displayImg->getLongDesc() )->text();
 
                        $medialink = "[[Media:$filename|$linktext]]";
 
                        if ( !$this->displayImg->isSafeFile() ) {
-                               $warning = wfMessage( 'mediawarning' )->plain();
+                               $warning = $this->getContext()->msg( 'mediawarning' )->plain();
                                // dirmark is needed here to separate the file name, which
                                // most likely ends in Latin characters, from the description,
                                // which may begin with the file type. In RTL environment
@@ -619,7 +620,7 @@ EOT
                        return Html::rawElement( 'a', array(
                                'href' => $thumbnail->getUrl(),
                                'class' => 'mw-thumbnail-link'
-                               ), wfMessage( 'show-big-image-size' )->numParams(
+                               ), $this->getContext()->msg( 'show-big-image-size' )->numParams(
                                        $thumbnail->getWidth(), $thumbnail->getHeight()
                                )->parse() );
                } else {
@@ -645,9 +646,9 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
+               if ( $descUrl && $descText && $this->getContext()->msg( 'sharedupload-desc-here' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
+               } elseif ( $descUrl && $this->getContext()->msg( 'sharedupload-desc-there' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -694,7 +695,7 @@ EOT
                ) {
                        $ulink = Linker::makeExternalLink(
                                $this->getUploadUrl(),
-                               wfMessage( 'uploadnewversion-linktext' )->text()
+                               $this->getContext()->msg( 'uploadnewversion-linktext' )->text()
                        );
                        $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
                                . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
@@ -832,7 +833,7 @@ EOT
                                $liContents = $link;
                        } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
                                # Redirect without usages
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
                        } else {
                                # Redirect with usages
                                $li = '';
@@ -855,7 +856,7 @@ EOT
                                        array( 'class' => 'mw-imagepage-redirectstofile' ),
                                        $li
                                        ) . "\n";
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
+                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )->rawParams(
                                        $link, $ul )->parse();
                        }
                        $out->addHTML( Html::rawElement(
@@ -901,7 +902,7 @@ EOT
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+                               $fromSrc = $this->getContext()->msg( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
@@ -930,7 +931,7 @@ EOT
         */
        function showError( $description ) {
                $out = $this->getContext()->getOutput();
-               $out->setPageTitle( wfMessage( 'internalerror' ) );
+               $out->setPageTitle( $this->getContext()->msg( 'internalerror' ) );
                $out->setRobotPolicy( 'noindex,nofollow' );
                $out->setArticleRelated( false );
                $out->enableClientCache( false );
@@ -1008,7 +1009,7 @@ EOT
                        $code = wfBCP47( $lang );
                        $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
                        if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $code, $name )->text();
+                               $display = $this->getContext()->msg( 'img-lang-opt', $code, $name )->text();
                        } else {
                                $display = $code;
                        }
@@ -1024,7 +1025,7 @@ EOT
                        // Its hard to know if the content is really in the default language, or
                        // if its just unmarked content that could be in any language.
                        $opts = Xml::option(
-                               wfMessage( 'img-lang-default' )->text(),
+                                       $this->getContext()->msg( 'img-lang-default' )->text(),
                                $defaultLang,
                                $defaultLang === $curLang
                        ) . $opts;
@@ -1032,7 +1033,7 @@ EOT
                if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
                        $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
                        if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
+                               $display = $this->getContext()->msg( 'img-lang-opt', $curLang, $name )->text();
                        } else {
                                $display = $curLang;
                        }
@@ -1044,9 +1045,9 @@ EOT
                        array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
                        $opts
                );
-               $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
+               $submit = Xml::submitButton( $this->getContext()->msg( 'img-lang-go' )->text() );
 
-               $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
+               $formContents = $this->getContext()->msg( 'img-lang-info' )->rawParams( $select, $submit )->parse()
                        . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
 
                $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
index b9f7eda..9b98592 100644 (file)
@@ -50,7 +50,7 @@ class WikiPage implements Page, IDBAccessObject {
        public $mLatest = false;             // !< Integer (false means "not loaded")
        /**@}}*/
 
-       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
+       /** @var stdClass Map of cache fields (text, parser output, ect) for a proposed/new edit */
        public $mPreparedEdit = false;
 
        /**
@@ -395,7 +395,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string|int $from One of the following:
         *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
+        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from
         *          the master DB using SELECT FOR UPDATE
         */
        public function loadFromRow( $data, $from ) {
@@ -557,7 +557,6 @@ class WikiPage implements Page, IDBAccessObject {
         * @return Revision|null
         */
        public function getOldestRevision() {
-               wfProfileIn( __METHOD__ );
 
                // Try using the slave database first, then try the master
                $continue = 2;
@@ -588,7 +587,6 @@ class WikiPage implements Page, IDBAccessObject {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $row ? Revision::newFromRow( $row ) : null;
        }
 
@@ -975,7 +973,7 @@ class WikiPage implements Page, IDBAccessObject {
                                $source = $this->mTitle->getFullURL( 'redirect=no' );
                                return $rt->getFullURL( array( 'rdfrom' => $source ) );
                        } else {
-                               // External pages pages without "local" bit set are not valid
+                               // External pages without "local" bit set are not valid
                                // redirect targets
                                return false;
                        }
@@ -1055,7 +1053,6 @@ class WikiPage implements Page, IDBAccessObject {
         * @return array Array of authors, duplicates not removed
         */
        public function getLastNAuthors( $num, $revLatest = 0 ) {
-               wfProfileIn( __METHOD__ );
                // First try the slave
                // If that doesn't have the latest revision, try the master
                $continue = 2;
@@ -1076,7 +1073,6 @@ class WikiPage implements Page, IDBAccessObject {
                        );
 
                        if ( !$res ) {
-                               wfProfileOut( __METHOD__ );
                                return array();
                        }
 
@@ -1096,7 +1092,6 @@ class WikiPage implements Page, IDBAccessObject {
                        $authors[] = $row->rev_user_text;
                }
 
-               wfProfileOut( __METHOD__ );
                return $authors;
        }
 
@@ -1129,7 +1124,6 @@ class WikiPage implements Page, IDBAccessObject {
         * @return ParserOutput|bool ParserOutput or false if the revision was not found
         */
        public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
-               wfProfileIn( __METHOD__ );
 
                $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
                wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
@@ -1140,7 +1134,6 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $useParserCache ) {
                        $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
                        if ( $parserOutput !== false ) {
-                               wfProfileOut( __METHOD__ );
                                return $parserOutput;
                        }
                }
@@ -1152,8 +1145,6 @@ class WikiPage implements Page, IDBAccessObject {
                $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
                $pool->execute();
 
-               wfProfileOut( __METHOD__ );
-
                return $pool->getParserOutput();
        }
 
@@ -1228,7 +1219,6 @@ class WikiPage implements Page, IDBAccessObject {
         * @return int The newly created page_id key, or false if the title already existed
         */
        public function insertOn( $dbw ) {
-               wfProfileIn( __METHOD__ );
 
                $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
                $dbw->insert( 'page', array(
@@ -1251,7 +1241,6 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
                }
-               wfProfileOut( __METHOD__ );
 
                return $affected ? $newid : false;
        }
@@ -1274,8 +1263,6 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                global $wgContentHandlerUseDB;
 
-               wfProfileIn( __METHOD__ );
-
                $content = $revision->getContent();
                $len = $content ? $content->getSize() : 0;
                $rt = $content ? $content->getUltimateRedirectTarget() : null;
@@ -1317,7 +1304,6 @@ class WikiPage implements Page, IDBAccessObject {
                                                                                                        $this->mLatest, $revision->getContentModel() );
                }
 
-               wfProfileOut( __METHOD__ );
                return $result;
        }
 
@@ -1342,7 +1328,6 @@ class WikiPage implements Page, IDBAccessObject {
                        return true;
                }
 
-               wfProfileIn( __METHOD__ );
                if ( $isRedirect ) {
                        $this->insertRedirectEntry( $redirectTitle );
                } else {
@@ -1354,7 +1339,6 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $this->getTitle()->getNamespace() == NS_FILE ) {
                        RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
                }
-               wfProfileOut( __METHOD__ );
 
                return ( $dbw->affectedRows() != 0 );
        }
@@ -1370,7 +1354,6 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function updateIfNewerOn( $dbw, $revision ) {
-               wfProfileIn( __METHOD__ );
 
                $row = $dbw->selectRow(
                        array( 'revision', 'page' ),
@@ -1382,7 +1365,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $row ) {
                        if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
-                               wfProfileOut( __METHOD__ );
                                return false;
                        }
                        $prev = $row->rev_id;
@@ -1395,7 +1377,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -1514,7 +1495,6 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function replaceSectionContent( $sectionId, Content $sectionContent, $sectionTitle = '',
                $edittime = null ) {
-               wfProfileIn( __METHOD__ );
 
                $baseRevId = null;
                if ( $edittime && $sectionId !== 'new' ) {
@@ -1525,7 +1505,6 @@ class WikiPage implements Page, IDBAccessObject {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $this->replaceSectionAtRev( $sectionId, $sectionContent, $sectionTitle, $baseRevId );
        }
 
@@ -1545,14 +1524,12 @@ class WikiPage implements Page, IDBAccessObject {
        public function replaceSectionAtRev( $sectionId, Content $sectionContent,
                $sectionTitle = '', $baseRevId = null
        ) {
-               wfProfileIn( __METHOD__ );
 
                if ( strval( $sectionId ) === '' ) {
                        // Whole-page edit; let the whole text through
                        $newContent = $sectionContent;
                } else {
                        if ( !$this->supportsSections() ) {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "sections not supported for content model " .
                                        $this->getContentHandler()->getModelID() );
                        }
@@ -1568,7 +1545,6 @@ class WikiPage implements Page, IDBAccessObject {
                                if ( !$rev ) {
                                        wfDebug( __METHOD__ . " asked for bogus section (page: " .
                                                $this->getId() . "; section: $sectionId)\n" );
-                                       wfProfileOut( __METHOD__ );
                                        return null;
                                }
 
@@ -1577,14 +1553,12 @@ class WikiPage implements Page, IDBAccessObject {
 
                        if ( !$oldContent ) {
                                wfDebug( __METHOD__ . ": no page text\n" );
-                               wfProfileOut( __METHOD__ );
                                return null;
                        }
 
                        $newContent = $oldContent->replaceSection( $sectionId, $sectionContent, $sectionTitle );
                }
 
-               wfProfileOut( __METHOD__ );
                return $newContent;
        }
 
@@ -1726,10 +1700,7 @@ class WikiPage implements Page, IDBAccessObject {
                        throw new MWException( 'Something is trying to edit an article with an empty title' );
                }
 
-               wfProfileIn( __METHOD__ );
-
                if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
-                       wfProfileOut( __METHOD__ );
                        return Status::newFatal( 'content-not-allowed-here',
                                ContentHandler::getLocalizedName( $content->getModel() ),
                                $this->getTitle()->getPrefixedText() );
@@ -1758,7 +1729,6 @@ class WikiPage implements Page, IDBAccessObject {
                                $status->fatal( 'edit-hook-aborted' );
                        }
 
-                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
@@ -1805,11 +1775,9 @@ class WikiPage implements Page, IDBAccessObject {
                                wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
                                $status->fatal( 'edit-gone-missing' );
 
-                               wfProfileOut( __METHOD__ );
                                return $status;
                        } elseif ( !$old_content ) {
                                // Sanity check for bug 37225
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Could not find text for current revision {$oldid}." );
                        }
 
@@ -1840,7 +1808,6 @@ class WikiPage implements Page, IDBAccessObject {
                                        if ( !$status->isOK() ) {
                                                $dbw->rollback( __METHOD__ );
 
-                                               wfProfileOut( __METHOD__ );
                                                return $status;
                                        }
                                        $revisionId = $revision->insertOn( $dbw );
@@ -1856,7 +1823,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                                                $dbw->rollback( __METHOD__ );
 
-                                               wfProfileOut( __METHOD__ );
                                                return $status;
                                        }
 
@@ -1878,7 +1844,7 @@ class WikiPage implements Page, IDBAccessObject {
                                                }
                                        }
                                        $user->incEditCount();
-                               } catch ( MWException $e ) {
+                               } catch ( Exception $e ) {
                                        $dbw->rollback( __METHOD__ );
                                        // Question: Would it perhaps be better if this method turned all
                                        // exceptions into $status's?
@@ -1921,7 +1887,6 @@ class WikiPage implements Page, IDBAccessObject {
                                if ( !$status->isOK() ) {
                                        $dbw->rollback( __METHOD__ );
 
-                                       wfProfileOut( __METHOD__ );
                                        return $status;
                                }
 
@@ -1935,7 +1900,6 @@ class WikiPage implements Page, IDBAccessObject {
                                        $dbw->rollback( __METHOD__ );
                                        $status->fatal( 'edit-already-exists' );
 
-                                       wfProfileOut( __METHOD__ );
                                        return $status;
                                }
 
@@ -1983,7 +1947,7 @@ class WikiPage implements Page, IDBAccessObject {
                                }
                                $user->incEditCount();
 
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                $dbw->rollback( __METHOD__ );
                                throw $e;
                        }
@@ -2018,7 +1982,6 @@ class WikiPage implements Page, IDBAccessObject {
                        $user->addAutopromoteOnceGroups( 'onEdit' );
                } );
 
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -2050,7 +2013,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Prepare text which is about to be saved.
-        * Returns a stdclass with source, pst and output members
+        * Returns a stdClass with source, pst and output members
         *
         * @deprecated since 1.21: use prepareContentForEdit instead.
         * @return object
@@ -2063,7 +2026,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Prepare content which is about to be saved.
-        * Returns a stdclass with source, pst and output members
+        * Returns a stdClass with source, pst and output members
         *
         * @param Content $content
         * @param int|null $revid
@@ -2078,7 +2041,7 @@ class WikiPage implements Page, IDBAccessObject {
        public function prepareContentForEdit(
                Content $content, $revid = null, User $user = null, $serialFormat = null, $useCache = true
        ) {
-               global $wgContLang, $wgUser;
+               global $wgContLang, $wgUser, $wgAjaxEditStash;
 
                $user = is_null( $user ) ? $wgUser : $user;
                //XXX: check $user->getId() here???
@@ -2100,7 +2063,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // The edit may have already been prepared via api.php?action=stashedit
-               $cachedEdit = $useCache
+               $cachedEdit = $useCache && $wgAjaxEditStash
                        ? ApiStashEdit::checkCache( $this->getTitle(), $content, $user )
                        : false;
 
@@ -2166,8 +2129,6 @@ class WikiPage implements Page, IDBAccessObject {
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
                global $wgEnableParserCache;
 
-               wfProfileIn( __METHOD__ );
-
                $options += array(
                        'changed' => true,
                        'created' => false,
@@ -2214,7 +2175,6 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( !$this->exists() ) {
-                       wfProfileOut( __METHOD__ );
                        return;
                }
 
@@ -2279,7 +2239,6 @@ class WikiPage implements Page, IDBAccessObject {
                        self::onArticleEdit( $this->mTitle );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -2315,7 +2274,6 @@ class WikiPage implements Page, IDBAccessObject {
        public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
                $serialFormat = null
        ) {
-               wfProfileIn( __METHOD__ );
 
                $serialized = $content->serialize( $serialFormat );
 
@@ -2335,7 +2293,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -3026,8 +2983,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Get the last edit not by this guy...
                // Note: these may not be public values
-               $user = intval( $current->getRawUser() );
-               $user_text = $dbw->addQuotes( $current->getRawUserText() );
+               $user = intval( $current->getUser( Revision::RAW ) );
+               $user_text = $dbw->addQuotes( $current->getUserText( Revision::RAW ) );
                $s = $dbw->selectRow( 'revision',
                        array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
                        array( 'rev_page' => $current->getPage(),
@@ -3156,13 +3113,9 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param Title $title
         */
-       public static function onArticleCreate( $title ) {
+       public static function onArticleCreate( Title $title ) {
                // Update existence markers on article/talk tabs...
-               if ( $title->isTalkPage() ) {
-                       $other = $title->getSubjectPage();
-               } else {
-                       $other = $title->getTalkPage();
-               }
+               $other = $title->getOtherPage();
 
                $other->invalidateCache();
                $other->purgeSquid();
@@ -3177,13 +3130,9 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param Title $title
         */
-       public static function onArticleDelete( $title ) {
+       public static function onArticleDelete( Title $title ) {
                // Update existence markers on article/talk tabs...
-               if ( $title->isTalkPage() ) {
-                       $other = $title->getSubjectPage();
-               } else {
-                       $other = $title->getTalkPage();
-               }
+               $other = $title->getOtherPage();
 
                $other->invalidateCache();
                $other->purgeSquid();
@@ -3222,10 +3171,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Purge caches on page update etc
         *
         * @param Title $title
-        * @todo Verify that $title is always a Title object (and never false or
-        *   null), add Title hint to parameter $title.
         */
-       public static function onArticleEdit( $title ) {
+       public static function onArticleEdit( Title $title ) {
                // Invalidate caches of articles which include this page
                DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
 
index 9398e30..7a5952f 100644 (file)
@@ -196,7 +196,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        public function doQuery() {
                # Use the child class name for profiling
                $fname = __METHOD__ . ' (' . get_class( $this ) . ')';
-               wfProfileIn( $fname );
+               $section = Profiler::instance()->scopedProfileIn( $fname );
 
                // @todo This should probably compare to DIR_DESCENDING and DIR_ASCENDING constants
                $descending = ( $this->mIsBackwards == $this->mDefaultDirection );
@@ -226,8 +226,6 @@ abstract class IndexPager extends ContextSource implements Pager {
 
                $this->preprocessResults( $this->mResult );
                $this->mResult->rewind(); // Paranoia
-
-               wfProfileOut( $fname );
        }
 
        /**
index 94abc26..e382cf3 100644 (file)
@@ -34,7 +34,7 @@ class CacheTime {
 
        public $mVersion = Parser::VERSION,  # Compatibility check
                $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
-               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
+               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncacheable. Used in ParserCache.
                $mContainsOldMagic,           # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
                $mCacheRevisionId = null;     # Revision ID that was parsed
 
@@ -123,7 +123,7 @@ class CacheTime {
 
                if ( $this->mCacheTime < 0 ) {
                        return 0;
-               } // old-style marker for "not cachable"
+               } // old-style marker for "not cacheable"
 
                $expire = $this->mCacheExpiry;
 
@@ -138,7 +138,7 @@ class CacheTime {
                }
 
                if ( $expire <= 0 ) {
-                       return 0; // not cachable
+                       return 0; // not cacheable
                } else {
                        return $expire;
                }
index 6f19a23..2b495b1 100644 (file)
@@ -111,7 +111,7 @@ class CoreParserFunctions {
 
                $pref = $parser->getOptions()->getDateFormat();
 
-               // Specify a different default date format other than the the normal default
+               // Specify a different default date format other than the normal default
                // if the user has 'default' for their setting
                if ( $pref == 'default' && $defaultPref ) {
                        $pref = $defaultPref;
@@ -309,15 +309,12 @@ class CoreParserFunctions {
         * @return string
         */
        public static function gender( $parser, $username ) {
-               wfProfileIn( __METHOD__ );
                $forms = array_slice( func_get_args(), 2 );
 
                // Some shortcuts to avoid loading user data unnecessarily
                if ( count( $forms ) === 0 ) {
-                       wfProfileOut( __METHOD__ );
                        return '';
                } elseif ( count( $forms ) === 1 ) {
-                       wfProfileOut( __METHOD__ );
                        return $forms[0];
                }
 
@@ -341,7 +338,6 @@ class CoreParserFunctions {
                        $gender = GenderCache::singleton()->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
                }
                $ret = $parser->getFunctionLang()->gender( $gender, $forms );
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -953,13 +949,6 @@ class CoreParserFunctions {
                        $inner = null;
                }
 
-               $stripList = $parser->getStripList();
-               if ( !in_array( $tagName, $stripList ) ) {
-                       return '<span class="error">' .
-                               wfMessage( 'unknown_extension_tag', $tagName )->inContentLanguage()->text() .
-                               '</span>';
-               }
-
                $attributes = array();
                foreach ( $args as $arg ) {
                        $bits = $arg->splitArg();
@@ -973,6 +962,19 @@ class CoreParserFunctions {
                        }
                }
 
+               $stripList = $parser->getStripList();
+               if ( !in_array( $tagName, $stripList ) ) {
+                       // we can't handle this tag (at least not now), so just re-emit it as an ordinary tag
+                       $attrText = '';
+                       foreach ( $attributes as $name => $value ) {
+                               $attrText .= ' ' . htmlspecialchars( $name ) . '="' . htmlspecialchars( $value ) . '"';
+                       }
+                       if ( $inner === null ) {
+                               return "<$tagName$attrText/>";
+                       }
+                       return "<$tagName$attrText>$inner</$tagName>";
+               }
+
                $params = array(
                        'name' => $tagName,
                        'inner' => $inner,
index 0121072..7026c5c 100644 (file)
@@ -229,7 +229,6 @@ class LinkHolderArray {
         * @return string
         */
        public function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) {
-               wfProfileIn( __METHOD__ );
                if ( !is_object( $nt ) ) {
                        # Fail gracefully
                        $retVal = "<!-- ERROR -->{$prefix}{$text}{$trail}";
@@ -259,7 +258,6 @@ class LinkHolderArray {
                        }
                        $this->size++;
                }
-               wfProfileOut( __METHOD__ );
                return $retVal;
        }
 
@@ -269,13 +267,10 @@ class LinkHolderArray {
         * @param string $text
         */
        public function replace( &$text ) {
-               wfProfileIn( __METHOD__ );
 
                $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
-               wfProfileOut( __METHOD__ );
-
        }
 
        /**
@@ -287,14 +282,12 @@ class LinkHolderArray {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
                global $wgContLang, $wgContentHandlerUseDB;
 
                $colours = array();
                $linkCache = LinkCache::singleton();
                $output = $this->parent->getOutput();
 
-               wfProfileIn( __METHOD__ . '-check' );
                $dbr = wfGetDB( DB_SLAVE );
                $threshold = $this->parent->getOptions()->getStubThreshold();
 
@@ -380,7 +373,6 @@ class LinkHolderArray {
                        //pass an array of page_ids to an extension
                        Hooks::run( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
                }
-               wfProfileOut( __METHOD__ . '-check' );
 
                # Do a second query for different language variants of links and categories
                if ( $wgContLang->hasVariants() ) {
@@ -388,7 +380,6 @@ class LinkHolderArray {
                }
 
                # Construct search and replace arrays
-               wfProfileIn( __METHOD__ . '-construct' );
                $replacePairs = array();
                foreach ( $this->internals as $ns => $entries ) {
                        foreach ( $entries as $index => $entry ) {
@@ -424,18 +415,14 @@ class LinkHolderArray {
                        }
                }
                $replacer = new HashtableReplacer( $replacePairs, 1 );
-               wfProfileOut( __METHOD__ . '-construct' );
 
                # Do the thing
-               wfProfileIn( __METHOD__ . '-replace' );
                $text = preg_replace_callback(
                        '/(<!--LINK .*?-->)/',
                        $replacer->cb(),
                        $text
                );
 
-               wfProfileOut( __METHOD__ . '-replace' );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -447,7 +434,6 @@ class LinkHolderArray {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
                # Make interwiki link HTML
                $output = $this->parent->getOutput();
                $replacePairs = array();
@@ -461,7 +447,6 @@ class LinkHolderArray {
                        '/<!--IWLINK (.*?)-->/',
                        $replacer->cb(),
                        $text );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -642,14 +627,12 @@ class LinkHolderArray {
         * @return string
         */
        public function replaceText( $text ) {
-               wfProfileIn( __METHOD__ );
 
                $text = preg_replace_callback(
                        '/<!--(LINK|IWLINK) (.*?)-->/',
                        array( &$this, 'replaceTextCallback' ),
                        $text );
 
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
index 7b53776..d446ccf 100644 (file)
@@ -131,12 +131,12 @@ class MWTidy {
                $wrappedtext = $wrapper->getWrapped( $text );
 
                $retVal = null;
-               list( $correctedtext, $errors ) = self::clean( $wrappedtext, $retVal );
+               $correctedtext = self::clean( $wrappedtext, false, $retVal );
 
                if ( $retVal < 0 ) {
                        wfDebug( "Possible tidy configuration error!\n" );
                        return $text . "\n<!-- Tidy was unable to run -->\n";
-               } elseif ( $correctedtext === '' && $text !== '' ) {
+               } elseif ( is_null( $correctedtext ) ) {
                        wfDebug( "Tidy error detected!\n" );
                        return $text . "\n<!-- Tidy found serious XHTML errors -->\n";
                }
@@ -155,23 +155,32 @@ class MWTidy {
         */
        public static function checkErrors( $text, &$errorStr = null ) {
                $retval = 0;
-               list( $outputStr, $errorStr ) = self::clean( $text, $retval );
+               $errorStr = self::clean( $text, true, $retval );
                return ( $retval < 0 && $errorStr == '' ) || $retval == 0;
        }
 
        /**
         * Perform a clean/repair operation
         * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
         * @param int &$retval Exit code (-1 on internal error)
-        * @return string|null
+        * @return null|string
+        * @throws MWException
         */
-       private static function clean( $text, &$retval = null ) {
+       private static function clean( $text, $stderr = false, &$retval = null ) {
                global $wgTidyInternal;
 
                if ( $wgTidyInternal ) {
-                       return self::internalClean( $text, $retval );
+                       if ( wfIsHHVM() ) {
+                               if ( $stderr ) {
+                                       throw new MWException( __METHOD__ . ": error text return from HHVM tidy is not supported" );
+                               }
+                               return self::hhvmClean( $text, $retval );
+                       } else {
+                               return self::phpClean( $text, $stderr, $retval );
+                       }
                } else {
-                       return self::externalClean( $text, $retval );
+                       return self::externalClean( $text, $stderr, $retval );
                }
        }
 
@@ -180,23 +189,31 @@ class MWTidy {
         * Also called in OutputHandler.php for full page validation
         *
         * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
         * @param int &$retval Exit code (-1 on internal error)
         * @return string|null
         */
-       private static function externalClean( $text, &$retval = null ) {
+       private static function externalClean( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgTidyBin, $wgTidyOpts;
-               wfProfileIn( __METHOD__ );
 
+               $cleansource = '';
                $opts = ' -utf8';
 
-               $descriptorspec = array(
-                       0 => array( 'pipe', 'r' ),
-                       1 => array( 'pipe', 'w' ),
-                       2 => array( 'pipe', 'w' ),
-               );
+               if ( $stderr ) {
+                       $descriptorspec = array(
+                               0 => array( 'pipe', 'r' ),
+                               1 => array( 'file', wfGetNull(), 'a' ),
+                               2 => array( 'pipe', 'w' )
+                       );
+               } else {
+                       $descriptorspec = array(
+                               0 => array( 'pipe', 'r' ),
+                               1 => array( 'pipe', 'w' ),
+                               2 => array( 'file', wfGetNull(), 'a' )
+                       );
+               }
 
-               $outputBuffer = '';
-               $errorBuffer = '';
+               $readpipe = $stderr ? 2 : 1;
                $pipes = array();
 
                $process = proc_open(
@@ -213,25 +230,23 @@ class MWTidy {
                        // for tidyParseStdin and tidySaveStdout in console/tidy.c
                        fwrite( $pipes[0], $text );
                        fclose( $pipes[0] );
-
-                       while ( !feof( $pipes[1] ) ) {
-                               $outputBuffer .= fgets( $pipes[1], 1024 );
-                       }
-                       fclose( $pipes[1] );
-
-                       while ( !feof( $pipes[2] ) ) {
-                               $errorBuffer .= fgets( $pipes[2], 1024 );
+                       while ( !feof( $pipes[$readpipe] ) ) {
+                               $cleansource .= fgets( $pipes[$readpipe], 1024 );
                        }
-                       fclose( $pipes[2] );
-
+                       fclose( $pipes[$readpipe] );
                        $retval = proc_close( $process );
                } else {
                        wfWarn( "Unable to start external tidy process" );
                        $retval = -1;
                }
 
-               wfProfileOut( __METHOD__ );
-               return array( $outputBuffer, $errorBuffer );
+               if ( !$stderr && $cleansource == '' && $text != '' ) {
+                       // Some kind of error happened, so we couldn't get the corrected text.
+                       // Just give up; we'll use the source text and append a warning.
+                       $cleansource = null;
+               }
+
+               return $cleansource;
        }
 
        /**
@@ -239,12 +254,12 @@ class MWTidy {
         * saving the overhead of spawning a new process.
         *
         * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from error status instead of output
         * @param int &$retval Exit code (-1 on internal error)
         * @return string|null
         */
-       private static function internalClean( $text, &$retval = null ) {
+       private static function phpClean( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgDebugTidy;
-               wfProfileIn( __METHOD__ );
 
                if ( ( !wfIsHHVM() && !class_exists( 'tidy' ) ) ||
                        ( wfIsHHVM() && !function_exists( 'tidy_repair_string' ) )
@@ -252,40 +267,57 @@ class MWTidy {
                        wfWarn( "Unable to load internal tidy class." );
                        $retval = -1;
 
-                       wfProfileOut( __METHOD__ );
                        return null;
                }
 
-               $outputBuffer = '';
-               $errorBuffer = '';
-
-               if ( wfIsHHVM() ) {
-                       // Use the tidy extension for HHVM from
-                       // https://github.com/wikimedia/mediawiki-php-tidy
-                       //
-                       // This currently does not support the object-oriented interface, but
-                       // tidy_repair_string() can be used for the most common tasks.
-                       $result = tidy_repair_string( $text, $wgTidyConf, 'utf8' );
-                       $outputBuffer .= $result;
-                       $retval = $result === false ? -1 : 0;
-               } else {
-                       $tidy = new tidy;
-                       $tidy->parseString( $text, $wgTidyConf, 'utf8' );
-                       $tidy->cleanRepair();
+               $tidy = new tidy;
+               $tidy->parseString( $text, $wgTidyConf, 'utf8' );
+
+               if ( $stderr ) {
                        $retval = $tidy->getStatus();
-                       $outputBuffer .= tidy_get_output( $tidy );
-                       if ( $retval > 0 ) {
-                               $errorBuffer .= $tidy->errorBuffer;
+                       return $tidy->errorBuffer;
+               }
+
+               $tidy->cleanRepair();
+               $retval = $tidy->getStatus();
+               if ( $retval == 2 ) {
+                       // 2 is magic number for fatal error
+                       // http://www.php.net/manual/en/function.tidy-get-status.php
+                       $cleansource = null;
+               } else {
+                       $cleansource = tidy_get_output( $tidy );
+                       if ( $wgDebugTidy && $retval > 0 ) {
+                               $cleansource .= "<!--\nTidy reports:\n" .
+                                       str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
+                                       "\n-->";
                        }
                }
 
-               if ( $wgDebugTidy && $errorBuffer && $retval > 0 ) {
-                       $outputBuffer .= "<!--\nTidy reports:\n" .
-                               str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
-                               "\n-->";
+               return $cleansource;
+       }
+
+       /**
+        * Use the tidy extension for HHVM from
+        * https://github.com/wikimedia/mediawiki-php-tidy
+        *
+        * This currently does not support the object-oriented interface, but
+        * tidy_repair_string() can be used for the most common tasks.
+        *
+        * @param string $text HTML to check
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
+        */
+       private static function hhvmClean( $text, &$retval ) {
+               global $wgTidyConf;
+
+               $cleansource = tidy_repair_string( $text, $wgTidyConf, 'utf8' );
+               if ( $cleansource === false ) {
+                       $cleansource = null;
+                       $retval = -1;
+               } else {
+                       $retval = 0;
                }
 
-               wfProfileOut( __METHOD__ );
-               return array( $outputBuffer, $errorBuffer );
+               return $cleansource;
        }
 }
index 5c8253a..fc7040a 100644 (file)
@@ -90,6 +90,9 @@ class Parser {
        const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
                \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
 
+       # Regular expression for a non-newline space
+       const SPACE_NOT_NL = '(?:\t|&nbsp;|&\#0*160;|&\#[Xx]0*[Aa]0;|\p{Zs})';
+
        # State constants for the definition list colon extraction
        const COLON_STATE_TEXT = 0;
        const COLON_STATE_TAG = 1;
@@ -143,7 +146,8 @@ class Parser {
         * @var MagicWordArray
         */
        public $mSubstWords;
-       public $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols; # Initialised in constructor
+       # Initialised in constructor
+       public $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols;
 
        # Cleared with clearState():
        /**
@@ -295,14 +299,11 @@ class Parser {
                }
                $this->mFirstCall = false;
 
-               wfProfileIn( __METHOD__ );
-
                CoreParserFunctions::register( $this );
                CoreTagHooks::register( $this );
                $this->initialiseVariables();
 
                Hooks::run( 'ParserFirstCallInit', array( &$this ) );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -311,7 +312,6 @@ class Parser {
         * @private
         */
        public function clearState() {
-               wfProfileIn( __METHOD__ );
                if ( $this->mFirstCall ) {
                        $this->firstCallInit();
                }
@@ -370,7 +370,6 @@ class Parser {
                $this->mProfiler = new SectionProfiler();
 
                Hooks::run( 'ParserClearState', array( &$this ) );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -395,8 +394,6 @@ class Parser {
 
                global $wgShowHostnames;
                $fname = __METHOD__ . '-' . wfGetCaller();
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( $fname );
 
                if ( $clearState ) {
                        $magicScopeVariable = $this->lock();
@@ -557,8 +554,6 @@ class Parser {
                $this->mRevisionSize = $oldRevisionSize;
                $this->mInputSize = false;
                $this->currentRevisionCache = null;
-               wfProfileOut( $fname );
-               wfProfileOut( __METHOD__ );
 
                return $this->mOutput;
        }
@@ -586,11 +581,9 @@ class Parser {
         * @return string UNSAFE half-parsed HTML
         */
        public function recursiveTagParse( $text, $frame = false ) {
-               wfProfileIn( __METHOD__ );
                Hooks::run( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
                Hooks::run( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
                $text = $this->internalParse( $text, false, $frame );
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -612,10 +605,8 @@ class Parser {
         * @return string Fully parsed HTML
         */
        public function recursiveTagParseFully( $text, $frame = false ) {
-               wfProfileIn( __METHOD__ );
                $text = $this->recursiveTagParse( $text, $frame );
                $text = $this->internalParseHalfParsed( $text, false );
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -630,8 +621,9 @@ class Parser {
         * @param bool|PPFrame $frame
         * @return mixed|string
         */
-       public function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null, $frame = false ) {
-               wfProfileIn( __METHOD__ );
+       public function preprocess( $text, Title $title = null,
+               ParserOptions $options, $revid = null, $frame = false
+       ) {
                $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PREPROCESS, true );
                if ( $revid !== null ) {
@@ -641,7 +633,6 @@ class Parser {
                Hooks::run( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
                $text = $this->replaceVariables( $text, $frame );
                $text = $this->mStripState->unstripBoth( $text );
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -655,10 +646,8 @@ class Parser {
         * @since 1.19
         */
        public function recursivePreprocess( $text, $frame = false ) {
-               wfProfileIn( __METHOD__ );
                $text = $this->replaceVariables( $text, $frame );
                $text = $this->mStripState->unstripBoth( $text );
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -1013,7 +1002,6 @@ class Parser {
         * @return string
         */
        public function doTableStuff( $text ) {
-               wfProfileIn( __METHOD__ );
 
                $lines = StringUtils::explode( "\n", $text );
                $out = '';
@@ -1200,8 +1188,6 @@ class Parser {
                        $out = '';
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $out;
        }
 
@@ -1218,13 +1204,11 @@ class Parser {
         * @return string
         */
        public function internalParse( $text, $isMain = true, $frame = false ) {
-               wfProfileIn( __METHOD__ );
 
                $origText = $text;
 
                # Hook to suspend the parser in this state
                if ( !Hooks::run( 'ParserBeforeInternalParse', array( &$this, &$text, &$this->mStripState ) ) ) {
-                       wfProfileOut( __METHOD__ );
                        return $text;
                }
 
@@ -1275,7 +1259,6 @@ class Parser {
                $text = $this->doMagicLinks( $text );
                $text = $this->formatHeadings( $text, $origText, $isMain );
 
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -1386,22 +1369,24 @@ class Parser {
         * @return string
         */
        public function doMagicLinks( $text ) {
-               wfProfileIn( __METHOD__ );
                $prots = wfUrlProtocolsWithoutProtRel();
                $urlChar = self::EXT_LINK_URL_CLASS;
+               $space = self::SPACE_NOT_NL; #  non-newline space
+               $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)$urlChar+) |  # m[3]: Free external links" . '
-                               \b(?:RFC|PMID)\s+([0-9]+)\b |# m[4]: RFC or PMID, capture number
-                               \bISBN\s+(                  # m[5]: ISBN, capture number
-                                       (?: 97[89] [\ \-]? )?   # optional 13-digit ISBN prefix
-                                       (?: [0-9]  [\ \-]? ){9} # 9 digits with opt. delimiters
+                               (\b(?i:$prots)$urlChar+) |  # m[3]: Free external links
+                               \b(?:RFC|PMID) $spaces      # m[4]: RFC or PMID, capture number
+                                       ([0-9]+)\b |
+                               \bISBN $spaces (            # m[5]: 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', array( &$this, 'magicLinkCallback' ), $text );
-               wfProfileOut( __METHOD__ );
+                               )\b
+                       )!xu", array( &$this, 'magicLinkCallback' ), $text );
                return $text;
        }
 
@@ -1441,6 +1426,8 @@ class Parser {
                } elseif ( isset( $m[5] ) && $m[5] !== '' ) {
                        # ISBN
                        $isbn = $m[5];
+                       $space = self::SPACE_NOT_NL; #  non-newline space
+                       $isbn = preg_replace( "/$space/", ' ', $isbn );
                        $num = strtr( $isbn, array(
                                '-' => '',
                                ' ' => '',
@@ -1464,7 +1451,6 @@ class Parser {
         * @private
         */
        public function makeFreeExternalLink( $url ) {
-               wfProfileIn( __METHOD__ );
 
                $trail = '';
 
@@ -1484,7 +1470,20 @@ class Parser {
                        $sep .= ')';
                }
 
-               $numSepChars = strspn( strrev( $url ), $sep );
+               $urlRev = strrev( $url );
+               $numSepChars = strspn( $urlRev, $sep );
+               # Don't break a trailing HTML entity by moving the ; into $trail
+               # This is in hot code, so use substr_compare to avoid having to
+               # create a new string object for the comparison
+               if ( $numSepChars && substr_compare( $url, ";", -$numSepChars, 1 ) === 0) {
+                       # more optimization: instead of running preg_match with a $
+                       # anchor, which can be slow, do the match on the reversed
+                       # string starting at the desired offset.
+                       # un-reversed regexp is: /&([a-z]+|#x[\da-f]+|#\d+)$/i
+                       if ( preg_match( '/\G([a-z]+|[\da-f]+x#|\d+#)&/i', $urlRev, $m2, 0, $numSepChars ) ) {
+                               $numSepChars--;
+                       }
+               }
                if ( $numSepChars ) {
                        $trail = substr( $url, -$numSepChars ) . $trail;
                        $url = substr( $url, 0, -$numSepChars );
@@ -1505,7 +1504,6 @@ class Parser {
                        $pasteurized = self::normalizeLinkUrl( $url );
                        $this->mOutput->addExternalLink( $pasteurized );
                }
-               wfProfileOut( __METHOD__ );
                return $text . $trail;
        }
 
@@ -1519,12 +1517,10 @@ class Parser {
         * @return string
         */
        public function doHeadings( $text ) {
-               wfProfileIn( __METHOD__ );
                for ( $i = 6; $i >= 1; --$i ) {
                        $h = str_repeat( '=', $i );
                        $text = preg_replace( "/^$h(.+)$h\\s*$/m", "<h$i>\\1</h$i>", $text );
                }
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -1537,14 +1533,12 @@ class Parser {
         * @return string The altered text
         */
        public function doAllQuotes( $text ) {
-               wfProfileIn( __METHOD__ );
                $outtext = '';
                $lines = StringUtils::explode( "\n", $text );
                foreach ( $lines as $line ) {
                        $outtext .= $this->doQuotes( $line ) . "\n";
                }
                $outtext = substr( $outtext, 0, -1 );
-               wfProfileOut( __METHOD__ );
                return $outtext;
        }
 
@@ -1746,11 +1740,9 @@ class Parser {
         * @return string
         */
        public function replaceExternalLinks( $text ) {
-               wfProfileIn( __METHOD__ );
 
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
                if ( $bits === false ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "PCRE needs to be compiled with "
                                . "--enable-unicode-properties in order for MediaWiki to function" );
                }
@@ -1814,7 +1806,6 @@ class Parser {
                        $this->mOutput->addExternalLink( $pasteurized );
                }
 
-               wfProfileOut( __METHOD__ );
                return $s;
        }
 
@@ -2012,9 +2003,7 @@ class Parser {
         */
        public function replaceInternalLinks2( &$s ) {
                global $wgExtraInterlanguageLinkPrefixes;
-               wfProfileIn( __METHOD__ );
 
-               wfProfileIn( __METHOD__ . '-setup' );
                static $tc = false, $e1, $e1_img;
                # the % is needed to support urlencoded titles as well
                if ( !$tc ) {
@@ -2046,8 +2035,6 @@ class Parser {
                }
 
                if ( is_null( $this->mTitle ) ) {
-                       wfProfileOut( __METHOD__ . '-setup' );
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
                }
                $nottalk = !$this->mTitle->isTalkPage();
@@ -2064,7 +2051,6 @@ class Parser {
                }
 
                $useSubpages = $this->areSubpagesAllowed();
-               wfProfileOut( __METHOD__ . '-setup' );
 
                // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                # Loop for each link
@@ -2080,7 +2066,6 @@ class Parser {
                        }
 
                        if ( $useLinkPrefixExtension ) {
-                               wfProfileIn( __METHOD__ . '-prefixhandling' );
                                if ( preg_match( $e2, $s, $m ) ) {
                                        $prefix = $m[2];
                                        $s = $m[1];
@@ -2092,12 +2077,10 @@ class Parser {
                                        $prefix = $first_prefix;
                                        $first_prefix = false;
                                }
-                               wfProfileOut( __METHOD__ . '-prefixhandling' );
                        }
 
                        $might_be_img = false;
 
-                       wfProfileIn( __METHOD__ . "-e1" );
                        if ( preg_match( $e1, $line, $m ) ) { # page with normal text or alt
                                $text = $m[2];
                                # If we get a ] at the beginning of $m[3] that means we have a link that's something like:
@@ -2131,11 +2114,8 @@ class Parser {
                                $trail = "";
                        } else { # Invalid form; output directly
                                $s .= $prefix . '[[' . $line;
-                               wfProfileOut( __METHOD__ . "-e1" );
                                continue;
                        }
-                       wfProfileOut( __METHOD__ . "-e1" );
-                       wfProfileIn( __METHOD__ . "-misc" );
 
                        $origLink = $m[1];
 
@@ -2144,7 +2124,6 @@ class Parser {
                        # should be external links.
                        if ( preg_match( '/^(?i:' . $this->mUrlProtocols . ')/', $origLink ) ) {
                                $s .= $prefix . '[[' . $line;
-                               wfProfileOut( __METHOD__ . "-misc" );
                                continue;
                        }
 
@@ -2161,21 +2140,16 @@ class Parser {
                                $link = substr( $link, 1 );
                        }
 
-                       wfProfileOut( __METHOD__ . "-misc" );
-                       wfProfileIn( __METHOD__ . "-title" );
                        $nt = Title::newFromText( $this->mStripState->unstripNoWiki( $link ) );
                        if ( $nt === null ) {
                                $s .= $prefix . '[[' . $line;
-                               wfProfileOut( __METHOD__ . "-title" );
                                continue;
                        }
 
                        $ns = $nt->getNamespace();
                        $iw = $nt->getInterwiki();
-                       wfProfileOut( __METHOD__ . "-title" );
 
                        if ( $might_be_img ) { # if this is actually an invalid link
-                               wfProfileIn( __METHOD__ . "-might_be_img" );
                                if ( $ns == NS_FILE && $noforce ) { # but might be an image
                                        $found = false;
                                        while ( true ) {
@@ -2207,16 +2181,13 @@ class Parser {
                                                $holders->merge( $this->replaceInternalLinks2( $text ) );
                                                $s .= "{$prefix}[[$link|$text";
                                                # note: no $trail, because without an end, there *is* no trail
-                                               wfProfileOut( __METHOD__ . "-might_be_img" );
                                                continue;
                                        }
                                } else { # it's not an image, so output it raw
                                        $s .= "{$prefix}[[$link|$text";
                                        # note: no $trail, because without an end, there *is* no trail
-                                       wfProfileOut( __METHOD__ . "-might_be_img" );
                                        continue;
                                }
-                               wfProfileOut( __METHOD__ . "-might_be_img" );
                        }
 
                        $wasblank = ( $text == '' );
@@ -2233,7 +2204,6 @@ class Parser {
                        # Link not escaped by : , create the various objects
                        if ( $noforce && !$nt->wasLocalInterwiki() ) {
                                # Interwikis
-                               wfProfileIn( __METHOD__ . "-interwiki" );
                                if (
                                        $iw && $this->mOptions->getInterwikiMagic() && $nottalk && (
                                                Language::fetchLanguageName( $iw, null, 'mw' ) ||
@@ -2248,13 +2218,10 @@ class Parser {
 
                                        $s = rtrim( $s . $prefix );
                                        $s .= trim( $trail, "\n" ) == '' ? '': $prefix . $trail;
-                                       wfProfileOut( __METHOD__ . "-interwiki" );
                                        continue;
                                }
-                               wfProfileOut( __METHOD__ . "-interwiki" );
 
                                if ( $ns == NS_FILE ) {
-                                       wfProfileIn( __METHOD__ . "-image" );
                                        if ( !wfIsBadImage( $nt->getDBkey(), $this->mTitle ) ) {
                                                if ( $wasblank ) {
                                                        # if no parameters were passed, $text
@@ -2275,12 +2242,10 @@ class Parser {
                                        } else {
                                                $s .= $prefix . $trail;
                                        }
-                                       wfProfileOut( __METHOD__ . "-image" );
                                        continue;
                                }
 
                                if ( $ns == NS_CATEGORY ) {
-                                       wfProfileIn( __METHOD__ . "-category" );
                                        $s = rtrim( $s . "\n" ); # bug 87
 
                                        if ( $wasblank ) {
@@ -2298,7 +2263,6 @@ class Parser {
                                         */
                                        $s .= trim( $prefix . $trail, "\n" ) == '' ? '' : $prefix . $trail;
 
-                                       wfProfileOut( __METHOD__ . "-category" );
                                        continue;
                                }
                        }
@@ -2314,7 +2278,6 @@ class Parser {
                        # NS_MEDIA is a pseudo-namespace for linking directly to a file
                        # @todo FIXME: Should do batch file existence checks, see comment below
                        if ( $ns == NS_MEDIA ) {
-                               wfProfileIn( __METHOD__ . "-media" );
                                # Give extensions a chance to select the file revision for us
                                $options = array();
                                $descQuery = false;
@@ -2325,11 +2288,9 @@ class Parser {
                                # Cloak with NOPARSE to avoid replacement in replaceExternalLinks
                                $s .= $prefix . $this->armorLinks(
                                        Linker::makeMediaLinkFile( $nt, $file, $text ) ) . $trail;
-                               wfProfileOut( __METHOD__ . "-media" );
                                continue;
                        }
 
-                       wfProfileIn( __METHOD__ . "-always_known" );
                        # Some titles, such as valid special pages or files in foreign repos, should
                        # be shown as bluelinks even though they're not included in the page table
                        #
@@ -2342,9 +2303,7 @@ class Parser {
                                # Links will be added to the output link list after checking
                                $s .= $holders->makeHolder( $nt, $text, array(), $trail, $prefix );
                        }
-                       wfProfileOut( __METHOD__ . "-always_known" );
                }
-               wfProfileOut( __METHOD__ );
                return $holders;
        }
 
@@ -2543,7 +2502,6 @@ class Parser {
         * @return string The lists rendered as HTML
         */
        public function doBlockLevels( $text, $linestart ) {
-               wfProfileIn( __METHOD__ );
 
                # Parsing through the text line by line.  The main thing
                # happening here is handling of block-level elements p, pre,
@@ -2652,7 +2610,6 @@ class Parser {
 
                        # If we have no prefixes, go to paragraph mode.
                        if ( 0 == $prefixLength ) {
-                               wfProfileIn( __METHOD__ . "-paragraph" );
                                # No prefix (not in list)--go to paragraph mode
                                # XXX: use a stack for nestable elements like span, table and div
                                $openmatch = preg_match(
@@ -2721,7 +2678,6 @@ class Parser {
                                                }
                                        }
                                }
-                               wfProfileOut( __METHOD__ . "-paragraph" );
                        }
                        # somewhere above we forget to get out of pre block (bug 785)
                        if ( $preCloseMatch && $this->mInPre ) {
@@ -2746,7 +2702,6 @@ class Parser {
                        $this->mLastSection = '';
                }
 
-               wfProfileOut( __METHOD__ );
                return $output;
        }
 
@@ -2761,12 +2716,10 @@ class Parser {
         * @return string The position of the ':', or false if none found
         */
        public function findColonNoLinks( $str, &$before, &$after ) {
-               wfProfileIn( __METHOD__ );
 
                $pos = strpos( $str, ':' );
                if ( $pos === false ) {
                        # Nothing to find!
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -2775,7 +2728,6 @@ class Parser {
                        # Easy; no tag nesting to worry about
                        $before = substr( $str, 0, $pos );
                        $after = substr( $str, $pos + 1 );
-                       wfProfileOut( __METHOD__ );
                        return $pos;
                }
 
@@ -2799,7 +2751,6 @@ class Parser {
                                                # We found it!
                                                $before = substr( $str, 0, $i );
                                                $after = substr( $str, $i + 1 );
-                                               wfProfileOut( __METHOD__ );
                                                return $i;
                                        }
                                        # Embedded in a tag; don't break it.
@@ -2809,7 +2760,6 @@ class Parser {
                                        $colon = strpos( $str, ':', $i );
                                        if ( $colon === false ) {
                                                # Nothing else interesting
-                                               wfProfileOut( __METHOD__ );
                                                return false;
                                        }
                                        $lt = strpos( $str, '<', $i );
@@ -2818,7 +2768,6 @@ class Parser {
                                                        # We found it!
                                                        $before = substr( $str, 0, $colon );
                                                        $after = substr( $str, $colon + 1 );
-                                                       wfProfileOut( __METHOD__ );
                                                        return $i;
                                                }
                                        }
@@ -2869,7 +2818,6 @@ class Parser {
                                        $stack--;
                                        if ( $stack < 0 ) {
                                                wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
-                                               wfProfileOut( __METHOD__ );
                                                return false;
                                        }
                                        $state = self::COLON_STATE_TEXT;
@@ -2904,16 +2852,13 @@ class Parser {
                                }
                                break;
                        default:
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "State machine error in " . __METHOD__ );
                        }
                }
                if ( $stack > 0 ) {
                        wfDebug( __METHOD__ . ": Invalid input; not enough close tags (stack $stack, state $state)\n" );
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
-               wfProfileOut( __METHOD__ );
                return false;
        }
 
@@ -3281,13 +3226,11 @@ class Parser {
         * @private
         */
        public function initialiseVariables() {
-               wfProfileIn( __METHOD__ );
                $variableIDs = MagicWord::getVariableIDs();
                $substIDs = MagicWord::getSubstIDs();
 
                $this->mVariables = new MagicWordArray( $variableIDs );
                $this->mSubstWords = new MagicWordArray( $substIDs );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -3362,7 +3305,6 @@ class Parser {
                if ( strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize() ) {
                        return $text;
                }
-               wfProfileIn( __METHOD__ );
 
                if ( $frame === false ) {
                        $frame = $this->getPreprocessor()->newFrame();
@@ -3376,7 +3318,6 @@ class Parser {
                $flags = $argsOnly ? PPFrame::NO_TEMPLATES : 0;
                $text = $frame->expand( $dom, $flags );
 
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -3454,8 +3395,6 @@ class Parser {
         * @return string The text of the template
         */
        public function braceSubstitution( $piece, $frame ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-setup' );
 
                // Flags
 
@@ -3488,12 +3427,10 @@ class Parser {
                # @todo FIXME: If piece['parts'] is null then the call to getLength()
                # below won't work b/c this $args isn't an object
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
-               wfProfileOut( __METHOD__ . '-setup' );
 
                $profileSection = null; // profile templates
 
                # SUBST
-               wfProfileIn( __METHOD__ . '-modifiers' );
                if ( !$found ) {
 
                        $substMatch = $this->mSubstWords->matchStartAndRemove( $part1 );
@@ -3550,11 +3487,9 @@ class Parser {
                                $forceRawInterwiki = true;
                        }
                }
-               wfProfileOut( __METHOD__ . '-modifiers' );
 
                # Parser functions
                if ( !$found ) {
-                       wfProfileIn( __METHOD__ . '-pfunc' );
 
                        $colonPos = strpos( $part1, ':' );
                        if ( $colonPos !== false ) {
@@ -3566,8 +3501,6 @@ class Parser {
                                try {
                                        $result = $this->callParserFunction( $frame, $func, $funcArgs );
                                } catch ( Exception $ex ) {
-                                       wfProfileOut( __METHOD__ . '-pfunc' );
-                                       wfProfileOut( __METHOD__ );
                                        throw $ex;
                                }
 
@@ -3576,7 +3509,6 @@ class Parser {
                                # here.
                                extract( $result );
                        }
-                       wfProfileOut( __METHOD__ . '-pfunc' );
                }
 
                # Finish mangling title and then check for loops.
@@ -3612,7 +3544,6 @@ class Parser {
                # Load from database
                if ( !$found && $title ) {
                        $profileSection = $this->mProfiler->scopedProfileIn( $title->getPrefixedDBkey() );
-                       wfProfileIn( __METHOD__ . '-loadtpl' );
                        if ( !$title->isExternal() ) {
                                if ( $title->isSpecialPage()
                                        && $this->mOptions->getAllowSpecialInclusion()
@@ -3686,7 +3617,6 @@ class Parser {
                                        . '</span>';
                                wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" );
                        }
-                       wfProfileOut( __METHOD__ . '-loadtpl' );
                }
 
                # If we haven't found text to substitute by now, we're done
@@ -3696,7 +3626,6 @@ class Parser {
                        if ( $profileSection ) {
                                $this->mProfiler->scopedProfileOut( $profileSection );
                        }
-                       wfProfileOut( __METHOD__ );
                        return array( 'object' => $text );
                }
 
@@ -3762,7 +3691,6 @@ class Parser {
                        $ret = array( 'text' => $text );
                }
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -3788,7 +3716,6 @@ class Parser {
        public function callParserFunction( $frame, $function, array $args = array() ) {
                global $wgContLang;
 
-               wfProfileIn( __METHOD__ );
 
                # Case sensitive functions
                if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
@@ -3799,18 +3726,14 @@ class Parser {
                        if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
                                $function = $this->mFunctionSynonyms[0][$function];
                        } else {
-                               wfProfileOut( __METHOD__ );
                                return array( 'found' => false );
                        }
                }
 
-               wfProfileIn( __METHOD__ . '-pfunc-' . $function );
                list( $callback, $flags ) = $this->mFunctionHooks[$function];
 
                # Workaround for PHP bug 35229 and similar
                if ( !is_callable( $callback ) ) {
-                       wfProfileOut( __METHOD__ . '-pfunc-' . $function );
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Tag hook for $function is not callable\n" );
                }
 
@@ -3875,8 +3798,6 @@ class Parser {
                        $result['text'] = $this->preprocessToDom( $result['text'], $preprocessFlags );
                        $result['isChildObj'] = true;
                }
-               wfProfileOut( __METHOD__ . '-pfunc-' . $function );
-               wfProfileOut( __METHOD__ );
 
                return $result;
        }
@@ -4206,7 +4127,6 @@ class Parser {
         * @return array
         */
        public function argSubstitution( $piece, $frame ) {
-               wfProfileIn( __METHOD__ );
 
                $error = false;
                $parts = $piece['parts'];
@@ -4241,7 +4161,6 @@ class Parser {
                        $ret = array( 'text' => $text );
                }
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -4372,7 +4291,6 @@ class Parser {
         * @return string
         */
        public function doDoubleUnderscore( $text ) {
-               wfProfileIn( __METHOD__ );
 
                # The position of __TOC__ needs to be recorded
                $mw = MagicWord::get( 'toc' );
@@ -4420,7 +4338,6 @@ class Parser {
                        $this->mOutput->setProperty( $key, '' );
                }
 
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -4614,14 +4531,15 @@ class Parser {
                        # * <sup> and <sub> (bug 8393)
                        # * <i> (bug 26375)
                        # * <b> (r105284)
+                       # * <bdi> (bug 72884)
                        # * <span dir="rtl"> and <span dir="ltr"> (bug 35167)
                        #
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
                        $tocline = preg_replace(
                                array(
-                                       '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#',
-                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#'
+                                       '#<(?!/?(span|sup|sub|bdi|i|b)(?: [^>]*)?>).*?' . '>#',
+                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|bdi|i|b))(?: .*?)?' . '>#'
                                ),
                                array( '', '<$1>' ),
                                $safeHeadline
@@ -4862,6 +4780,7 @@ class Parser {
 
                $pairs = array(
                        "\r\n" => "\n",
+                       "\r" => "\n",
                );
                $text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
                if ( $options->getPreSaveTransform() ) {
@@ -5124,7 +5043,6 @@ class Parser {
                }
                $executing = true;
 
-               wfProfileIn( __METHOD__ );
                if ( !$title ) {
                        global $wgTitle;
                        $title = $wgTitle;
@@ -5133,7 +5051,6 @@ class Parser {
                $text = $this->preprocess( $text, $title, $options );
 
                $executing = false;
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -5360,7 +5277,6 @@ class Parser {
         * @return string HTML
         */
        public function renderImageGallery( $text, $params ) {
-               wfProfileIn( __METHOD__ );
 
                $mode = false;
                if ( isset( $params['mode'] ) ) {
@@ -5369,7 +5285,7 @@ class Parser {
 
                try {
                        $ig = ImageGalleryBase::factory( $mode );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        // If invalid type set, fallback to default.
                        $ig = ImageGalleryBase::factory( false );
                }
@@ -5436,7 +5352,6 @@ class Parser {
                        $file = $this->fetchFileNoRegister( $title, $options );
                        $handler = $file ? $file->getHandler() : false;
 
-                       wfProfileIn( __METHOD__ . '-getMagicWord' );
                        $paramMap = array(
                                'img_alt' => 'gallery-internal-alt',
                                'img_link' => 'gallery-internal-link',
@@ -5449,7 +5364,6 @@ class Parser {
                        }
 
                        $mwArray = new MagicWordArray( array_keys( $paramMap ) );
-                       wfProfileOut( __METHOD__ . '-getMagicWord' );
 
                        $label = '';
                        $alt = '';
@@ -5512,7 +5426,6 @@ class Parser {
                }
                $html = $ig->toHTML();
                Hooks::run( 'AfterParserFetchFileAndTitle', array( $this, $ig, &$html ) );
-               wfProfileOut( __METHOD__ );
                return $html;
        }
 
@@ -6084,7 +5997,6 @@ class Parser {
         */
        public function getRevisionTimestamp() {
                if ( is_null( $this->mRevisionTimestamp ) ) {
-                       wfProfileIn( __METHOD__ );
 
                        global $wgContLang;
 
@@ -6099,7 +6011,6 @@ class Parser {
                        # it needs to be consistent for all visitors.
                        $this->mRevisionTimestamp = $wgContLang->userAdjust( $timestamp, '' );
 
-                       wfProfileOut( __METHOD__ );
                }
                return $this->mRevisionTimestamp;
        }
@@ -6354,14 +6265,12 @@ class Parser {
         * @return array
         */
        public function serializeHalfParsedText( $text ) {
-               wfProfileIn( __METHOD__ );
                $data = array(
                        'text' => $text,
                        'version' => self::HALF_PARSED_VERSION,
                        'stripState' => $this->mStripState->getSubState( $text ),
                        'linkHolders' => $this->mLinkHolders->getSubArray( $text )
                );
-               wfProfileOut( __METHOD__ );
                return $data;
        }
 
index 7952300..ad131f4 100644 (file)
@@ -184,12 +184,10 @@ class ParserCache {
         */
        public function get( $article, $popts, $useOutdated = false ) {
                global $wgCacheEpoch;
-               wfProfileIn( __METHOD__ );
 
                $canCache = $article->checkTouched();
                if ( !$canCache ) {
                        // It's a redirect now
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -198,7 +196,6 @@ class ParserCache {
                $parserOutputKey = $this->getKey( $article, $popts, $useOutdated );
                if ( $parserOutputKey === false ) {
                        wfIncrStats( 'pcache_miss_absent' );
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -206,7 +203,6 @@ class ParserCache {
                if ( !$value ) {
                        wfDebug( "ParserOutput cache miss.\n" );
                        wfIncrStats( "pcache_miss_absent" );
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -233,7 +229,6 @@ class ParserCache {
                        wfIncrStats( "pcache_hit" );
                }
 
-               wfProfileOut( __METHOD__ );
                return $value;
        }
 
index 7ad85a9..b09fe76 100644 (file)
@@ -639,8 +639,6 @@ class ParserOptions {
                        $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit,
                        $wgMaxGeneratedPPNodeCount, $wgDisableLangConversion, $wgDisableTitleConversion;
 
-               wfProfileIn( __METHOD__ );
-
                // *UPDATE* ParserOptions::matches() if any of this changes as needed
                $this->mInterwikiMagic = $wgInterwikiMagic;
                $this->mAllowExternalImages = $wgAllowExternalImages;
@@ -664,7 +662,6 @@ class ParserOptions {
                $this->mStubThreshold = $user->getStubThreshold();
                $this->mUserLang = $lang;
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -818,4 +815,46 @@ class ParserOptions {
 
                return $confstr;
        }
+
+       /**
+        * Sets a hook to force that a page exists, and sets a current revision callback to return a
+        * revision with custom content when the current revision of the page is requested.
+        *
+        * @since 1.25
+        * @param Title $title
+        * @param Content $content
+        * @param User $user The user that the fake revision is attributed to
+        * @return ScopedCallback to unset the hook
+        */
+       public function setupFakeRevision( $title, $content, $user ) {
+               $oldCallback = $this->setCurrentRevisionCallback( function ( $titleToCheck, $parser = false ) use ( $title, $content, $user, &$oldCallback ) {
+                       if ( $titleToCheck->equals( $title ) ) {
+                               return new Revision( array(
+                                       'page' => $title->getArticleID(),
+                                       'user_text' => $user->getName(),
+                                       'user' => $user->getId(),
+                                       'parent_id' => $title->getLatestRevId(),
+                                       'title' => $title,
+                                       'content' => $content
+                               ) );
+                       } else {
+                               return call_user_func( $oldCallback, $titleToCheck, $parser );
+                       }
+               } );
+               global $wgHooks;
+               $wgHooks['TitleExists'][] =
+                       function ( $titleToCheck, &$exists ) use ( $title ) {
+                               if ( $titleToCheck->equals( $title ) ) {
+                                       $exists = true;
+                               }
+                       };
+               end( $wgHooks['TitleExists'] );
+               $key = key( $wgHooks['TitleExists'] );
+               LinkCache::singleton()->clearBadLink( $title->getPrefixedDBkey() );
+               return new ScopedCallback( function () use ( $title, $key ) {
+                       global $wgHooks;
+                       unset( $wgHooks['TitleExists'][$key] );
+                       LinkCache::singleton()->clearLink( $title );
+               } );
+       }
 }
index 428e7b2..117e04a 100644 (file)
@@ -54,6 +54,7 @@ class ParserOutput extends CacheTime {
        private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
        private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
        private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
+       private $mCustomDataUpdateCount = 0; # Number of custom updaters in $mSecondaryDataUpdates.
        private $mExtensionData = array(); # extra data used by extensions
        private $mLimitReportData = array(); # Parser limit report data
        private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
@@ -73,7 +74,6 @@ class ParserOutput extends CacheTime {
        }
 
        public function getText() {
-               wfProfileIn( __METHOD__ );
                $text = $this->mText;
                if ( $this->mEditSectionTokens ) {
                        $text = preg_replace_callback(
@@ -111,7 +111,6 @@ class ParserOutput extends CacheTime {
                                $text
                        );
                }
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -682,12 +681,30 @@ class ParserOutput extends CacheTime {
         * from the page's content. This is triggered by calling getSecondaryDataUpdates()
         * and is used for forward links updates on edit and backlink updates by jobs.
         *
+        * @note: custom DataUpdates do not survive serialization of the ParserOutput!
+        * This is especially relevant when using a cached ParserOutput for updating
+        * the database, as WikiPage does if $wgAjaxStashEdit is enabled. For this
+        * reason, ApiStashEdit will skip any ParserOutput that has custom DataUpdates.
+        *
         * @since 1.20
         *
         * @param DataUpdate $update
         */
        public function addSecondaryDataUpdate( DataUpdate $update ) {
                $this->mSecondaryDataUpdates[] = $update;
+               $this->mCustomDataUpdateCount = count( $this->mSecondaryDataUpdates );
+       }
+
+       /**
+        * Whether this ParserOutput contains custom DataUpdate objects that may not survive
+        * serialization of the ParserOutput.
+        *
+        * @see __sleep()
+        *
+        * @return bool
+        */
+       public function hasCustomDataUpdates() {
+               return ( $this->mCustomDataUpdateCount > 0 );
        }
 
        /**
@@ -704,6 +721,9 @@ class ParserOutput extends CacheTime {
         *    be created based on $this->getTitleText()
         * @param bool $recursive Queue jobs for recursive updates?
         *
+        * @throws MWException if called on a ParserOutput instance that was restored from serialization.
+        *         DataUpdates are generally not serializable, so after serialization, they are undefined.
+        *
         * @return array An array of instances of DataUpdate
         */
        public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
@@ -711,6 +731,15 @@ class ParserOutput extends CacheTime {
                        $title = Title::newFromText( $this->getTitleText() );
                }
 
+               if ( count( $this->mSecondaryDataUpdates ) !== $this->mCustomDataUpdateCount ) {
+                       // NOTE: This happens when mSecondaryDataUpdates are lost during serialization
+                       // (see __sleep below). After (un)serialization, getSecondaryDataUpdates()
+                       // has no defined behavior in that case, and should throw an exception.
+                       throw new MWException( 'getSecondaryDataUpdates() must not be called on ParserOutput restored from serialization.' );
+               }
+
+               // NOTE: ApiStashEdit knows about this "magic" update object. If this goes away,
+               // ApiStashEdit::buildStashValue needs to be adjusted.
                $linksUpdate = new LinksUpdate( $title, $this, $recursive );
 
                return array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
@@ -861,7 +890,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Save space for for serialization by removing useless values
+        * Save space for serialization by removing useless values
         * @return array
         */
        public function __sleep() {
index 2cce574..3435881 100644 (file)
@@ -68,6 +68,7 @@ class Preprocessor_DOM implements Preprocessor {
        /**
         * @param array $values
         * @return PPNode_DOM
+        * @throws MWException
         */
        public function newPartNodeArray( $values ) {
                //NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
@@ -85,7 +86,6 @@ class Preprocessor_DOM implements Preprocessor {
 
                $xml .= "</list>";
 
-               wfProfileIn( __METHOD__ . '-loadXML' );
                $dom = new DOMDocument();
                wfSuppressWarnings();
                $result = $dom->loadXML( $xml );
@@ -97,7 +97,6 @@ class Preprocessor_DOM implements Preprocessor {
                        // don't barf when the XML is >256 levels deep
                        $result = $dom->loadXML( $xml, 1 << 19 );
                }
-               wfProfileOut( __METHOD__ . '-loadXML' );
 
                if ( !$result ) {
                        throw new MWException( 'Parameters passed to ' . __METHOD__ . ' result in invalid XML' );
@@ -149,14 +148,12 @@ class Preprocessor_DOM implements Preprocessor {
         * @return PPNode_DOM
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               wfProfileIn( __METHOD__ );
                global $wgMemc, $wgPreprocessorCacheThreshold;
 
                $xml = false;
                $cacheable = ( $wgPreprocessorCacheThreshold !== false
                        && strlen( $text ) > $wgPreprocessorCacheThreshold );
                if ( $cacheable ) {
-                       wfProfileIn( __METHOD__ . '-cacheable' );
 
                        $cacheKey = wfMemcKey( 'preprocess-xml', md5( $text ), $flags );
                        $cacheValue = $wgMemc->get( $cacheKey );
@@ -169,11 +166,9 @@ class Preprocessor_DOM implements Preprocessor {
                                }
                        }
                        if ( $xml === false ) {
-                               wfProfileIn( __METHOD__ . '-cache-miss' );
                                $xml = $this->preprocessToXml( $text, $flags );
                                $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
                                $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                               wfProfileOut( __METHOD__ . '-cache-miss' );
                                wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
                        }
                } else {
@@ -186,13 +181,10 @@ class Preprocessor_DOM implements Preprocessor {
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
                        if ( $cacheable ) {
-                               wfProfileOut( __METHOD__ . '-cacheable' );
                        }
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
                }
 
-               wfProfileIn( __METHOD__ . '-loadXML' );
                $dom = new DOMDocument;
                wfSuppressWarnings();
                $result = $dom->loadXML( $xml );
@@ -207,14 +199,10 @@ class Preprocessor_DOM implements Preprocessor {
                if ( $result ) {
                        $obj = new PPNode_DOM( $dom->documentElement );
                }
-               wfProfileOut( __METHOD__ . '-loadXML' );
 
                if ( $cacheable ) {
-                       wfProfileOut( __METHOD__ . '-cacheable' );
                }
 
-               wfProfileOut( __METHOD__ );
-
                if ( !$result ) {
                        throw new MWException( __METHOD__ . ' generated invalid XML' );
                }
@@ -227,7 +215,6 @@ class Preprocessor_DOM implements Preprocessor {
         * @return string
         */
        public function preprocessToXml( $text, $flags = 0 ) {
-               wfProfileIn( __METHOD__ );
                $rules = array(
                        '{' => array(
                                'end' => '}',
@@ -764,8 +751,6 @@ class Preprocessor_DOM implements Preprocessor {
                $stack->rootAccum .= '</root>';
                $xml = $stack->rootAccum;
 
-               wfProfileOut( __METHOD__ );
-
                return $xml;
        }
 }
@@ -1101,7 +1086,6 @@ class PPFrame_DOM implements PPFrame {
                        );
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
-               wfProfileIn( __METHOD__ );
                ++$expansionDepth;
                if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
                        $this->parser->mHighestExpansionDepth = $expansionDepth;
@@ -1290,7 +1274,6 @@ class PPFrame_DOM implements PPFrame {
                                        $newIterator = $contextNode->childNodes;
                                }
                        } else {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( __METHOD__ . ': Invalid parameter type' );
                        }
 
@@ -1314,7 +1297,6 @@ class PPFrame_DOM implements PPFrame {
                        }
                }
                --$expansionDepth;
-               wfProfileOut( __METHOD__ );
                return $outStack[0];
        }
 
index b4b14dc..af91ad4 100644 (file)
@@ -112,7 +112,6 @@ class Preprocessor_Hash implements Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               wfProfileIn( __METHOD__ );
 
                // Check cache.
                global $wgMemc, $wgPreprocessorCacheThreshold;
@@ -121,7 +120,6 @@ class Preprocessor_Hash implements Preprocessor {
                        && strlen( $text ) > $wgPreprocessorCacheThreshold;
 
                if ( $cacheable ) {
-                       wfProfileIn( __METHOD__ . '-cacheable' );
 
                        $cacheKey = wfMemcKey( 'preprocess-hash', md5( $text ), $flags );
                        $cacheValue = $wgMemc->get( $cacheKey );
@@ -132,12 +130,9 @@ class Preprocessor_Hash implements Preprocessor {
                                        // From the cache
                                        wfDebugLog( "Preprocessor",
                                                "Loaded preprocessor hash from memcached (key $cacheKey)" );
-                                       wfProfileOut( __METHOD__ . '-cacheable' );
-                                       wfProfileOut( __METHOD__ );
                                        return $hash;
                                }
                        }
-                       wfProfileIn( __METHOD__ . '-cache-miss' );
                }
 
                $rules = array(
@@ -637,18 +632,12 @@ class Preprocessor_Hash implements Preprocessor {
                                                        }
                                                        if ( !$node ) {
                                                                if ( $cacheable ) {
-                                                                       wfProfileOut( __METHOD__ . '-cache-miss' );
-                                                                       wfProfileOut( __METHOD__ . '-cacheable' );
                                                                }
-                                                               wfProfileOut( __METHOD__ );
                                                                throw new MWException( __METHOD__ . ': eqpos not found' );
                                                        }
                                                        if ( $node->name !== 'equals' ) {
                                                                if ( $cacheable ) {
-                                                                       wfProfileOut( __METHOD__ . '-cache-miss' );
-                                                                       wfProfileOut( __METHOD__ . '-cacheable' );
                                                                }
-                                                               wfProfileOut( __METHOD__ );
                                                                throw new MWException( __METHOD__ . ': eqpos is not equals' );
                                                        }
                                                        $equalsNode = $node;
@@ -748,12 +737,9 @@ class Preprocessor_Hash implements Preprocessor {
                if ( $cacheable ) {
                        $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
                        $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                       wfProfileOut( __METHOD__ . '-cache-miss' );
-                       wfProfileOut( __METHOD__ . '-cacheable' );
                        wfDebugLog( "Preprocessor", "Saved preprocessor Hash to memcached (key $cacheKey)" );
                }
 
-               wfProfileOut( __METHOD__ );
                return $rootNode;
        }
 }
index 5d1743e..51ae42d 100644 (file)
@@ -117,12 +117,10 @@ class StripState {
                        return $text;
                }
 
-               wfProfileIn( __METHOD__ );
                $oldType = $this->tempType;
                $this->tempType = $type;
                $text = preg_replace_callback( $this->regex, array( $this, 'unstripCallback' ), $text );
                $this->tempType = $oldType;
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
index e77ffd7..5692d73 100644 (file)
  * minutes and hundreds of read hits.
  *
  * The PoolCounter provides semaphore semantics for restricting the number
- * of workers that may be concurrently performing such single task.
+ * of workers that may be concurrently performing such single task. Only one
+ * key can be locked by any PoolCounter instance of a process, except for keys
+ * that start with "nowait:". However, only 0 timeouts (non-blocking requests)
+ * can be used with "nowait:" keys.
  *
  * By default PoolCounter_Stub is used, which provides no locking. You
  * can get a useful one in the PoolCounter extension.
@@ -67,6 +70,15 @@ abstract class PoolCounter {
        /** @var float Maximum time in seconds to wait for the lock */
        protected $timeout;
 
+       /**
+        * @var boolean Whether the key is a "might wait" key
+        */
+       private $isMightWaitKey;
+       /**
+        * @var boolean Whether this process holds a "might wait" lock key
+        */
+       private static $acquiredMightWaitKey = 0;
+
        /**
         * @param array $conf
         * @param string $type
@@ -84,6 +96,7 @@ abstract class PoolCounter {
                        $key = $this->hashKeyIntoSlots( $key, $this->slots );
                }
                $this->key = $key;
+               $this->isMightWaitKey = !preg_match( '/^nowait:/', $this->key );
        }
 
        /**
@@ -136,6 +149,48 @@ abstract class PoolCounter {
         */
        abstract public function release();
 
+       /**
+        * Checks that the lock request is sane.
+        * @return Status - good for sane requests fatal for insane
+        * @since 1.25
+        */
+       final protected function precheckAcquire() {
+               if ( $this->isMightWaitKey ) {
+                       if ( self::$acquiredMightWaitKey ) {
+                               /*
+                                * The poolcounter itself is quite happy to allow you to wait
+                                * on another lock while you have a lock you waited on already
+                                * but we think that it is unlikely to be a good idea.  So we
+                                * made it an error.  If you are _really_ _really_ sure it is a
+                                * good idea then feel free to implement an unsafe flag or
+                                * something.
+                                */
+                               return Status::newFatal( 'poolcounter-usage-error',
+                                       'You may only aquire a single non-nowait lock.' );
+                       }
+               } elseif ( $this->timeout !== 0 ) {
+                       return Status::newFatal( 'poolcounter-usage-error',
+                               'Locks starting in nowait: must have 0 timeout.' );
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * Update any lock tracking information when the lock is acquired
+        * @since 1.25
+        */
+       final protected function onAcquire() {
+               self::$acquiredMightWaitKey |= $this->isMightWaitKey;
+       }
+
+       /**
+        * Update any lock tracking information when the lock is released
+        * @since 1.25
+        */
+       final protected function onRelease() {
+               self::$acquiredMightWaitKey &= !$this->isMightWaitKey;
+       }
+
        /**
         * Given a key (any string) and the number of lots, returns a slot number (an integer from the [0..($slots-1)] range).
         * This is used for a global limit on the number of instances  of a given type that can acquire a lock.
index d609f61..98797a3 100644 (file)
@@ -121,19 +121,26 @@ class PoolCounterRedis extends PoolCounter {
        }
 
        function acquireForMe() {
-               $section = new ProfileSection( __METHOD__ );
+
+               $status = $this->precheckAcquire();
+               if ( !$status->isGood() ) {
+                       return $status;
+               }
 
                return $this->waitForSlotOrNotif( self::AWAKE_ONE );
        }
 
        function acquireForAnyone() {
-               $section = new ProfileSection( __METHOD__ );
+
+               $status = $this->precheckAcquire();
+               if ( !$status->isGood() ) {
+                       return $status;
+               }
 
                return $this->waitForSlotOrNotif( self::AWAKE_ALL );
        }
 
        function release() {
-               $section = new ProfileSection( __METHOD__ );
 
                if ( $this->slot === null ) {
                        return Status::newGood( PoolCounter::NOT_LOCKED ); // not locked
@@ -207,6 +214,8 @@ LUA;
                $this->onRelease = null;
                unset( self::$active[$this->session] );
 
+               $this->onRelease();
+
                return Status::newGood( PoolCounter::RELEASED );
        }
 
@@ -266,6 +275,8 @@ LUA;
                        self::$active[$this->session] = $this;
                }
 
+               $this->onAcquire();
+
                return Status::newGood( $slot === 'w' ? PoolCounter::DONE : PoolCounter::LOCKED );
        }
 
index ca80ebc..68ef668 100644 (file)
  * Class for handling function-scope profiling
  *
  * @since 1.22
+ * @deprecated 1.25 No-op now
  */
 class ProfileSection {
-       /** @var string $name Method name */
-       protected $name;
-       /** @var boolean $enabled Is profiling enabled? */
-       protected $enabled = false;
-
        /**
         * Begin profiling of a function and return an object that ends profiling
         * of the function when that object leaves scope. As long as the object is
@@ -43,21 +39,5 @@ class ProfileSection {
         *
         * @param string $name Name of the function to profile
         */
-       public function __construct( $name ) {
-               $this->name = $name;
-               // Use Profiler member variable directly to reduce overhead
-               if ( Profiler::$__instance === null ) {
-                       Profiler::instance();
-               }
-               if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
-                       $this->enabled = true;
-                       Profiler::$__instance->profileIn( $this->name );
-               }
-       }
-
-       function __destruct() {
-               if ( $this->enabled ) {
-                       Profiler::$__instance->profileOut( $this->name );
-               }
-       }
+       public function __construct( $name ) {}
 }
index 667a9e2..9bb2db9 100644 (file)
@@ -118,19 +118,9 @@ abstract class Profiler {
                }
        }
 
-       /**
-        * Called by wfProfieIn()
-        *
-        * @param string $functionname
-        */
-       abstract public function profileIn( $functionname );
-
-       /**
-        * Called by wfProfieOut()
-        *
-        * @param string $functionname
-        */
-       abstract public function profileOut( $functionname );
+       // Kept BC for now, remove when possible
+       public function profileIn( $functionname ) {}
+       public function profileOut( $functionname ) {}
 
        /**
         * Mark the start of a custom profiling frame (e.g. DB queries).
index a0d5943..4984e77 100644 (file)
@@ -42,27 +42,15 @@ function wfGetRusage() {
 /**
  * Begin profiling of a function
  * @param string $functionname Name of the function we will profile
+ * @deprecated 1.25
  */
 function wfProfileIn( $functionname ) {
-       // Use Profiler member variable directly to reduce overhead
-       if ( Profiler::$__instance === null ) {
-               Profiler::instance();
-       }
-       if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
-               Profiler::$__instance->profileIn( $functionname );
-       }
 }
 
 /**
  * Stop profiling of a function
  * @param string $functionname Name of the function we have profiled
+ * @deprecated 1.25
  */
 function wfProfileOut( $functionname = 'missing' ) {
-       // Use Profiler member variable directly to reduce overhead
-       if ( Profiler::$__instance === null ) {
-               Profiler::instance();
-       }
-       if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
-               Profiler::$__instance->profileOut( $functionname );
-       }
 }
diff --git a/includes/profiler/ProfilerSectionOnly.php b/includes/profiler/ProfilerSectionOnly.php
new file mode 100755 (executable)
index 0000000..1f8d33b
--- /dev/null
@@ -0,0 +1,104 @@
+<?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
+ */
+
+/**
+ * Profiler that only tracks explicit profiling sections
+ *
+ * @code
+ * $wgProfiler['class'] = 'ProfilerSectionOnly';
+ * $wgProfiler['output'] = 'text';
+ * $wgProfiler['visible'] = true;
+ * @endcode
+ *
+ * @author Aaron Schulz
+ * @ingroup Profiler
+ * @since 1.25
+ */
+class ProfilerSectionOnly extends Profiler {
+       /** @var SectionProfiler */
+       protected $sprofiler;
+
+       public function __construct( array $params = array() ) {
+               parent::__construct( $params );
+               $this->sprofiler = new SectionProfiler();
+       }
+
+       public function scopedProfileIn( $section ) {
+               return $this->sprofiler->scopedProfileIn( $section );
+       }
+
+       public function close() {
+       }
+
+       public function getFunctionStats() {
+               return $this->sprofiler->getFunctionStats();
+       }
+
+       public function getOutput() {
+               return $this->getFunctionReport();
+       }
+
+       /**
+        * Get a report of profiled functions sorted by inclusive wall clock time
+        * in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Function name
+        * - Number of times function was called
+        * - Total wall clock time spent in function in microseconds
+        * - Minimum wall clock time spent in function in microseconds
+        * - Average wall clock time spent in function in microseconds
+        * - Maximum wall clock time spent in function in microseconds
+        * - Percentage of total wall clock time spent in function
+        * - Total delta of memory usage from start to end of function in bytes
+        *
+        * @return string
+        */
+       protected function getFunctionReport() {
+               $data = $this->getFunctionStats();
+               usort( $data, function( $a, $b ) {
+                       if ( $a['real'] === $b['real'] ) {
+                               return 0;
+                       }
+                       return ( $a['real'] > $b['real'] ) ? -1 : 1; // descending
+               } );
+
+               $width = 140;
+               $nameWidth = $width - 65;
+               $format = "%-{$nameWidth}s %6d %9d %9d %9d %9d %7.3f%% %9d";
+               $out = array();
+               $out[] = sprintf( "%-{$nameWidth}s %6s %9s %9s %9s %9s %7s %9s",
+                       'Name', 'Calls', 'Total', 'Min', 'Each', 'Max', '%', 'Mem'
+               );
+               foreach ( $data as $stats ) {
+                       $out[] = sprintf( $format,
+                               $stats['name'],
+                               $stats['calls'],
+                               $stats['real'] * 1000,
+                               $stats['min_real'] * 1000,
+                               $stats['real'] / $stats['calls'] * 1000,
+                               $stats['max_real'] * 1000,
+                               $stats['%real'],
+                               $stats['memory']
+                       );
+               }
+               return implode( "\n", $out );
+       }
+}
diff --git a/includes/profiler/ProfilerSimpleTrace.php b/includes/profiler/ProfilerSimpleTrace.php
deleted file mode 100644 (file)
index 893d960..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Profiler showing execution trace.
- *
- * 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 Profiler
- */
-
-/**
- * Execution trace profiler
- * @todo document methods (?)
- * @ingroup Profiler
- */
-class ProfilerSimpleTrace extends ProfilerStandard {
-       protected $trace = "Beginning trace: \n";
-       protected $memory = 0;
-
-       public function profileIn( $functionname ) {
-               parent::profileIn( $functionname );
-
-               $this->trace .= "         " . sprintf( "%6.1f", $this->memoryDiff() ) .
-                       str_repeat( " ", count( $this->workStack ) ) . " > " . $functionname . "\n";
-       }
-
-       public function profileOut( $functionname ) {
-               $item = end( $this->workStack );
-
-               parent::profileOut( $functionname );
-
-               if ( !$item ) {
-                       $this->trace .= "Profiling error: $functionname\n";
-               } else {
-                       list( $ofname, /* $ocount */, $ortime ) = $item;
-                       if ( $functionname == 'close' ) {
-                               $message = "Profile section ended by close(): {$ofname}";
-                               $functionname = $ofname;
-                               $this->trace .= $message . "\n";
-                       } elseif ( $ofname != $functionname ) {
-                               $this->trace .= "Profiling error: in({$ofname}), out($functionname)";
-                       }
-                       $elapsedreal = $this->getTime() - $ortime;
-                       $this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
-                               str_repeat( " ", count( $this->workStack ) + 1 ) . " < " . $functionname . "\n";
-               }
-       }
-
-       protected function memoryDiff() {
-               $diff = memory_get_usage() - $this->memory;
-               $this->memory = memory_get_usage();
-               return $diff / 1024;
-       }
-
-       public function logData() {
-               if ( $this->templated ) {
-                       $contentType = $this->getContentType();
-                       if ( PHP_SAPI === 'cli' ) {
-                               print "<!-- \n {$this->trace} \n -->";
-                       } elseif ( $contentType === 'text/html' ) {
-                               print "<!-- \n {$this->trace} \n -->";
-                       } elseif ( $contentType === 'text/javascript' ) {
-                               print "\n/*\n {$this->trace}\n*/";
-                       } elseif ( $contentType === 'text/css' ) {
-                               print "\n/*\n {$this->trace}\n*/";
-                       }
-               }
-       }
-}
diff --git a/includes/profiler/ProfilerStandard.php b/includes/profiler/ProfilerStandard.php
deleted file mode 100644 (file)
index 4ce88bd..0000000
+++ /dev/null
@@ -1,628 +0,0 @@
-<?php
-/**
- * Common implementation class for profiling.
- *
- * 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 Profiler
- */
-
-/**
- * Standard profiler that tracks real time, cpu time, and memory deltas
- *
- * This supports profile reports, the debug toolbar, and high-contention
- * DB query warnings. This does not persist the profiling data though.
- *
- * @ingroup Profiler
- * @since 1.24
- */
-class ProfilerStandard extends Profiler {
-       /** @var array List of resolved profile calls with start/end data */
-       protected $stack = array();
-       /** @var array Queue of open profile calls with start data */
-       protected $workStack = array();
-
-       /** @var array Map of (function name => aggregate data array) */
-       protected $collated = array();
-       /** @var bool */
-       protected $collateDone = false;
-       /** @var bool Whether to collect the full stack trace or just aggregates */
-       protected $collateOnly = true;
-       /** @var array Cache of a standard broken collation entry */
-       protected $errorEntry;
-
-       /**
-        * @param array $params
-        *   - initTotal : set to false to omit -total/-setup entries (which use request start time)
-        */
-       public function __construct( array $params ) {
-               parent::__construct( $params );
-
-               if ( !isset( $params['initTotal'] ) || $params['initTotal'] ) {
-                       $this->addInitialStack();
-               }
-       }
-
-       /**
-        * Add the inital item in the stack.
-        */
-       protected function addInitialStack() {
-               $this->errorEntry = $this->getErrorEntry();
-
-               $initialTime = $this->getInitialTime( 'wall' );
-               $initialCpu = $this->getInitialTime( 'cpu' );
-               if ( $initialTime !== null && $initialCpu !== null ) {
-                       $this->workStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
-                       if ( $this->collateOnly ) {
-                               $this->workStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
-                               $this->profileOut( '-setup' );
-                       } else {
-                               $this->stack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
-                                       $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
-                       }
-               } else {
-                       $this->profileIn( '-total' );
-               }
-       }
-
-       /**
-        * @return array Initial collation entry
-        */
-       protected function getZeroEntry() {
-               return array(
-                       'cpu'      => 0.0,
-                       'cpu_sq'   => 0.0,
-                       'real'     => 0.0,
-                       'real_sq'  => 0.0,
-                       'memory'   => 0,
-                       'count'    => 0,
-                       'min_cpu'  => 0.0,
-                       'max_cpu'  => 0.0,
-                       'min_real' => 0.0,
-                       'max_real' => 0.0,
-                       'periods'  => array(), // not filled if collateOnly
-                       'overhead' => 0 // not filled if collateOnly
-               );
-       }
-
-       /**
-        * @return array Initial collation entry for errors
-        */
-       protected function getErrorEntry() {
-               $entry = $this->getZeroEntry();
-               $entry['count'] = 1;
-               return $entry;
-       }
-
-       /**
-        * Update the collation entry for a given method name
-        *
-        * @param string $name
-        * @param float $elapsedCpu
-        * @param float $elapsedReal
-        * @param int $memChange
-        * @param int $subcalls
-        * @param array|null $period Map of ('start','end','memory','subcalls')
-        */
-       protected function updateEntry(
-               $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
-       ) {
-               $entry =& $this->collated[$name];
-               if ( !is_array( $entry ) ) {
-                       $entry = $this->getZeroEntry();
-                       $this->collated[$name] =& $entry;
-               }
-               $entry['cpu'] += $elapsedCpu;
-               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
-               $entry['real'] += $elapsedReal;
-               $entry['real_sq'] += $elapsedReal * $elapsedReal;
-               $entry['memory'] += $memChange > 0 ? $memChange : 0;
-               $entry['count']++;
-               $entry['min_cpu'] = $elapsedCpu < $entry['min_cpu'] ? $elapsedCpu : $entry['min_cpu'];
-               $entry['max_cpu'] = $elapsedCpu > $entry['max_cpu'] ? $elapsedCpu : $entry['max_cpu'];
-               $entry['min_real'] = $elapsedReal < $entry['min_real'] ? $elapsedReal : $entry['min_real'];
-               $entry['max_real'] = $elapsedReal > $entry['max_real'] ? $elapsedReal : $entry['max_real'];
-               // Apply optional fields
-               $entry['overhead'] += $subcalls;
-               if ( $period ) {
-                       $entry['periods'][] = $period;
-               }
-       }
-
-       /**
-        * Called by wfProfieIn()
-        *
-        * @param string $functionname
-        */
-       public function profileIn( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->workStack ) ) .
-                               'Entering ' . $functionname . "\n" );
-               }
-
-               $this->workStack[] = array(
-                       $functionname,
-                       count( $this->workStack ),
-                       $this->getTime( 'time' ),
-                       $this->getTime( 'cpu' ),
-                       memory_get_usage()
-               );
-       }
-
-       /**
-        * Called by wfProfieOut()
-        *
-        * @param string $functionname
-        */
-       public function profileOut( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->workStack ) - 1 ) .
-                               'Exiting ' . $functionname . "\n" );
-               }
-
-               $item = array_pop( $this->workStack );
-               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
-
-               if ( $item === null ) {
-                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
-               } else {
-                       if ( $functionname === 'close' ) {
-                               if ( $ofname !== '-total' ) {
-                                       $message = "Profile section ended by close(): {$ofname}";
-                                       $this->debugGroup( 'profileerror', $message );
-                                       if ( $this->collateOnly ) {
-                                               $this->collated[$message] = $this->errorEntry;
-                                       } else {
-                                               $this->stack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
-                                       }
-                               }
-                               $functionname = $ofname;
-                       } elseif ( $ofname !== $functionname ) {
-                               $message = "Profiling error: in({$ofname}), out($functionname)";
-                               $this->debugGroup( 'profileerror', $message );
-                               if ( $this->collateOnly ) {
-                                       $this->collated[$message] = $this->errorEntry;
-                               } else {
-                                       $this->stack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
-                               }
-                       }
-                       $realTime = $this->getTime( 'wall' );
-                       $cpuTime = $this->getTime( 'cpu' );
-                       if ( $this->collateOnly ) {
-                               $elapsedcpu = $cpuTime - $octime;
-                               $elapsedreal = $realTime - $ortime;
-                               $memchange = memory_get_usage() - $omem;
-                               $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
-                       } else {
-                               $this->stack[] = array_merge( $item,
-                                       array( $realTime, $cpuTime,     memory_get_usage() ) );
-                       }
-               }
-       }
-
-       public function scopedProfileIn( $section ) {
-               $this->profileIn( $section );
-
-               $that = $this;
-               return new ScopedCallback( function () use ( $that, $section ) {
-                       $that->profileOut( $section );
-               } );
-       }
-
-       /**
-        * Close opened profiling sections
-        */
-       public function close() {
-               while ( count( $this->workStack ) ) {
-                       $this->profileOut( 'close' );
-               }
-       }
-
-       /**
-        * Returns a profiling output to be stored in debug file
-        *
-        * @return string
-        */
-       public function getOutput() {
-               global $wgDebugFunctionEntry, $wgProfileCallTree;
-
-               $wgDebugFunctionEntry = false; // hack
-
-               if ( !count( $this->stack ) && !count( $this->collated ) ) {
-                       return "No profiling output\n";
-               }
-
-               if ( $wgProfileCallTree ) {
-                       return $this->getCallTree();
-               } else {
-                       return $this->getFunctionReport();
-               }
-       }
-
-       /**
-        * Returns a tree of function call instead of a list of functions
-        * @return string
-        */
-       protected function getCallTree() {
-               return implode( '', array_map(
-                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->stack )
-               ) );
-       }
-
-       /**
-        * Recursive function the format the current profiling array into a tree
-        *
-        * @param array $stack Profiling array
-        * @return array
-        */
-       protected function remapCallTree( array $stack ) {
-               if ( count( $stack ) < 2 ) {
-                       return $stack;
-               }
-               $outputs = array();
-               for ( $max = count( $stack ) - 1; $max > 0; ) {
-                       /* Find all items under this entry */
-                       $level = $stack[$max][1];
-                       $working = array();
-                       for ( $i = $max -1; $i >= 0; $i-- ) {
-                               if ( $stack[$i][1] > $level ) {
-                                       $working[] = $stack[$i];
-                               } else {
-                                       break;
-                               }
-                       }
-                       $working = $this->remapCallTree( array_reverse( $working ) );
-                       $output = array();
-                       foreach ( $working as $item ) {
-                               array_push( $output, $item );
-                       }
-                       array_unshift( $output, $stack[$max] );
-                       $max = $i;
-
-                       array_unshift( $outputs, $output );
-               }
-               $final = array();
-               foreach ( $outputs as $output ) {
-                       foreach ( $output as $item ) {
-                               $final[] = $item;
-                       }
-               }
-               return $final;
-       }
-
-       /**
-        * Callback to get a formatted line for the call tree
-        * @param array $entry
-        * @return string
-        */
-       protected function getCallTreeLine( $entry ) {
-               list( $fname, $level, $startreal, , , $endreal ) = $entry;
-               $delta = $endreal - $startreal;
-               $space = str_repeat( ' ', $level );
-               # The ugly double sprintf is to work around a PHP bug,
-               # which has been fixed in recent releases.
-               return sprintf( "%10s %s %s\n",
-                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
-       }
-
-       /**
-        * Return the collated data, collating first if need be
-        * @return array
-        */
-       public function getCollatedData() {
-               if ( !$this->collateDone ) {
-                       $this->collateData();
-               }
-               return $this->collated;
-       }
-
-       /**
-        * Populate collated
-        */
-       protected function collateData() {
-               if ( $this->collateDone ) {
-                       return;
-               }
-               $this->collateDone = true;
-               $this->close(); // set "-total" entry
-
-               if ( $this->collateOnly ) {
-                       // already collated as methods exited
-                       $this->sortCollated();
-                       return;
-               }
-
-               $this->collated = array();
-
-               # Estimate profiling overhead
-               $profileCount = count( $this->stack );
-               self::calculateOverhead( $profileCount );
-
-               # First, subtract the overhead!
-               $overheadTotal = $overheadMemory = $overheadInternal = array();
-               foreach ( $this->stack as $entry ) {
-                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
-                       $fname = $entry[0];
-                       $elapsed = $entry[5] - $entry[2];
-                       $memchange = $entry[7] - $entry[4];
-
-                       if ( $fname === '-overhead-total' ) {
-                               $overheadTotal[] = $elapsed;
-                               $overheadMemory[] = max( 0, $memchange );
-                       } elseif ( $fname === '-overhead-internal' ) {
-                               $overheadInternal[] = $elapsed;
-                       }
-               }
-               $overheadTotal = $overheadTotal ?
-                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
-               $overheadMemory = $overheadMemory ?
-                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
-               $overheadInternal = $overheadInternal ?
-                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
-
-               # Collate
-               foreach ( $this->stack as $index => $entry ) {
-                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
-                       $fname = $entry[0];
-                       $elapsedCpu = $entry[6] - $entry[3];
-                       $elapsedReal = $entry[5] - $entry[2];
-                       $memchange = $entry[7] - $entry[4];
-                       $subcalls = $this->calltreeCount( $this->stack, $index );
-
-                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
-                               # Adjust for profiling overhead (except special values with elapsed=0
-                               if ( $elapsed ) {
-                                       $elapsed -= $overheadInternal;
-                                       $elapsed -= ( $subcalls * $overheadTotal );
-                                       $memchange -= ( $subcalls * $overheadMemory );
-                               }
-                       }
-
-                       $period = array( 'start' => $entry[2], 'end' => $entry[5],
-                               'memory' => $memchange, 'subcalls' => $subcalls );
-                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
-               }
-
-               $this->collated['-overhead-total']['count'] = $profileCount;
-               $this->sortCollated();
-       }
-
-       protected function sortCollated() {
-               uksort( $this->collated, function ( $a, $b ) {
-                       $ca = $this->collated[$a]['real'];
-                       $cb = $this->collated[$b]['real'];
-                       if ( $ca > $cb ) {
-                               return -1;
-                       } elseif ( $cb > $ca ) {
-                               return 1;
-                       } else {
-                               return 0;
-                       }
-               } );
-       }
-
-       /**
-        * Returns a list of profiled functions.
-        *
-        * @return string
-        */
-       protected function getFunctionReport() {
-               $this->collateData();
-
-               $width = 140;
-               $nameWidth = $width - 65;
-               $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d  (%13.3f -%13.3f) [%d]\n";
-               $titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
-               $prof = "\nProfiling data\n";
-               $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
-
-               $total = isset( $this->collated['-total'] )
-                       ? $this->collated['-total']['real']
-                       : 0;
-
-               foreach ( $this->collated as $fname => $data ) {
-                       $calls = $data['count'];
-                       $percent = $total ? 100 * $data['real'] / $total : 0;
-                       $memory = $data['memory'];
-                       $prof .= sprintf( $format,
-                               substr( $fname, 0, $nameWidth ),
-                               $calls,
-                               (float)( $data['real'] * 1000 ),
-                               (float)( $data['real'] * 1000 ) / $calls,
-                               $percent,
-                               $memory,
-                               ( $data['min_real'] * 1000.0 ),
-                               ( $data['max_real'] * 1000.0 ),
-                               $data['overhead']
-                       );
-               }
-               $prof .= "\nTotal: $total\n\n";
-
-               return $prof;
-       }
-
-       public function getFunctionStats() {
-               // This method is called before shutdown in the footer method on Skins.
-               // If some outer methods have not yet called wfProfileOut(), work around
-               // that by clearing anything in the work stack to just the "-total" entry.
-               // Collate after doing this so the results do not include profile errors.
-               if ( count( $this->workStack ) > 1 ) {
-                       $oldWorkStack = $this->workStack;
-                       $this->workStack = array( $this->workStack[0] ); // just the "-total" one
-               } else {
-                       $oldWorkStack = null;
-               }
-               $this->collateData();
-               // If this trick is used, then the old work stack is swapped back afterwards
-               // and collateDone is reset to false. This means that logData() will still
-               // make use of all the method data since the missing wfProfileOut() calls
-               // should be made by the time it is called.
-               if ( $oldWorkStack ) {
-                       $this->workStack = $oldWorkStack;
-                       $this->collateDone = false;
-               }
-
-               $totalCpu = isset( $this->collated['-total'] )
-                       ? $this->collated['-total']['cpu']
-                       : 0;
-               $totalReal = isset( $this->collated['-total'] )
-                       ? $this->collated['-total']['real']
-                       : 0;
-               $totalMem = isset( $this->collated['-total'] )
-                       ? $this->collated['-total']['memory']
-                       : 0;
-
-               $profile = array();
-               foreach ( $this->collated as $fname => $data ) {
-                       $profile[] = array(
-                               'name' => $fname,
-                               'calls' => $data['count'],
-                               'real' => $data['real'] * 1000,
-                               '%real' => $totalReal ? 100 * $data['real'] / $totalReal : 0,
-                               'cpu' => $data['cpu'] * 1000,
-                               '%cpu' => $totalCpu ? 100 * $data['cpu'] / $totalCpu : 0,
-                               'memory' => $data['memory'],
-                               '%memory' => $totalMem ? 100 * $data['memory'] / $totalMem : 0,
-                               'min_real' => $data['min_real'] * 1000,
-                               'max_real' => $data['max_real'] * 1000
-                       );
-               }
-
-               return $profile;
-       }
-
-       /**
-        * Dummy calls to wfProfileIn/wfProfileOut to calculate its overhead
-        * @param int $profileCount
-        */
-       protected static function calculateOverhead( $profileCount ) {
-               wfProfileIn( '-overhead-total' );
-               for ( $i = 0; $i < $profileCount; $i++ ) {
-                       wfProfileIn( '-overhead-internal' );
-                       wfProfileOut( '-overhead-internal' );
-               }
-               wfProfileOut( '-overhead-total' );
-       }
-
-       /**
-        * Counts the number of profiled function calls sitting under
-        * the given point in the call graph. Not the most efficient algo.
-        *
-        * @param array $stack
-        * @param int $start
-        * @return int
-        */
-       protected function calltreeCount( $stack, $start ) {
-               $level = $stack[$start][1];
-               $count = 0;
-               for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
-                       $count ++;
-               }
-               return $count;
-       }
-
-       /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
-        *
-        * @param string|bool $metric Metric to use, with the following possibilities:
-        *   - user: User CPU time (without system calls)
-        *   - cpu: Total CPU time (user and system calls)
-        *   - wall (or any other string): elapsed time
-        *   - false (default): will fall back to default metric
-        * @return float|null
-        */
-       protected function getTime( $metric = 'wall' ) {
-               if ( $metric === 'cpu' || $metric === 'user' ) {
-                       $ru = wfGetRusage();
-                       if ( !$ru ) {
-                               return 0;
-                       }
-                       $time = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
-                       if ( $metric === 'cpu' ) {
-                               # This is the time of system calls, added to the user time
-                               # it gives the total CPU time
-                               $time += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
-                       }
-                       return $time;
-               } else {
-                       return microtime( true );
-               }
-       }
-
-       /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
-        *
-        * @param string|bool $metric Metric to use, with the following possibilities:
-        *   - user: User CPU time (without system calls)
-        *   - cpu: Total CPU time (user and system calls)
-        *   - wall (or any other string): elapsed time
-        *   - false (default): will fall back to default metric
-        * @return float|null
-        */
-       protected function getInitialTime( $metric = 'wall' ) {
-               global $wgRequestTime, $wgRUstart;
-
-               if ( $metric === 'cpu' || $metric === 'user' ) {
-                       if ( !count( $wgRUstart ) ) {
-                               return null;
-                       }
-
-                       $time = $wgRUstart['ru_utime.tv_sec'] + $wgRUstart['ru_utime.tv_usec'] / 1e6;
-                       if ( $metric === 'cpu' ) {
-                               # This is the time of system calls, added to the user time
-                               # it gives the total CPU time
-                               $time += $wgRUstart['ru_stime.tv_sec'] + $wgRUstart['ru_stime.tv_usec'] / 1e6;
-                       }
-                       return $time;
-               } else {
-                       if ( empty( $wgRequestTime ) ) {
-                               return null;
-                       } else {
-                               return $wgRequestTime;
-                       }
-               }
-       }
-
-       /**
-        * Add an entry in the debug log file
-        *
-        * @param string $s String to output
-        */
-       protected function debug( $s ) {
-               if ( function_exists( 'wfDebug' ) ) {
-                       wfDebug( $s );
-               }
-       }
-
-       /**
-        * Add an entry in the debug log group
-        *
-        * @param string $group Group to send the message to
-        * @param string $s String to output
-        */
-       protected function debugGroup( $group, $s ) {
-               if ( function_exists( 'wfDebugLog' ) ) {
-                       wfDebugLog( $group, $s );
-               }
-       }
-}
index 9a7ec8c..5580f94 100644 (file)
  * @ingroup Profiler
  */
 class ProfilerStub extends Profiler {
-       public function profileIn( $fn ) {
-       }
-
-       public function profileOut( $fn ) {
-       }
-
        public function scopedProfileIn( $section ) {
-               return new ScopedCallback( function () {
-                       // no-op
-               } );
+               return new ScopedCallback( null ); // no-op
        }
 
        public function getFunctionStats() {
index a40c44a..7a50497 100644 (file)
@@ -21,9 +21,6 @@
 /**
  * Profiler wrapper for XHProf extension.
  *
- * Mimics the output of ProfilerStandard using data collected via the XHProf
- * PHP extension.
- *
  * @code
  * $wgProfiler['class'] = 'ProfilerXhprof';
  * $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
  * $wgProfiler['output'] = 'udp';
  * @endcode
  *
- * Rather than obeying wfProfileIn() and wfProfileOut() calls placed in the
- * application code, ProfilerXhprof profiles all functions using the XHProf
- * PHP extenstion. For PHP5 users, this extension can be installed via PECL or
- * your operating system's package manager. XHProf support is built into HHVM.
+ * ProfilerXhprof profiles all functions using the XHProf PHP extenstion.
+ * For PHP5 users, this extension can be installed via PECL or your operating
+ * system's package manager. XHProf support is built into HHVM.
  *
  * To restrict the functions for which profiling data is collected, you can
  * use either a whitelist ($wgProfiler['include']) or a blacklist
@@ -80,28 +76,6 @@ class ProfilerXhprof extends Profiler {
                $this->sprofiler = new SectionProfiler();
        }
 
-       /**
-        * No-op for xhprof profiling.
-        *
-        * Use the 'include' configuration key instead if you need to constrain
-        * the functions that are profiled.
-        *
-        * @param string $functionname
-        */
-       public function profileIn( $functionname ) {
-       }
-
-       /**
-        * No-op for xhprof profiling.
-        *
-        * Use the 'include' configuration key instead if you need to constrain
-        * the functions that are profiled.
-        *
-        * @param string $functionname
-        */
-       public function profileOut( $functionname ) {
-       }
-
        public function scopedProfileIn( $section ) {
                return $this->sprofiler->scopedProfileIn( $section );
        }
@@ -118,7 +92,7 @@ class ProfilerXhprof extends Profiler {
 
                $main = null; // units in ms
                foreach ( $metrics as $fname => $stats ) {
-                       // Convert elapsed times from μs to ms to match ProfilerStandard
+                       // Convert elapsed times from μs to ms to match interface
                        $entry = array(
                                'name' => $fname,
                                'calls' => $stats['ct'],
@@ -139,8 +113,13 @@ class ProfilerXhprof extends Profiler {
 
                // Merge in all of the custom profile sections
                foreach ( $this->sprofiler->getFunctionStats() as $stats ) {
+                       if ( $stats['name'] === '-total' ) {
+                               // Discard section profiler running totals
+                               continue;
+                       }
+
                        // @note: getFunctionStats() values already in ms
-                       $stats['%real'] = $stats['real'] / $main['real'];
+                       $stats['%real'] = $main['real'] ? $stats['real'] / $main['real'] * 100 : 0;
                        $stats['%cpu'] = $main['cpu'] ? $stats['cpu'] / $main['cpu'] * 100 : 0;
                        $stats['%memory'] = $main['memory'] ? $stats['memory'] / $main['memory'] * 100 : 0;
                        $profile[] = $stats; // assume no section names collide with $metrics
index 2c36b68..245022d 100644 (file)
@@ -67,8 +67,7 @@ class SectionProfiler {
        public function scopedProfileIn( $section ) {
                $this->profileInInternal( $section );
 
-               $that = $this;
-               return new ScopedCallback( $this->profileOutCallback, array( $that, $section ) );
+               return new SectionProfileCallback( $this, $section );
        }
 
        /**
@@ -278,6 +277,7 @@ class SectionProfiler {
        /**
         * Returns a tree of function calls with their real times
         * @return string
+        * @throws Exception
         */
        public function getCallTreeReport() {
                if ( $this->collateOnly ) {
@@ -502,3 +502,29 @@ class SectionProfiler {
                }
        }
 }
+
+/**
+ * Subclass ScopedCallback to avoid call_user_func_array(), which is slow
+ *
+ * This class should not be used outside of SectionProfiler
+ */
+class SectionProfileCallback extends ScopedCallback {
+       /** @var SectionProfiler */
+       protected $profiler;
+       /** @var string */
+       protected $section;
+
+       /**
+        * @param SectionProfiler $profiler
+        * @param string $section
+        */
+       public function __construct( SectionProfiler $profiler, $section ) {
+               parent::__construct( null );
+               $this->profiler = $profiler;
+               $this->section = $section;
+       }
+
+       function __destruct() {
+               $this->profiler->profileOutInternal( $this->section );
+       }
+}
index 8554670..9afae66 100644 (file)
@@ -29,6 +29,7 @@ class UDPRCFeedEngine implements RCFeedEngine {
         * @see RCFeedEngine::send
         */
        public function send( array $feed, $line ) {
-               wfErrorLog( $line, $feed['uri'] );
+               $transport = UDPTransport::newFromString( $feed['uri'] );
+               $transport->emit( $line );
        }
 }
diff --git a/includes/registration/ExtensionProcessor.php b/includes/registration/ExtensionProcessor.php
new file mode 100644 (file)
index 0000000..45bea64
--- /dev/null
@@ -0,0 +1,258 @@
+<?php
+
+class ExtensionProcessor implements Processor {
+
+       /**
+        * Keys that should be set to $GLOBALS
+        *
+        * @var array
+        */
+       protected static $globalSettings = array(
+               'ResourceLoaderSources',
+               'ResourceLoaderLESSVars',
+               'ResourceLoaderLESSImportPaths',
+               'TrackingCategories',
+               'DefaultUserOptions',
+               'HiddenPrefs',
+               'GroupPermissions',
+               'RevokePermissions',
+               'ImplicitGroups',
+               'GroupsAddToSelf',
+               'GroupsRemoveFromSelf',
+               'AddGroups',
+               'RemoveGroups',
+               'AvailableRights',
+               'ContentHandlers',
+               'ConfigRegistry',
+               'RateLimits',
+               'ParserTestFiles',
+               'RecentChangesFlags',
+               'ExtensionFunctions',
+               'ExtensionEntryPointListFiles',
+               'SpecialPages',
+               'SpecialPageGroups',
+               'JobClasses',
+               'LogTypes',
+               'LogRestrictions',
+               'FilterLogTypes',
+               'LogNames',
+               'LogHeaders',
+               'LogActions',
+               'LogActionsHandlers',
+               'Actions',
+               'APIModules',
+               'APIFormatModules',
+               'APIMetaModules',
+               'APIPropModules',
+               'APIListModules',
+       );
+
+       /**
+        * Keys that are part of the extension credits
+        *
+        * @var array
+        */
+       protected static $creditsAttributes = array(
+               'name',
+               'author',
+               'version',
+               'url',
+               'description',
+               'descriptionmsg',
+               'license-name',
+       );
+
+       /**
+        * Stuff that is going to be set to $GLOBALS
+        *
+        * Some keys are pre-set to arrays so we can += to them
+        *
+        * @var array
+        */
+       protected $globals = array(
+               'wgExtensionMessagesFiles' => array(),
+               'wgMessagesDirs' => array(),
+       );
+
+       /**
+        * Things that should be define()'d
+        *
+        * @var array
+        */
+       protected $defines = array();
+
+       /**
+        * Things to be called once registration of these extensions are done
+        *
+        * @var callable[]
+        */
+       protected $callbacks = array();
+
+       /**
+        * @var array
+        */
+       protected $credits = array();
+
+       /**
+        * Any thing else in the $info that hasn't
+        * already been processed
+        *
+        * @var array
+        */
+       protected $attributes = array();
+
+       /**
+        * List of keys that have already been processed
+        *
+        * @var array
+        */
+       protected $processed = array();
+
+       /**
+        * @param string $path
+        * @param array $info
+        * @return array
+        */
+       public function extractInfo( $path, array $info ) {
+               $this->extractConfig( $info );
+               $this->extractHooks( $info );
+               $dir = dirname( $path );
+               $this->extractMessageSettings( $dir, $info );
+               $this->extractNamespaces( $info );
+               $this->extractResourceLoaderModules( $dir, $info );
+               if ( isset( $info['callback'] ) ) {
+                       $this->callbacks[] = $info['callback'];
+                       $this->processed[] = 'callback';
+               }
+
+               $this->extractCredits( $path, $info );
+               foreach ( $info as $key => $val ) {
+                       if ( in_array( $key, self::$globalSettings ) ) {
+                               $this->storeToArray( "wg$key", $val, $this->globals );
+                       } elseif ( !in_array( $key, $this->processed ) ) {
+                               $this->storeToArray( $key, $val, $this->attributes );
+                       }
+               }
+
+       }
+
+       public function getExtractedInfo() {
+               return array(
+                       'globals' => $this->globals,
+                       'defines' => $this->defines,
+                       'callbacks' => $this->callbacks,
+                       'credits' => $this->credits,
+                       'attributes' => $this->attributes,
+               );
+       }
+
+       protected function extractHooks( array $info ) {
+               if ( isset( $info['Hooks'] ) ) {
+                       foreach ( $info['Hooks'] as $name => $callable ) {
+                               $this->globals['wgHooks'][$name][] = $callable;
+                       }
+                       $this->processed[] = 'Hooks';
+               }
+       }
+
+       /**
+        * Register namespaces with the appropriate global settings
+        *
+        * @param array $info
+        */
+       protected function extractNamespaces( array $info ) {
+               if ( isset( $info['namespaces'] ) ) {
+                       foreach ( $info['namespaces'] as $ns ) {
+                               $id = $ns['id'];
+                               $this->defines[$ns['constant']] = $id;
+                               $this->globals['wgExtraNamespaces'][$id] = $ns['name'];
+                               if ( isset( $ns['gender'] ) ) {
+                                       $this->globals['wgExtraGenderNamespaces'][$id] = $ns['gender'];
+                               }
+                               if ( isset( $ns['subpages'] ) && $ns['subpages'] ) {
+                                       $this->globals['wgNamespacesWithSubpages'][$id] = true;
+                               }
+                               if ( isset( $ns['content'] ) && $ns['content'] ) {
+                                       $this->globals['wgContentNamespaces'][] = $id;
+                               }
+                               if ( isset( $ns['defaultcontentmodel'] ) ) {
+                                       $this->globals['wgNamespaceContentModels'][$id] = $ns['defaultcontentmodel'];
+                               }
+                       }
+                       $this->processed[] = 'namespaces';
+               }
+       }
+
+       protected function extractResourceLoaderModules( $dir, array $info ) {
+               if ( isset( $info['ResourceModules'] ) ) {
+                       foreach ( $info['ResourceModules'] as $name => $data ) {
+                               if ( isset( $data['localBasePath'] ) ) {
+                                       $data['localBasePath'] = "$dir/{$data['localBasePath']}";
+                               }
+                               $this->globals['wgResourceModules'][$name] = $data;
+                       }
+               }
+       }
+
+       /**
+        * Set message-related settings, which need to be expanded to use
+        * absolute paths
+        *
+        * @param string $dir
+        * @param array $info
+        */
+       protected function extractMessageSettings( $dir, array $info ) {
+               foreach ( array( 'ExtensionMessagesFiles', 'MessagesDirs' ) as $key ) {
+                       if ( isset( $info[$key] ) ) {
+                               $this->globals["wg$key"] += array_map( function( $file ) use ( $dir ) {
+                                       return "$dir/$file";
+                               }, $info[$key] );
+                               $this->processed[] = $key;
+                       }
+               }
+       }
+
+       protected function extractCredits( $path, array $info ) {
+               $credits = array(
+                       'path' => $path,
+                       'type' => isset( $info['type'] ) ? $info['type'] : 'other',
+               );
+               $this->processed[] = 'type';
+               foreach ( self::$creditsAttributes as $attr ) {
+                       if ( isset( $info[$attr] ) ) {
+                               $credits[$attr] = $info[$attr];
+                               $this->processed[] = $attr;
+                       }
+               }
+
+               $this->credits[$credits['name']] = $credits;
+       }
+
+       /**
+        * Set configuration settings
+        * @todo In the future, this should be done via Config interfaces
+        *
+        * @param array $info
+        */
+       protected function extractConfig( array $info ) {
+               if ( isset( $info['config'] ) ) {
+                       foreach ( $info['config'] as $key => $val ) {
+                               $this->globals["wg$key"] = $val;
+                       }
+                       $this->processed[] = 'config';
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param mixed $value
+        * @param array &$array
+        */
+       protected function storeToArray( $name, $value, &$array ) {
+               if ( isset( $array[$name] ) ) {
+                       $array[$name] = array_merge_recursive( $array[$name], $value );
+               } else {
+                       $array[$name] = $value;
+               }
+       }
+}
diff --git a/includes/registration/ExtensionRegistry.php b/includes/registration/ExtensionRegistry.php
new file mode 100644 (file)
index 0000000..44855d8
--- /dev/null
@@ -0,0 +1,260 @@
+<?php
+
+/**
+ * ExtensionRegistry class
+ *
+ * The Registry loads JSON files, and uses a Processor
+ * to extract information from them. It also registers
+ * classes with the autoloader.
+ *
+ * @since 1.25
+ */
+class ExtensionRegistry {
+
+       /**
+        * @var BagOStuff
+        */
+       protected $cache;
+
+       /**
+        * Array of loaded things, keyed by name, values are credits information
+        *
+        * @var array
+        */
+       private $loaded = array();
+
+       /**
+        * List of paths that should be loaded
+        *
+        * @var array
+        */
+       protected $queued = array();
+
+       /**
+        * Items in the JSON file that aren't being
+        * set as globals
+        *
+        * @var array
+        */
+       protected $attributes = array();
+
+       /**
+        * Processors, 'default' should be set by subclasses in the constructor
+        *
+        * @var Processor[]
+        */
+       protected $processors = array();
+
+       /**
+        * @var ExtensionRegistry
+        */
+       private static $instance;
+
+       /**
+        * @return ExtensionRegistry
+        */
+       public static function getInstance() {
+               if ( self::$instance === null ) {
+                       self::$instance = new self();
+               }
+
+               return self::$instance;
+       }
+
+       public function __construct() {
+               $this->cache = ObjectCache::newAccelerator( array(), CACHE_NONE );
+       }
+
+       /**
+        * @param string $path Absolute path to the JSON file
+        */
+       public function queue( $path ) {
+               global $wgExtensionInfoMTime;
+               if ( $wgExtensionInfoMTime !== false ) {
+                       $mtime = $wgExtensionInfoMTime;
+               } else {
+                       $mtime = filemtime( $path );
+               }
+               $this->queued[$path] = $mtime;
+       }
+
+       public function loadFromQueue() {
+               if ( !$this->queued ) {
+                       return;
+               }
+
+               $this->queued = array_unique( $this->queued );
+
+               // See if this queue is in APC
+               $key = wfMemcKey( 'registration', md5( json_encode( $this->queued ) ) );
+               $data = $this->cache->get( $key );
+               if ( $data ) {
+                       $this->exportExtractedData( $data );
+               } else {
+                       $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
+                       $autoloadClasses = array();
+                       foreach ( $this->queued as $path => $mtime ) {
+                               $json = file_get_contents( $path );
+                               $info = json_decode( $json, /* $assoc = */ true );
+                               $autoload = $this->processAutoLoader( dirname( $path ), $info );
+                               // Set up the autoloader now so custom processors will work
+                               $GLOBALS['wgAutoloadClasses'] += $autoload;
+                               $autoloadClasses += $autoload;
+                               if ( isset( $info['processor'] ) ) {
+                                       $processor = $this->getProcessor( $info['processor'] );
+                               } else {
+                                       $processor = $this->getProcessor( 'default' );
+                               }
+                               $processor->extractInfo( $path, $info );
+                       }
+                       foreach ( $this->processors as $processor ) {
+                               $data = array_merge_recursive( $data, $processor->getExtractedInfo() );
+                       }
+                       foreach ( $data['credits'] as $credit ) {
+                               $data['globals']['wgExtensionCredits'][$credit['type']][] = $credit;
+                       }
+                       $this->processors = array(); // Reset
+                       $this->exportExtractedData( $data );
+                       // Do this late since we don't want to extract it since we already
+                       // did that, but it should be cached
+                       $data['globals']['wgAutoloadClasses'] += $autoloadClasses;
+                       $this->cache->set( $key, $data );
+               }
+               $this->queued = array();
+       }
+
+       protected function getProcessor( $type ) {
+               if ( !isset( $this->processors[$type] ) ) {
+                       $processor = $type === 'default' ? new ExtensionProcessor() : new $type();
+                       if ( !$processor instanceof Processor ) {
+                               throw new Exception( "$type is not a Processor" );
+                       }
+                       $this->processors[$type] = $processor;
+               }
+
+               return $this->processors[$type];
+       }
+
+       protected function exportExtractedData( array $info ) {
+               foreach ( $info['globals'] as $key => $val ) {
+                       if ( !isset( $GLOBALS[$key] ) || !$GLOBALS[$key] ) {
+                               $GLOBALS[$key] = $val;
+                       } elseif ( is_array( $GLOBALS[$key] ) && is_array( $val ) ) {
+                               $GLOBALS[$key] = array_merge_recursive( $GLOBALS[$key], $val );
+                       } // else case is a config setting where it has already been overriden, so don't set it
+               }
+               foreach ( $info['defines'] as $name => $val ) {
+                       define( $name, $val );
+               }
+               foreach ( $info['callbacks'] as $cb ) {
+                       call_user_func( $cb );
+               }
+
+               $this->loaded += $info['credits'];
+
+               if ( $info['attributes'] ) {
+                       if ( !$this->attributes ) {
+                               $this->attributes = $info['attributes'];
+                       } else {
+                               $this->attributes = array_merge_recursive( $this->attributes, $info['attributes'] );
+                       }
+               }
+       }
+
+       /**
+        * Loads and processes the given JSON file without delay
+        *
+        * If some extensions are already queued, this will load
+        * those as well.
+        *
+        * @param string $path Absolute path to the JSON file
+        */
+       public function load( $path ) {
+               $this->loadFromQueue(); // First clear the queue
+               $this->queue( $path );
+               $this->loadFromQueue();
+       }
+
+       /**
+        * Whether a thing has been loaded
+        * @param string $name
+        * @return bool
+        */
+       public function isLoaded( $name ) {
+               return isset( $this->loaded[$name] );
+       }
+
+       /**
+        * @param string $name
+        * @return array
+        */
+       public function getAttribute( $name ) {
+               if ( isset( $this->attributes[$name] ) ) {
+                       return $this->attributes[$name];
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Get information about all things
+        *
+        * @return array
+        */
+       public function getAllThings() {
+               return $this->loaded;
+       }
+
+       /**
+        * Mark a thing as loaded
+        *
+        * @param string $name
+        * @param array $credits
+        */
+       protected function markLoaded( $name, array $credits ) {
+               $this->loaded[$name] = $credits;
+       }
+
+       /**
+        * Register classes with the autoloader
+        *
+        * @param string $dir
+        * @param array $info
+        * @return array
+        */
+       protected function processAutoLoader( $dir, array $info ) {
+               if ( isset( $info['AutoloadClasses'] ) ) {
+                       // Make paths absolute, relative to the JSON file
+                       return array_map( function( $file ) use ( $dir ) {
+                               return "$dir/$file";
+                       }, $info['AutoloadClasses'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * @param string $filename absolute path to the JSON file
+        * @param int $mtime modified time of the file
+        * @return array
+        */
+       protected function loadInfoFromFile( $filename, $mtime ) {
+               $key = wfMemcKey( 'registry', md5( $filename ) );
+               $cached = $this->cache->get( $key );
+               if ( isset( $cached['mtime'] ) && $cached['mtime'] === $mtime ) {
+                       return $cached['info'];
+               }
+
+               $contents = file_get_contents( $filename );
+               $json = json_decode( $contents, /* $assoc = */ true );
+               if ( is_array( $json ) ) {
+                       $this->cache->set( $key, array( 'mtime' => $mtime, 'info' => $json ) );
+               } else {
+                       // Don't throw an error here, but don't cache it either.
+                       // @todo log somewhere?
+                       $json = array();
+               }
+
+               return $json;
+       }
+}
diff --git a/includes/registration/Processor.php b/includes/registration/Processor.php
new file mode 100644 (file)
index 0000000..e930fd3
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Processors read associated arrays and register
+ * whatever is required
+ *
+ * @since 1.25
+ */
+interface Processor {
+
+       /**
+        * Main entry point, processes the information
+        * provided.
+        * Callers should call "callback" after calling
+        * this function.
+        *
+        * @param string $path Absolute path of JSON file
+        * @param array $info
+        * @return array "credits" information to store
+        */
+       public function extractInfo( $path, array $info );
+
+       /**
+        * @return array With 'globals', 'defines', 'callbacks', 'credits' keys.
+        */
+       public function getExtractedInfo();
+}
index 933397c..15bb13f 100644 (file)
@@ -165,12 +165,10 @@ class ResourceLoader {
         * @return string Filtered data, or a comment containing an error message
         */
        public function filter( $filter, $data, $cacheReport = true ) {
-               wfProfileIn( __METHOD__ );
 
                // For empty/whitespace-only data or for unknown filters, don't perform
                // any caching or processing
                if ( trim( $data ) === '' || !in_array( $filter, array( 'minify-js', 'minify-css' ) ) ) {
-                       wfProfileOut( __METHOD__ );
                        return $data;
                }
 
@@ -181,7 +179,6 @@ class ResourceLoader {
                $cacheEntry = $cache->get( $key );
                if ( is_string( $cacheEntry ) ) {
                        wfIncrStats( "rl-$filter-cache-hits" );
-                       wfProfileOut( __METHOD__ );
                        return $cacheEntry;
                }
 
@@ -215,8 +212,6 @@ class ResourceLoader {
                        $this->errors[] = self::formatExceptionNoComment( $e );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $result;
        }
 
@@ -229,8 +224,6 @@ class ResourceLoader {
        public function __construct( Config $config = null ) {
                global $IP;
 
-               wfProfileIn( __METHOD__ );
-
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' was called without providing a Config instance' );
                        $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
@@ -254,7 +247,6 @@ class ResourceLoader {
                        $this->registerTestModules();
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -278,14 +270,12 @@ class ResourceLoader {
         *   not registered
         */
        public function register( $name, $info = null ) {
-               wfProfileIn( __METHOD__ );
 
                // Allow multiple modules to be registered in one call
                $registrations = is_array( $name ) ? $name : array( $name => $info );
                foreach ( $registrations as $name => $info ) {
                        // Disallow duplicate registrations
                        if ( isset( $this->moduleInfos[$name] ) ) {
-                               wfProfileOut( __METHOD__ );
                                // A module has already been registered by this name
                                throw new MWException(
                                        'ResourceLoader duplicate registration error. ' .
@@ -295,7 +285,6 @@ class ResourceLoader {
 
                        // Check $name for validity
                        if ( !self::isValidModuleName( $name ) ) {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "ResourceLoader module name '$name' is invalid, "
                                        . "see ResourceLoader::isValidModuleName()" );
                        }
@@ -309,7 +298,6 @@ class ResourceLoader {
                                // New calling convention
                                $this->moduleInfos[$name] = $info;
                        } else {
-                               wfProfileOut( __METHOD__ );
                                throw new MWException(
                                        'ResourceLoader module info type error for module \'' . $name .
                                        '\': expected ResourceLoaderModule or array (got: ' . gettype( $info ) . ')'
@@ -357,7 +345,6 @@ class ResourceLoader {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -371,8 +358,6 @@ class ResourceLoader {
                                . 'Edit your <code>LocalSettings.php</code> to enable it.' );
                }
 
-               wfProfileIn( __METHOD__ );
-
                // Get core test suites
                $testModules = array();
                $testModules['qunit'] = array();
@@ -400,7 +385,6 @@ class ResourceLoader {
                        $this->testModuleNames[$id] = array_keys( $testModules[$id] );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -579,8 +563,6 @@ class ResourceLoader {
                // See http://bugs.php.net/bug.php?id=36514
                ob_start();
 
-               wfProfileIn( __METHOD__ );
-
                // Find out which modules are missing and instantiate the others
                $modules = array();
                $missing = array();
@@ -609,8 +591,6 @@ class ResourceLoader {
                        $this->errors[] = self::formatExceptionNoComment( $e );
                }
 
-               wfProfileIn( __METHOD__ . '-getModifiedTime' );
-
                // To send Last-Modified and support If-Modified-Since, we need to detect
                // the last modified time
                $mtime = wfTimestamp( TS_UNIX, $this->config->get( 'CacheEpoch' ) );
@@ -628,11 +608,8 @@ class ResourceLoader {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-getModifiedTime' );
-
                // If there's an If-Modified-Since header, respond with a 304 appropriately
                if ( $this->tryRespondLastModified( $context, $mtime ) ) {
-                       wfProfileOut( __METHOD__ );
                        return; // output handled (buffers cleared)
                }
 
@@ -682,7 +659,6 @@ class ResourceLoader {
                $this->errors = array();
                echo $response;
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -880,8 +856,6 @@ class ResourceLoader {
    no modules were requested. Max made me put this here. */";
                }
 
-               wfProfileIn( __METHOD__ );
-
                $image = $context->getImageObj();
                if ( $image ) {
                        $data = $image->getImageData( $context );
@@ -889,7 +863,6 @@ class ResourceLoader {
                                $data = '';
                                $this->errors[] = 'Image generation failed';
                        }
-                       wfProfileOut( __METHOD__ );
                        return $data;
                }
 
@@ -920,7 +893,6 @@ class ResourceLoader {
                         * @var $module ResourceLoaderModule
                         */
 
-                       wfProfileIn( __METHOD__ . '-' . $name );
                        try {
                                $scripts = '';
                                if ( $context->shouldIncludeScripts() ) {
@@ -1034,7 +1006,6 @@ class ResourceLoader {
                                unset( $modules[$name] );
                        }
                        $isRaw |= $module->isRaw();
-                       wfProfileOut( __METHOD__ . '-' . $name );
                }
 
                // Update module states
@@ -1066,7 +1037,6 @@ class ResourceLoader {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $out;
        }
 
index 2e07911..d79174c 100644 (file)
@@ -32,6 +32,7 @@ class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
         *
         * @param string $value
         * @return string
+        * @throws Exception
         */
        private static function cssSerializeString( $value ) {
                if ( strstr( $value, "\0" ) ) {
index bcef149..fbca08e 100644 (file)
@@ -483,8 +483,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
        /**
         * Get the skip function.
-        *
-        * @return string|null
+        * @return null|string
+        * @throws MWException
         */
        public function getSkipFunction() {
                if ( !$this->skipFunction ) {
@@ -527,7 +527,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                if ( isset( $this->modifiedTime[$context->getHash()] ) ) {
                        return $this->modifiedTime[$context->getHash()];
                }
-               wfProfileIn( __METHOD__ );
 
                $files = array();
 
@@ -567,13 +566,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                // giving max() an empty array
                if ( count( $files ) === 0 ) {
                        $this->modifiedTime[$context->getHash()] = 1;
-                       wfProfileOut( __METHOD__ );
                        return $this->modifiedTime[$context->getHash()];
                }
 
-               wfProfileIn( __METHOD__ . '-filemtime' );
                $filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
-               wfProfileOut( __METHOD__ . '-filemtime' );
 
                $this->modifiedTime[$context->getHash()] = max(
                        $filesMtime,
@@ -581,7 +577,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $this->getDefinitionMtime( $context )
                );
 
-               wfProfileOut( __METHOD__ );
                return $this->modifiedTime[$context->getHash()];
        }
 
@@ -979,8 +974,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
        /**
         * Takes named templates by the module and returns an array mapping.
-        *
         * @return array of templates mapping template alias to content
+        * @throws MWException
         */
        public function getTemplates() {
                $templates = array();
index 9246df7..67806ff 100644 (file)
@@ -158,10 +158,14 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                                isset( $options['variants'] ) ? $options['variants'] : array(),
                                                $this->getGlobalVariants( $type )
                                        );
-                                       $variantConfig = array_intersect_key(
-                                               $this->variants[$type],
-                                               array_fill_keys( $allowedVariants, true )
-                                       );
+                                       if ( isset( $this->variants[$type] ) ) {
+                                               $variantConfig = array_intersect_key(
+                                                       $this->variants[$type],
+                                                       array_fill_keys( $allowedVariants, true )
+                                               );
+                                       } else {
+                                               $variantConfig = array();
+                                       }
 
                                        $image = new ResourceLoaderImage( $name, $this->getName(), $imageDesc, $this->localBasePath, $variantConfig );
                                        $this->imageObjects[ $image->getName() ] = $image;
@@ -182,9 +186,11 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                if ( !isset( $this->globalVariants[$type] ) ) {
                        $this->globalVariants[$type] = array();
 
-                       foreach ( $this->variants[$type] as $name => $config ) {
-                               if ( isset( $config['global'] ) && $config['global'] ) {
-                                       $this->globalVariants[$type][] = $name;
+                       if ( isset( $this->variants[$type] ) ) {
+                               foreach ( $this->variants[$type] as $name => $config ) {
+                                       if ( isset( $config['global'] ) && $config['global'] ) {
+                                               $this->globalVariants[$type][] = $name;
+                                       }
                                }
                        }
                }
index 09d90d6..1239453 100644 (file)
@@ -52,10 +52,14 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.language.setData', array(
-                       $context->getLanguage(),
-                       $this->getData( $context )
-               ) );
+               return Xml::encodeJsCall(
+                       'mw.language.setData',
+                       array(
+                               $context->getLanguage(),
+                               $this->getData( $context )
+                       ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
index fe0c845..55b1f4b 100644 (file)
@@ -49,11 +49,15 @@ class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.language.setData', array(
-                       $context->getLanguage(),
-                       'languageNames',
-                       $this->getData( $context )
-               ) );
+               return Xml::encodeJsCall(
+                       'mw.language.setData',
+                       array(
+                               $context->getLanguage(),
+                               'languageNames',
+                               $this->getData( $context )
+                       ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        public function getDependencies() {
index 3f95ce6..4c2c2b2 100644 (file)
@@ -498,10 +498,8 @@ abstract class ResourceLoaderModule {
         * @return int UNIX timestamp
         */
        public function getDefinitionMtime( ResourceLoaderContext $context ) {
-               wfProfileIn( __METHOD__ );
                $summary = $this->getDefinitionSummary( $context );
                if ( $summary === null ) {
-                       wfProfileOut( __METHOD__ );
                        return 1;
                }
 
@@ -523,7 +521,6 @@ abstract class ResourceLoaderModule {
                $data = $cache->get( $key );
                if ( is_int( $data ) && $data > 0 ) {
                        // We've seen this hash before, re-use the timestamp of when we first saw it.
-                       wfProfileOut( __METHOD__ );
                        return $data;
                }
 
@@ -533,7 +530,6 @@ abstract class ResourceLoaderModule {
                $timestamp = time();
                $cache->set( $key, $timestamp );
 
-               wfProfileOut( __METHOD__ );
                return $timestamp;
        }
 
index a0764de..48b3576 100644 (file)
@@ -90,7 +90,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgNamespaceIds' => $namespaceIds,
                        'wgContentNamespaces' => MWNamespace::getContentNamespaces(),
                        'wgSiteName' => $conf->get( 'Sitename' ),
-                       'wgFileExtensions' => array_values( array_unique( $conf->get( 'FileExtensions' ) ) ),
                        'wgDBname' => $conf->get( 'DBname' ),
                        'wgAvailableSkins' => Skin::getSkinNames(),
                        'wgExtensionAssetsPath' => $conf->get( 'ExtensionAssetsPath' ),
@@ -188,7 +187,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @return string JavaScript code for registering all modules with the client loader
         */
        public function getModuleRegistrations( ResourceLoaderContext $context ) {
-               wfProfileIn( __METHOD__ );
 
                $resourceLoader = $context->getResourceLoader();
                $target = $context->getRequest()->getVal( 'target', 'desktop' );
@@ -279,7 +277,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
 
-               wfProfileOut( __METHOD__ );
                return $out;
        }
 
@@ -293,7 +290,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        }
 
        /**
-        * Base modules required for the the base environment of ResourceLoader
+        * Base modules required for the base environment of ResourceLoader
         *
         * @return array
         */
@@ -356,7 +353,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        );
                        $mwConfigSetJsCall = Xml::encodeJsCall(
                                'mw.config.set',
-                               array( $configuration )
+                               array( $configuration ),
+                               ResourceLoader::inDebugMode()
                        );
 
                        $out .= "var startUp = function () {\n" .
@@ -370,7 +368,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        $scriptTag = Html::linkedScript( self::getStartupModulesUrl( $context ) );
                        $out .= "if ( isCompatible() ) {\n" .
                                "\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
-                               "}";
+                               "\n}";
                }
 
                return $out;
@@ -409,8 +407,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // ATTENTION!: Because of the line below, this is not going to cause
                // infinite recursion - think carefully before making changes to this
                // code!
-               // Pre-populate modifiedTime with something because the the loop over
-               // all modules below includes the the startup module (this module).
+               // Pre-populate modifiedTime with something because the loop over
+               // all modules below includes the startup module (this module).
                $this->modifiedTime[$hash] = 1;
 
                foreach ( $loader->getModuleNames() as $name ) {
index d78fa9d..5f4bc16 100644 (file)
@@ -53,6 +53,10 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.user.options.set', array( User::getDefaultOptions() ) );
+               return Xml::encodeJsCall(
+                       'mw.user.options.set',
+                       array( User::getDefaultOptions() ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 }
index a0ff667..b4ac628 100644 (file)
@@ -247,7 +247,7 @@ abstract class RevDelList extends RevisionListBase {
                } else {
                        $logType = 'delete';
                }
-               // Add params for effected page and ids
+               // Add params for affected page and ids
                $logParams = $this->getLogParams( $params );
                // Actually add the deletion log entry
                $log = new LogPage( $logType );
index d4f8167..ba1f0f6 100644 (file)
@@ -78,6 +78,7 @@ class RevisionDeleter {
         * @param Title $title
         * @param array $ids
         * @return RevDelList
+        * @throws MWException
         */
        public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
                $typeName = self::getCanonicalTypeName( $typeName );
@@ -115,7 +116,7 @@ class RevisionDeleter {
         * "revdelete-restricted", "revdelete-unrestricted" indicating (un)suppression
         * or null to indicate nothing in particular.
         * You can turn the keys in $arr[0] and $arr[1] into message keys by
-        * appending -hid and and -unhid to the keys respectively.
+        * appending -hid and -unhid to the keys respectively.
         *
         * @param int $n The new bitfield.
         * @param int $o The old bitfield.
index cd6cf7d..5770276 100644 (file)
@@ -47,6 +47,7 @@ class SearchEngine {
 
        /** @var bool */
        protected $showSuggestion = true;
+       private $sort = 'relevance';
 
        /** @var array Feature values */
        protected $features = array();
@@ -309,6 +310,43 @@ class SearchEngine {
                $this->showSuggestion = $showSuggestion;
        }
 
+       /**
+        * Get the valid sort directions.  All search engines support 'relevance' but others
+        * might support more. The default in all implementations should be 'relevance.'
+        *
+        * @since 1.25
+        * @return array(string) the valid sort directions for setSort
+        */
+       public function getValidSorts() {
+               return array( 'relevance' );
+       }
+
+       /**
+        * Set the sort direction of the search results. Must be one returned by
+        * SearchEngine::getValidSorts()
+        *
+        * @since 1.25
+        * @throws InvalidArgumentException
+        * @param string $sort sort direction for query result
+        */
+       public function setSort( $sort ) {
+               if ( !in_array( $sort, $this->getValidSorts() ) ) {
+                       throw new InvalidArgumentException( "Invalid sort: $sort. " .
+                               "Must be one of: " . implode( ', ', $this->getValidSorts() ) );
+               }
+               $this->sort = $sort;
+       }
+
+       /**
+        * Get the sort direction of the search results
+        *
+        * @since 1.25
+        * @return string
+        */
+       public function getSort() {
+               return $this->sort;
+       }
+
        /**
         * Parse some common prefixes: all (search everything)
         * or namespace names
index c3c3a8f..255d005 100644 (file)
@@ -67,7 +67,6 @@ class SearchHighlighter {
                $spat .= '/';
                $textExt = array(); // text extracts
                $otherExt = array(); // other extracts
-               wfProfileIn( "$fname-split" );
                $start = 0;
                $textLen = strlen( $text );
                $count = 0; // sequence number to maintain ordering
@@ -132,8 +131,6 @@ class SearchHighlighter {
 
                $all = $textExt + $otherExt; // these have disjunct key sets
 
-               wfProfileOut( "$fname-split" );
-
                // prepare regexps
                foreach ( $terms as $index => $term ) {
                        // manually do upper/lowercase stuff for utf-8 since PHP won't do it
@@ -163,8 +160,6 @@ class SearchHighlighter {
                $pat1 = "/(" . $phrase . ")/ui";
                $pat2 = "/$patPre(" . $anyterm . ")$patPost/ui";
 
-               wfProfileIn( "$fname-extract" );
-
                $left = $contextlines;
 
                $snippets = array();
@@ -287,8 +282,6 @@ class SearchHighlighter {
                        }
                }
 
-               wfProfileOut( "$fname-extract" );
-
                return $extract;
        }
 
@@ -452,7 +445,6 @@ class SearchHighlighter {
         */
        function removeWiki( $text ) {
                $fname = __METHOD__;
-               wfProfileIn( $fname );
 
                // $text = preg_replace( "/'{2,5}/", "", $text );
                // $text = preg_replace( "/\[[a-z]+:\/\/[^ ]+ ([^]]+)\]/", "\\2", $text );
@@ -474,7 +466,6 @@ class SearchHighlighter {
                $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text );
                $text = preg_replace( "/''/", "", $text );
 
-               wfProfileOut( $fname );
                return $text;
        }
 
@@ -523,7 +514,6 @@ class SearchHighlighter {
                $lineno = 0;
 
                $extract = "";
-               wfProfileIn( "$fname-extract" );
                foreach ( $lines as $line ) {
                        if ( 0 == $contextlines ) {
                                break;
@@ -551,7 +541,6 @@ class SearchHighlighter {
 
                        $extract .= "${line}\n";
                }
-               wfProfileOut( "$fname-extract" );
 
                return $extract;
        }
index 78eba2d..485088c 100644 (file)
@@ -382,8 +382,6 @@ class SearchMySQL extends SearchDatabase {
        function normalizeText( $string ) {
                global $wgContLang;
 
-               wfProfileIn( __METHOD__ );
-
                $out = parent::normalizeText( $string );
 
                // MySQL fulltext index doesn't grok utf-8, so we
@@ -416,8 +414,6 @@ class SearchMySQL extends SearchDatabase {
                        "$1u82e$2",
                        $out );
 
-               wfProfileOut( __METHOD__ );
-
                return $out;
        }
 
index f2a95a8..e48a187 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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
- * @since 1.25
- *
  * @file
  *
  * @license GNU GPL v2+
  */
+
+/**
+ * Provides a file-based cache of a SiteStore, stored as a json file.
+ * The cache can be built with the rebuildSitesCache.php maintenance script,
+ * and a MediaWiki instance can be setup to use this by setting the
+ * 'wgSitesCacheFile' configuration to the cache file location.
+ *
+ * @since 1.25
+ */
 class SiteListFileCache {
 
        /**
@@ -55,7 +61,11 @@ class SiteListFileCache {
        }
 
        /**
+        * @param string $globalId
+        *
         * @since 1.25
+        *
+        * @return Site|null
         */
        public function getSite( $globalId ) {
                $sites = $this->getSites();
index c1a350d..8f25c76 100644 (file)
@@ -104,7 +104,6 @@ class SiteSQLStore implements SiteStore {
         * @return string The cache key.
         */
        protected function getCacheKey() {
-               wfProfileIn( __METHOD__ );
 
                if ( $this->cacheKey === null ) {
                        $type = 'SiteList#' . SiteList::getSerialVersionId();
@@ -117,7 +116,6 @@ class SiteSQLStore implements SiteStore {
                        $this->cacheKey = wfMemcKey( "$source/$type" );
                }
 
-               wfProfileOut( __METHOD__ );
                return $this->cacheKey;
        }
 
@@ -131,7 +129,6 @@ class SiteSQLStore implements SiteStore {
         * @return SiteList
         */
        public function getSites( $source = 'cache' ) {
-               wfProfileIn( __METHOD__ );
 
                if ( $source === 'cache' ) {
                        if ( $this->sites === null ) {
@@ -148,7 +145,6 @@ class SiteSQLStore implements SiteStore {
                        $this->loadSites();
                }
 
-               wfProfileOut( __METHOD__ );
                return $this->sites;
        }
 
@@ -162,7 +158,6 @@ class SiteSQLStore implements SiteStore {
         * @return Site
         */
        protected function siteFromRow( ORMRow $siteRow ) {
-               wfProfileIn( __METHOD__ );
 
                $site = Site::newForType( $siteRow->getField( 'type', Site::TYPE_UNKNOWN ) );
 
@@ -197,7 +192,6 @@ class SiteSQLStore implements SiteStore {
                        $site->setExtraConfig( $siteRow->getField( 'config' ) );
                }
 
-               wfProfileOut( __METHOD__ );
                return $site;
        }
 
@@ -240,7 +234,6 @@ class SiteSQLStore implements SiteStore {
         * @since 1.21
         */
        protected function loadSites() {
-               wfProfileIn( __METHOD__ );
 
                $this->sites = new SiteList();
 
@@ -270,7 +263,6 @@ class SiteSQLStore implements SiteStore {
 
                $this->cache->set( $this->getCacheKey(), $this->sites, $this->cacheTimeout );
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -284,11 +276,9 @@ class SiteSQLStore implements SiteStore {
         * @return Site|null
         */
        public function getSite( $globalId, $source = 'cache' ) {
-               wfProfileIn( __METHOD__ );
 
                $sites = $this->getSites( $source );
 
-               wfProfileOut( __METHOD__ );
                return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
        }
 
@@ -315,10 +305,8 @@ class SiteSQLStore implements SiteStore {
         * @return bool Success indicator
         */
        public function saveSites( array $sites ) {
-               wfProfileIn( __METHOD__ );
 
                if ( empty( $sites ) ) {
-                       wfProfileOut( __METHOD__ );
                        return true;
                }
 
@@ -371,7 +359,6 @@ class SiteSQLStore implements SiteStore {
                // purge cache
                $this->reset();
 
-               wfProfileOut( __METHOD__ );
                return $success;
        }
 
@@ -382,12 +369,10 @@ class SiteSQLStore implements SiteStore {
         * @since 1.21
         */
        public function reset() {
-               wfProfileIn( __METHOD__ );
                // purge cache
                $this->cache->delete( $this->getCacheKey() );
                $this->sites = null;
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -398,7 +383,6 @@ class SiteSQLStore implements SiteStore {
         * @return bool Success
         */
        public function clear() {
-               wfProfileIn( __METHOD__ );
                $dbw = $this->sitesTable->getWriteDbConnection();
 
                $dbw->startAtomic( __METHOD__ );
@@ -408,7 +392,6 @@ class SiteSQLStore implements SiteStore {
 
                $this->reset();
 
-               wfProfileOut( __METHOD__ );
                return $ok;
        }
 
index 3cdfca0..eedd2a1 100644 (file)
@@ -55,7 +55,6 @@ abstract class BaseTemplate extends QuickTemplate {
         * @return array
         */
        function getToolbox() {
-               wfProfileIn( __METHOD__ );
 
                $toolbox = array();
                if ( isset( $this->data['nav_urls']['whatlinkshere'] )
@@ -113,7 +112,6 @@ abstract class BaseTemplate extends QuickTemplate {
                }
 
                Hooks::run( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
-               wfProfileOut( __METHOD__ );
                return $toolbox;
        }
 
index 8bd77cc..6e48d04 100644 (file)
@@ -33,7 +33,6 @@ class MediaWikiI18N {
        }
 
        function translate( $value ) {
-               wfProfileIn( __METHOD__ );
 
                // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23
                $value = preg_replace( '/^string:/', '', $value );
@@ -48,7 +47,6 @@ class MediaWikiI18N {
                        wfRestoreWarnings();
                        $value = str_replace( $src, $varValue, $value );
                }
-               wfProfileOut( __METHOD__ );
                return $value;
        }
 }
index b28dc51..905e537 100644 (file)
@@ -50,6 +50,20 @@ abstract class QuickTemplate {
                $this->data[$name] = $value;
        }
 
+       /**
+       * extends the value of data with name $name with the value $value
+       * @since 1.25
+       * @param string $name
+       * @param mixed $value
+       */
+       public function extend( $name, $value ) {
+               if ( $this->haveData( $name ) ) {
+                       $this->data[$name] = $this->data[$name] . $value;
+               } else {
+                       $this->data[$name] = $value;
+               }
+       }
+
        /**
         * Gets the template data requested
         * @since 1.22
index ce0c640..999dda8 100644 (file)
@@ -168,11 +168,9 @@ abstract class Skin extends ContextSource {
         * @param OutputPage $out
         */
        function initPage( OutputPage $out ) {
-               wfProfileIn( __METHOD__ );
 
                $this->preloadExistence();
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -482,9 +480,10 @@ abstract class Skin extends ContextSource {
 
                        $msg = $this->msg( 'pagecategories' )->numParams( count( $allCats['normal'] ) )->escaped();
                        $linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text();
+                       $title = Title::newFromText( $linkPage );
+                       $link = $title ? Linker::link( $title, $msg ) : $msg;
                        $s .= '<div id="mw-normal-catlinks" class="mw-normal-catlinks">' .
-                               Linker::link( Title::newFromText( $linkPage ), $msg )
-                               . $colon . '<ul>' . $t . '</ul>' . '</div>';
+                               $link . $colon . '<ul>' . $t . '</ul>' . '</div>';
                }
 
                # Hidden categories
@@ -645,8 +644,9 @@ abstract class Skin extends ContextSource {
                        $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) );
                }
 
-               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url
-                       . '">' . $url . '</a>' )->text();
+               return $this->msg( 'retrievedfrom' )
+                       ->rawParams( '<a dir="ltr" href="' . $url. '">' . $url . '</a>' )
+                       ->escaped();
        }
 
        /**
@@ -860,13 +860,13 @@ abstract class Skin extends ContextSource {
                if ( $timestamp ) {
                        $d = $this->getLanguage()->userDate( $timestamp, $this->getUser() );
                        $t = $this->getLanguage()->userTime( $timestamp, $this->getUser() );
-                       $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->text();
+                       $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->escaped();
                } else {
                        $s = '';
                }
 
                if ( wfGetLB()->getLaggedSlaveMode() ) {
-                       $s .= ' <strong>' . $this->msg( 'laggedslavemode' )->text() . '</strong>';
+                       $s .= ' <strong>' . $this->msg( 'laggedslavemode' )->parse() . '</strong>';
                }
 
                return $s;
@@ -940,7 +940,6 @@ abstract class Skin extends ContextSource {
         * @return string HTML anchor
         */
        public function footerLink( $desc, $page ) {
-               $section = new ProfileSection( __METHOD__ );
                // if the link description has been set to "-" in the default language,
                if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) {
                        // then it is disabled, for all languages.
@@ -951,6 +950,10 @@ abstract class Skin extends ContextSource {
                        // but we make the link target be the one site-wide page.
                        $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() );
 
+                       if ( !$title ) {
+                               return '';
+                       }
+
                        return Linker::linkKnown(
                                $title,
                                $this->msg( $desc )->escaped()
@@ -1040,6 +1043,7 @@ abstract class Skin extends ContextSource {
         *
         * @param string $name The name or path of a skin resource file
         * @return string The fully resolved style path url including styleversion
+        * @throws MWException
         */
        function getSkinStylePath( $name ) {
                global $wgStylePath, $wgStyleVersion;
@@ -1217,7 +1221,6 @@ abstract class Skin extends ContextSource {
         */
        function buildSidebar() {
                global $wgMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry;
-               wfProfileIn( __METHOD__ );
 
                $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() );
 
@@ -1226,7 +1229,6 @@ abstract class Skin extends ContextSource {
                        if ( $cachedsidebar ) {
                                Hooks::run( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
 
-                               wfProfileOut( __METHOD__ );
                                return $cachedsidebar;
                        }
                }
@@ -1241,7 +1243,6 @@ abstract class Skin extends ContextSource {
 
                Hooks::run( 'SidebarBeforeOutput', array( $this, &$bar ) );
 
-               wfProfileOut( __METHOD__ );
                return $bar;
        }
 
@@ -1467,8 +1468,6 @@ abstract class Skin extends ContextSource {
        private function getCachedNotice( $name ) {
                global $wgRenderHashAppend, $parserMemc, $wgContLang;
 
-               wfProfileIn( __METHOD__ );
-
                $needParse = false;
 
                if ( $name === 'default' ) {
@@ -1476,13 +1475,11 @@ abstract class Skin extends ContextSource {
                        global $wgSiteNotice;
                        $notice = $wgSiteNotice;
                        if ( empty( $notice ) ) {
-                               wfProfileOut( __METHOD__ );
                                return false;
                        }
                } else {
                        $msg = $this->msg( $name )->inContentLanguage();
                        if ( $msg->isDisabled() ) {
-                               wfProfileOut( __METHOD__ );
                                return false;
                        }
                        $notice = $msg->plain();
@@ -1509,7 +1506,6 @@ abstract class Skin extends ContextSource {
 
                $notice = Html::rawElement( 'div', array( 'id' => 'localNotice',
                        'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $notice );
-               wfProfileOut( __METHOD__ );
                return $notice;
        }
 
@@ -1519,7 +1515,6 @@ abstract class Skin extends ContextSource {
         * @return string HTML fragment
         */
        function getNamespaceNotice() {
-               wfProfileIn( __METHOD__ );
 
                $key = 'namespacenotice-' . $this->getTitle()->getNsText();
                $namespaceNotice = $this->getCachedNotice( $key );
@@ -1529,7 +1524,6 @@ abstract class Skin extends ContextSource {
                        $namespaceNotice = '';
                }
 
-               wfProfileOut( __METHOD__ );
                return $namespaceNotice;
        }
 
@@ -1539,7 +1533,6 @@ abstract class Skin extends ContextSource {
         * @return string HTML fragment
         */
        function getSiteNotice() {
-               wfProfileIn( __METHOD__ );
                $siteNotice = '';
 
                if ( Hooks::run( 'SiteNoticeBefore', array( &$siteNotice, $this ) ) ) {
@@ -1559,7 +1552,6 @@ abstract class Skin extends ContextSource {
                }
 
                Hooks::run( 'SiteNoticeAfter', array( &$siteNotice, $this ) );
-               wfProfileOut( __METHOD__ );
                return $siteNotice;
        }
 
index d393280..45a1a8b 100644 (file)
@@ -175,17 +175,13 @@ class SkinTemplate extends Skin {
        }
 
        protected function setupTemplateForOutput() {
-               wfProfileIn( __METHOD__ );
 
                $request = $this->getRequest();
                $user = $this->getUser();
                $title = $this->getTitle();
 
-               wfProfileIn( __METHOD__ . '-init' );
                $tpl = $this->setupTemplate( $this->template, 'skins' );
-               wfProfileOut( __METHOD__ . '-init' );
 
-               wfProfileIn( __METHOD__ . '-stuff' );
                $this->thispage = $title->getPrefixedDBkey();
                $this->titletxt = $title->getPrefixedText();
                $this->userpage = $user->getUserPage()->getPrefixedText();
@@ -208,10 +204,6 @@ class SkinTemplate extends Skin {
                        $this->userpageUrlDetails = self::makeKnownUrlDetails( $this->userpage );
                }
 
-               wfProfileOut( __METHOD__ . '-stuff' );
-
-               wfProfileOut( __METHOD__ );
-
                return $tpl;
        }
 
@@ -221,7 +213,6 @@ class SkinTemplate extends Skin {
         * @param OutputPage $out
         */
        function outputPage( OutputPage $out = null ) {
-               wfProfileIn( __METHOD__ );
                Profiler::instance()->setTemplated( true );
 
                $oldContext = null;
@@ -234,14 +225,10 @@ class SkinTemplate extends Skin {
 
                $out = $this->getOutput();
 
-               wfProfileIn( __METHOD__ . '-init' );
                $this->initPage( $out );
-               wfProfileOut( __METHOD__ . '-init' );
                $tpl = $this->prepareQuickTemplate( $out );
                // execute template
-               wfProfileIn( __METHOD__ . '-execute' );
                $res = $tpl->execute();
-               wfProfileOut( __METHOD__ . '-execute' );
 
                // result may be an error
                $this->printOrError( $res );
@@ -250,7 +237,6 @@ class SkinTemplate extends Skin {
                        $this->setContext( $oldContext );
                }
 
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -265,14 +251,11 @@ class SkinTemplate extends Skin {
                        $wgShowCreditsIfMax, $wgArticlePath,
                        $wgScriptPath, $wgServer;
 
-               wfProfileIn( __METHOD__ );
-
                $title = $this->getTitle();
                $request = $this->getRequest();
                $out = $this->getOutput();
                $tpl = $this->setupTemplateForOutput();
 
-               wfProfileIn( __METHOD__ . '-stuff2' );
                $tpl->set( 'title', $out->getPageTitle() );
                $tpl->set( 'pagetitle', $out->getHTMLTitle() );
                $tpl->set( 'displaytitle', $out->mPageLinkTitle );
@@ -367,9 +350,6 @@ class SkinTemplate extends Skin {
                        $tpl->set( 'userlangattributes', $attrs );
                }
 
-               wfProfileOut( __METHOD__ . '-stuff2' );
-
-               wfProfileIn( __METHOD__ . '-stuff3' );
                $tpl->set( 'newtalk', $this->getNewtalks() );
                $tpl->set( 'logo', $this->logoText() );
 
@@ -390,9 +370,7 @@ class SkinTemplate extends Skin {
                        }
                        $tpl->set( 'copyright', $this->getCopyright() );
                }
-               wfProfileOut( __METHOD__ . '-stuff3' );
 
-               wfProfileIn( __METHOD__ . '-stuff4' );
                $tpl->set( 'copyrightico', $this->getCopyrightIcon() );
                $tpl->set( 'poweredbyico', $this->getPoweredBy() );
                $tpl->set( 'disclaimer', $this->disclaimerLink() );
@@ -463,9 +441,7 @@ class SkinTemplate extends Skin {
                } else {
                        $tpl->set( 'language_urls', false );
                }
-               wfProfileOut( __METHOD__ . '-stuff4' );
 
-               wfProfileIn( __METHOD__ . '-stuff5' );
                # Personal toolbar
                $tpl->set( 'personal_urls', $this->buildPersonalUrls() );
                $content_navigation = $this->buildContentNavigationUrls();
@@ -505,9 +481,7 @@ class SkinTemplate extends Skin {
                // allow extensions adding stuff after the page content.
                // See Skin::afterContentHook() for further documentation.
                $tpl->set( 'dataAfterContent', $this->afterContentHook() );
-               wfProfileOut( __METHOD__ . '-stuff5' );
 
-               wfProfileOut( __METHOD__ );
                return $tpl;
        }
 
@@ -571,7 +545,6 @@ class SkinTemplate extends Skin {
                $title = $this->getTitle();
                $request = $this->getRequest();
                $pageurl = $title->getLocalURL();
-               wfProfileIn( __METHOD__ );
 
                /* set up the default links for the personal toolbar */
                $personal_urls = array();
@@ -704,7 +677,6 @@ class SkinTemplate extends Skin {
                }
 
                Hooks::run( 'PersonalUrls', array( &$personal_urls, &$title, $this ) );
-               wfProfileOut( __METHOD__ );
                return $personal_urls;
        }
 
@@ -822,8 +794,6 @@ class SkinTemplate extends Skin {
        protected function buildContentNavigationUrls() {
                global $wgDisableLangConversion;
 
-               wfProfileIn( __METHOD__ );
-
                // Display tabs for the relevant title rather than always the title itself
                $title = $this->getRelevantTitle();
                $onPage = $title->equals( $this->getTitle() );
@@ -909,8 +879,6 @@ class SkinTemplate extends Skin {
                                        );
                                }
 
-                               wfProfileIn( __METHOD__ . '-edit' );
-
                                // Checks if user can edit the current page if it exists or create it otherwise
                                if ( $title->quickUserCan( 'edit', $user )
                                        && ( $title->exists() || $title->quickUserCan( 'create', $user ) )
@@ -967,9 +935,7 @@ class SkinTemplate extends Skin {
                                                'primary' => true, // don't collapse this in vector
                                        );
                                }
-                               wfProfileOut( __METHOD__ . '-edit' );
 
-                               wfProfileIn( __METHOD__ . '-live' );
                                // Checks if the page exists
                                if ( $title->exists() ) {
                                        // Adds history view link
@@ -1030,8 +996,6 @@ class SkinTemplate extends Skin {
                                        );
                                }
 
-                               wfProfileOut( __METHOD__ . '-live' );
-
                                // Checks if the user is logged in
                                if ( $this->loggedin && $user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' ) ) {
                                        /**
@@ -1138,8 +1102,6 @@ class SkinTemplate extends Skin {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $content_navigation;
        }
 
@@ -1150,8 +1112,6 @@ class SkinTemplate extends Skin {
         */
        private function buildContentActionUrls( $content_navigation ) {
 
-               wfProfileIn( __METHOD__ );
-
                // content_actions has been replaced with content_navigation for backwards
                // compatibility and also for skins that just want simple tabs content_actions
                // is now built by flattening the content_navigation arrays into one
@@ -1183,8 +1143,6 @@ class SkinTemplate extends Skin {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $content_actions;
        }
 
@@ -1195,8 +1153,6 @@ class SkinTemplate extends Skin {
        protected function buildNavUrls() {
                global $wgUploadNavigationUrl;
 
-               wfProfileIn( __METHOD__ );
-
                $out = $this->getOutput();
                $request = $this->getRequest();
 
@@ -1301,7 +1257,6 @@ class SkinTemplate extends Skin {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
                return $nav_urls;
        }
 
index fd3bc7b..f727c05 100644 (file)
@@ -74,6 +74,16 @@ abstract class FormSpecialPage extends SpecialPage {
                return strtolower( $this->getName() );
        }
 
+       /**
+        * Get display format for the form. See HTMLForm documentation for available values.
+        *
+        * @since 1.25
+        * @return string
+        */
+       protected function getDisplayFormat() {
+               return 'table';
+       }
+
        /**
         * Get the HTMLForm to control behavior
         * @return HTMLForm|null
@@ -81,15 +91,9 @@ abstract class FormSpecialPage extends SpecialPage {
        protected function getForm() {
                $this->fields = $this->getFormFields();
 
-               $form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
+               $form = HTMLForm::factory( $this->getDisplayFormat(), $this->fields, $this->getContext(), $this->getMessagePrefix() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               // If the form is a compact vertical form, then don't output this ugly
-               // fieldset surrounding it.
-               // XXX Special pages can setDisplayFormat to 'vform' in alterForm(), but that
-               // is called after this.
-               if ( !$form->isVForm() ) {
-                       $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
-               }
+               $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
 
                $headerMsg = $this->msg( $this->getMessagePrefix() . '-text' );
                if ( !$headerMsg->isDisabled() ) {
index dd21af4..1ff7e3f 100644 (file)
@@ -81,7 +81,7 @@ abstract class QueryPage extends SpecialPage {
                                array( 'MostimagesPage', 'Mostimages' ),
                                array( 'MostinterwikisPage', 'Mostinterwikis' ),
                                array( 'MostlinkedCategoriesPage', 'Mostlinkedcategories' ),
-                               array( 'MostlinkedtemplatesPage', 'Mostlinkedtemplates' ),
+                               array( 'MostlinkedTemplatesPage', 'Mostlinkedtemplates' ),
                                array( 'MostlinkedPage', 'Mostlinked' ),
                                array( 'MostrevisionsPage', 'Mostrevisions' ),
                                array( 'FewestrevisionsPage', 'Fewestrevisions' ),
@@ -96,7 +96,7 @@ abstract class QueryPage extends SpecialPage {
                                array( 'WantedFilesPage', 'Wantedfiles' ),
                                array( 'WantedPagesPage', 'Wantedpages' ),
                                array( 'WantedTemplatesPage', 'Wantedtemplates' ),
-                               array( 'UnwatchedPagesPage', 'Unwatchedpages' ),
+                               array( 'UnwatchedpagesPage', 'Unwatchedpages' ),
                                array( 'UnusedtemplatesPage', 'Unusedtemplates' ),
                                array( 'WithoutInterwikiPage', 'Withoutinterwiki' ),
                        );
index 759d7cb..31d679a 100644 (file)
@@ -330,7 +330,7 @@ class SpecialPage {
 
        /**
         * Helper function for implementations of prefixSearchSubpages() that
-        * filter the values in memory (as oppposed to making a query).
+        * filter the values in memory (as opposed to making a query).
         *
         * @since 1.24
         * @param string $search
index e31ebf6..175b0cb 100644 (file)
@@ -220,7 +220,6 @@ class SpecialPageFactory {
                global $wgPageLanguageUseDB;
 
                if ( !is_array( self::$list ) ) {
-                       wfProfileIn( __METHOD__ );
 
                        self::$list = self::$coreList;
 
@@ -254,7 +253,6 @@ class SpecialPageFactory {
                        // This hook can be used to remove undesired built-in special pages
                        Hooks::run( 'SpecialPage_initList', array( &self::$list ) );
 
-                       wfProfileOut( __METHOD__ );
                }
 
                return self::$list;
@@ -527,7 +525,6 @@ class SpecialPageFactory {
         * @return bool
         */
        public static function executePath( Title &$title, IContextSource &$context, $including = false ) {
-               wfProfileIn( __METHOD__ );
 
                // @todo FIXME: Redirects broken due to this call
                $bits = explode( '/', $title->getDBkey(), 2 );
@@ -549,7 +546,6 @@ class SpecialPageFactory {
                        }
 
                        $context->getOutput()->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -569,14 +565,12 @@ class SpecialPageFactory {
                                $title = $page->getPageTitle( $par );
                                $url = $title->getFullURL( $query );
                                $context->getOutput()->redirect( $url );
-                               wfProfileOut( __METHOD__ );
 
                                return $title;
                        } else {
                                $context->setTitle( $page->getPageTitle( $par ) );
                        }
                } elseif ( !$page->isIncludable() ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -584,11 +578,7 @@ class SpecialPageFactory {
                $page->including( $including );
 
                // Execute special page
-               $profName = 'Special:' . $page->getName();
-               wfProfileIn( $profName );
                $page->run( $par );
-               wfProfileOut( $profName );
-               wfProfileOut( __METHOD__ );
 
                return true;
        }
index fe06375..66f1f03 100644 (file)
@@ -115,15 +115,23 @@ class ActiveUsersPager extends UsersPager {
                        ) . ')';
                }
 
+               if ( $dbr->implicitGroupby() ) {
+                       $options = array( 'GROUP BY' => array( 'qcc_title' ) );
+               } else {
+                       $options = array( 'GROUP BY' => array( 'user_name', 'user_id', 'qcc_title' ) );
+               }
+
                return array(
                        'tables' => array( 'querycachetwo', 'user', 'recentchanges' ),
                        'fields' => array( 'user_name', 'user_id', 'recentedits' => 'COUNT(*)', 'qcc_title' ),
-                       'options' => array( 'GROUP BY' => array( 'qcc_title' ) ),
+                       'options' => $options,
                        'conds' => $conds
                );
        }
 
        function doBatchLookups() {
+               parent::doBatchLookups();
+
                $uids = array();
                foreach ( $this->mResult as $row ) {
                        $uids[] = $row->user_id;
@@ -172,7 +180,8 @@ class ActiveUsersPager extends UsersPager {
                // Note: This is a different loop than for user rights,
                // because we're reusing it to build the group links
                // at the same time
-               foreach ( $user->getGroups() as $group ) {
+               $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache );
+               foreach ( $groups_list as $group ) {
                        if ( in_array( $group, $this->hideGroups ) ) {
                                return '';
                        }
@@ -260,9 +269,11 @@ class SpecialActiveUsers extends SpecialPage {
 
                // Occasionally merge in new updates
                $seconds = min( self::mergeActiveUsers( 300, $days ), $days * 86400 );
-               // Mention the level of staleness
-               $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl',
-                       $this->getLanguage()->formatDuration( $seconds ) );
+               if ( $seconds > 0 ) {
+                       // Mention the level of staleness
+                       $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl',
+                               $this->getLanguage()->formatDuration( $seconds ) );
+               }
 
                $up = new ActiveUsersPager( $this->getContext(), null, $par );
 
index 96be4d0..7cf94cc 100644 (file)
@@ -223,7 +223,6 @@ class AllMessagesTablePager extends TablePager {
        }
 
        function getAllMessages( $descending ) {
-               wfProfileIn( __METHOD__ );
                $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
                if ( $descending ) {
                        rsort( $messageNames );
@@ -234,8 +233,6 @@ class AllMessagesTablePager extends TablePager {
                // Normalise message names so they look like page titles
                $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
 
-               wfProfileOut( __METHOD__ );
-
                return $messageNames;
        }
 
@@ -252,7 +249,6 @@ class AllMessagesTablePager extends TablePager {
         */
        public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
                // FIXME: This function should be moved to Language:: or something.
-               wfProfileIn( __METHOD__ . '-db' );
 
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'page',
@@ -288,8 +284,6 @@ class AllMessagesTablePager extends TablePager {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-db' );
-
                return array( 'pages' => $pageFlags, 'talks' => $talkFlags );
        }
 
index 144d39b..1d4a860 100644 (file)
@@ -105,7 +105,7 @@ class SpecialBlock extends FormSpecialPage {
 
                # Don't need to do anything if the form has been posted
                if ( !$this->getRequest()->wasPosted() && $this->preErrors ) {
-                       $s = HTMLForm::formatErrors( $this->preErrors );
+                       $s = $form->formatErrors( $this->preErrors );
                        if ( $s ) {
                                $form->addHeaderText( Html::rawElement(
                                        'div',
@@ -626,7 +626,7 @@ class SpecialBlock extends FormSpecialPage {
                        # permission anyway, although the code does allow for it.
                        # Note: Important to use $target instead of $data['Target']
                        # since both $data['PreviousTarget'] and $target are normalized
-                       # but $data['target'] gets overriden by (non-normalized) request variable
+                       # but $data['target'] gets overridden by (non-normalized) request variable
                        # from previous request.
                        if ( $target === $performer->getName() &&
                                ( $data['PreviousTarget'] !== $target || !$data['Confirm'] )
@@ -829,7 +829,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        list( $show, $value ) = explode( ':', $option );
-                       $a[htmlspecialchars( $show )] = htmlspecialchars( $value );
+                       $a[$show] = $value;
                }
 
                return $a;
index da6f4c0..4583430 100644 (file)
@@ -262,7 +262,6 @@ class BlockListPager extends TablePager {
                                'blocklist-nousertalk',
                                'unblocklink',
                                'change-blocklink',
-                               'infiniteblock',
                        );
                        $msg = array_combine( $msg, array_map( array( $this, 'msg' ), $msg ) );
                }
@@ -428,7 +427,6 @@ class BlockListPager extends TablePager {
         * @param ResultWrapper $result
         */
        function preprocessResults( $result ) {
-               wfProfileIn( __METHOD__ );
                # Do a link batch query
                $lb = new LinkBatch;
                $lb->setCaller( __METHOD__ );
@@ -453,6 +451,5 @@ class BlockListPager extends TablePager {
                }
 
                $lb->execute();
-               wfProfileOut( __METHOD__ );
        }
 }
index e09c8ac..674cbc8 100644 (file)
@@ -39,7 +39,7 @@ class SpecialChangeEmail extends FormSpecialPage {
        /**
         * @return bool
         */
-       function isListed() {
+       public function isListed() {
                global $wgAuth;
 
                return $wgAuth->allowPropChange( 'emailaddress' );
@@ -54,7 +54,7 @@ class SpecialChangeEmail extends FormSpecialPage {
                $out->disallowUserJs();
                $out->addModules( 'mediawiki.special.changeemail' );
 
-               return parent::execute( $par );
+               parent::execute( $par );
        }
 
        protected function checkExecutePermissions( User $user ) {
@@ -106,11 +106,13 @@ class SpecialChangeEmail extends FormSpecialPage {
                return $fields;
        }
 
+       protected function getDisplayFormat() {
+               return 'vform';
+       }
+
        protected function alterForm( HTMLForm $form ) {
-               $form->setDisplayFormat( 'vform' );
                $form->setId( 'mw-changeemail-form' );
                $form->setTableId( 'mw-changeemail-table' );
-               $form->setWrapperLegend( false );
                $form->setSubmitTextMsg( 'changeemail-submit' );
                $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
        }
@@ -149,7 +151,7 @@ class SpecialChangeEmail extends FormSpecialPage {
         * @param string $newaddr
         * @return Status
         */
-       protected function attemptChange( User $user, $pass, $newaddr ) {
+       private function attemptChange( User $user, $pass, $newaddr ) {
                global $wgAuth;
 
                if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
index d771589..b6ab112 100644 (file)
@@ -38,6 +38,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
         * Main execution point
         *
         * @param null|string $code Confirmation code passed to the page
+        * @throws PermissionsError
+        * @throws ReadOnlyError
+        * @throws UserNotLoggedIn
         */
        function execute( $code ) {
                $this->setHeaders();
index 7cc5425..c2cd812 100644 (file)
@@ -711,7 +711,7 @@ class ContribsPager extends ReverseChronologicalPager {
 
        /**
         * This method basically executes the exact same code as the parent class, though with
-        * a hook added, to allow extentions to add additional queries.
+        * a hook added, to allow extensions to add additional queries.
         *
         * @param string $offset Index offset, inclusive
         * @param int $limit Exact query limit
@@ -954,7 +954,6 @@ class ContribsPager extends ReverseChronologicalPager {
         * @return string
         */
        function formatRow( $row ) {
-               wfProfileIn( __METHOD__ );
 
                $ret = '';
                $classes = array();
@@ -970,7 +969,7 @@ class ContribsPager extends ReverseChronologicalPager {
                try {
                        $rev = new Revision( $row );
                        $validRevision = (bool)$rev->getId();
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $validRevision = false;
                }
                wfRestoreWarnings();
@@ -1118,8 +1117,6 @@ class ContribsPager extends ReverseChronologicalPager {
                        $ret = Html::rawElement( 'li', array( 'class' => $classes ), $ret ) . "\n";
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $ret;
        }
 
index 7e5d13c..680aa35 100644 (file)
@@ -151,7 +151,6 @@ class DeletedContribsPager extends IndexPager {
         * @return string
         */
        function formatRow( $row ) {
-               wfProfileIn( __METHOD__ );
 
                $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
 
@@ -258,8 +257,6 @@ class DeletedContribsPager extends IndexPager {
 
                $ret = Html::rawElement( 'li', array(), $ret ) . "\n";
 
-               wfProfileOut( __METHOD__ );
-
                return $ret;
        }
 
index e42db8c..ffe7892 100644 (file)
@@ -256,7 +256,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                // Do a batch existence check
                $batch = new LinkBatch();
                if ( count( $titles ) >= 100 ) {
-                       $output = wfMessage( 'watchlistedit-too-many' )->parse();
+                       $output = $this->msg( 'watchlistedit-too-many' )->parse();
                        return;
                }
                foreach ( $titles as $title ) {
@@ -760,7 +760,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return Html::rawElement(
                        'span',
                        array( 'class' => 'mw-watchlist-toollinks' ),
-                       wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text()
+                       wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $tools ) )->escaped()
                );
        }
 }
index fc26c90..0ebbbc9 100644 (file)
@@ -212,7 +212,7 @@ class FileDuplicateSearchPage extends QueryPage {
                if ( $result->isLocal() ) {
                        $userId = $result->getUser( 'id' );
                        $user = Linker::userLink( $userId, $userText );
-                       $user .= $this->getContext()->msg( 'word-separator' )->plain();
+                       $user .= $this->getContext()->msg( 'word-separator' )->escaped();
                        $user .= '<span style="white-space: nowrap;">';
                        $user .= Linker::userToolLinks( $userId, $userText );
                        $user .= '</span>';
index da2df2d..aa9b0f4 100644 (file)
@@ -47,17 +47,20 @@ class SpecialImport extends SpecialPage {
         */
        public function __construct() {
                parent::__construct( 'Import', 'import' );
-               $this->namespace = $this->getConfig()->get( 'ImportTargetNamespace' );
        }
 
        /**
         * Execute
         * @param string|null $par
+        * @throws PermissionsError
+        * @throws ReadOnlyError
         */
        function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
 
+               $this->namespace = $this->getConfig()->get( 'ImportTargetNamespace' );
+
                $this->getOutput()->addModules( 'mediawiki.special.import' );
 
                $user = $this->getUser();
@@ -191,7 +194,7 @@ class SpecialImport extends SpecialPage {
                        $reporter->open();
                        try {
                                $importer->doImport();
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                $exception = $e;
                        }
                        $result = $reporter->close();
@@ -518,13 +521,14 @@ class ImportReporter extends ContextSource {
 
        /**
         * @param Title $title
-        * @param Title $origTitle
+        * @param ForeignTitle $foreignTitle
         * @param int $revisionCount
         * @param int $successCount
         * @param array $pageInfo
         * @return void
         */
-       function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
+       function reportPage( $title, $foreignTitle, $revisionCount,
+                       $successCount, $pageInfo ) {
                $args = func_get_args();
                call_user_func_array( $this->mOriginalPageOutCallback, $args );
 
@@ -553,7 +557,7 @@ class ImportReporter extends ContextSource {
                                $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
                        } else {
                                $interwiki = '[[:' . $this->mInterwiki . ':' .
-                                       $origTitle->getPrefixedText() . ']]';
+                                       $foreignTitle->getFullText() . ']]';
                                $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
                                        $successCount )->params( $interwiki )->inContentLanguage()->text();
                                if ( $this->reason ) {
index a61a673..492105d 100644 (file)
  */
 class SpecialJavaScriptTest extends SpecialPage {
        /**
-        * @var array Mapping of framework ids and their initilizer methods
-        * in this class. If a framework is requested but not in this array,
-        * the 'unknownframework' error is served.
+        * @var array Supported frameworks.
         */
        private static $frameworks = array(
-               'qunit' => 'initQUnitTesting',
+               'qunit',
        );
 
        public function __construct() {
@@ -44,43 +42,70 @@ class SpecialJavaScriptTest extends SpecialPage {
                $this->setHeaders();
                $out->disallowUserJs();
 
-               $out->addModules( 'mediawiki.special.javaScriptTest' );
-
-               // Determine framework
-               $pars = explode( '/', $par );
-               $framework = strtolower( $pars[0] );
-
-               // No framework specified
-               if ( $par == '' ) {
+               if ( $par === null ) {
+                       // No framework specified
+                       $out->setStatusCode( 404 );
                        $out->setPageTitle( $this->msg( 'javascripttest' ) );
-                       $summary = $this->wrapSummaryHtml(
-                               $this->msg( 'javascripttest-pagetext-noframework' )->escaped() .
-                                       $this->getFrameworkListHtml(),
-                               'noframework'
+                       $out->addHTML(
+                               $this->msg( 'javascripttest-pagetext-noframework' )->parseAsBlock()
+                               . $this->getFrameworkListHtml()
                        );
-                       $out->addHtml( $summary );
-               } elseif ( isset( self::$frameworks[$framework] ) ) {
-                       // Matched! Display proper title and initialize the framework
-                       $out->setPageTitle( $this->msg(
-                               'javascripttest-title',
-                               // Messages: javascripttest-qunit-name
-                               $this->msg( "javascripttest-$framework-name" )->plain()
-                       ) );
-                       $out->setSubtitle( $this->msg( 'javascripttest-backlink' )
-                               ->rawParams( Linker::linkKnown( $this->getPageTitle() ) ) );
-                       $this->{self::$frameworks[$framework]}();
-               } else {
-                       // Framework not found, display error
-                       $out->setPageTitle( $this->msg( 'javascripttest' ) );
-                       $summary = $this->wrapSummaryHtml(
-                               '<p class="error">' .
-                                       $this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped() .
-                                       '</p>' .
-                                       $this->getFrameworkListHtml(),
-                               'unknownframework'
+                       return;
+               }
+
+               // Determine framework and mode
+               $pars = explode( '/', $par, 2 );
+
+               $framework = $pars[0];
+               if ( !in_array( $framework, self::$frameworks ) ) {
+                       // Framework not found
+                       $out->setStatusCode( 404 );
+                       $out->addHTML(
+                               '<div class="error">'
+                               . $this->msg( 'javascripttest-pagetext-unknownframework' )
+                                       ->plaintextParams( $par )->parseAsBlock()
+                               . '</div>'
+                               . $this->getFrameworkListHtml()
                        );
-                       $out->addHtml( $summary );
+                       return;
                }
+
+               // This special page is disabled by default ($wgEnableJavaScriptTest), and contains
+               // no sensitive data. In order to allow TestSwarm to embed it into a test client window,
+               // we need to allow iframing of this page.
+               $out->allowClickjacking();
+               $out->setSubtitle(
+                       $this->msg( 'javascripttest-backlink' )
+                               ->rawParams( Linker::linkKnown( $this->getPageTitle() ) )
+               );
+
+               // Custom actions
+               if ( isset( $pars[1] ) ) {
+                       $action = $pars[1];
+                       if ( !in_array( $action, array( 'export', 'plain' ) ) ) {
+                               $out->setStatusCode( 404 );
+                               $out->addHTML(
+                                       '<div class="error">'
+                                       . $this->msg( 'javascripttest-pagetext-unknownaction' )
+                                               ->plaintextParams( $action )->parseAsBlock()
+                                       . '</div>'
+                               );
+                               return;
+                       }
+                       $method = $action . ucfirst( $framework );
+                       $this->$method();
+                       return;
+               }
+
+               $out->addModules( 'mediawiki.special.javaScriptTest' );
+
+               $method = 'view' . ucfirst( $framework );
+               $this->$method();
+               $out->setPageTitle( $this->msg(
+                       'javascripttest-title',
+                       // Messages: javascripttest-qunit-name
+                       $this->msg( "javascripttest-$framework-name" )->plain()
+               ) );
        }
 
        /**
@@ -91,7 +116,7 @@ class SpecialJavaScriptTest extends SpecialPage {
         */
        private function getFrameworkListHtml() {
                $list = '<ul>';
-               foreach ( self::$frameworks as $framework => $initFn ) {
+               foreach ( self::$frameworks as $framework ) {
                        $list .= Html::rawElement(
                                'li',
                                array(),
@@ -109,67 +134,129 @@ class SpecialJavaScriptTest extends SpecialPage {
        }
 
        /**
-        * Function to wrap the summary.
-        * It must be given a valid state as a second parameter or an exception will
-        * be thrown.
-        * @param string $html The raw HTML.
-        * @param string $state State, one of 'noframework', 'unknownframework' or 'frameworkfound'
-        * @throws MWException
-        * @return string
+        * Wrap HTML contents in a summary container.
+        *
+        * @param string $html HTML contents to be wrapped
+        * @return string HTML
         */
-       private function wrapSummaryHtml( $html, $state ) {
-               $validStates = array( 'noframework', 'unknownframework', 'frameworkfound' );
-
-               if ( !in_array( $state, $validStates ) ) {
-                       throw new MWException( __METHOD__
-                               . ' given an invalid state. Must be one of "'
-                               . join( '", "', $validStates ) . '".'
-                       );
-               }
-
-               return "<div id=\"mw-javascripttest-summary\" class=\"mw-javascripttest-$state\">$html</div>";
+       private function wrapSummaryHtml( $html ) {
+               return "<div id=\"mw-javascripttest-summary\">$html</div>";
        }
 
        /**
-        * Initialize the page for QUnit.
+        * Run the test suite on the Special page.
+        *
+        * Rendered by OutputPage and Skin.
         */
-       private function initQUnitTesting() {
+       private function viewQUnit() {
                $out = $this->getOutput();
-               $testConfig = $this->getConfig()->get( 'JavaScriptTestConfig' );
 
-               $out->addModules( 'test.mediawiki.qunit.testrunner' );
-               $qunitTestModules = $out->getResourceLoader()->getTestModuleNames( 'qunit' );
-               $out->addModules( $qunitTestModules );
+               $modules = $out->getResourceLoader()->getTestModuleNames( 'qunit' );
 
                $summary = $this->msg( 'javascripttest-qunit-intro' )
-                       ->params( $testConfig['qunit']['documentation'] )
+                       ->params( 'https://www.mediawiki.org/wiki/Manual:JavaScript_unit_testing' )
                        ->parseAsBlock();
-               $header = $this->msg( 'javascripttest-qunit-heading' )->escaped();
-               $userDir = $this->getLanguage()->getDir();
 
                $baseHtml = <<<HTML
 <div class="mw-content-ltr">
-<div id="qunit-header"><span dir="$userDir">$header</span></div>
-<div id="qunit-banner"></div>
-<div id="qunit-testrunner-toolbar"></div>
-<div id="qunit-userAgent"></div>
-<ol id="qunit-tests"></ol>
-<div id="qunit-fixture">test markup, will be hidden</div>
+<div id="qunit"></div>
 </div>
 HTML;
-               $out->addHtml( $this->wrapSummaryHtml( $summary, 'frameworkfound' ) . $baseHtml );
 
-               // This special page is disabled by default ($wgEnableJavaScriptTest), and contains
-               // no sensitive data. In order to allow TestSwarm to embed it into a test client window,
-               // we need to allow iframing of this page.
-               $out->allowClickjacking();
+               $out->addHtml( $this->wrapSummaryHtml( $summary ) . $baseHtml );
+
+               // The testrunner configures QUnit and essentially depends on it. However, test suites
+               // are reusable in environments that preload QUnit (or a compatibility interface to
+               // another framework). Therefore we have to load it ourselves.
+               $out->addHtml( Html::inlineScript(
+                       ResourceLoader::makeLoaderConditionalScript(
+                               Xml::encodeJsCall( 'mw.loader.using', array(
+                                       array( 'jquery.qunit', 'jquery.qunit.completenessTest' ),
+                                       new XmlJsCode(
+                                               'function () {' . Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) . '}'
+                                       )
+                               ) )
+                       )
+               ) );
+       }
+
+       /**
+        * Generate self-sufficient JavaScript payload to run the tests elsewhere.
+        *
+        * Includes startup module to request modules from ResourceLoader.
+        *
+        * Note: This modifies the registry to replace 'jquery.qunit' with an
+        * empty module to allow external environment to preload QUnit with any
+        * neccecary framework adapters (e.g. Karma). Loading it again would
+        * re-define QUnit and dereference event handlers from Karma.
+        */
+       private function exportQUnit() {
+               $out = $this->getOutput();
+               $out->disable();
 
-               // Used in ./tests/qunit/data/testrunner.js, see also documentation of
-               // $wgJavaScriptTestConfig in DefaultSettings.php
-               $out->addJsConfigVars(
-                       'QUnitTestSwarmInjectJSPath',
-                       $testConfig['qunit']['testswarm-injectjs']
+               $rl = $out->getResourceLoader();
+
+               $query = array(
+                       'lang' => $this->getLanguage()->getCode(),
+                       'skin' => $this->getSkin()->getSkinName(),
+                       'debug' => ResourceLoader::inDebugMode() ? 'true' : 'false',
                );
+               $embedContext = new ResourceLoaderContext( $rl, new FauxRequest( $query ) );
+               $query['only'] = 'scripts';
+               $startupContext = new ResourceLoaderContext( $rl, new FauxRequest( $query ) );
+
+               $modules = $rl->getTestModuleNames( 'qunit' );
+
+               // The below is essentially a pure-javascript version of OutputPage::getHeadScripts.
+               $startup = $rl->makeModuleResponse( $startupContext, array(
+                       'startup' => $rl->getModule( 'startup' ),
+               ) );
+               // Embed page-specific mw.config variables.
+               // The current Special page shouldn't be relevant to tests, but various modules (which
+               // are loaded before the test suites), reference mw.config while initialising.
+               $code = ResourceLoader::makeConfigSetScript( $out->getJSVars() );
+               // Embed private modules as they're not allowed to be loaded dynamically
+               $code .= $rl->makeModuleResponse( $embedContext, array(
+                       'user.options' => $rl->getModule( 'user.options' ),
+                       'user.tokens' => $rl->getModule( 'user.tokens' ),
+               ) );
+               $code .= Xml::encodeJsCall( 'mw.loader.load', array( $modules ) );
+
+               header( 'Content-Type: text/javascript; charset=utf-8' );
+               header( 'Cache-Control: private, no-cache, must-revalidate' );
+               header( 'Pragma: no-cache' );
+               echo $startup;
+               echo "\n";
+               // Note: The following has to be wrapped in a script tag because the startup module also
+               // writes a script tag (the one loading mediawiki.js). Script tags are synchronous, block
+               // each other, and run in order. But they don't nest. The code appended after the startup
+               // module runs before the added script tag is parsed and executed.
+               echo Xml::encodeJsCall( 'document.write', array( Html::inlineScript( $code  ) ) );
+       }
+
+       private function plainQUnit() {
+               $out = $this->getOutput();
+               $out->disable();
+
+               $url = $this->getPageTitle( 'qunit/export' )->getFullURL( array(
+                       'debug' => ResourceLoader::inDebugMode() ? 'true' : 'false',
+               ) );
+
+               $styles = $out->makeResourceLoaderLink( 'jquery.qunit', ResourceLoaderModule::TYPE_STYLES, false );
+               // Use 'raw' since this is a plain HTML page without ResourceLoader
+               $scripts = $out->makeResourceLoaderLink( 'jquery.qunit', ResourceLoaderModule::TYPE_SCRIPTS, false, array( 'raw' => 'true' ) );
+
+               $head = trim( $styles['html'] . $scripts['html'] );
+               $html = <<<HTML
+<!DOCTYPE html>
+<title>QUnit</title>
+$head
+<div id="qunit"></div>
+HTML;
+               $html .= "\n" . Html::linkedScript( $url );
+
+               header( 'Content-Type: text/html; charset=utf-8' );
+               echo $html;
        }
 
        /**
@@ -178,7 +265,7 @@ HTML;
         * @return string[] subpages
         */
        public function getSubpagesForPrefixSearch() {
-               return array_keys( self::$frameworks );
+               return self::$frameworks;
        }
 
        protected function getGroupName() {
index c68341c..760704d 100644 (file)
@@ -302,6 +302,7 @@ class ImageListPager extends TablePager {
         * @param int $limit
         * @param bool $asc
         * @return array
+        * @throws MWException
         */
        function reallyDoQuery( $offset, $limit, $asc ) {
                $prevTableName = $this->mTableName;
index 8b9a0ee..828a93b 100644 (file)
@@ -86,13 +86,14 @@ class SpecialListGroupRights extends SpecialPage {
                        $grouppageLocalized = !$msg->isBlank() ?
                                $msg->text() :
                                MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
+                       $grouppageLocalizedTitle = Title::newFromText( $grouppageLocalized );
 
-                       if ( $group == '*' ) {
-                               // Do not make a link for the generic * group
+                       if ( $group == '*' || !$grouppageLocalizedTitle ) {
+                               // Do not make a link for the generic * group or group with invalid group page
                                $grouppage = htmlspecialchars( $groupnameLocalized );
                        } else {
                                $grouppage = Linker::link(
-                                       Title::newFromText( $grouppageLocalized ),
+                                       $grouppageLocalizedTitle,
                                        htmlspecialchars( $groupnameLocalized )
                                );
                        }
index 68c5346..56c4eb5 100644 (file)
  */
 class UsersPager extends AlphabeticPager {
 
+       /**
+        * @var array A array with user ids as key and a array of groups as value
+        */
+       protected $userGroupCache;
+
        /**
         * @param IContextSource $context
         * @param array $par (Default null)
@@ -132,8 +137,6 @@ class UsersPager extends AlphabeticPager {
                                'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name',
                                'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)',
                                'edits' => 'MAX(user_editcount)',
-                               'numgroups' => 'COUNT(ug_group)',
-                               'singlegroup' => 'MAX(ug_group)', // the usergroup if there is only one
                                'creation' => 'MIN(user_registration)',
                                'ipb_deleted' => 'MAX(ipb_deleted)' // block/hide status
                        ),
@@ -176,7 +179,7 @@ class UsersPager extends AlphabeticPager {
                $lang = $this->getLanguage();
 
                $groups = '';
-               $groups_list = self::getGroups( $row->user_id );
+               $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache );
 
                if ( !$this->including && count( $groups_list ) > 0 ) {
                        $list = array();
@@ -218,11 +221,38 @@ class UsersPager extends AlphabeticPager {
 
        function doBatchLookups() {
                $batch = new LinkBatch();
+               $userIds = array();
                # Give some pointers to make user links
                foreach ( $this->mResult as $row ) {
                        $batch->add( NS_USER, $row->user_name );
                        $batch->add( NS_USER_TALK, $row->user_name );
+                       $userIds[] = $row->user_id;
+               }
+
+               // Lookup groups for all the users
+               $dbr = wfGetDB( DB_SLAVE );
+               $groupRes = $dbr->select(
+                       'user_groups',
+                       array( 'ug_user', 'ug_group' ),
+                       array( 'ug_user' => $userIds ),
+                       __METHOD__
+               );
+               $cache = array();
+               $groups = array();
+               foreach ( $groupRes as $row ) {
+                       $cache[intval( $row->ug_user )][] = $row->ug_group;
+                       $groups[$row->ug_group] = true;
                }
+               $this->userGroupCache = $cache;
+
+               // Add page of groups to link batch
+               foreach ( $groups as $group => $unused ) {
+                       $groupPage = User::getGroupPage( $group );
+                       if ( $groupPage ) {
+                               $batch->addObj( $groupPage );
+                       }
+               }
+
                $batch->execute();
                $this->mResult->rewind();
        }
@@ -331,11 +361,17 @@ class UsersPager extends AlphabeticPager {
         * Get a list of groups the specified user belongs to
         *
         * @param int $uid User id
+        * @param array|null $cache
         * @return array
         */
-       protected static function getGroups( $uid ) {
-               $user = User::newFromId( $uid );
-               $groups = array_diff( $user->getEffectiveGroups(), User::getImplicitGroups() );
+       protected static function getGroups( $uid, $cache = null ) {
+               if ( $cache === null ) {
+                       $user = User::newFromId( $uid );
+                       $effectiveGroups = $user->getEffectiveGroups();
+               } else {
+                       $effectiveGroups = isset( $cache[$uid] ) ? $cache[$uid] : array();
+               }
+               $groups = array_diff( $effectiveGroups, User::getImplicitGroups() );
 
                return $groups;
        }
@@ -350,7 +386,7 @@ class UsersPager extends AlphabeticPager {
        protected static function buildGroupLink( $group, $username ) {
                return User::makeGroupLinkHtml(
                        $group,
-                       htmlspecialchars( User::getGroupMember( $group, $username ) )
+                       User::getGroupMember( $group, $username )
                );
        }
 }
index c26adc5..e3c7e3a 100644 (file)
@@ -306,6 +306,8 @@ class MediaStatisticsPage extends QueryPage {
         *
         * @param $skin Skin
         * @param $result stdObject Result row
+        * @return bool|string|void
+        * @throws MWException
         */
        public function formatResult( $skin, $result ) {
                throw new MWException( "unimplemented" );
index 07a18b0..7e74cd5 100644 (file)
@@ -521,7 +521,6 @@ class MergeHistoryPager extends ReverseChronologicalPager {
        }
 
        function getStartBody() {
-               wfProfileIn( __METHOD__ );
                # Do a link batch query
                $this->mResult->seek( 0 );
                $batch = new LinkBatch();
@@ -544,8 +543,6 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                $batch->execute();
                $this->mResult->seek( 0 );
 
-               wfProfileOut( __METHOD__ );
-
                return '';
        }
 
index 98d8da3..3666964 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 /**
- * A special page page that list most used images
+ * A special page that lists most used images
  *
  * @ingroup SpecialPage
  */
index bc16925..94e77e3 100644 (file)
@@ -141,7 +141,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        $mode = $this->getRequest()->getVal( 'gallerymode', null );
                        try {
                                $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // User specified something invalid, fallback to default.
                                $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
                        }
index aa16dbc..82cd0a1 100644 (file)
@@ -228,7 +228,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        ),
                        'nsinvert' => array(
                                'type' => 'check',
-                               'name' => 'nsinvert',
+                               'name' => 'invert',
                                'label-message' => 'invert',
                                'default' => $nsinvert,
                                'tooltip' => $this->msg( 'tooltip-invert' )->text(),
@@ -236,7 +236,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        'tagFilter' => array(
                                'type' => 'tagfilter',
                                'name' => 'tagfilter',
-                               'label-raw' => wfMessage( 'tag-filter' )->parse(),
+                               'label-raw' => $this->msg( 'tag-filter' )->parse(),
                                'default' => $tagFilterVal,
                        ),
                        'username' => array(
index 52c2460..79b2444 100644 (file)
@@ -90,9 +90,11 @@ class SpecialPageLanguage extends FormSpecialPage {
                return $this->showLogFragment( $this->par );
        }
 
+       protected function getDisplayFormat() {
+               return 'vform';
+       }
+
        public function alterForm( HTMLForm $form ) {
-               $form->setDisplayFormat( 'vform' );
-               $form->setWrapperLegend( false );
                Hooks::run( 'LanguageSelector', array( $this->getOutput(), 'mw-languageselector' ) );
        }
 
index 6ee3290..a2dc2ad 100644 (file)
@@ -103,16 +103,13 @@ class SpecialPasswordReset extends FormSpecialPage {
                return $a;
        }
 
+       protected function getDisplayFormat() {
+               return 'vform';
+       }
+
        public function alterForm( HTMLForm $form ) {
                $resetRoutes = $this->getConfig()->get( 'PasswordResetRoutes' );
 
-               $form->setDisplayFormat( 'vform' );
-               // Turn the old-school line around the form off.
-               // XXX This wouldn't be necessary here if we could set the format of
-               // the HTMLForm to 'vform' at its creation, but there's no way to do so
-               // from a FormSpecialPage class.
-               $form->setWrapperLegend( false );
-
                $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
 
                $i = 0;
index a40da87..d25c2c8 100644 (file)
@@ -72,7 +72,6 @@ class SpecialProtectedtitles extends SpecialPage {
         * @return string
         */
        function formatRow( $row ) {
-               wfProfileIn( __METHOD__ );
 
                static $infinity = null;
 
@@ -82,7 +81,6 @@ class SpecialProtectedtitles extends SpecialPage {
 
                $title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
                if ( !$title ) {
-                       wfProfileOut( __METHOD__ );
 
                        return Html::rawElement(
                                'li',
@@ -119,8 +117,6 @@ class SpecialProtectedtitles extends SpecialPage {
                        )->escaped();
                }
 
-               wfProfileOut( __METHOD__ );
-
                // @todo i18n: This should use a comma separator instead of a hard coded comma, right?
                return '<li>' . $lang->specialList( $link, implode( $description_items, ', ' ) ) . "</li>\n";
        }
@@ -227,7 +223,6 @@ class ProtectedTitlesPager extends AlphabeticPager {
        }
 
        function getStartBody() {
-               wfProfileIn( __METHOD__ );
                # Do a link batch query
                $this->mResult->seek( 0 );
                $lb = new LinkBatch;
@@ -237,7 +232,6 @@ class ProtectedTitlesPager extends AlphabeticPager {
                }
 
                $lb->execute();
-               wfProfileOut( __METHOD__ );
 
                return '';
        }
index f9e03ab..69436bf 100644 (file)
@@ -179,12 +179,12 @@ class SpecialRandomInCategory extends FormSpecialPage {
         * @param float $rand Random number between 0 and 1
         * @param int $offset Extra offset to fudge randomness
         * @param bool $up True to get the result above the random number, false for below
-        *
+        * @return array Query information.
+        * @throws MWException
         * @note The $up parameter is supposed to counteract what would happen if there
         *   was a large gap in the distribution of cl_timestamp values. This way instead
         *   of things to the right of the gap being favoured, both sides of the gap
         *   are favoured.
-        * @return array Query information.
         */
        protected function getQueryInfo( $rand, $offset, $up ) {
                $op = $up ? '>=' : '<=';
@@ -230,7 +230,7 @@ class SpecialRandomInCategory extends FormSpecialPage {
                if ( !$this->minTimestamp || !$this->maxTimestamp ) {
                        try {
                                list( $this->minTimestamp, $this->maxTimestamp ) = $this->getMinAndMaxForCat( $this->category );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // Possibly no entries in category.
                                return false;
                        }
index 7eea71d..7a350c7 100644 (file)
@@ -293,6 +293,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         * Show a deleted file version requested by the visitor.
         * @todo Mostly copied from Special:Undelete. Refactor.
         * @param string $archiveName
+        * @throws MWException
+        * @throws PermissionsError
         */
        protected function tryShowFile( $archiveName ) {
                $repo = RepoGroup::singleton()->getLocalRepo();
index 1923d44..55be2c2 100644 (file)
@@ -63,7 +63,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * @var string
         */
-       protected $didYouMeanHtml, $fulltext;
+       protected $fulltext;
 
        const NAMESPACES_CURRENT = 'sense';
 
@@ -165,7 +165,6 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-               $this->didYouMeanHtml = ''; # html of did you mean... link
                $this->fulltext = $request->getVal( 'fulltext' );
                $this->profile = $profile;
        }
@@ -207,12 +206,12 @@ class SpecialSearch extends SpecialPage {
        public function showResults( $term ) {
                global $wgContLang;
 
-               $profile = new ProfileSection( __METHOD__ );
                $search = $this->getSearchEngine();
                $search->setLimitOffset( $this->limit, $this->offset );
                $search->setNamespaces( $this->namespaces );
                $search->prefix = $this->mPrefix;
                $term = $search->transformSearchTerm( $term );
+               $didYouMeanHtml = '';
 
                Hooks::run( 'SpecialSearchSetupEngine', array( $this, $this->profile, $search ) );
 
@@ -289,8 +288,11 @@ class SpecialSearch extends SpecialPage {
                                $stParams
                        );
 
-                       $this->didYouMeanHtml = '<div class="searchdidyoumean">'
-                               . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
+                       # html of did you mean... search suggestion link
+                       $didYouMeanHtml =
+                               Xml::openElement( 'div', array( 'class' => 'searchdidyoumean' ) ) .
+                               $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() .
+                               Xml::closeElement( 'div' );
                }
 
                if ( !Hooks::run( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
@@ -303,7 +305,7 @@ class SpecialSearch extends SpecialPage {
                        Xml::openElement(
                                'form',
                                array(
-                                       'id' => ( $this->profile === 'advanced' ? 'powersearch' : 'search' ),
+                                       'id' => ( $this->isPowerSearch() ? 'powersearch' : 'search' ),
                                        'method' => 'get',
                                        'action' => wfScript(),
                                )
@@ -330,9 +332,10 @@ class SpecialSearch extends SpecialPage {
                        Xml::openElement( 'div', array( 'id' => 'mw-search-top-table' ) ) .
                        $this->shortDialog( $term, $num, $totalRes ) .
                        Xml::closeElement( 'div' ) .
+                       $this->searchProfileTabs( $term ) .
+                       $this->searchOptions( $term ) .
                        Xml::closeElement( 'form' ) .
-                       $this->didYouMeanHtml .
-                       $this->searchProfileTabs( $term )
+                       $didYouMeanHtml
                );
 
                $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
@@ -459,8 +462,6 @@ class SpecialSearch extends SpecialPage {
         * @param string $term
         */
        protected function setupPage( $term ) {
-               # Should advanced UI be used?
-               $this->searchAdvanced = ( $this->profile === 'advanced' );
                $out = $this->getOutput();
                if ( strval( $term ) !== '' ) {
                        $out->setPageTitle( $this->msg( 'searchresults' ) );
@@ -473,6 +474,15 @@ class SpecialSearch extends SpecialPage {
                $out->addModules( 'mediawiki.special.search' );
        }
 
+       /**
+        * Return true if current search is a power (advanced) search
+        *
+        * @return bool
+        */
+       protected function isPowerSearch() {
+               return $this->profile === 'advanced';
+       }
+
        /**
         * Extract "power search" namespace settings from the request object,
         * returning a list of index numbers to search.
@@ -498,7 +508,7 @@ class SpecialSearch extends SpecialPage {
         */
        protected function powerSearchOptions() {
                $opt = array();
-               if ( $this->profile !== 'advanced' ) {
+               if ( !$this->isPowerSearch() ) {
                        $opt['profile'] = $this->profile;
                } else {
                        foreach ( $this->namespaces as $n ) {
@@ -553,7 +563,6 @@ class SpecialSearch extends SpecialPage {
        protected function showMatches( &$matches ) {
                global $wgContLang;
 
-               $profile = new ProfileSection( __METHOD__ );
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
 
                $out = "<ul class='mw-search-results'>\n";
@@ -579,7 +588,6 @@ class SpecialSearch extends SpecialPage {
         * @return string
         */
        protected function showHit( $result, $terms ) {
-               $profile = new ProfileSection( __METHOD__ );
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -738,7 +746,6 @@ class SpecialSearch extends SpecialPage {
         */
        protected function showInterwiki( $matches, $query ) {
                global $wgContLang;
-               $profile = new ProfileSection( __METHOD__ );
 
                $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
                        $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
@@ -789,7 +796,6 @@ class SpecialSearch extends SpecialPage {
         * @return string
         */
        protected function showInterwikiHit( $result, $lastInterwiki, $query, $customCaptions ) {
-               $profile = new ProfileSection( __METHOD__ );
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -919,7 +925,7 @@ class SpecialSearch extends SpecialPage {
                $user = $this->getUser();
                if ( $user->isLoggedIn() ) {
                        $remember .= Xml::checkLabel(
-                               wfMessage( 'powersearch-remember' )->text(),
+                               $this->msg( 'powersearch-remember' )->text(),
                                'nsRemember',
                                'mw-search-powersearch-remember',
                                false,
@@ -1036,11 +1042,19 @@ class SpecialSearch extends SpecialPage {
                $out .= Xml::element( 'div', array( 'style' => 'clear:both' ), '', false );
                $out .= Xml::closeElement( 'div' );
 
-               // Hidden stuff
+               return $out;
+       }
+
+       /**
+        * @param string $term Search term
+        * @return string
+        */
+       protected function searchOptions( $term ) {
+               $out = '';
                $opts = array();
                $opts['profile'] = $this->profile;
 
-               if ( $this->profile === 'advanced' ) {
+               if ( $this->isPowerSearch() ) {
                        $out .= $this->powerSearchBox( $term, $opts );
                } else {
                        $form = '';
@@ -1062,9 +1076,9 @@ class SpecialSearch extends SpecialPage {
                $out .= Html::hidden( 'profile', $this->profile ) . "\n";
                // Term box
                $out .= Html::input( 'search', $term, 'search', array(
-                       'id' => $this->profile === 'advanced' ? 'powerSearchText' : 'searchText',
+                       'id' => $this->isPowerSearch() ? 'powerSearchText' : 'searchText',
                        'size' => '50',
-                       'autofocus',
+                       'autofocus' => trim( $term ) === '',
                        'class' => 'mw-ui-input mw-ui-input-inline',
                ) ) . "\n";
                $out .= Html::hidden( 'fulltext', 'Search' ) . "\n";
index 2ea1b12..fb2c421 100644 (file)
@@ -550,7 +550,7 @@ class PageArchive {
                                'title' => $article->getTitle(), // used to derive default content model
                        )
                );
-               $user = User::newFromName( $revision->getRawUserText(), false );
+               $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.
@@ -623,7 +623,7 @@ class PageArchive {
                $wasnew = $article->updateIfNewerOn( $dbw, $revision, $previousRevId );
                if ( $created || $wasnew ) {
                        // Update site stats, link tables, etc
-                       $user = User::newFromName( $revision->getRawUserText(), false );
+                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
                        $article->doEditUpdates(
                                $revision,
                                $user,
index ff0ccc1..1b85ff8 100644 (file)
@@ -143,6 +143,13 @@ class SpecialUpload extends SpecialPage {
        /**
         * Special page entry point
         * @param string $par
+        * @throws ErrorPageError
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
+        * @throws PermissionsError
+        * @throws ReadOnlyError
+        * @throws UserBlockedError
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -454,7 +461,7 @@ class SpecialUpload extends SpecialPage {
                // Get the page text if this is not a reupload
                if ( !$this->mForReUpload ) {
                        $pageText = self::getInitialPageText( $this->mComment, $this->mLicense,
-                               $this->mCopyrightStatus, $this->mCopyrightSource );
+                               $this->mCopyrightStatus, $this->mCopyrightSource, $this->getConfig() );
                } else {
                        $pageText = false;
                }
@@ -484,28 +491,32 @@ class SpecialUpload extends SpecialPage {
         * @param string $license
         * @param string $copyStatus
         * @param string $source
+        * @param Config $config Configuration object to load data from
         * @return string
-        * @todo Use Config obj instead of globals
         */
        public static function getInitialPageText( $comment = '', $license = '',
-               $copyStatus = '', $source = ''
+               $copyStatus = '', $source = '', Config $config = null
        ) {
-               global $wgUseCopyrightUpload, $wgForceUIMsgAsContentMsg;
+               if ( $config === null ) {
+                       wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
+                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
 
                $msg = array();
+               $forceUIMsgAsContentMsg = (array)$config->get( 'ForceUIMsgAsContentMsg' );
                /* These messages are transcluded into the actual text of the description page.
                 * Thus, forcing them as content messages makes the upload to produce an int: template
                 * instead of hardcoding it there in the uploader language.
                 */
                foreach ( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
-                       if ( in_array( $msgName, (array)$wgForceUIMsgAsContentMsg ) ) {
+                       if ( in_array( $msgName, $forceUIMsgAsContentMsg ) ) {
                                $msg[$msgName] = "{{int:$msgName}}";
                        } else {
                                $msg[$msgName] = wfMessage( $msgName )->inContentLanguage()->text();
                        }
                }
 
-               if ( $wgUseCopyrightUpload ) {
+               if ( $config->get( 'UseCopyrightUpload' ) ) {
                        $licensetxt = '';
                        if ( $license != '' ) {
                                $licensetxt = '== ' . $msg['license-header'] . " ==\n" . '{{' . $license . '}}' . "\n";
@@ -731,7 +742,7 @@ class SpecialUpload extends SpecialPage {
                }
 
                return '<li>' .
-                       wfMessage( 'file-exists-duplicate' )->numParams( count( $dupes ) )->parse() .
+                       $this->msg( 'file-exists-duplicate' )->numParams( count( $dupes ) )->parse() .
                        $gallery->toHTML() . "</li>\n";
        }
 
@@ -930,35 +941,31 @@ class UploadForm extends HTMLForm {
                $config = $this->getConfig();
 
                if ( $config->get( 'CheckFileExtensions' ) ) {
+                       $fileExtensions = array_unique( $config->get( 'FileExtensions' ) );
                        if ( $config->get( 'StrictFileExtensions' ) ) {
                                # Everything not permitted is banned
                                $extensionsList =
                                        '<div id="mw-upload-permitted">' .
-                                       $this->msg(
-                                               'upload-permitted',
-                                               $this->getContext()->getLanguage()->commaList(
-                                                       array_unique( $config->get( 'FileExtensions' ) )
-                                               )
-                                       )->parseAsBlock() .
+                                       $this->msg( 'upload-permitted' )
+                                               ->params( $this->getLanguage()->commaList( $fileExtensions ) )
+                                               ->numParams( count( $fileExtensions ) )
+                                               ->parseAsBlock() .
                                        "</div>\n";
                        } else {
                                # We have to list both preferred and prohibited
+                               $fileBlacklist = array_unique( $config->get( 'FileBlacklist' ) );
                                $extensionsList =
                                        '<div id="mw-upload-preferred">' .
-                                               $this->msg(
-                                                       'upload-preferred',
-                                                       $this->getContext()->getLanguage()->commaList(
-                                                               array_unique( $config->get( 'FileExtensions' ) )
-                                                       )
-                                               )->parseAsBlock() .
+                                               $this->msg( 'upload-preferred' )
+                                                       ->params( $this->getLanguage()->commaList( $fileExtensions ) )
+                                                       ->numParams( count( $fileExtensions ) )
+                                                       ->parseAsBlock() .
                                        "</div>\n" .
                                        '<div id="mw-upload-prohibited">' .
-                                               $this->msg(
-                                                       'upload-prohibited',
-                                                       $this->getContext()->getLanguage()->commaList(
-                                                               array_unique( $config->get( 'FileBlacklist' ) )
-                                                       )
-                                               )->parseAsBlock() .
+                                               $this->msg( 'upload-prohibited' )
+                                                       ->params( $this->getLanguage()->commaList( $fileBlacklist ) )
+                                                       ->numParams( count( $fileBlacklist ) )
+                                                       ->parseAsBlock() .
                                        "</div>\n";
                        }
                } else {
@@ -981,7 +988,7 @@ class UploadForm extends HTMLForm {
                        $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
                        try {
                                $file = $stash->getFile( $this->mSessionKey );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                $file = null;
                        }
                        if ( $file ) {
@@ -1139,7 +1146,9 @@ class UploadForm extends HTMLForm {
                                // the wpDestFile textbox
                                $this->mDestFile === '',
                        'wgUploadSourceIds' => $this->mSourceIds,
+                       'wgCheckFileExtensions' => $config->get( 'CheckFileExtensions' ),
                        'wgStrictFileExtensions' => $config->get( 'StrictFileExtensions' ),
+                       'wgFileExtensions' => array_values( array_unique( $config->get( 'FileExtensions' ) ) ),
                        'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
                        'wgMaxUploadSize' => $this->mMaxUploadSize,
                        'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
index b7c7868..f2f6b69 100644 (file)
@@ -1272,6 +1272,12 @@ class LoginForm extends SpecialPage {
        /**
         * @param string $msg
         * @param string $msgtype
+        * @throws ErrorPageError
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
+        * @throws PermissionsError
+        * @throws ReadOnlyError
         * @private
         */
        function mainLoginForm( $msg, $msgtype = 'error' ) {
@@ -1335,7 +1341,7 @@ class LoginForm extends SpecialPage {
                                'mediawiki.special.userlogin.signup.styles'
                        ) );
 
-                       $template = new UsercreateTemplate();
+                       $template = new UsercreateTemplate( $this->getConfig() );
 
                        // Must match number of benefits defined in messages
                        $template->set( 'benefitCount', 3 );
@@ -1348,7 +1354,7 @@ class LoginForm extends SpecialPage {
                                'mediawiki.special.userlogin.login.styles'
                        ) );
 
-                       $template = new UserloginTemplate();
+                       $template = new UserloginTemplate( $this->getConfig() );
 
                        $q = 'action=submitlogin&type=login';
                        $linkq = 'type=signup';
index 3e9313c..36a31bd 100644 (file)
@@ -106,7 +106,7 @@ class UserrightsPage extends SpecialPage {
                        }
                }
 
-               if ( User::getCanonicalName( $this->mTarget ) == $user->getName() ) {
+               if ( User::getCanonicalName( $this->mTarget ) === $user->getName() ) {
                        $this->isself = true;
                }
 
@@ -228,7 +228,7 @@ class UserrightsPage extends SpecialPage {
                global $wgAuth;
 
                // Validate input set...
-               $isself = ( $user->getName() == $this->getUser()->getName() );
+               $isself = $user->equals( $this->getUser() );
                $groups = $user->getGroups();
                $changeable = $this->changeableGroups();
                $addable = array_merge( $changeable['add'], $isself ? $changeable['add-self'] : array() );
@@ -493,25 +493,32 @@ class UserrightsPage extends SpecialPage {
                }
 
                $language = $this->getLanguage();
-               $displayedList = $this->msg( 'userrights-groupsmember-type',
-                       $language->listToText( $list ),
-                       $language->listToText( $membersList )
-               )->plain();
-               $displayedAutolist = $this->msg( 'userrights-groupsmember-type',
-                       $language->listToText( $autoList ),
-                       $language->listToText( $autoMembersList )
-               )->plain();
+               $displayedList = $this->msg( 'userrights-groupsmember-type' )
+                       ->rawParams(
+                               $language->listToText( $list ),
+                               $language->listToText( $membersList )
+                       )->escaped();
+               $displayedAutolist = $this->msg( 'userrights-groupsmember-type' )
+                       ->rawParams(
+                               $language->listToText( $autoList ),
+                               $language->listToText( $autoMembersList )
+                       )->escaped();
 
                $grouplist = '';
                $count = count( $list );
                if ( $count > 0 ) {
-                       $grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
+                       $grouplist = $this->msg( 'userrights-groupsmember' )
+                               ->numParams( $count )
+                               ->params( $user->getName() )
+                               ->parse();
                        $grouplist = '<p>' . $grouplist . ' ' . $displayedList . "</p>\n";
                }
 
                $count = count( $autoList );
                if ( $count > 0 ) {
-                       $autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )
+                       $autogrouplistintro = $this->msg( 'userrights-groupsmember-auto' )
+                               ->numParams( $count )
+                               ->params( $user->getName() )
                                ->parse();
                        $grouplist .= '<p>' . $autogrouplistintro . ' ' . $displayedAutolist . "</p>\n";
                }
@@ -669,9 +676,9 @@ class UserrightsPage extends SpecialPage {
 
                                $member = User::getGroupMember( $group, $user->getName() );
                                if ( $checkbox['irreversible'] ) {
-                                       $text = $this->msg( 'userrights-irreversible-marker', $member )->escaped();
+                                       $text = $this->msg( 'userrights-irreversible-marker', $member )->text();
                                } else {
-                                       $text = htmlspecialchars( $member );
+                                       $text = $member;
                                }
                                $checkboxHtml = Xml::checkLabel( $text, "wpGroup-" . $group,
                                        "wpGroup-" . $group, $checkbox['set'], $attr );
index ee9e2ad..2aa629e 100644 (file)
@@ -132,6 +132,7 @@ class SpecialVersion extends SpecialPage {
                                $out->addHtml(
                                        $this->getSkinCredits() .
                                        $this->getExtensionCredits() .
+                                       $this->getExternalLibraries() .
                                        $this->getParserTags() .
                                        $this->getParserFunctionHooks()
                                );
@@ -251,7 +252,6 @@ class SpecialVersion extends SpecialPage {
         */
        public static function getVersion( $flags = '' ) {
                global $wgVersion, $IP;
-               wfProfileIn( __METHOD__ );
 
                $gitInfo = self::getGitHeadSha1( $IP );
                $svnInfo = self::getSvnInfo( $IP );
@@ -275,8 +275,6 @@ class SpecialVersion extends SpecialPage {
                                )->text();
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $version;
        }
 
@@ -290,7 +288,6 @@ class SpecialVersion extends SpecialPage {
         */
        public static function getVersionLinked() {
                global $wgVersion;
-               wfProfileIn( __METHOD__ );
 
                $gitVersion = self::getVersionLinkedGit();
                if ( $gitVersion ) {
@@ -304,8 +301,6 @@ class SpecialVersion extends SpecialPage {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $v;
        }
 
@@ -503,6 +498,50 @@ class SpecialVersion extends SpecialPage {
                return $out;
        }
 
+       /**
+        * Generate an HTML table for external libraries that are installed
+        *
+        * @return string
+        */
+       protected function getExternalLibraries() {
+               global $IP;
+               $path = "$IP/composer.lock";
+               if ( !file_exists( $path ) ) {
+                       // Maybe they're using mediawiki/vendor?
+                       $path = "$IP/vendor/composer.lock";
+                       if ( !file_exists( $path ) ) {
+                               return '';
+                       }
+               }
+
+               $lock = new ComposerLock( $path );
+               $out = Html::element(
+                       'h2',
+                       array( 'id' => 'mw-version-libraries' ),
+                       $this->msg( 'version-libraries' )->text()
+               );
+               $out .= Html::openElement( 'table', array( 'class' => 'wikitable plainlinks', 'id' => 'sv-libraries' ) );
+               $out .= Html::openElement( 'tr' )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-library' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-version' )->text() )
+                       . Html::closeElement( 'tr' );
+
+               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+                       if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
+                               // Skip any extensions or skins since they'll be listed
+                               // in their proper section
+                               continue;
+                       }
+                       $out .= Html::openElement( 'tr' )
+                               . Html::rawElement( 'td', array(), Linker::makeExternalLink( "https://packagist.org/packages/$name", $name ) )
+                               . Html::element( 'td', array(), $info['version'] )
+                               . Html::closeElement( 'tr' );
+               }
+               $out .= Html::closeElement( 'table' );
+
+               return $out;
+       }
+
        /**
         * Obtains a list of installed parser tags and the associated H2 header
         *
@@ -689,7 +728,7 @@ class SpecialVersion extends SpecialPage {
                        list( $vcsVersion, $vcsLink, $vcsDate ) = $cache->get( $memcKey );
 
                        if ( !$vcsVersion ) {
-                               wfDebug( "Getting VCS info for extension $extensionName" );
+                               wfDebug( "Getting VCS info for extension {$extension['name']}" );
                                $gitInfo = new GitInfo( $extensionPath );
                                $vcsVersion = $gitInfo->getHeadSHA1();
                                if ( $vcsVersion !== false ) {
@@ -705,7 +744,7 @@ class SpecialVersion extends SpecialPage {
                                }
                                $cache->set( $memcKey, array( $vcsVersion, $vcsLink, $vcsDate ), 60 * 60 * 24 );
                        } else {
-                               wfDebug( "Pulled VCS info for extension $extensionName from cache" );
+                               wfDebug( "Pulled VCS info for extension {$extension['name']} from cache" );
                        }
                }
 
@@ -748,24 +787,23 @@ class SpecialVersion extends SpecialPage {
                // ... and license information; if a license file exists we
                // will link to it
                $licenseLink = '';
-               if ( isset( $extension['license-name'] ) ) {
-                       $licenseLink = Linker::link(
-                               $this->getPageTitle( 'License/' . $extensionName ),
-                               $out->parseInline( $extension['license-name'] ),
-                               array(
-                                       'class' => 'mw-version-ext-license',
-                                       'dir' => 'auto',
-                               )
-                       );
-               } elseif ( $this->getExtLicenseFileName( $extensionPath ) ) {
-                       $licenseLink = Linker::link(
-                               $this->getPageTitle( 'License/' . $extensionName ),
-                               $this->msg( 'version-ext-license' ),
-                               array(
-                                       'class' => 'mw-version-ext-license',
-                                       'dir' => 'auto',
-                               )
-                       );
+               if ( isset( $extension['name'] ) ) {
+                       $licenseName = null;
+                       if ( isset( $extension['license-name'] ) ) {
+                               $licenseName = $out->parseInline( $extension['license-name'] );
+                       } elseif ( $this->getExtLicenseFileName( $extensionPath ) ) {
+                               $licenseName = $this->msg( 'version-ext-license' );
+                       }
+                       if ( $licenseName !== null ) {
+                               $licenseLink = Linker::link(
+                                       $this->getPageTitle( 'License/' . $extension['name'] ),
+                                       $licenseName,
+                                       array(
+                                               'class' => 'mw-version-ext-license',
+                                               'dir' => 'auto',
+                                       )
+                               );
+                       }
                }
 
                // ... and generate the description; which can be a parameterized l10n message
@@ -793,12 +831,12 @@ class SpecialVersion extends SpecialPage {
 
                // ... now get the authors for this extension
                $authors = isset( $extension['author'] ) ? $extension['author'] : array();
-               $authors = $this->listAuthors( $authors, $extensionName, $extensionPath );
+               $authors = $this->listAuthors( $authors, $extension['name'], $extensionPath );
 
                // Finally! Create the table
                $html = Html::openElement( 'tr', array(
                                'class' => 'mw-version-ext',
-                               'id' => "mw-version-ext-{$extensionName}"
+                               'id' => "mw-version-ext-{$extension['name']}"
                        )
                );
 
@@ -1039,7 +1077,7 @@ class SpecialVersion extends SpecialPage {
         * Convert an array or object to a string for display.
         *
         * @param mixed $list Will convert an array to string if given and return
-        *   the paramater unaltered otherwise
+        *   the parameter unaltered otherwise
         *
         * @return mixed
         */
index b8c0bb2..7ddafae 100644 (file)
@@ -109,6 +109,7 @@ class WantedCategoriesPage extends WantedQueryPage {
                        $currentValue = isset( $this->currentCategoryCounts[$result->title] )
                                ? $this->currentCategoryCounts[$result->title]
                                : 0;
+                       $cachedValue = intval( $result->value ); // T76910
 
                        // If the category has been created or emptied since the list was refreshed, strike it
                        if ( $nt->isKnown() || $currentValue === 0 ) {
@@ -116,11 +117,11 @@ class WantedCategoriesPage extends WantedQueryPage {
                        }
 
                        // Show the current number of category entries if it changed
-                       if ( $currentValue !== $result->value ) {
+                       if ( $currentValue !== $cachedValue ) {
                                $nlinks = $this->msg( 'nmemberschanged' )
-                                       ->numParams( $result->value, $currentValue )->escaped();
+                                       ->numParams( $cachedValue, $currentValue )->escaped();
                        } else {
-                               $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
+                               $nlinks = $this->msg( 'nmembers' )->numParams( $cachedValue )->escaped();
                        }
                }
 
index 11ec363..bbc111f 100644 (file)
@@ -58,6 +58,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $opts->add( 'hidetrans', false );
                $opts->add( 'hidelinks', false );
                $opts->add( 'hideimages', false );
+               $opts->add( 'invert', false );
 
                $opts->fetchValuesFromRequest( $this->getRequest() );
                $opts->validateIntBounds( 'limit', 0, 5000 );
@@ -125,15 +126,17 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $useLinkNamespaceDBFields = $this->getConfig()->get( 'UseLinkNamespaceDBFields' );
                $namespace = $this->opts->getValue( 'namespace' );
+               $invert = $this->opts->getValue( 'invert' );
+               $nsComparison = ( $invert ? '!= ' : '= ' ) . $dbr->addQuotes( $namespace );
                if ( is_int( $namespace ) ) {
                        if ( $useLinkNamespaceDBFields ) {
-                               $conds['pagelinks']['pl_from_namespace'] = $namespace;
-                               $conds['templatelinks']['tl_from_namespace'] = $namespace;
-                               $conds['imagelinks']['il_from_namespace'] = $namespace;
+                               $conds['pagelinks'][] = "pl_from_namespace $nsComparison";
+                               $conds['templatelinks'][] = "tl_from_namespace $nsComparison";
+                               $conds['imagelinks'][] = "il_from_namespace $nsComparison";
                        } else {
-                               $conds['pagelinks']['page_namespace'] = $namespace;
-                               $conds['templatelinks']['page_namespace'] = $namespace;
-                               $conds['imagelinks']['page_namespace'] = $namespace;
+                               $conds['pagelinks'][] = "page_namespace $nsComparison";
+                               $conds['templatelinks'][] = "page_namespace $nsComparison";
+                               $conds['imagelinks'][] = "page_namespace $nsComparison";
                        }
                }
 
@@ -419,6 +422,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $target = $this->target ? $this->target->getPrefixedText() : '';
                $namespace = $this->opts->consumeValue( 'namespace' );
+               $nsinvert = $this->opts->consumeValue( 'invert' );
 
                # Build up the form
                $f = Xml::openElement( 'form', array( 'action' => wfScript() ) );
@@ -450,6 +454,15 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        )
                );
 
+               $f .= '&#160;' .
+                       Xml::checkLabel(
+                               $this->msg( 'invert' )->text(),
+                               'invert',
+                               'nsinvert',
+                               $nsinvert,
+                               array( 'title' => $this->msg( 'tooltip-whatlinkshere-invert' )->text() )
+                       );
+
                $f .= ' ';
 
                # Submit
@@ -496,6 +509,24 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                );
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               if ( $search === '' ) {
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
+
        protected function getGroupName() {
                return 'pagetools';
        }
index 4eea01c..b185cb3 100644 (file)
@@ -53,7 +53,7 @@ class UsercreateTemplate extends BaseTemplate {
        <div id="userloginForm">
                <form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
                        <section class="mw-form-header">
-                               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+                               <?php $this->html( 'header' ); ?>
                        </section>
                        <!-- This element is used by the mediawiki.special.userlogin.signup.js module. -->
                        <div
@@ -248,8 +248,11 @@ class UsercreateTemplate extends BaseTemplate {
                                }
                        }
 
-                       // JS attempts to move the image CAPTCHA below this part of the form,
-                       // so skip one index.
+                       // A separate placeholder for any inserting any extrafields, e.g used by ConfirmEdit extension
+                       if ( $this->haveData( 'extrafields' ) ) {
+                               echo $this->data['extrafields'];
+                       }
+                       // skip one index.
                        $tabIndex++;
                        ?>
                        <div class="mw-ui-vform-field mw-submit">
@@ -262,7 +265,6 @@ class UsercreateTemplate extends BaseTemplate {
                                                'tabindex' => $tabIndex++
                                        ),
                                        array(
-                                               'mw-ui-big',
                                                'mw-ui-block',
                                                'mw-ui-constructive',
                                        )
index adf8947..345bb71 100644 (file)
@@ -70,12 +70,10 @@ class UserloginTemplate extends BaseTemplate {
                                        ?>
                                </label>
                                <?php
-                               $extraAttrs = array();
                                echo Html::input( 'wpName', $this->data['name'], 'text', array(
                                        'class' => 'loginText mw-ui-input',
                                        'id' => 'wpName1',
                                        'tabindex' => '1',
-                                       'size' => '20',
                                        // 'required' is blacklisted for now in Html.php due to browser issues.
                                        // Keeping here in case that changes.
                                        'required' => true,
@@ -90,14 +88,6 @@ class UserloginTemplate extends BaseTemplate {
                                <label for='wpPassword1'>
                                        <?php
                                        $this->msg( 'userlogin-yourpassword' );
-
-                                       if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
-                                               echo ' ' . Linker::link(
-                                                       SpecialPage::getTitleFor( 'PasswordReset' ),
-                                                       $this->getMsg( 'userlogin-resetpassword-link' )->parse(),
-                                                       array( 'class' => 'mw-ui-flush-right' )
-                                               );
-                                       }
                                        ?>
                                </label>
                                <?php
@@ -105,7 +95,6 @@ class UserloginTemplate extends BaseTemplate {
                                        'class' => 'loginPassword mw-ui-input',
                                        'id' => 'wpPassword1',
                                        'tabindex' => '2',
-                                       'size' => '20',
                                        // Set focus to this field if username is filled in.
                                        'autofocus' => (bool)$this->data['name'],
                                        'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
@@ -154,13 +143,13 @@ class UserloginTemplate extends BaseTemplate {
                                        'tabindex' => '6',
                                );
                                $modifiers = array(
-                                       'mw-ui-big', 'mw-ui-block', 'mw-ui-constructive',
+                                       'mw-ui-constructive',
                                );
                                echo Html::submitButton( $this->getMsg( 'pt-login-button' )->text(), $attrs, $modifiers );
                                ?>
                        </div>
 
-                       <div class="mw-ui-vform-field" id="mw-userlogin-help">
+                       <div class="mw-ui-vform-field mw-form-related-link-container" id="mw-userlogin-help">
                                <?php
                                echo Html::element(
                                        'a',
@@ -173,22 +162,51 @@ class UserloginTemplate extends BaseTemplate {
                                );
                                ?>
                        </div>
+                       <?php
+
+                       if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
+                               echo Html::rawElement(
+                                       'div',
+                                       array(
+                                               'class' => 'mw-ui-vform-field mw-form-related-link-container',
+                                       ),
+                                       Linker::link(
+                                               SpecialPage::getTitleFor( 'PasswordReset' ),
+                                               $this->getMsg( 'userlogin-resetpassword-link' )->escaped()
+                                       )
+                               );
+                       }
 
-                       <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
-                               <?php if ( $this->data['loggedin'] ) { ?>
-                                       <div id="mw-createaccount-another">
-                                               <a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button"><?php $this->msg( 'userlogin-createanother' ); ?></a>
+                       if ( $this->haveData( 'createOrLoginHref' ) ) {
+                               if ( $this->data['loggedin'] ) { ?>
+                                       <div class="mw-form-related-link-container mw-ui-vform-field">
+                                               <a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"><?php $this->msg( 'userlogin-createanother' ); ?></a>
                                        </div>
                                <?php } else { ?>
-                                       <div id="mw-createaccount-cta">
-                                               <?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-progressive"><?php $this->msg( 'userlogin-joinproject' ); ?></a>
+                                       <div id="mw-createaccount-cta" class="mw-form-related-link-container mw-ui-vform-field">
+                                               <?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7" class="mw-ui-button mw-ui-progressive"><?php $this->msg( 'userlogin-joinproject' ); ?></a>
                                        </div>
-                               <?php } ?>
-                       <?php } ?>
-                       <?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-                       <?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-                       <?php if ( $this->data['cansecurelogin'] ) {?><input type="hidden" name="wpForceHttps" value="<?php $this->text( 'stickhttps' ); ?>" /><?php } ?>
-                       <?php if ( $this->data['cansecurelogin'] && $this->haveData( 'fromhttp' )) {?><input type="hidden" name="wpFromhttp" value="<?php $this->text( 'fromhttp' ); ?>" /><?php } ?>
+                               <?php
+                               }
+                       }
+
+                       // Hidden fields
+                       $fields = '';
+                       if ( $this->haveData( 'uselang' ) ) {
+                               $fields .= Html::hidden( 'uselang', $this->data['uselang'] );
+                       }
+                       if ( $this->haveData( 'token' ) ) {
+                               $fields .= Html::hidden( 'wpLoginToken', $this->data['token'] );
+                       }
+                       if ( $this->data['cansecurelogin'] ) {
+                               $fields .= Html::hidden( 'wpForceHttps', $this->data['stickhttps'] );
+                       }
+                       if ( $this->data['cansecurelogin'] && $this->haveData( 'fromhttp' ) ) {
+                               $fields .= Html::hidden( 'wpFromhttp', $this->data['fromhttp'] );
+                       }
+                       echo $fields;
+
+                       ?>
                </form>
        </div>
 </div>
diff --git a/includes/title/ForeignTitle.php b/includes/title/ForeignTitle.php
new file mode 100644 (file)
index 0000000..ed96d17
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * A structure to hold the title of a page on a foreign MediaWiki installation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author This, that and the other
+ */
+
+/**
+ * A simple, immutable structure to hold the title of a page on a foreign
+ * MediaWiki installation.
+ */
+class ForeignTitle {
+       /**
+        * @var int|null
+        * Null if we don't know the namespace ID (e.g. interwiki links)
+        */
+       protected $namespaceId;
+       /** @var string */
+       protected $namespaceName;
+       /** @var string */
+       protected $pageName;
+
+       /**
+        * Creates a new ForeignTitle object.
+        *
+        * @param int|null $namespaceId Null if the namespace ID is unknown (e.g.
+        * interwiki links)
+        * @param string $namespaceName
+        * @param string $pageName
+        */
+       public function __construct( $namespaceId, $namespaceName, $pageName ) {
+               if ( is_null( $namespaceId ) ) {
+                       $this->namespaceId = null;
+               } else {
+                       $this->namespaceId = intval( $namespaceId );
+               }
+               $this->namespaceName = str_replace( ' ', '_', $namespaceName );
+               $this->pageName = str_replace( ' ', '_', $pageName );
+       }
+
+       /**
+        * Do we know the namespace ID of the page on the foreign wiki?
+        * @return bool
+        */
+       public function isNamespaceIdKnown() {
+               return !is_null( $this->namespaceId );
+       }
+
+       /**
+        * @return int
+        * @throws MWException If isNamespaceIdKnown() is false, it does not make
+        * sense to call this function.
+        */
+       public function getNamespaceId() {
+               if ( is_null( $this->namespaceId ) ) {
+                       throw new MWException(
+                               "Attempted to call getNamespaceId when the namespace ID is not known" );
+               }
+               return $this->namespaceId;
+       }
+
+       /** @return string */
+       public function getNamespaceName() {
+               return $this->namespaceName;
+       }
+
+       /** @return string */
+       public function getText() {
+               return $this->pageName;
+       }
+
+       /** @return string */
+       public function getFullText() {
+               $result = '';
+               if ( $this->namespaceName ) {
+                       $result .= $this->namespaceName . ':';
+               }
+               $result .= $this->pageName;
+               return $result;
+       }
+
+       /**
+        * Returns a string representation of the title, for logging. This is purely
+        * informative and must not be used programmatically. Use the appropriate
+        * ImportTitleFactory to generate the correct string representation for a
+        * given use.
+        *
+        * @return string
+        */
+       public function __toString() {
+               $name = '';
+               if ( $this->isNamespaceIdKnown() ) {
+                       $name .= '{ns' . $this->namespaceId . '}';
+               } else {
+                       $name .= '{ns??}';
+               }
+               $name .= $this->namespaceName . ':' . $this->pageName;
+
+               return $name;
+       }
+}
diff --git a/includes/title/ForeignTitleFactory.php b/includes/title/ForeignTitleFactory.php
new file mode 100644 (file)
index 0000000..427afdf
--- /dev/null
@@ -0,0 +1,36 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * A parser that translates page titles into ForeignTitle objects.
+ */
+interface ForeignTitleFactory {
+       /**
+        * Creates a ForeignTitle object based on the page title, and optionally the
+        * namespace ID, of a page on a foreign wiki. These values could be, for
+        * example, the <title> and <ns> attributes found in an XML dump.
+        *
+        * @param string $title The page title
+        * @param int|null $ns The namespace ID, or null if this data is not available
+        * @return ForeignTitle
+        */
+       public function createForeignTitle( $title, $ns = null );
+}
diff --git a/includes/title/ImportTitleFactory.php b/includes/title/ImportTitleFactory.php
new file mode 100644 (file)
index 0000000..629616d
--- /dev/null
@@ -0,0 +1,36 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * Represents an object that can convert page titles on a foreign wiki
+ * (ForeignTitle objects) into page titles on the local wiki (Title objects).
+ */
+interface ImportTitleFactory {
+       /**
+        * Determines which local title best corresponds to the given foreign title.
+        * If such a title can't be found or would be locally invalid, null is
+        * returned.
+        *
+        * @param ForeignTitle $foreignTitle The ForeignTitle to convert
+        * @return Title|null
+        */
+       public function createTitleFromForeignTitle( ForeignTitle $foreignTitle );
+}
index a8a5d75..a9e58b3 100644 (file)
@@ -27,6 +27,7 @@
  *
  * @license GPL 2+
  * @author Daniel Kinzler
+ * @since 1.23
  */
 class MalformedTitleException extends Exception {
 }
index f46cb5e..9ee4841 100644 (file)
@@ -26,6 +26,7 @@
  * A service for generating links from page titles.
  *
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
+ * @since 1.23
  */
 class MediaWikiPageLinkRenderer implements PageLinkRenderer {
        /**
index 6ca0799..c05a87d 100644 (file)
@@ -31,6 +31,7 @@
  * via parseTitle() or from a (semi)trusted source, such as the database.
  *
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
+ * @since 1.23
  */
 class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
        /**
@@ -322,7 +323,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                }
 
                # Reject illegal characters.
-               $rxTc = Title::getTitleInvalidRegex();
+               $rxTc = self::getTitleInvalidRegex();
                if ( preg_match( $rxTc, $dbkey ) ) {
                        throw new MalformedTitleException( 'Illegal characters found in title: ' . $text );
                }
@@ -397,4 +398,33 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
 
                return $parts;
        }
+
+       /**
+        * Returns a simple regex that will match on characters and sequences invalid in titles.
+        * Note that this doesn't pick up many things that could be wrong with titles, but that
+        * replacing this regex with something valid will make many titles valid.
+        * Previously Title::getTitleInvalidRegex()
+        *
+        * @return string Regex string
+        * @since 1.25
+        */
+       public static function getTitleInvalidRegex() {
+               static $rxTc = false;
+               if ( !$rxTc ) {
+                       # Matching titles will be held as illegal.
+                       $rxTc = '/' .
+                               # Any character not allowed is forbidden...
+                               '[^' . Title::legalChars() . ']' .
+                               # URL percent encoding sequences interfere with the ability
+                               # to round-trip titles -- you can't link to them consistently.
+                               '|%[0-9A-Fa-f]{2}' .
+                               # XML/HTML character references produce similar issues.
+                               '|&[A-Za-z0-9\x80-\xff]+;' .
+                               '|&#[0-9]+;' .
+                               '|&#x[0-9A-Fa-f]+;' .
+                               '/S';
+               }
+
+               return $rxTc;
+       }
 }
diff --git a/includes/title/NaiveForeignTitleFactory.php b/includes/title/NaiveForeignTitleFactory.php
new file mode 100644 (file)
index 0000000..6c8bcc0
--- /dev/null
@@ -0,0 +1,71 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * A parser that translates page titles on a foreign wiki into ForeignTitle
+ * objects, with no knowledge of the namespace setup on the foreign site.
+ */
+class NaiveForeignTitleFactory implements ForeignTitleFactory {
+       /**
+        * Creates a ForeignTitle object based on the page title, and optionally the
+        * namespace ID, of a page on a foreign wiki. These values could be, for
+        * example, the <title> and <ns> attributes found in an XML dump.
+        *
+        * Although exported XML dumps have contained a map of namespace IDs to names
+        * since MW 1.5, the importer used to completely ignore the <siteinfo> tag
+        * before MW 1.25.  It is therefore possible that custom XML dumps (i.e. not
+        * generated by Special:Export) have been created without this metadata.
+        * As a result, this code falls back to using namespace data for the local
+        * wiki (similar to buggy pre-1.25 behaviour) if $ns is not supplied.
+        *
+        * @param string $title The page title
+        * @param int|null $ns The namespace ID, or null if this data is not available
+        * @return ForeignTitle
+        */
+       public function createForeignTitle( $title, $ns = null ) {
+               $pieces = explode( ':', $title, 2 );
+
+               global $wgContLang;
+
+               // Can we assume that the part of the page title before the colon is a
+               // namespace name?
+               //
+               // XML export schema version 0.5 and earlier (MW 1.18 and earlier) does not
+               // contain a <ns> tag, so we need to be able to handle that case.
+               //
+               // If we know the namespace ID, we assume a non-zero namespace ID means
+               // the ':' sets off a valid namespace name. If we don't know the namespace
+               // ID, we fall back to using the local wiki's namespace names to resolve
+               // this -- better than nothing, and mimics the old crappy behavior
+               $isNamespacePartValid = is_null( $ns ) ?
+                       ( $wgContLang->getNsIndex( $pieces[0] ) !== false ) :
+                       $ns != 0;
+
+               if ( count( $pieces ) === 2 && $isNamespacePartValid ) {
+                       list( $namespaceName, $pageName ) = $pieces;
+               } else {
+                       $namespaceName = '';
+                       $pageName = $title;
+               }
+
+               return new ForeignTitle( $ns, $namespaceName, $pageName );
+       }
+}
diff --git a/includes/title/NaiveImportTitleFactory.php b/includes/title/NaiveImportTitleFactory.php
new file mode 100644 (file)
index 0000000..43c662e
--- /dev/null
@@ -0,0 +1,65 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * A class to convert page titles on a foreign wiki (ForeignTitle objects) into
+ * page titles on the local wiki (Title objects), using a default namespace
+ * mapping.
+ *
+ * For built-in namespaces (0 <= ID < 100), we try to find a local namespace
+ * with the same namespace ID as the foreign page. If no such namespace exists,
+ * or the namespace ID is unknown or > 100, we look for a local namespace with
+ * a matching namespace name. If that can't be found, we dump the page in the
+ * main namespace as a last resort.
+ */
+class NaiveImportTitleFactory implements ImportTitleFactory {
+       /**
+        * Determines which local title best corresponds to the given foreign title.
+        * If such a title can't be found or would be locally invalid, null is
+        * returned.
+        *
+        * @param ForeignTitle $foreignTitle The ForeignTitle to convert
+        * @return Title|null
+        */
+       public function createTitleFromForeignTitle( ForeignTitle $foreignTitle ) {
+               global $wgContLang;
+
+               if ( $foreignTitle->isNamespaceIdKnown() ) {
+                       $foreignNs = $foreignTitle->getNamespaceId();
+
+                       // For built-in namespaces (0 <= ID < 100), we try to find a local NS with
+                       // the same namespace ID
+                       if ( $foreignNs < 100 && MWNamespace::exists( $foreignNs ) ) {
+                               return Title::makeTitleSafe( $foreignNs, $foreignTitle->getText() );
+                       }
+               }
+
+               // Do we have a local namespace by the same name as the foreign
+               // namespace?
+               $targetNs = $wgContLang->getNsIndex( $foreignTitle->getNamespaceName() );
+               if ( $targetNs !== false ) {
+                       return Title::makeTitleSafe( $targetNs, $foreignTitle->getText() );
+               }
+
+               // Otherwise, just fall back to main namespace
+               return Title::makeTitleSafe( 0, $foreignTitle->getFullText() );
+       }
+}
diff --git a/includes/title/NamespaceAwareForeignTitleFactory.php b/includes/title/NamespaceAwareForeignTitleFactory.php
new file mode 100644 (file)
index 0000000..bf97e2c
--- /dev/null
@@ -0,0 +1,134 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * A parser that translates page titles on a foreign wiki into ForeignTitle
+ * objects, using information about the namespace setup on the foreign site.
+ */
+class NamespaceAwareForeignTitleFactory implements ForeignTitleFactory {
+       /**
+        * @var array
+        */
+       protected $foreignNamespaces;
+       /**
+        * @var array
+        */
+       private $foreignNamespacesFlipped;
+
+       /**
+        * Normalizes an array name for $foreignNamespacesFlipped.
+        * @param string $name
+        * @return string
+        */
+       private function normalizeNamespaceName( $name ) {
+               return strtolower( str_replace( ' ', '_', $name ) );
+       }
+
+       /**
+        * @param array|null $foreignNamespaces An array 'id' => 'name' which contains
+        * the complete namespace setup of the foreign wiki. Such data could be
+        * obtained from siteinfo/namespaces in an XML dump file, or by an action API
+        * query such as api.php?action=query&meta=siteinfo&siprop=namespaces. If
+        * this data is unavailable, use NaiveForeignTitleFactory instead.
+        */
+       public function __construct( $foreignNamespaces ) {
+               $this->foreignNamespaces = $foreignNamespaces;
+               if ( !is_null( $foreignNamespaces ) ) {
+                       $this->foreignNamespacesFlipped = array();
+                       foreach ( $foreignNamespaces as $id => $name ) {
+                               $newKey = self::normalizeNamespaceName( $name );
+                               $this->foreignNamespacesFlipped[$newKey] = $id;
+                       }
+               }
+       }
+
+       /**
+        * Creates a ForeignTitle object based on the page title, and optionally the
+        * namespace ID, of a page on a foreign wiki. These values could be, for
+        * example, the <title> and <ns> attributes found in an XML dump.
+        *
+        * @param string $title The page title
+        * @param int|null $ns The namespace ID, or null if this data is not available
+        * @return ForeignTitle
+        */
+       public function createForeignTitle( $title, $ns = null ) {
+               // Export schema version 0.5 and earlier (MW 1.18 and earlier) does not
+               // contain a <ns> tag, so we need to be able to handle that case.
+               if ( is_null( $ns ) ) {
+                       return self::parseTitleNoNs( $title );
+               } else {
+                       return self::parseTitleWithNs( $title, $ns );
+               }
+       }
+
+       /**
+        * Helper function to parse the title when the namespace ID is not specified.
+        *
+        * @param string $title
+        * @return ForeignTitle
+        */
+       protected function parseTitleNoNs( $title ) {
+               $pieces = explode( ':', $title, 2 );
+               $key = self::normalizeNamespaceName( $pieces[0] );
+
+               // Does the part before the colon match a known namespace? Check the
+               // foreign namespaces
+               $isNamespacePartValid = isset( $this->foreignNamespacesFlipped[$key] );
+
+               if ( count( $pieces ) === 2 && $isNamespacePartValid ) {
+                       list( $namespaceName, $pageName ) = $pieces;
+                       $ns = $this->foreignNamespacesFlipped[$key];
+               } else {
+                       $namespaceName = '';
+                       $pageName = $title;
+                       $ns = 0;
+               }
+
+               return new ForeignTitle( $ns, $namespaceName, $pageName );
+       }
+
+       /**
+        * Helper function to parse the title when the namespace value is known.
+        *
+        * @param string $title
+        * @param int $ns
+        * @return ForeignTitle
+        */
+       protected function parseTitleWithNs( $title, $ns ) {
+               $pieces = explode( ':', $title, 2 );
+
+               if ( isset( $this->foreignNamespaces[$ns] ) ) {
+                       $namespaceName = $this->foreignNamespaces[$ns];
+               } else {
+                       $namespaceName = $ns == '0' ? '' : $pieces[0];
+               }
+
+               // We assume that the portion of the page title before the colon is the
+               // namespace name, except in the case of namespace 0
+               if ( $ns != '0' ) {
+                       $pageName = $pieces[1];
+               } else {
+                       $pageName = $title;
+               }
+
+               return new ForeignTitle( $ns, $namespaceName, $pageName );
+       }
+}
diff --git a/includes/title/NamespaceImportTitleFactory.php b/includes/title/NamespaceImportTitleFactory.php
new file mode 100644 (file)
index 0000000..0c1d0c4
--- /dev/null
@@ -0,0 +1,52 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * A class to convert page titles on a foreign wiki (ForeignTitle objects) into
+ * page titles on the local wiki (Title objects), placing all pages in a fixed
+ * local namespace.
+ */
+class NamespaceImportTitleFactory implements ImportTitleFactory {
+       /** @var int */
+       protected $ns;
+
+       /**
+        * @param int $ns The namespace to use for all pages
+        */
+       public function __construct( $ns ) {
+               if ( !MWNamespace::exists( $ns ) ) {
+                       throw new MWException( "Namespace $ns doesn't exist on this wiki" );
+               }
+               $this->ns = $ns;
+       }
+
+       /**
+        * Determines which local title best corresponds to the given foreign title.
+        * If such a title can't be found or would be locally invalid, null is
+        * returned.
+        *
+        * @param ForeignTitle $foreignTitle The ForeignTitle to convert
+        * @return Title|null
+        */
+       public function createTitleFromForeignTitle( ForeignTitle $foreignTitle ) {
+               return Title::makeTitleSafe( $this->ns, $foreignTitle->getText() );
+       }
+}
index fb1096e..ca91f58 100644 (file)
@@ -29,6 +29,7 @@
  * URLs, and how links are encoded in a given output format.
  *
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
+ * @since 1.23
  */
 interface PageLinkRenderer {
        /**
diff --git a/includes/title/SubpageImportTitleFactory.php b/includes/title/SubpageImportTitleFactory.php
new file mode 100644 (file)
index 0000000..b0be7af
--- /dev/null
@@ -0,0 +1,55 @@
+<?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
+ * @license GPL 2+
+ */
+
+/**
+ * A class to convert page titles on a foreign wiki (ForeignTitle objects) into
+ * page titles on the local wiki (Title objects), placing all pages as subpages
+ * of a given root page.
+ */
+class SubpageImportTitleFactory implements ImportTitleFactory {
+       /** @var Title */
+       protected $rootPage;
+
+       /**
+        * @param Title $rootPage The root page under which all pages should be
+        * created
+        */
+       public function __construct( Title $rootPage ) {
+               if ( !MWNamespace::hasSubpages( $rootPage->getNamespace() ) ) {
+                       throw new MWException( "The root page you specified, $rootPage, is in a " .
+                               "namespace where subpages are not allowed" );
+               }
+               $this->rootPage = $rootPage;
+       }
+
+       /**
+        * Determines which local title best corresponds to the given foreign title.
+        * If such a title can't be found or would be locally invalid, null is
+        * returned.
+        *
+        * @param ForeignTitle $foreignTitle The ForeignTitle to convert
+        * @return Title|null
+        */
+       public function createTitleFromForeignTitle( ForeignTitle $foreignTitle ) {
+               return Title::newFromText( $this->rootPage->getPrefixedDBkey() . '/' .
+                       $foreignTitle->getFullText() );
+       }
+}
index 7c71ef5..aad8376 100644 (file)
@@ -29,6 +29,7 @@
  * forms to be used in the database, in urls, in wikitext, etc.
  *
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
+ * @since 1.23
  */
 interface TitleFormatter {
        /**
index 0635ee8..381b1d0 100644 (file)
@@ -29,6 +29,7 @@
  * forms to be used in the database, in urls, in wikitext, etc.
  *
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
+ * @since 1.23
  */
 interface TitleParser {
        /**
index 402247c..5cac347 100644 (file)
@@ -32,6 +32,7 @@
  * It does not represent a link, and does not support interwiki prefixes etc.
  *
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
+ * @since 1.23
  */
 class TitleValue {
        /**
index 4c96dc8..a8a38c7 100644 (file)
@@ -261,7 +261,6 @@ abstract class UploadBase {
         * @return string|bool The real path if it was a virtual URL Returns false on failure
         */
        function getRealPath( $srcPath ) {
-               wfProfileIn( __METHOD__ );
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        /** @todo Just make uploads work with storage paths UploadFromStash
@@ -275,7 +274,6 @@ abstract class UploadBase {
                } else {
                        $path = $srcPath;
                }
-               wfProfileOut( __METHOD__ );
 
                return $path;
        }
@@ -285,13 +283,11 @@ abstract class UploadBase {
         * @return mixed Const self::OK or else an array with error information
         */
        public function verifyUpload() {
-               wfProfileIn( __METHOD__ );
 
                /**
                 * If there was no filename or a zero size given, give up quick.
                 */
                if ( $this->isEmptyFile() ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array( 'status' => self::EMPTY_FILE );
                }
@@ -301,7 +297,6 @@ abstract class UploadBase {
                 */
                $maxSize = self::getMaxUploadSize( $this->getSourceType() );
                if ( $this->mFileSize > $maxSize ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array(
                                'status' => self::FILE_TOO_LARGE,
@@ -316,7 +311,6 @@ abstract class UploadBase {
                 */
                $verification = $this->verifyFile();
                if ( $verification !== true ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array(
                                'status' => self::VERIFICATION_ERROR,
@@ -329,7 +323,6 @@ abstract class UploadBase {
                 */
                $result = $this->validateName();
                if ( $result !== true ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $result;
                }
@@ -338,13 +331,10 @@ abstract class UploadBase {
                if ( !Hooks::run( 'UploadVerification',
                        array( $this->mDestName, $this->mTempPath, &$error ) )
                ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return array( 'status' => self::OK );
        }
 
@@ -386,12 +376,10 @@ abstract class UploadBase {
         */
        protected function verifyMimeType( $mime ) {
                global $wgVerifyMimeType;
-               wfProfileIn( __METHOD__ );
                if ( $wgVerifyMimeType ) {
                        wfDebug( "mime: <$mime> extension: <{$this->mFinalExtension}>\n" );
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
-                               wfProfileOut( __METHOD__ );
 
                                return array( 'filetype-badmime', $mime );
                        }
@@ -406,15 +394,12 @@ abstract class UploadBase {
                        $ieTypes = $magic->getIEMimeTypes( $this->mTempPath, $chunk, $extMime );
                        foreach ( $ieTypes as $ieType ) {
                                if ( $this->checkFileExtension( $ieType, $wgMimeTypeBlacklist ) ) {
-                                       wfProfileOut( __METHOD__ );
 
                                        return array( 'filetype-bad-ie-mime', $ieType );
                                }
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return true;
        }
 
@@ -425,11 +410,9 @@ abstract class UploadBase {
         */
        protected function verifyFile() {
                global $wgVerifyMimeType, $wgDisableUploadScriptChecks;
-               wfProfileIn( __METHOD__ );
 
                $status = $this->verifyPartialFile();
                if ( $status !== true ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $status;
                }
@@ -440,7 +423,6 @@ abstract class UploadBase {
                if ( $wgVerifyMimeType ) {
                        # XXX: Missing extension will be caught by validateName() via getTitle()
                        if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
-                               wfProfileOut( __METHOD__ );
 
                                return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
                        }
@@ -451,7 +433,6 @@ abstract class UploadBase {
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
                                $svgStatus = $this->detectScriptInSvg( $this->mTempPath, false );
                                if ( $svgStatus !== false ) {
-                                       wfProfileOut( __METHOD__ );
 
                                        return $svgStatus;
                                }
@@ -463,7 +444,6 @@ abstract class UploadBase {
                        $handlerStatus = $handler->verifyUpload( $this->mTempPath );
                        if ( !$handlerStatus->isOK() ) {
                                $errors = $handlerStatus->getErrorsArray();
-                               wfProfileOut( __METHOD__ );
 
                                return reset( $errors );
                        }
@@ -471,13 +451,11 @@ abstract class UploadBase {
 
                Hooks::run( 'UploadVerifyFile', array( $this, $mime, &$status ) );
                if ( $status !== true ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $status;
                }
 
                wfDebug( __METHOD__ . ": all clear; passing.\n" );
-               wfProfileOut( __METHOD__ );
 
                return true;
        }
@@ -492,7 +470,6 @@ abstract class UploadBase {
         */
        protected function verifyPartialFile() {
                global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
-               wfProfileIn( __METHOD__ );
 
                # getTitle() sets some internal parameters like $this->mFinalExtension
                $this->getTitle();
@@ -503,7 +480,6 @@ abstract class UploadBase {
                $mime = $this->mFileProps['file-mime'];
                $status = $this->verifyMimeType( $mime );
                if ( $status !== true ) {
-                       wfProfileOut( __METHOD__ );
 
                        return $status;
                }
@@ -511,14 +487,12 @@ abstract class UploadBase {
                # check for htmlish code and javascript
                if ( !$wgDisableUploadScriptChecks ) {
                        if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
-                               wfProfileOut( __METHOD__ );
 
                                return array( 'uploadscripted' );
                        }
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
                                $svgStatus = $this->detectScriptInSvg( $this->mTempPath, true );
                                if ( $svgStatus !== false ) {
-                                       wfProfileOut( __METHOD__ );
 
                                        return $svgStatus;
                                }
@@ -535,13 +509,11 @@ abstract class UploadBase {
                                $errors = $zipStatus->getErrorsArray();
                                $error = reset( $errors );
                                if ( $error[0] !== 'zip-wrong-format' ) {
-                                       wfProfileOut( __METHOD__ );
 
                                        return $error;
                                }
                        }
                        if ( $this->mJavaDetected ) {
-                               wfProfileOut( __METHOD__ );
 
                                return array( 'uploadjava' );
                        }
@@ -550,13 +522,10 @@ abstract class UploadBase {
                # Scan the uploaded file for viruses
                $virus = $this->detectVirus( $this->mTempPath );
                if ( $virus ) {
-                       wfProfileOut( __METHOD__ );
 
                        return array( 'uploadvirus', $virus );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return true;
        }
 
@@ -649,7 +618,6 @@ abstract class UploadBase {
         */
        public function checkWarnings() {
                global $wgLang;
-               wfProfileIn( __METHOD__ );
 
                $warnings = array();
 
@@ -718,8 +686,6 @@ abstract class UploadBase {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $warnings;
        }
 
@@ -735,7 +701,6 @@ abstract class UploadBase {
         * @return Status Indicating the whether the upload succeeded.
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
-               wfProfileIn( __METHOD__ );
 
                $status = $this->getLocalFile()->upload(
                        $this->mTempPath,
@@ -760,8 +725,6 @@ abstract class UploadBase {
                        $this->postProcessUpload();
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $status;
        }
 
@@ -952,14 +915,11 @@ abstract class UploadBase {
         */
        public function stashFile( User $user = null ) {
                // was stashSessionFile
-               wfProfileIn( __METHOD__ );
 
                $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $user );
                $file = $stash->stashFile( $this->mTempPath, $this->getSourceType() );
                $this->mLocalFile = $file;
 
-               wfProfileOut( __METHOD__ );
-
                return $file;
        }
 
@@ -1099,7 +1059,6 @@ abstract class UploadBase {
         */
        public static function detectScript( $file, $mime, $extension ) {
                global $wgAllowTitlesInSVG;
-               wfProfileIn( __METHOD__ );
 
                # ugly hack: for text files, always look at the entire file.
                # For binary field, just check the first K.
@@ -1115,7 +1074,6 @@ abstract class UploadBase {
                $chunk = strtolower( $chunk );
 
                if ( !$chunk ) {
-                       wfProfileOut( __METHOD__ );
 
                        return false;
                }
@@ -1140,7 +1098,6 @@ abstract class UploadBase {
 
                # check for HTML doctype
                if ( preg_match( "/<!DOCTYPE *X?HTML/i", $chunk ) ) {
-                       wfProfileOut( __METHOD__ );
 
                        return true;
                }
@@ -1149,7 +1106,6 @@ abstract class UploadBase {
                // PHP/expat will interpret the given encoding in the xml declaration (bug 47304)
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
-                               wfProfileOut( __METHOD__ );
 
                                return true;
                        }
@@ -1188,7 +1144,6 @@ abstract class UploadBase {
                foreach ( $tags as $tag ) {
                        if ( false !== strpos( $chunk, $tag ) ) {
                                wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
-                               wfProfileOut( __METHOD__ );
 
                                return true;
                        }
@@ -1204,7 +1159,6 @@ abstract class UploadBase {
                # look for script-types
                if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found script types\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return true;
                }
@@ -1212,7 +1166,6 @@ abstract class UploadBase {
                # look for html-style script-urls
                if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found html-style script urls\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return true;
                }
@@ -1220,13 +1173,11 @@ abstract class UploadBase {
                # look for css-style script-urls
                if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found css-style script urls\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return true;
                }
 
                wfDebug( __METHOD__ . ": no scripts found\n" );
-               wfProfileOut( __METHOD__ );
 
                return false;
        }
@@ -1650,11 +1601,9 @@ abstract class UploadBase {
         */
        public static function detectVirus( $file ) {
                global $wgAntivirus, $wgAntivirusSetup, $wgAntivirusRequired, $wgOut;
-               wfProfileIn( __METHOD__ );
 
                if ( !$wgAntivirus ) {
                        wfDebug( __METHOD__ . ": virus scanner disabled\n" );
-                       wfProfileOut( __METHOD__ );
 
                        return null;
                }
@@ -1663,7 +1612,6 @@ abstract class UploadBase {
                        wfDebug( __METHOD__ . ": unknown virus scanner: $wgAntivirus\n" );
                        $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
                                array( 'virus-badscanner', $wgAntivirus ) );
-                       wfProfileOut( __METHOD__ );
 
                        return wfMessage( 'virus-unknownscanner' )->text() . " $wgAntivirus";
                }
@@ -1737,8 +1685,6 @@ abstract class UploadBase {
                        wfDebug( __METHOD__ . ": FOUND VIRUS! scanner feedback: $output \n" );
                }
 
-               wfProfileOut( __METHOD__ );
-
                return $output;
        }
 
index 4e65e11..1f639fc 100644 (file)
@@ -50,7 +50,7 @@ class AutoloadGenerator {
                if ( !is_array( $flags ) ) {
                        $flags = array( $flags );
                }
-               $this->basepath = realpath( $basepath );
+               $this->basepath = self::normalizePathSeparator( realpath( $basepath ) );
                $this->collector = new ClassCollector;
                if ( in_array( 'local', $flags ) ) {
                        $this->variableName = 'wgAutoloadLocalClasses';
@@ -63,9 +63,10 @@ class AutoloadGenerator {
         *
         * @param string $fqcn FQCN to force the location of
         * @param string $inputPath Full path to the file containing the class
+        * @throws Exception
         */
        public function forceClassPath( $fqcn, $inputPath ) {
-               $path = realpath( $inputPath );
+               $path = self::normalizePathSeparator( realpath( $inputPath ) );
                if ( !$path ) {
                        throw new \Exception( "Invalid path: $inputPath" );
                }
@@ -78,9 +79,14 @@ class AutoloadGenerator {
        }
 
        /**
-        * @var string $inputPath Path to a php file to find classes within
+        * @param string $inputPath Path to a php file to find classes within
+        * @throws Exception
         */
        public function readFile( $inputPath ) {
+               // NOTE: do NOT expand $inputPath using realpath(). It is perfectly
+               // reasonable for LocalSettings.php and similiar files to be symlinks
+               // to files that are outside of $this->basepath.
+               $inputPath = self::normalizePathSeparator( $inputPath );
                $len = strlen( $this->basepath );
                if ( substr( $inputPath, 0, $len ) !== $this->basepath ) {
                        throw new \Exception( "Path is not within basepath: $inputPath" );
@@ -99,7 +105,8 @@ class AutoloadGenerator {
         *  for php files with either .php or .inc extensions
         */
        public function readDir( $dir ) {
-               $it = new RecursiveDirectoryIterator( realpath( $dir ) );
+               $it = new RecursiveDirectoryIterator(
+                       self::normalizePathSeparator( realpath( $dir ) ) );
                $it = new RecursiveIteratorIterator( $it );
 
                foreach ( $it as $path => $file ) {
@@ -170,6 +177,16 @@ global \${$this->variableName};
 EOD
                );
        }
+
+       /**
+        * Ensure that Unix-style path separators ("/") are used in the path.
+        *
+        * @param string $path
+        * @return string
+        */
+       protected static function normalizePathSeparator( $path ) {
+               return str_replace( '\\', '/', $path );
+       }
 }
 
 /**
index 55a8994..4441236 100644 (file)
@@ -731,7 +731,6 @@ class IP {
        public static function isConfiguredProxy( $ip ) {
                global $wgSquidServers, $wgSquidServersNoPurge;
 
-               wfProfileIn( __METHOD__ );
                // Quick check of known singular proxy servers
                $trusted = in_array( $ip, $wgSquidServers );
 
@@ -742,7 +741,6 @@ class IP {
                        }
                        $trusted = self::$proxyIpSet->match( $ip );
                }
-               wfProfileOut( __METHOD__ );
 
                return $trusted;
        }
index cc13679..950dd84 100644 (file)
@@ -103,6 +103,7 @@ class MWCryptHKDF {
         * @param string $algorithm Name of hashing algorithm
         * @param BagOStuff $cache
         * @param string|array $context Context to mix into HKDF context
+        * @throws MWException
         */
        public function __construct( $secretKeyMaterial, $algorithm, $cache, $context ) {
                if ( strlen( $secretKeyMaterial ) < 16 ) {
@@ -157,6 +158,7 @@ class MWCryptHKDF {
        /**
         * Return a singleton instance, based on the global configs.
         * @return HKDF
+        * @throws MWException
         */
        protected static function singleton() {
                global $wgHKDFAlgorithm, $wgHKDFSecret, $wgSecretKey;
@@ -271,14 +273,15 @@ class MWCryptHKDF {
         *
         * @param string $hash Hashing Algorithm
         * @param string $prk A pseudorandom key of at least HashLen octets
-        *      (usually, the output from the extract step)
+        *    (usually, the output from the extract step)
         * @param string $info Optional context and application specific information
-        *      (can be a zero-length string)
+        *    (can be a zero-length string)
         * @param int $bytes Length of output keying material in bytes
-        *      (<= 255*HashLen)
+        *    (<= 255*HashLen)
         * @param string &$lastK Set by this function to the last block of the expansion.
-        *      In MediaWiki, this is used to seed future Extractions.
+        *    In MediaWiki, this is used to seed future Extractions.
         * @return string Cryptographically secure random string $bytes long
+        * @throws MWException
         */
        private static function HKDFExpand( $hash, $prk, $info, $bytes, &$lastK = '' ) {
                $hashLen = MWCryptHKDF::$hashLength[$hash];
index b602f78..e6c0e78 100644 (file)
@@ -294,7 +294,6 @@ class MWCryptRand {
         * @see self::generate()
         */
        public function realGenerate( $bytes, $forceStrong = false ) {
-               wfProfileIn( __METHOD__ );
 
                wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " .
                        wfGetAllCallers( 5 ) . "\n" );
@@ -314,7 +313,6 @@ class MWCryptRand {
                        // entropy so this is also preferable to just trying to read urandom because it may work
                        // on Windows systems as well.
                        if ( function_exists( 'mcrypt_create_iv' ) ) {
-                               wfProfileIn( __METHOD__ . '-mcrypt' );
                                $rem = $bytes - strlen( $buffer );
                                $iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
                                if ( $iv === false ) {
@@ -324,7 +322,6 @@ class MWCryptRand {
                                        wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) .
                                                " bytes of randomness.\n" );
                                }
-                               wfProfileOut( __METHOD__ . '-mcrypt' );
                        }
                }
 
@@ -337,7 +334,6 @@ class MWCryptRand {
                        if ( function_exists( 'openssl_random_pseudo_bytes' )
                                && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
                        ) {
-                               wfProfileIn( __METHOD__ . '-openssl' );
                                $rem = $bytes - strlen( $buffer );
                                $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
                                if ( $openssl_bytes === false ) {
@@ -353,7 +349,6 @@ class MWCryptRand {
                                        // using it use it's say on whether the randomness is strong
                                        $this->strong = !!$openssl_strong;
                                }
-                               wfProfileOut( __METHOD__ . '-openssl' );
                        }
                }
 
@@ -361,7 +356,6 @@ class MWCryptRand {
                if ( strlen( $buffer ) < $bytes &&
                        ( function_exists( 'stream_set_read_buffer' ) || $forceStrong )
                ) {
-                       wfProfileIn( __METHOD__ . '-fopen-urandom' );
                        $rem = $bytes - strlen( $buffer );
                        if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
                                wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom " .
@@ -400,7 +394,6 @@ class MWCryptRand {
                        } else {
                                wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
                        }
-                       wfProfileOut( __METHOD__ . '-fopen-urandom' );
                }
 
                // If we cannot use or generate enough data from a secure source
@@ -414,12 +407,10 @@ class MWCryptRand {
                                ": Falling back to using a pseudo random state to generate randomness.\n" );
                }
                while ( strlen( $buffer ) < $bytes ) {
-                       wfProfileIn( __METHOD__ . '-fallback' );
                        $buffer .= $this->hmac( $this->randomState(), mt_rand() );
                        // This code is never really cryptographically strong, if we use it
                        // at all, then set strong to false.
                        $this->strong = false;
-                       wfProfileOut( __METHOD__ . '-fallback' );
                }
 
                // Once the buffer has been filled up with enough random data to fulfill
@@ -431,8 +422,6 @@ class MWCryptRand {
                wfDebug( __METHOD__ . ": " . strlen( $buffer ) .
                        " bytes of randomness leftover in the buffer.\n" );
 
-               wfProfileOut( __METHOD__ );
-
                return $generated;
        }
 
index 86f4512..c71e315 100644 (file)
@@ -498,16 +498,12 @@ class ReplacementArray {
         */
        function replace( $subject ) {
                if ( function_exists( 'fss_prep_replace' ) ) {
-                       wfProfileIn( __METHOD__ . '-fss' );
                        if ( $this->fss === false ) {
                                $this->fss = fss_prep_replace( $this->data );
                        }
                        $result = fss_exec_replace( $this->fss, $subject );
-                       wfProfileOut( __METHOD__ . '-fss' );
                } else {
-                       wfProfileIn( __METHOD__ . '-strtr' );
                        $result = strtr( $subject, $this->data );
-                       wfProfileOut( __METHOD__ . '-strtr' );
                }
 
                return $result;
index 5346afa..9241587 100644 (file)
@@ -119,6 +119,7 @@ class UIDGenerator {
        /**
         * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
         * @return string 88 bits
+        * @throws MWException
         */
        protected function getTimestampedID88( array $info ) {
                list( $time, $counter ) = $info;
@@ -163,6 +164,7 @@ class UIDGenerator {
        /**
         * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
         * @return string 128 bits
+        * @throws MWException
         */
        protected function getTimestampedID128( array $info ) {
                list( $time, $counter, $clkSeq ) = $info;
@@ -260,6 +262,7 @@ class UIDGenerator {
         * @param int $count Number of IDs to return (1 to 10000)
         * @param int $flags (supports UIDGenerator::QUICK_VOLATILE)
         * @return array Ordered list of float integer values
+        * @throws MWException
         */
        protected function getSequentialPerNodeIDs( $bucket, $bits, $count, $flags ) {
                if ( $count <= 0 ) {
@@ -278,7 +281,7 @@ class UIDGenerator {
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
                        try {
                                $cache = ObjectCache::newAccelerator( array() );
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                // not supported
                        }
                }
@@ -436,6 +439,7 @@ class UIDGenerator {
        /**
         * @param array $time Result of UIDGenerator::millitime()
         * @return string 46 MSBs of "milliseconds since epoch" in binary (rolls over in 4201)
+        * @throws MWException
         */
        protected function millisecondsSinceEpochBinary( array $time ) {
                list( $sec, $msec ) = $time;
index bc84976..86960aa 100644 (file)
@@ -186,6 +186,7 @@ class ZipDirectoryReader {
         * Throw an error, and log a debug message
         * @param mixed $code
         * @param string $debugMessage
+        * @throws ZipDirectoryReaderError
         */
        function error( $code, $debugMessage ) {
                wfDebug( __CLASS__ . ": Fatal error: $debugMessage\n" );
index a5e960f..e6625c1 100644 (file)
@@ -445,10 +445,11 @@ class ConverterRule {
        }
 
        /**
-        * @todo FIXME: code this function :)
+        * Checks if there are conversion rules.
+        * @return bool
         */
        public function hasRules() {
-               // TODO:
+               return $this->mRules !== '';
        }
 
        /**
index 9e3abb3..fbd4f6d 100644 (file)
@@ -318,7 +318,7 @@ class Language {
                // see bugs 37564, 37587, 36938
                $cache[$code] =
                        strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
-                       && !preg_match( Title::getTitleInvalidRegex(), $code );
+                       && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
 
                return $cache[$code];
        }
@@ -854,7 +854,6 @@ class Language {
         * @since 1.20
         */
        public static function fetchLanguageNames( $inLanguage = null, $include = 'mw' ) {
-               wfProfileIn( __METHOD__ );
                $cacheKey = $inLanguage === null ? 'null' : $inLanguage;
                $cacheKey .= ":$include";
                if ( self::$languageNameCache === null ) {
@@ -866,7 +865,6 @@ class Language {
                        $ret = self::fetchLanguageNamesUncached( $inLanguage, $include );
                        self::$languageNameCache->set( $cacheKey, $ret );
                }
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -911,6 +909,7 @@ class Language {
                }
 
                if ( $include === 'all' ) {
+                       ksort( $names );
                        return $names;
                }
 
@@ -932,9 +931,11 @@ class Language {
                                }
                        }
 
+                       ksort( $namesMwFile );
                        return $namesMwFile;
                }
 
+               ksort( $returnMw );
                # 'mw' option; default if it's not one of the other two options (all/mwfile)
                return $returnMw;
        }
@@ -959,7 +960,17 @@ class Language {
         * @return string
         */
        function getMessageFromDB( $msg ) {
-               return wfMessage( $msg )->inLanguage( $this )->text();
+               return $this->msg( $msg )->text();
+       }
+
+       /**
+        * Get message object in this language. Only for use inside this class.
+        *
+        * @param string $msg Message name
+        * @return Message
+        */
+       protected function msg( $msg ) {
+               return wfMessage( $msg )->inLanguage( $this );
        }
 
        /**
@@ -3345,7 +3356,7 @@ class Language {
                                // the string does not have any number part. Eg: .12345
                                return $sign . $groupedNumber;
                        }
-                       $start = $end = strlen( $integerPart[0] );
+                       $start = $end = ($integerPart) ? strlen( $integerPart[0] ) : 0;
                        while ( $start > 0 ) {
                                $match = $matches[0][$numMatches - 1];
                                $matchLen = strlen( $match );
@@ -3403,10 +3414,10 @@ class Language {
                        return '';
                }
                if ( $m > 0 ) {
-                       $and = $this->getMessageFromDB( 'and' );
-                       $space = $this->getMessageFromDB( 'word-separator' );
+                       $and = $this->msg( 'and' )->escaped();
+                       $space = $this->msg( 'word-separator' )->escaped();
                        if ( $m > 1 ) {
-                               $comma = $this->getMessageFromDB( 'comma-separator' );
+                               $comma = $this->msg( 'comma-separator' )->escaped();
                        }
                }
                $s = $l[$m];
@@ -4432,7 +4443,6 @@ class Language {
                        return array( $wikiUpperChars, $wikiLowerChars );
                }
 
-               wfProfileIn( __METHOD__ );
                $arr = wfGetPrecompiledData( 'Utf8Case.ser' );
                if ( $arr === false ) {
                        throw new MWException(
@@ -4440,7 +4450,6 @@ class Language {
                }
                $wikiUpperChars = $arr['wikiUpperChars'];
                $wikiLowerChars = $arr['wikiLowerChars'];
-               wfProfileOut( __METHOD__ );
                return array( $wikiUpperChars, $wikiLowerChars );
        }
 
@@ -4640,17 +4649,22 @@ class Language {
         * Make a list item, used by various special pages
         *
         * @param string $page Page link
-        * @param string $details Text between brackets
+        * @param string $details HTML safe text between brackets
         * @param bool $oppositedm Add the direction mark opposite to your
         *   language, to display text properly
-        * @return string
+        * @return HTML escaped string
         */
        function specialList( $page, $details, $oppositedm = true ) {
-               $dirmark = ( $oppositedm ? $this->getDirMark( true ) : '' ) .
-                       $this->getDirMark();
-               $details = $details ? $dirmark . $this->getMessageFromDB( 'word-separator' ) .
-                       wfMessage( 'parentheses' )->rawParams( $details )->inLanguage( $this )->escaped() : '';
-               return $page . $details;
+               if ( !$details ) {
+                       return $page;
+               }
+
+               $dirmark = ( $oppositedm ? $this->getDirMark( true ) : '' ) . $this->getDirMark();
+               return
+                       $page .
+                       $dirmark .
+                       $this->msg( 'word-separator' )->escaped() .
+                       $this->msg( 'parentheses' )->rawParams( $details )->escaped();
        }
 
        /**
index eae77fb..43d6063 100644 (file)
@@ -336,20 +336,17 @@ class LanguageConverter {
         * @return string The converted text
         */
        public function autoConvert( $text, $toVariant = false ) {
-               wfProfileIn( __METHOD__ );
 
                $this->loadTables();
 
                if ( !$toVariant ) {
                        $toVariant = $this->getPreferredVariant();
                        if ( !$toVariant ) {
-                               wfProfileOut( __METHOD__ );
                                return $text;
                        }
                }
 
                if ( $this->guessVariant( $text, $toVariant ) ) {
-                       wfProfileOut( __METHOD__ );
                        return $text;
                }
 
@@ -446,7 +443,6 @@ class LanguageConverter {
                        $literalIter->next();
                }
 
-               wfProfileOut( __METHOD__ );
                return $output;
        }
 
@@ -460,14 +456,12 @@ class LanguageConverter {
         * @return string Translated text
         */
        public function translate( $text, $variant ) {
-               wfProfileIn( __METHOD__ );
                // If $text is empty or only includes spaces, do nothing
                // Otherwise translate it
                if ( trim( $text ) ) {
                        $this->loadTables();
                        $text = $this->mTables[$variant]->replace( $text );
                }
-               wfProfileOut( __METHOD__ );
                return $text;
        }
 
@@ -478,7 +472,6 @@ class LanguageConverter {
         * @return array Variant => converted text
         */
        public function autoConvertToAllVariants( $text ) {
-               wfProfileIn( __METHOD__ );
                $this->loadTables();
 
                $ret = array();
@@ -486,7 +479,6 @@ class LanguageConverter {
                        $ret[$variant] = $this->translate( $text, $variant );
                }
 
-               wfProfileOut( __METHOD__ );
                return $ret;
        }
 
@@ -856,7 +848,6 @@ class LanguageConverter {
                        return;
                }
 
-               wfProfileIn( __METHOD__ );
                $this->mTablesLoaded = true;
                $this->mTables = false;
                if ( $fromCache ) {
@@ -881,7 +872,6 @@ class LanguageConverter {
                        $wgLangConvMemc->set( $this->mCacheKey, $this->mTables, 43200 );
                        wfProfileOut( __METHOD__ . '-recache' );
                }
-               wfProfileOut( __METHOD__ );
        }
 
        /**
index 4e4d103..bb26d19 100644 (file)
@@ -74,6 +74,7 @@
        'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E",     # Belarusian in Taraskievica orthography
        'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E",      # (be-tarask compat)
        'bg' => 'български',   # Bulgarian
+       'bgn' => 'بلوچی رخشانی', # Western Balochi
        'bh' => 'भोजपुरी',        # Bihari macro language. Falls back to Bhojpuri (bho)
        'bho' => 'भोजपुरी',       # Bhojpuri
        'bi' => 'Bislama',              # Bislama
index ac59380..56faa4a 100644 (file)
@@ -44,7 +44,6 @@ class LanguageBe_tarask extends Language {
         * @return string
         */
        function normalizeForSearch( $string ) {
-               wfProfileIn( __METHOD__ );
 
                # MySQL fulltext index doesn't grok utf-8, so we
                # need to fold cases and convert to hex
@@ -54,7 +53,6 @@ class LanguageBe_tarask extends Language {
 
                $s = parent::normalizeForSearch( $s );
 
-               wfProfileOut( __METHOD__ );
                return $s;
        }
 
index 39e62f5..b8af885 100644 (file)
@@ -454,7 +454,6 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        function convertGrammar( $word, $case ) {
-               wfProfileIn( __METHOD__ );
 
                $variant = $this->getPreferredVariant();
                switch ( $variant ) {
@@ -473,7 +472,6 @@ class LanguageKk extends LanguageKk_cyrl {
                                $word = parent::convertGrammarKk_cyrl( $word, $case );
                }
 
-               wfProfileOut( __METHOD__ );
                return $word;
        }
 }
index 1ee398d..353b59a 100644 (file)
@@ -26,7 +26,7 @@
  * This does not affect untranslated messages.
  *
  * NOTE: It returns a valid title, because there are some poorly written
- * extentions that assume the contents of some messages are valid.
+ * extensions that assume the contents of some messages are valid.
  *
  * @ingroup Language
  */
index 3293cc6..d5f3e76 100644 (file)
@@ -54,14 +54,12 @@ class LanguageYue extends Language {
         * @return string
         */
        function normalizeForSearch( $string ) {
-               wfProfileIn( __METHOD__ );
 
                // Double-width roman characters
                $s = self::convertDoubleWidth( $string );
                $s = trim( $s );
                $s = parent::normalizeForSearch( $s );
 
-               wfProfileOut( __METHOD__ );
                return $s;
        }
 }
index 67f8769..4271ed3 100644 (file)
@@ -67,23 +67,35 @@ class ZhConverter extends LanguageConverter {
                $this->mTables = array(
                        'zh-hans' => new ReplacementArray( $zh2Hans ),
                        'zh-hant' => new ReplacementArray( $zh2Hant ),
-                       'zh-cn' => new ReplacementArray( array_merge( $zh2Hans, $zh2CN ) ),
-                       'zh-hk' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
-                       'zh-mo' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
-                       'zh-my' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
-                       'zh-sg' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
-                       'zh-tw' => new ReplacementArray( array_merge( $zh2Hant, $zh2TW ) ),
+                       'zh-cn' => new ReplacementArray( $zh2CN ),
+                       'zh-hk' => new ReplacementArray( $zh2HK ),
+                       'zh-mo' => new ReplacementArray( $zh2HK ),
+                       'zh-my' => new ReplacementArray( $zh2SG ),
+                       'zh-sg' => new ReplacementArray( $zh2SG ),
+                       'zh-tw' => new ReplacementArray( $zh2TW ),
                        'zh' => new ReplacementArray
                );
        }
 
        function postLoadTables() {
-               $this->mTables['zh-cn']->merge( $this->mTables['zh-hans'] );
-               $this->mTables['zh-hk']->merge( $this->mTables['zh-hant'] );
-               $this->mTables['zh-mo']->merge( $this->mTables['zh-hant'] );
-               $this->mTables['zh-my']->merge( $this->mTables['zh-hans'] );
-               $this->mTables['zh-sg']->merge( $this->mTables['zh-hans'] );
-               $this->mTables['zh-tw']->merge( $this->mTables['zh-hant'] );
+               $this->mTables['zh-cn']->setArray(
+                       $this->mTables['zh-cn']->getArray() + $this->mTables['zh-hans']->getArray()
+               );
+               $this->mTables['zh-hk']->setArray(
+                       $this->mTables['zh-hk']->getArray() + $this->mTables['zh-hant']->getArray()
+               );
+               $this->mTables['zh-mo']->setArray(
+                       $this->mTables['zh-mo']->getArray() + $this->mTables['zh-hant']->getArray()
+               );
+               $this->mTables['zh-my']->setArray(
+                       $this->mTables['zh-my']->getArray() + $this->mTables['zh-hans']->getArray()
+               );
+               $this->mTables['zh-sg']->setArray(
+                       $this->mTables['zh-sg']->getArray() + $this->mTables['zh-hans']->getArray()
+               );
+               $this->mTables['zh-tw']->setArray(
+                       $this->mTables['zh-tw']->getArray() + $this->mTables['zh-hant']->getArray()
+               );
        }
 
        /**
@@ -170,7 +182,6 @@ class LanguageZh extends LanguageZh_hans {
         * @return string
         */
        function normalizeForSearch( $string, $autoVariant = 'zh-hans' ) {
-               wfProfileIn( __METHOD__ );
 
                // always convert to zh-hans before indexing. it should be
                // better to use zh-hans for search, since conversion from
@@ -179,7 +190,6 @@ class LanguageZh extends LanguageZh_hans {
                $s = $this->mConverter->autoConvert( $string, $autoVariant );
                // LanguageZh_hans::normalizeForSearch
                $s = parent::normalizeForSearch( $s );
-               wfProfileOut( __METHOD__ );
                return $s;
 
        }
index 6483d90..75a05fd 100644 (file)
@@ -56,14 +56,12 @@ class LanguageZh_hans extends Language {
         * @return string
         */
        function normalizeForSearch( $s ) {
-               wfProfileIn( __METHOD__ );
 
                // Double-width roman characters
                $s = parent::normalizeForSearch( $s );
                $s = trim( $s );
                $s = $this->segmentByWord( $s );
 
-               wfProfileOut( __METHOD__ );
                return $s;
        }
 
index 70c29aa..7b71a0b 100644 (file)
@@ -46,7 +46,7 @@
        "tog-shownumberswatching": "Wys die aantal gebruikers wat dophou",
        "tog-oldsig": "Bestaande handtekening:",
        "tog-fancysig": "Doodgewone handtekening (sonder outomatiese skakel)",
-       "tog-uselivepreview": "Gebruik lewendige voorskou (JavaScript) (eksperimenteel)",
+       "tog-uselivepreview": "Gebruik lewendige voorskou",
        "tog-forceeditsummary": "Let my daarop as ek nie 'n opsomming van my wysiging gee nie",
        "tog-watchlisthideown": "Versteek my wysigings in dophoulys",
        "tog-watchlisthidebots": "Versteek robotwysigings in dophoulys",
        "content-model-text": "eenvoudige teks",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leë objek",
+       "duplicate-args-category": "Bladsye met dubbele sjabloonparameters",
        "expensive-parserfunction-warning": "Waarskuwing: Die bladsy gebruik te veel duur ontlederfunksies.\n\nDaar is {{PLURAL:$1|$1 funksie|$1 funksies}}, terwyl die bladsy minder as $2 moet hê.",
        "expensive-parserfunction-category": "Bladsye wat te veel duur ontlederfunkies gebruik",
        "post-expand-template-inclusion-warning": "'''Waarskuwing:''' Die maksimum toelaatbare grootte vir die insluiting van sjablone is oorskry.\nSommige van die sjablone sal nie ingesluit word nie.",
        "revdelete-hide-text": "Steek hersiening teks weg",
        "revdelete-hide-image": "Steek lêer inhoud weg",
        "revdelete-hide-name": "Steek aksie en teiken weg",
-       "revdelete-hide-comment": "Versteek wysigopsomming",
-       "revdelete-hide-user": "Steek redigeerder se gebruikersnaam/IP weg",
+       "revdelete-hide-comment": "Wysigingsopsomming",
+       "revdelete-hide-user": "Gebruikersnaam of IP-adres van die gebruiker",
        "revdelete-hide-restricted": "Onderdruk data van administrateurs asook andere",
        "revdelete-radio-same": "(moenie verander nie)",
        "revdelete-radio-set": "Versteek",
        "search-result-category-size": "{{PLURAL:$1|1 kategorielid|$1 kategorielede}} ({{PLURAL:$2|1 subkategorie|$2 subkategorieë}}, {{PLURAL:$3|1 lêer|$3 lêers}})",
        "search-redirect": "(aanstuur $1)",
        "search-section": "(afdeling $1)",
+       "search-category": "(kategorie $1)",
+       "search-file-match": "(stem ooreen met die inhoud van die leêr)",
        "search-suggest": "Het u $1 bedoel?",
        "search-interwiki-caption": "Susterprojekte",
        "search-interwiki-default": "Resultate van $1:",
        "license": "Lisensiëring:",
        "license-header": "Lisensiëring",
        "nolicense": "Niks gekies nie",
+       "licenses-edit": "Wysig lisensie-opsies",
        "license-nopreview": "(Voorskou nie beskikbaar)",
        "upload_source_url": " ('n geldige, publiek toeganklike URL)",
        "upload_source_file": " ('n lêer op u rekenaar)",
        "listfiles_size": "Grootte",
        "listfiles_description": "Beskrywing",
        "listfiles_count": "Weergawes",
+       "listfiles-show-all": "Sluit ou weergawes van beelde in",
        "listfiles-latestversion": "Huidige weergawe",
        "listfiles-latestversion-yes": "Ja",
        "listfiles-latestversion-no": "Nee",
        "querypage-disabled": "Hierdie spesiale bladsy is afgeskakel om werkverrigting te verbeter (bediener is oorlaai).",
        "booksources": "Boekbronne",
        "booksources-search-legend": "Soek vir boekbronne",
+       "booksources-search": "Soek",
        "booksources-text": "Hieronder is 'n lys van webtuistes wat nuwe en gebruikte boeke verkoop, en dalk meer inligting oor die boeke waarna u soek kan bevat:",
        "booksources-invalid-isbn": "Die ingevoerde ISBN-kode blyk asof dit ongeldig is; maak asseblief seker dat u dit sonder fout oorgekopiëer het vanaf die oorspronklike bron.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
        "delete-toobig": "Die bladsy het 'n lang wysigingsgeskiedenis, meer as $1 {{PLURAL:$1|weergawe|weergawes}}.\nVerwydering van die soort blaaie is beperk om ontwrigting van {{SITENAME}} te voorkom.",
        "delete-warning-toobig": "Hierdie bladsy het 'n lang wysigingsgeskiedenis; meer as $1 {{PLURAL:$1|wysiging|wysigings}}.\nDeur weg te doen met hierdie bladsy mag dalk die werking van {{SITENAME}} versteur;\nTree asseblief versigtig op.",
        "rollback": "Rol veranderinge terug",
-       "rollback_short": "Rol terug",
        "rollbacklink": "Rol terug",
        "rollbacklinkcount": "rol {{PLURAL:$1|een wysiging|$1 wysigings}} terug",
        "rollbacklinkcount-morethan": "rol meer as {{PLURAL:$1|een wysiging|$1 wysigings}} terug",
        "autoblockid": "Outomatiese blokkade #$1",
        "block": "Blok gebruiker",
        "unblock": "Deblokkeer gebruiker",
-       "blockip": "Blokkeer gebruiker",
+       "blockip": "Blokkeer {{GENDER:$1|gebruiker}}",
        "blockip-legend": "Blokkeer gebruiker of IP-adres",
        "blockiptext": "Gebruik die vorm hier onder om skryftoegang vir 'n gebruiker of IP-adres in te trek.\nDit mag slegs as beskerming teen vandalisme en in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]] gedoen word.\nVul 'n spesifieke rede hier onder in (haal byvoorbeeld spesifieke bladsye wat gevandaliseer is, aan).",
        "ipaddressorusername": "IP-adres of gebruikersnaam:",
        "import-logentry-interwiki": "importeer $1 via transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|weergawe|weergawes}} vanaf $2",
        "javascripttest": "JavaScript toetsing",
-       "javascripttest-title": "Voer toetse uit vir $1",
        "javascripttest-pagetext-noframework": "Hierdie bladsy is gereserveer vir die uitvoer van JavaScript-toetse.",
        "javascripttest-pagetext-unknownframework": "Onbekende toetsraamwerk \"$1\".",
        "javascripttest-pagetext-frameworks": "Kies een van die volgende toetsraamwerke: $1",
        "javascripttest-pagetext-skins": "Kies 'n omslag waarmee die toets uitgevoer moet word:",
        "javascripttest-qunit-intro": "Sien die [$1 toetsdokumentasie] op mediawiki.org.",
-       "javascripttest-qunit-heading": "QUnit toetssuite vir MediaWiki JavaScript",
        "tooltip-pt-userpage": "My gebruikerbladsy",
        "tooltip-pt-anonuserpage": "Die gebruikersbladsy vir die IP-adres waaronder u wysigings aanbring",
        "tooltip-pt-mytalk": "My besprekingsbladsy",
        "watchlisttools-edit": "Bekyk en wysig dophoulys",
        "watchlisttools-raw": "Wysig bronkode",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kontak]])",
-       "unknown_extension_tag": "Onbekende etiket \"$1\"",
        "duplicate-defaultsort": "Waarskuwing: Die standaardsortering \"$2\" kry voorrang voor die sortering \"$1\".",
        "version": "Weergawe",
        "version-extensions": "Uitbreidings geïnstalleer",
        "version-entrypoints": "URL's vir ingange",
        "version-entrypoints-header-entrypoint": "Ingang",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Aanstuur volgens lêer, gebruiker of weergawenommer",
+       "version-libraries-library": "Biblioteek",
+       "version-libraries-version": "Weergawe",
+       "redirect": "Aanstuur volgens lêer, gebruiker, bladsy of weergawenommer",
        "redirect-legend": "Aanstuur na 'n lêer of bladsy",
        "redirect-summary": "Hierdie spesiale bladsy stuur aan na 'n lêer (as 'n lêernaam verskaf word), 'n bladsy (as 'n weergawe-nommer verskaf word) of 'n gebruikersblad (as 'n gebruiker-ID verskaf word).",
        "redirect-submit": "OK",
        "specialpages-group-wiki": "Data en hulpmiddels",
        "specialpages-group-redirects": "Aanstuur gewone bladsye",
        "specialpages-group-spam": "Spam-hulpmiddels",
+       "specialpages-group-developer": "Developer Tools",
        "blankpage": "Leë bladsy",
        "intentionallyblankpage": "Die bladsy is bewustelik leeg gelaat",
        "external_image_whitelist": "  #Laat hierdie reël onveranderd<pre>\n#Plaas reguliere ekspressiefragmente (slegs die deel tussen //) hieronder\n#Hierdie word vergelyk met die URL's van eksterne (warm-geskakelde) beelde\n#Die wat oplyn word as beelde vertoon, andersins word slegs 'n skakel na die beeld gewys\n#Reëls wat met \"#\" begin word as opmerkings hanteer\n#Hierdie lys is nie gevoelig vir hoofletters nie.\n\n#Plaas alle reguliere expressiefragmente bo hierdie reël. Laat hierdie reël onveranderd</pre>",
        "mediastatistics-table-totalbytes": "Totale grootte",
        "mediastatistics-header-unknown": "Onbekend",
        "mediastatistics-header-audio": "Oudio",
-       "mediastatistics-header-video": "Video's"
+       "mediastatistics-header-video": "Video's",
+       "mediastatistics-header-office": "Kantoorlêers",
+       "mediastatistics-header-text": "Tekslêers",
+       "mediastatistics-header-executable": "Uitvoerbare lêers",
+       "mediastatistics-header-archive": "Gekompakteerde lêers",
+       "json-error-syntax": "Sintaksfout"
 }
index 5025c36..2ec13d6 100644 (file)
@@ -29,8 +29,8 @@
        "tog-watchmoves": "Ēacnian mīn behealdungtæl mid trametum and ymelum þā ic wege.",
        "tog-watchdeletion": "Ēacnian mīn behealdungæl mid trametum and ymelum þā ic forlēose.",
        "tog-minordefault": "Mearcian ealla adihtunga lytela tō gewunan",
-       "tog-previewontop": "Īwan fōrebysene ofer adihtunge mearce",
-       "tog-previewonfirst": "Īwan fōrebysene on forman adihtunge",
+       "tog-previewontop": "Īwan forebysene ofer adihtunge mearce",
+       "tog-previewonfirst": "Īwan forebysene on forman adihtunge",
        "tog-enotifwatchlistpages": "Sendan mē spearcǣrend þǣr tramet oþþe ymele on mīnum behealdungtæle sīe andwended.",
        "tog-enotifusertalkpages": "Sendan mē spearcǣrend þǣr mīnes brūcendtrametes mōtung sī andwended",
        "tog-enotifminoredits": "Sendan mē spearcǣrend þǣr trametas oþþe ymelan sīen efne lyt andwended.",
@@ -38,7 +38,7 @@
        "tog-shownumberswatching": "Īwan þæt rīm behealdendra brūcenda",
        "tog-oldsig": "Genge selfmearc:",
        "tog-fancysig": "Dōn selfmearce tō wikitexte (lēas ǣr gedōnes hlencan)",
-       "tog-uselivepreview": "Notian rihte īwde fōrebysene (on costnunge)",
+       "tog-uselivepreview": "Notian rihte īwedre forebysene",
        "tog-forceeditsummary": "Cȳðan mē þǣr ic ne wrīte adihtunge sceortnesse",
        "tog-watchlisthideown": "Hȳdan mīna adihtunga wiþ þæt behealdungtæl",
        "tog-watchlisthidebots": "Hȳdan searuþrǣla adihtunga wiþ þæt behealdungtæl",
        "create-this-page": "Scieppan þisne tramet",
        "delete": "Forlēosan",
        "deletethispage": "Forlēosan þisne tramet",
+       "undeletethispage": "Undōn þā forlēosunge þisses trametes",
        "undelete_short": "Scieppan {{PLURAL:$1|āne adihtunge|$1 adihtunga}} eft",
        "viewdeleted_short": "Sēon {{PLURAL:$1|āne forlorene adihtunge|$1 forlorenra adihtunga}}",
        "protect": "Beorgan",
        "otherlanguages": "On ōðrum sprǣcum",
        "redirectedfrom": "(Edlǣded fram $1)",
        "redirectpagesub": "Edlǣdunge tramet",
+       "redirectto": "Edlǣdan tō:",
        "lastmodifiedat": "Man nīwanost wende þisne tramet on þǣre $2 tīde þæs $1.",
        "viewcount": "Þes tramet wæs gesawen {{PLURAL:$1|āne|$1 mǣla}}.",
        "protectedpage": "Geborgen tramet",
        "youhavenewmessagesfromusers": "Þū hafast $1 fram {{PLURAL:$3|ōðrum brūcende|$3 brūcenda}} ($2).",
        "youhavenewmessagesmanyusers": "Þū hafast $1 fram manigum brūcendum ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|nīwe ǣrendgewrit|999=nīwra ǣrendgewrita}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|nīwost andwendung|999=nīwostra andwendunga}}",
        "youhavenewmessagesmulti": "Þū hæfst nīwu ǣrendu on $1",
        "editsection": "adihtan",
        "editold": "adihtan",
        "toc": "Innung",
        "showtoc": "īwan",
        "hidetoc": "hȳdan",
+       "collapsible-collapse": "Lytlian",
+       "collapsible-expand": "Brǣdan",
+       "confirmable-confirm": "Ƿilt þū þis ƿitodlīce dōn?",
+       "confirmable-yes": "Gēa",
+       "confirmable-no": "Nese",
        "thisisdeleted": "Sēon oþþe nīwian $1?",
        "viewdeleted": "Sēon $1 lā?",
        "restorelink": "{{PLURAL:$1|ān forloren ādihtung|$1 forlorenra adihtunga}}",
        "nospecialpagetext": "<strong>Þū hafast abiden ungenges syndriges trametes.</strong>\n\nGetæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm syndrigra trameta getæle]].",
        "error": "Wōh",
        "databaseerror": "Cȳþþuhordes wōh",
+       "databaseerror-error": "Wōg: $1",
        "laggedslavemode": "'''Warnung:''' Wēnunga næbbe se tramet nīwlīca nīwunga.",
        "enterlockreason": "Wrīt race þǣre forwiernunge and apinsunge þæs tīman on þǣm bēo sēo forwiernung forlǣten",
        "missingarticle-rev": "(nīwung#: $1)",
        "internalerror": "Inweard wōh",
        "internalerror_info": "Inweard wōh: $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\".",
        "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.",
+       "cannotdelete-title": "Ne cann forlēosan þone tramet \"$1\"",
        "badtitle": "Nā genge titul",
+       "querypage-no-updates": "Ednīwunga for þissum tramete ne sindon nū gelīfeda. \nCȳþþu hēr ne biþ hraðe ednīwod.",
        "viewsource": "Sēon fruman",
        "viewsource-title": "Fruman for $1 sēon",
+       "protectedpagetext": "Þes tramet wæs geborgen tō wyrnenne ōðerre adihtunge oþþe ōðra dǣda.",
+       "viewsourcetext": "Þū canst sēon and biwrītan þone fruman þisses trametes:",
+       "viewyourtext": "Þū canst sēon and biwrītan þone fruman <strong>þīnra adihtunga</strong> tō þissum tramete:",
        "cascadeprotected": "Þes trament wæs geborgen wiþ adihtunge, for þǣm þe hē is befangen in þissum {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgen settum wyrcende þǣm cyre \"cascading\": $2",
+       "namespaceprotected": "Þū nafast lēafe tō adihtenne trametas in þǣm <strong>$1</strong> namstede.",
+       "customcssprotected": "Þū nafast lēafe tō adihtenne þisne CSS tramet for þȳ hē behealdeþ ōðres brūcendes āgna gesetednessa.",
+       "customjsprotected": "Þū nafast lēafe tō adihtenne þisne JavaScript tramet for þām hē behealdeþ ōðres hādes āgna gesetednessa.",
+       "mycustomcssprotected": "Þū nafast lēafe tō adihtenne þisne CSS tramet.",
+       "mycustomjsprotected": "Þū nafast lēafe tō adihtenne þisne JavaScript tramet.",
+       "myprivateinfoprotected": "Þū nafast lēafe tō adihtenne þīne āgnan cȳþþu.",
+       "mypreferencesprotected": "Þū nafast lēafe tō adihtenne þīna foreberunga.",
+       "ns-specialprotected": "Syndrige trametas ne cunnon wesan adihted.",
        "exception-nologin": "Ne inloggod",
        "virus-badscanner": "Yfel gesetedness: Uncūþ wyrmsēcend: <em>$1</em>",
        "virus-unknownscanner": "uncūþ andgund:",
        "minoredit": "Þēos is lytel adihtung",
        "watchthis": "Behealdan þisne tramet",
        "savearticle": "Hordian tramet",
-       "preview": "Fōrebysen",
-       "showpreview": "Īwan fōrebysene",
+       "preview": "Forebysen",
+       "showpreview": "Īwan forebysene",
        "showdiff": "Īwan andwendunga",
-       "summary-preview": "Scortnesse fōrebysen:",
+       "summary-preview": "Scortnesse forebysen:",
        "blockednoreason": "nān racu gifen",
        "whitelistedittext": "Þū scealt $1 to adihtenne trametas.",
        "nosuchsectiontitle": "Ne cann dǣl findan",
        "newarticle": "(Nīwe)",
        "newarticletext": "Þū hæfst hlencan tō tramete þe nū gīet ne stent gefolgod.\nTō scieppene þone tramet, onginn tō wrītenne in þǣre mearce þe is beneoþan (seoh þone [$1 helpes tramet] ymb mā cȳþþu).\nGif þū hider be misfēnge cōme, cnoca þīnes webbsēcendes '''on bæc''' cnæpp.",
        "usercssyoucanpreview": "'''Rǣd:''' Brūc þone \"{{int:Forescēaƿian}}\" cnæpp tō costnienne þīne nīwan css/js wrītunge ǣr hit sīe hordod.",
-       "userjsyoucanpreview": "'''Rǣd:''' Brūc þone 'Īwan fōrebysene' cnæpp tō costienne þīnre nīwan JavaScrip fadunge ǣr þū hordie.",
+       "userjsyoucanpreview": "'''Rǣd:''' Brūc þone \"{{int:showpreview}}\" cnæpp tō costienne þīnre nīwan JavaScrip fadunge ǣr þū hordie.",
        "updated": "(Ednīwed)",
        "note": "'''Gewritincel:'''",
-       "previewnote": "'''Beþenc þe þis is gīet efne fōrebysen.'''\nÞīna andwendunga gīet ne sind hordoda!",
+       "previewnote": "<strong>Beþenc þe þis is gīet efne forebysen.</strong>\nÞīna andwendunga gīet ne sind hordoda!",
        "editing": "Adihtende $1",
        "editingsection": "Adihtende $1 (dǣl)",
        "editingcomment": "Adihtende $1 (nīwe dǣl)",
        "yourdiff": "Fǣgnessa",
        "copyrightwarning2": "Bidde behielde þæt man mæg ealla forðunga tō {{SITENAME}}\nādihtan, hweorfan, oþþe forniman.\nGif þū ne wille man þīn gewrit ādihtan unmildheorte, þonne hīe hēr ne forþsendan.<br />\nÞū behǣtst ēac þæt þū selfa þis write, oþþe efenlǣhtest of sumre\nfolclicum āgnunge oþþe gelīcum frēom horde (sēo $1 for āscungum).\n'''Ne forþsend efenlǣhtscielded weorc būtan þafunge!'''",
        "templatesused": "{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þissum tramete:",
-       "templatesusedpreview": "{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þisre fōrebysene:",
+       "templatesusedpreview": "{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þisre forebysene:",
        "template-protected": "(geborgen)",
        "template-semiprotected": "(sāmborgen)",
        "hiddencategories": "Þes tramet is gesibb {{PLURAL:$1|1 gehȳdedum flocce|$1 gehȳdedra flocca}}:",
        "powersearch-legend": "Manigfeald sēcung",
        "powersearch-ns": "Sēcan in namstedum:",
        "search-external": "Ūtanweard sōcn",
-       "preferences": "Fōreberunga",
-       "mypreferences": "Mīna fōreberunga",
+       "preferences": "Foreberunga",
+       "mypreferences": "Foreberunga",
        "prefs-skin": "Scynn",
-       "skin-preview": "Fōrebysen",
+       "skin-preview": "Forebysen",
        "prefs-rc": "Nīwa andwendunga",
        "prefs-watchlist": "Wæccgetæl",
        "saveprefs": "Hordian",
        "columns": "Sȳla:",
        "searchresultshead": "Sōcn",
        "recentchangescount": "Hū mæniga adihtunga to īwenne gewunelīce:",
-       "savedprefs": "Þīna fōreberunga wurdon gehordod.",
+       "savedprefs": "Þīna foreberunga wurdon gehordod.",
        "timezonelegend": "Tīdgeard",
        "servertime": "Þegntōles tīd is nū:",
        "default": "gewunelic",
        "license": "Lēaf:",
        "license-header": "Lēaf:",
        "nolicense": "Nān is gecoren",
-       "license-nopreview": "(Fōrebysen nis gearu)",
+       "license-nopreview": "(Forebysen nis gearu)",
        "listfiles-summary": "Þes syndriga tramet īweþ ealla forþ gehladena ymelan.",
        "listfiles_search_for": "Sēcan missenendebyrdnesse naman:",
        "imgfile": "ymele",
        "deletepage": "Forlēosan tramet",
        "excontent": "innung wæs: \"$1\"",
        "excontentauthor": "innung wæs: '$1' (and se āna forðiend wæs \"[[Special:Contributions/$2|$2]]\")",
-       "historywarning": "'''Warnung''': Se tramet þe þū wilt forlēosan hafaþ stǣr mid nēan $1 {{PLURAL:$1|fadunge|fadunga}}:",
+       "historywarning": "<strong>Warnung:</strong> Se tramet þe þū wilt forlēosan hafaþ stǣr mid $1 {{PLURAL:$1|fadunge|fadunga}}:",
        "actioncomplete": "Dǣd  is fulfyled",
        "dellogpage": "Forlēosunge ealdhord",
        "deletionlog": "forlēosunge ealdhord",
        "whatlinkshere-hidetrans": "$1 bysene nytta",
        "whatlinkshere-hidelinks": "$1 hlencan",
        "whatlinkshere-filters": "Sifan",
-       "blockip": "Fortȳnan brūcend",
+       "blockip": "Fortȳnan {{GENDER:$1|brūcend|brūcicgan}}",
        "ipbreason": "Racu:",
        "ipbreason-dropdown": "*Gemǣna fortȳnungraca\n** Insettung falsre cȳþþe\n** Animung innunge of trametum\n** Spammlice hlencab tō ūtweardum webbstedum\n** Insettung gedofes oþþe dwolunge in trametas\n** Hwōpende gebǣru oþþe tirgung\n** Miswendung manigra reccinga\n** Uncwēme brūcendnama",
        "ipbsubmit": "Fortȳnan þisne brūcend",
        "import-noarticle": "Nān tramet tō inbringenne!",
        "tooltip-pt-userpage": "Þīn brūcendtramet",
        "tooltip-pt-mytalk": "Þīn mōtung",
-       "tooltip-pt-preferences": "Þīna fōreberunga",
+       "tooltip-pt-preferences": "Þīna foreberunga",
        "tooltip-pt-watchlist": "Getæl trameta þā behieltst þū ymbe andwendunga",
        "tooltip-pt-mycontris": "Getæl þīnra forðunga",
        "tooltip-pt-login": "Man þē byldeþ to inmeldienne; þēah, þis nis abeden",
index 7a907fc..23ae380 100644 (file)
@@ -47,7 +47,9 @@
                        "Kuwaity26",
                        "Calak",
                        "Omda4wady",
-                       "Bibas"
+                       "Bibas",
+                       "Khaled",
+                       "Emara"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "pool-queuefull": "الطابور ملآن",
        "pool-errorunknown": "خطأ غير معروف",
        "pool-servererror": "خدمة العداد غير متاحة ( $1 ).",
+       "poolcounter-usage-error": "خطأ الاستخدام: $1",
        "aboutsite": "عن {{SITENAME}}",
        "aboutpage": "Project:عن",
        "copyright": "المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.",
        "viewyourtext": "يمكنك استعراض و نسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
        "protectedinterface": "توفر هذه الصفحة نص الواجهة للبرنامج على هذا الويكي، وهي محمية لمنع سوء أستخدامها.\nلإضافة أو تغيير الترجمات لجميع مشاريع الويكي، رجاءً أستخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.",
        "editinginterface": "<strong>تنبيه:</strong> تعديل هذه الصفحة سيحفظ في هذا الويكي فقط. لتعميم التعديل على جميع مشاريع ميدياويكي، عدلها في [//translatewiki.net/ مشروع ترجمة الويكي].",
+       "translateinterface": "من أجل إضافة أو تعديل ترجمات في كل مشاريع الويكي يرجى استخدم [//translatewiki.net/ translatewiki.net]، مشروع ميدياويكي لترجمة الواجهة.",
        "cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
        "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
        "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "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إذا اخترت توفيره فسيستخدم لنسبة عمل المستخدم إليه.",
        "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
+       "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «{{int:savearticle}}» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
        "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "summary-preview": "معاينة الملخص:",
        "content-model-text": "نص عادي",
        "content-model-javascript": "جافاسكربت",
        "content-model-css": "CSS",
+       "content-json-empty-object": "غرض فارغ",
+       "content-json-empty-array": "مصفوفة فارغة",
        "duplicate-args-category": "صفحات تستعمل قالبا ببيانات مكررة",
+       "duplicate-args-category-desc": "تحوي هذه الصفحة استدعاءات قالب تستخدم متغيرات مزدوجة مثل <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> أو <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
        "expensive-parserfunction-category": "تجاوزات الدوال المكلفة",
        "post-expand-template-inclusion-warning": "'''تحذير:''' حجم تضمين القالب كبير جدا.\nبعض القوالب لن تضمن.",
        "history-feed-empty": "الصفحة المطلوبة غير موجودة.\nمن المحتمل أن تكون هذه الصفحة قد حذفت من الويكي، أو نقلت.\nحاول [[Special:Search|البحث في الويكي]] عن صفحات جديدة ذات صلة.",
        "rev-deleted-comment": "(أزيل ملخص التعديل)",
        "rev-deleted-user": "(اسم المستخدم تمت إزالته)",
-       "rev-deleted-event": "(Ù\81عÙ\84 Ø§Ù\84سجÙ\84 ØªÙ\85ت Ø¥Ø²Ø§Ù\84تÙ\87)",
+       "rev-deleted-event": "(Ù\85Ø­Ù\8aت ØªÙ\81اصÙ\8aÙ\84 Ø§Ù\84سجÙ\84)",
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
        "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-text-permission": "هذه النسخة قد <strong>أخفيت</strong> ([{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} تفاصيل].)",
        "revdelete-selected-file": "{{PLURAL:$1|النسخة المختارة من الملف|النسخ المختارة من الملف}} لـ [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
        "revdelete-text-text": "المراجعات المحذوفة ستظل تظهر في تاريخ الصفحة، ولكن أجزاءا من محتواها سيكون محجوبا عن الجميع.",
+       "revdelete-text-file": "ستبقى نسخ الملف المحذوفة تظهر في تاريخ الملف، ولكن جزءاً من مضمونها لن تكون متاحة للعموم.",
+       "logdelete-text": "ستبقى أحداث السجل المحذوفة تظهر في السجلات، لكن جزءاً من مضمونها لن يتاح للعموم.",
        "revdelete-text-others": "سيتمكن الإداريون الآخرون على {{SITENAME}} من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا من خلال ذات الواجهة ما لم تطبق قيود إضافية.",
        "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
        "revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم '''فقط''' في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.''",
        "revdelete-legend": "وضع ضوابط رؤية",
        "revdelete-hide-text": "نص المراجعة",
        "revdelete-hide-image": "أخف محتوى الملف",
-       "revdelete-hide-name": "أخÙ\81 Ø§Ù\84Ù\81عÙ\84 Ù\88اÙ\84Ù\87دÙ\81",
+       "revdelete-hide-name": "أخÙ\81 Ø§Ù\84Ù\87دÙ\81 Ù\88اÙ\84Ù\85عÙ\8aار",
        "revdelete-hide-comment": "ملخص التعديل",
        "revdelete-hide-user": "اسم المستخدم/عنوان الآيبي",
        "revdelete-hide-restricted": "أخف البيانات عن الإداريين إضافة إلى الآخرين",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
        "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
+       "mergehistory-fail-toobig": "لا يمكن إجراء دمج التاريخ بسبب تجاوز حدود عدد المراجعات المنقولة {{PLURAL:$1|المراجعة الواحدة|المراجعتين|$1 مراجعات|$1 مراجعة}}.",
        "mergehistory-no-source": "الصفحة المصدر $1 غير موجودة.",
        "mergehistory-no-destination": "الصفحة الهدف $1 غير موجودة.",
        "mergehistory-invalid-source": "الصفحة المصدر يجب أن تكون عنوانا صحيحا.",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
        "editundo": "رجوع",
        "diff-empty": "(لا فرق)",
-       "diff-multi-sameuser": "({{PLURAL:$1|مراجعة متوسطة واحدة|$1 مراجعات متوسطة}} بواسطة نفس المستخدم غير معروضة)",
-       "diff-multi-otherusers": "({{PLURAL:$1|مراجعة متوسطة واحدة|$1 مراجعات متوسطة}} بواسطة {{PLURAL:$2|مستخدم واحد آخر|$2 مستخدما}} غير معروضة)",
+       "diff-multi-sameuser": "({{PLURAL:$1|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة نفس المستخدم غير معروضة)",
+       "diff-multi-otherusers": "({{PLURAL:$1|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة {{PLURAL:$2|مستخدم واحد آخر|مستخدمين اثنين آخرين|$2 مستخدمين|$2 مستخدماً|$2 مستخدم}} غير معروضة)",
        "diff-multi-manyusers": "({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)",
        "difference-missing-revision": "{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.\n\nهذا يحدث عادة عن طريق اتباع وصلة فرق قديمة لصفحة تم حذفها.\nالتفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "searchresults": "نتائج البحث",
        "prefs-tokenwatchlist": "مفتاح",
        "prefs-diffs": "فروقات",
        "prefs-help-prefershttps": "سيتم تفعيل هذا التفضيل عند ولوجوك في المرة القادمة.",
+       "prefswarning-warning": "لقد أجريت تعديلات على تفضيلاتك، ولم تُحفَظ بعد.\nإذا غادرت هذه الصفحة دون أن تنقر على «$1» لن يتم تحديث تفضيلاتك.",
        "prefs-tabs-navigation-hint": "تلميح: يمكنك استخدام مفتاحي السهمين الأيمن والأيسر للتنقل بين الألسنة في قائمة الألسنة.",
        "email-address-validity-valid": "يبدو أن عنوان البريد الإلكتروني صالح",
        "email-address-validity-invalid": "أدخل عنوان بريد إلكتروني صالح",
        "right-browsearchive": "البحث في الصفحات المحذوفة",
        "right-undelete": "استرجاع صفحة",
        "right-suppressrevision": "مراجعة واسترجاع المراجعات المخفية عن مديري النظام",
+       "right-viewsuppressed": "أعرض المراجعات المخفية بواسطة أي مستخدم",
        "right-suppressionlog": "رؤية السجلات السرية",
        "right-block": "منع المستخدمين الآخرين من التعديل",
        "right-blockemail": "منع مستخدم من إرسال بريد إلكتروني",
        "right-protect": "تغيير مستويات الحماية وتعديل الصفحات المحمية",
        "right-editprotected": "تعديل الصفحات التي حمايتها \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "تعديل الصفحات التي حمايتها \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "عدل طريقة محتوى صفحة",
        "right-editinterface": "تعديل واجهة المستخدم",
        "right-editusercssjs": "تعديل ملفات CSS و JS للمستخدمين الآخرين",
        "right-editusercss": "تعديل ملفات CSS للمستخدمين الآخرين",
        "action-viewmywatchlist": "مشاهدة قائمة مراقبتك",
        "action-viewmyprivateinfo": "مشاهدة معلوماتك الخاصة",
        "action-editmyprivateinfo": "تعديل معلوماتك الخاصة",
+       "action-editcontentmodel": "عدل عدل طريقة محتوى صفحة",
        "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|منذ الزيارة الأخيرة}}",
        "enhancedrc-history": "تاريخ",
        "unwatchedpages": "صفحات غير مراقبة",
        "listredirects": "عرض التحويلات",
        "listduplicatedfiles": "قائمة الملفات مع المكررات",
+       "listduplicatedfiles-summary": "هذه قائمة بملفات أحدث نسخة منها تكرر أحدث نسخة من ملف آخر. لا تشمل القائمة إلا الملفات المحلية.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] مكرر في [[$3|{{PLURAL:$2||مكان آخر واحد|مكانين آخرين اثنين|$2 أماكن أخرى|$2 مكاناً آخر|$2مكان آخر}}]].",
        "unusedtemplates": "قوالب غير مستخدمة",
        "unusedtemplatestext": "هذه الصفحة تعرض كل الصفحات في نطاق {{ns:template}} غير المضمنة في صفحة أخرى.\nتذكر بأن تتحقق من الوصلات الأخرى للقوالب قبل حذفها.",
        "wantedpages-badtitle": "عنوان غير صحيح في مجموعة النتائج: $1",
        "wantedfiles": "ملفات مطلوبة",
        "wantedfiletext-cat": "الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].",
+       "wantedfiletext-cat-noforeign": "الملفات التالية مستخدمة لكنها غير موجودة. عدا ذلك، تسرد الصفحات التي تستخدم ملفات غير موجودة في [[:$1]].",
        "wantedfiletext-nocat": "الملفات التالية مستعملة ولكن  غير متوفرة. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة.",
+       "wantedfiletext-nocat-noforeign": "الملفات التالية مستخدمة لكنها غير موجودة.",
        "wantedtemplates": "قوالب مطلوبة",
        "mostlinked": "أكثر الصفحات وصلا",
        "mostlinkedcategories": "أكثر التصنيفات ارتباطا",
        "deleteprotected": "لا يمكنك حذف هذه الصفحة لأنها محمية.",
        "deleting-backlinks-warning": "[[Special:WhatLinksHere/{{FULLPAGENAME}}|تتصل صفحات أخرى]] بالصفحة التي تريد حذفها.",
        "rollback": "استرجاع التعديلات",
-       "rollback_short": "استرجع",
        "rollbacklink": "استرجع",
        "rollbacklinkcount": "استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديلاً|تعديل}}",
        "rollbacklinkcount-morethan": "استرجاع أكثر من {{PLURAL:$1||تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
        "protect-othertime": "وقت آخر:",
        "protect-othertime-op": "وقت آخر",
        "protect-existing-expiry": "تاريخ الانتهاء الموجود: $3، $2",
+       "protect-existing-expiry-infinity": "زمن الانتهاء الموجود: لانهائي",
        "protect-otherreason": "سبب آخر/إضافي:",
        "protect-otherreason-op": "سبب آخر",
        "protect-dropdown": "*أسباب الحماية الشائعة\n** تخريب شديد\n** سبام شديد\n** حرب تحرير معرقلة للعمل المنتج\n** صفحة زوارها كثيرون",
        "unblocked": "[[User:$1|$1]] تم رفع المنع عنه",
        "unblocked-range": "تم إلغاء منع $1",
        "unblocked-id": "منع $1 تم رفعه",
+       "unblocked-ip": "تم رفع المنع عن [[Special:Contributions/$1|$1]].",
        "blocklist": "المستخدمون الممنوعون",
        "ipblocklist": "المستخدمون الممنوعون",
        "ipblocklist-legend": "إيجاد مستخدم ممنوع",
        "thumbnail-temp-create": "تعذر إنشاء ملف الصورة المصغرة المؤقت",
        "thumbnail-dest-create": "تعذر حفظ الصورة المصغرة للوجهة",
        "thumbnail_invalid_params": "محددات التصغير غير صحيحة",
+       "thumbnail_toobigimagearea": "ملف أبعداه أكبر من $1",
        "thumbnail_dest_directory": "غير قادر على إنشاء المجلد الهدف",
        "thumbnail_image-type": "نوع الصورة غير مدعوم",
        "thumbnail_gd-library": "ضبط مكتبة GD غير مكتمل: دالة مفقودة $1",
        "import-logentry-interwiki": "استورد عبر الويكي $1",
        "import-logentry-interwiki-detail": "تم استيراد {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}} من $2",
        "javascripttest": "اختبار جافاسكربت",
-       "javascripttest-title": "تشغيل أختبارات $1",
        "javascripttest-pagetext-noframework": "هذه الصفحة محجوزة لإجراء أختبارات الجافا سكريبت.",
        "javascripttest-pagetext-unknownframework": "إطار اختبار غير معروف \"$1\".",
        "javascripttest-pagetext-frameworks": "الرجاء اختيار أحد أطر الاختبارات التالية: $1",
        "javascripttest-pagetext-skins": "قم باختيار الواجهة لإجراء الإحتبارات بها:",
        "javascripttest-qunit-intro": "راجع [$1 وثيقة الاختبار] على mediawiki.org.",
-       "javascripttest-qunit-heading": "جناح اختبار MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "صفحة المستخدم الخاصة بك",
        "tooltip-pt-anonuserpage": "صفحة المستخدم للأيبي الذي تقوم بالتحرير من خلاله",
        "tooltip-pt-mytalk": "صفحة نقاشك",
        "tooltip-pt-mycontris": "قائمة مساهماتك",
        "tooltip-pt-login": "يفضل أن تسجل الدخول، لكنه ليس إلزاميا.",
        "tooltip-pt-logout": "تسجيل الخروج",
+       "tooltip-pt-createaccount": "نشجعك على عمل حساب وتسجيل دخولك; لكنه غير ضروري على اي حال",
        "tooltip-ca-talk": "نقاش عن صفحة المحتوى",
        "tooltip-ca-edit": "يمكنك تعديل هذه الصفحة.\nمن فضلك استخدم زر العرض المسبق قبل الحفظ.",
        "tooltip-ca-addsection": "ابدأ قسما جديدا",
        "hebrew-calendar-m12-gen": "أيلول",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])",
        "timezone-utc": "ت ع م",
-       "unknown_extension_tag": "وسم امتداد غير معروف \"$1\"",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
+       "duplicate-displaytitle": "<strong>تحذير:</strong> أعرض عنوان \"$2\" تجاهل العنوان المعروض سابقا \"$1\".",
+       "invalid-indicator-name": "<strong>خطأ:</strong> لا يجوز أن تبقى خاصية <code>name</code> لمؤشرات وضع الصفحة فارغةً.",
        "version": "نسخة",
        "version-extensions": "الامتدادات المثبتة",
        "version-skins": "الواجهات المنصبة",
        "version-entrypoints-header-url": "المسار",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath مسار المقالات]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath مسار السكريبت]",
+       "version-libraries": "مكتبات مثبته",
+       "version-libraries-library": "المكتبة",
+       "version-libraries-version": "الإصدارة",
        "redirect": "تحويل حسب رقم الملف أو رقم المستخدم أو رقم الصفحة أو رقم مراجعة",
        "redirect-legend": "تحويل إلى ملف أو صفحة",
        "redirect-summary": "هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي). الاستخدام [[{{#Special:Redirect}}/file/Example.jpg]] أو [[{{#Special:Redirect}}/revision/328429]] أو [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "المراجعة التي حددتها غير موجودة.",
        "dberr-problems": "عذرا! هذا الموقع يعاني من صعوبات تقنية.",
        "dberr-again": "جرب الانتظار بضع دقائق وإعادة التحميل.",
-       "dberr-info": "(غير قادر على الاتصال بخادوم قاعدة البيانات: $1)",
-       "dberr-info-hidden": "(Ù\84ا Ù\8aÙ\85Ù\83Ù\86 Ø§Ù\84Ø¥تصال بخادم قاعدة البيانات)",
+       "dberr-info": "(لا يمكن الوصول إلى خادوم قاعدة البيانات: $1)",
+       "dberr-info-hidden": "(Ù\84ا Ù\8aÙ\85Ù\83Ù\86 Ø§Ù\84اتصال بخادم قاعدة البيانات)",
        "dberr-usegoogle": "يمكنك محاولة البحث من خلال جوجل في الوقت الحاضر.",
        "dberr-outofdate": "لاحظ أن فهارسهم لمحتوانا ربما تكون غير محدثة.",
        "dberr-cachederror": "التالي نسخة مخزنة من الصفحة المطلوبة، وربما لا تكون محدثة.",
        "api-error-stashfailed": "خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.",
        "api-error-publishfailed": "خطأ داخلي: لم ينجح الخادوم في نشر ملف مؤقت",
        "api-error-stasherror": "حدث خطأ أثناء رفع الملف لتخزينه.",
+       "api-error-stashedfilenotfound": "لم يعثر على الملف المحجوب عند محاولة رفعه من الحجب.",
+       "api-error-stashfilestorage": "حدث خطأ أثناء رفع الملف لتخزينه.",
+       "api-error-stashnotloggedin": "يجب عليك تسجيل الدخول لحفظ الملفات في مرفوعاتك.",
+       "api-error-stashwrongowner": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك ليس لك.",
+       "api-error-stashnosuchfilekey": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك غير موجود.",
        "api-error-timeout": "لم يستجب الملقم في الوقت المتوقع.",
        "api-error-unclassified": "حدث خطأ غير معروف",
        "api-error-unknown-code": "خطأ غير معروف : \" $1 \"",
        "right-pagelang": "تغيير لغة الصفحة",
        "action-pagelang": "تغيير لغة الصفحة",
        "log-name-pagelang": "تغيير سجل الصفحة",
+       "log-description-pagelang": "هذا سجل تغيرات في صفحة اللغات.",
        "logentry-pagelang-pagelang": " {{GENDER:$2|غيّر|غيّرت}} $1 لغة الصفحة «$3» من $4 إلى $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (مفعل)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''معطل''')",
        "mediastatistics": "إحصاءات الميديا",
+       "mediastatistics-summary": "إحصاءات عن أنماط الملفات المرفوعة، وتشمل أحدث نسخة من الملف فقط، حيث تستبعد النسخ القديمة أو المحذوفة من الملفات.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|بايت واحد|بايتان اثنان|$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-text": "نصي",
        "mediastatistics-header-executable": "تنفيذية",
        "mediastatistics-header-archive": "صيغ مضغوطة",
-       "json-error-syntax": "خطأ صياغة"
+       "json-warn-trailing-comma": "تمت إزالة {{PLURAL:$1|فاصلة انتهائية واحدة|فاصلتين انتهائيتين|$1 فاصلات انتهائية|$1 فاصلة انتهائية}} من JSON",
+       "json-error-unknown": "وقعت مشكلة مع JSON. رسالة الخطأ: $1",
+       "json-error-ctrl-char": "خطأ في محرف التحكم، ربما نتيجة سوء ترميزه.",
+       "json-error-syntax": "خطأ صياغة",
+       "json-error-utf8": "خطأ في تشكيل محارف UTF-8، ربما نتيجة سوء ترميزها.",
+       "json-error-recursion": "يوجد قيد الترميز إشارة مرجعية حلقية أو أكثر",
+       "json-error-inf-or-nan": "قيد الترميز قيمة أو أكثر من نمط NAN أو INF",
+       "json-error-unsupported-type": "نمط قيمة لا يمكن تشفيره قد أعطي"
 }
index 6b0eb78..01a0d29 100644 (file)
@@ -41,7 +41,7 @@
        "tog-shownumberswatching": "লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক",
        "tog-oldsig": "বৰ্তমানৰ স্বাক্ষৰ:",
        "tog-fancysig": "স্বাক্ষৰ ৱিকিটেক্সট হিচাপে ব্যৱহাৰ কৰক (স্বয়ংক্ৰিয় সংযোগ অবিহনে)",
-       "tog-uselivepreview": "সমà§\8dপাদনাৰ à¦²à¦\97à§\87 à¦²à¦\97à§\87 à¦\96à¦\9aৰা à¦¦à§\87à¦\96à§\81ৱাà¦\93à¦\95 (পৰà§\80à¦\95à§\8dষামà§\82লà¦\95)",
+       "tog-uselivepreview": "তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dৰাà¦\95à§\8dâ\80\8cদৰà§\8dশন à¦¬à§\8dযৱহাৰ à¦\95ৰà¦\95",
        "tog-forceeditsummary": "সম্পাদনাৰ সাৰাংশ নিদিলে মোক জনাব",
        "tog-watchlisthideown": "মোৰ লক্ষ্য-তালিকাত মোৰ সম্পাদনা নেদেখুৱাব",
        "tog-watchlisthidebots": "মোৰ লক্ষ্য-তালিকাত ব'টে কৰা সম্পাদনা নেদেখুৱাব",
        "otherlanguages": "আন ভাষাসমূহত",
        "redirectedfrom": "($1ৰ পৰা পুনঃনিৰ্দেশিত)",
        "redirectpagesub": "পুনঃনিৰ্দেশিত পৃষ্ঠা",
+       "redirectto": "পুনঃনিৰ্দেশ কৰা হৈছে:",
        "lastmodifiedat": "এই পৃষ্ঠাটো শেষবাৰৰ কাৰণে $1 তাৰিখে $2 বজাত সলনি কৰা হৈছিল।",
        "viewcount": "এই পৃষ্ঠাটো {{PLURAL:$1|এবাৰ|$1 বাৰ}} চোৱা হৈছে।",
        "protectedpage": "সুৰক্ষিত পৃষ্ঠা",
        "pool-queuefull": "পুল কিউ (pool queue) পূৰ্ণ",
        "pool-errorunknown": "অপৰিচিত ত্ৰুটি",
        "pool-servererror": "পুল কাউণ্টাৰ সেৱা উপলব্ধ নহয় ($1)।",
+       "poolcounter-usage-error": "ব্যৱহাৰ ত্ৰুটি: $1",
        "aboutsite": "{{SITENAME}}ৰ বিষয়ে",
        "aboutpage": "Project:ইতিবৃত্ত",
        "copyright": "আন একো উল্লেখ নাথাকিলে এই বিষয়বস্তু $1 ৰ আওতাত উপলব্ধ।",
        "hidetoc": "দেখুৱাব নালাগে",
        "collapsible-collapse": "সংকোচন",
        "collapsible-expand": "বহলাওক",
+       "confirmable-confirm": "{{GENDER:$1|আপুনি}} নিশ্চিতনে?",
        "confirmable-yes": "হয়",
        "confirmable-no": "নহয়",
        "thisisdeleted": "$1 চাওক বা সলনি কৰক?",
        "viewsourcetext": "আপুনি এই পৃষ্ঠাটোৰ উৎস চাব আৰু নকল কৰিব পাৰে",
        "viewyourtext": "আপুনি '''আপোনাৰ সম্পাদনাসমূহ'''ৰ উৎস চাব আৰু এই পৃষ্ঠালৈ নকল কৰিব পাৰে:",
        "protectedinterface": "এই পৃষ্ঠাই ৱিকি ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা প্ৰদান কৰে আৰু ইয়াক সুৰক্ষিত কৰি ৰখা হৈছে।\nসকলো ৱিকিৰ বাবে অনুবাদ যোগ কৰিবলৈ বা সলাবলৈ অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।",
-       "editinginterface": "'''সাৱধানবাণী:''' আপুনি যিখন পৃষ্ঠা সম্পাদনা কৰিছে সেইখন এই ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয়।\nএই পৃষ্ঠাৰ সাল-সলনিয়ে আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব।\nসকলো ৱিকিৰ বাবে অনুবাদৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক ।",
+       "editinginterface": "<strong>সাৱধানবাণী:</strong> আপুনি সম্পাদনা কৰি থকা পৃষ্ঠাটো এই ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয়।\nএই পৃষ্ঠাৰ সাল-সলনিয়ে এই ৱিকিত আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব।",
+       "translateinterface": "সকলো ৱিকিৰ বাবে অনুবাদ যোগ বা সালসলনি কৰিবৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প //translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।",
        "cascadeprotected": "এই পৃষ্ঠাটো সম্পাদনাৰ পৰা সুৰক্ষিত কাৰণ এই {{PLURAL:$1|পৃষ্ঠা, যিটো|পৃষ্ঠা, যিবোৰ}} \"প্ৰপাতাকাৰ\" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: \n$2",
        "namespaceprotected": "আপোনাৰ '''$1''' নামস্থানৰ পৃষ্ঠাসমূহ সম্পাদনা কৰাৰ অধিকাৰ নাই।",
        "customcssprotected": "এই CSS পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।",
        "createaccount-text": "আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4)ত \"$2\" নামৰ কোনোবাই, \"$3\" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।\n\nযদি এইয়া ভুলতে হৈছে, তেনেহলে আপুনি এই বাৰ্তাটো অবজ্ঞা কৰিব পাৰে ।",
        "login-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক ।",
        "login-abort-generic": "আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল",
+       "login-migrated-generic": "আপোনাৰ একাউণ্ট স্থানান্তৰিত কৰা হৈছে, আৰু আপোনাৰ ব্যৱহাৰকাৰী নাম এই ৱিকিত বৰ্তমান নাই।",
        "loginlanguagelabel": "ভাষা: $1",
        "suspicious-userlogout": "আপোনাৰ প্ৰস্থানৰ অনুৰোধ বাতিল কৰা হৈছে কাৰণ হয়তো আপোনাৰ ব্ৰাউজাৰ অসম্পূৰ্ণ নতুবা পূৰ্বৱতী তথ্য পঠিয়াইছে ।",
        "createacct-another-realname-tip": "প্ৰকৃত নাম দিয়াটো বৈকল্পিক।\nআপুনি নামটো দিলে সেইটো আপোনাৰ বৰঙণিসমূহৰ বাবে স্বীকৃতি প্ৰদানত ব্যৱহাৰ কৰা হ'ব।",
        "showpreview": "খচৰা চাওক",
        "showdiff": "সালসলনিবোৰ দেখুৱাওক",
        "blankarticle": "<strong>Warning:</strong>আপুনি সৃষ্টি কৰি থকা পৃষ্ঠাটো খালি।\nযদি আপুনি \"{{int:savearticle}}\" বুটামটোত আকৌ ক্লিক কৰে তেন্তে বিষয়বস্তু অবিহনেই পৃষ্ঠাটো সৃষ্টি হ'ব।",
-       "anoneditwarning": "<span style=\"color:red;\">'''সাৱধান:''' আপুনি প্ৰৱেশ কৰা নাই ।</span> \nএই পৃষ্ঠাৰ ইতিহাসত আপোনাৰ আই পি ঠিকনা সংৰক্ষিত কৰা হ'ব।",
+       "anoneditwarning": "<strong>সতৰ্কবাণী:</strong> আপুনি প্ৰৱেশ কৰা নাই। আপুনি কোনো সম্পাদনা কৰিলে আপোনাৰ আই পি ঠিকনা মুকলিকৈ দৃশ্যমান হ'ব। যদি আপুনি <strong>[$1 লগ্‌ ইন]</strong> বা <strong>[$2 এটা একাউণ্ট সৃষ্টি কৰে]</strong>, তেন্তে আন সুবিধা পোৱাৰ লগতে আপোনাৰ সম্পাদনাসমূহ আপোনাৰ ব্যৱহাৰকাৰী নামত সংৰক্ষিত হ'ব।",
        "anonpreviewwarning": "''আপুনি প্ৰৱেশ কৰা নাই। আপোনাৰ সম্পাদনা সাঁচিলে আপোনাৰ আই-পি ঠিকনা এই পৃষ্ঠাৰ ইতিহাসত সংৰক্ষিত হ'ব।\"",
        "missingsummary": "'''স্মাৰক:''' আপুনি সম্পাদনা সাৰাংশ দিয়া নাই।\nআপুনি আৰু এবাৰ সংৰক্ষণৰ বাবে ক্লিক কৰিলে সাৰাংশৰ অবিহনে সংৰক্ষিত হব।",
+       "selfredirect": "<strong>সতৰ্কবাণী:</strong> আপুনি একেটা নামলৈকে এই পৃষ্ঠাটো পুনঃনিৰ্দেশ কৰিব বিচাৰিছে। আপুনি হয়তো পুনঃনিৰ্দেশৰ বাবে ভুল লক্ষ্য নিৰ্ধাৰণ কৰিছে, বা ভুল পৃষ্ঠা সম্পাদনা কৰিছে।\nআপুনি আকৌ \"{{int:savearticle}}\" ক্লিক কৰিলে পুনঃনিৰ্দেশটো সৃষ্টি হ'ব।",
        "missingcommenttext": "অনুগ্ৰহ কৰি তলত মন্তব্য এটা দিয়ক।",
        "missingcommentheader": "'''স্মাৰক:''' আপুনি এই মন্তব্যটোত শিৰোনামা দিয়া নাই।\nযদি আকৌ এবাৰ যদি \"{{int:savearticle}}\" টিপে, তেনেহলে সম্পাদনা শিৰোনামা অবিহনে সংৰক্ষিত হব।",
        "summary-preview": "সাৰাংশৰ খচৰা:",
        "history-feed-empty": "অনুৰোধ কৰা পৃষ্ঠাৰ কোনো অস্বিত্ব নাই।\nহয়তো ইয়াক বিলোপ কৰা হৈছে অথবা ইয়াৰ নাম সলনি কৰা হৈছে।\n[[Special:Search|সন্ধান]] ব্যৱহাৰ কৰি প্ৰাসংগিক পৃষ্ঠাসমূহ চাওক।",
        "rev-deleted-comment": "(সম্পাদনা সাৰাংশ আঁতৰোৱা হ'ল)",
        "rev-deleted-user": "(সদস্যনাম আঁতৰোৱা হ’ল)",
-       "rev-deleted-event": "(à¦\85ভিলà§\87à¦\96 à¦\95াৰà§\8dয আঁতৰোৱা হ'ল)",
+       "rev-deleted-event": "(ল'à¦\97 à¦¸à¦¬à¦¿à¦¶à§\87ষ আঁতৰোৱা হ'ল)",
        "rev-deleted-user-contribs": "[সদস্যনাম বা আই-পি ঠিকনা আঁতৰোৱা হ'ল - সম্পাদনা বৰঙনিসমূহৰ পৰা আঁৰ কৰা হৈছে]",
        "rev-deleted-text-permission": "পৃষ্ঠাৰ এই সংশোধনটি '''বিলোপ''' কৰা হ'ল ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অবলুপ্তি অভিলেখত]",
        "rev-deleted-text-unhide": "পৃষ্ঠাখনৰ এই সংশোধনটো '''বিলোপ''' কৰা হৈছে | \nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অৱলুপ্তি অভিলেখত]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
        "querypage-disabled": "কাৰ্য্যগত কাৰণত এই বিশেষ পৃষ্ঠাটো নিষ্ক্ৰিয় কৰা হৈছে।",
        "booksources": "গ্ৰন্থৰ উৎস সমূহ",
        "booksources-search-legend": "গ্ৰন্থ উৎস অনুসন্ধান",
+       "booksources-search": "সন্ধান",
        "booksources-text": "নতুন আৰু পুৰণি কিতাপ বেচা চাইটসমূহৰ সংযোগ তলত দিয়া হৈছে, তাত আপুনি বিচৰা কিতাপসমূহৰ বিষয়ে অধিক তথ্যও পাব পাৰে:",
        "booksources-invalid-isbn": "আপুনি দিয়া ISBN সম্ভৱতঃ অবৈধ; মূল উৎসৰ পৰা তুলি লওঁতে হ’ব পৰা ভুলৰ বাবে পৰীক্ষা কৰক ।",
        "specialloguserlabel": "প্ৰদৰ্শনকাৰী:",
        "delete-toobig": "এই পৃষ্ঠাটোৰ সম্পাদনা ইতিহাস অতি দীঘল, $1 {{PLURAL:$1|টা সংশোধনৰো|টা সংশোধনৰো}} বেছি ।\n{{SITENAME}}ৰ আকস্মিক ক্ষতি ৰোধ কৰিবলৈ এনে পৃষ্ঠাৰ ইতিহাস বিলোপ কৰাত সীমাবদ্ধতা আৰোপ কৰা হৈছে ।",
        "delete-warning-toobig": "এই পৃষ্ঠাখনৰ সম্পাদনা ইতিহাস অতি দীঘল, $1 {{PLURAL:$1|টা সংশোধনৰো|টা সংশোধনৰো}} বেছি ।\nইয়াক বিলোপ কৰিলে {{SITENAME}} ৰ তথ্যভঁৰালৰ কাৰ্য্যকাৰীতাত সমস্যা হ’ব পাৰে;\nসাৱধানেৰে আগ বাঢ়ক ।",
        "rollback": "সম্পাদনা পূৰ্ববৎ কৰক",
-       "rollback_short": "পূৰ্ববৎ কৰক",
        "rollbacklink": "পূৰ্ববৎ কৰক",
        "rollbacklinkcount": "$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনাসমূহ}} পূৰ্বৱত কৰক",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনাসমূহ}} পূৰ্বৱত কৰক",
        "movenotallowedfile": "নথিখন স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।",
        "cant-move-user-page": "সদস্য পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনাৰ অনুমতি নাই (উপ-পৃষ্ঠাৰ বাহিৰে)।",
        "cant-move-to-user-page": "সদস্যপৃষ্ঠালৈ কোনো পৃষ্ঠা স্থানান্তৰ কৰাৰ অনুমতি আপোনাৰ নাই (কেৱল সদস্য উপপৃষ্ঠাৰ বাহিৰে ) ।",
+       "cant-move-category-page": "শ্ৰেণী পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই।",
+       "cant-move-to-category-page": "কোনো পৃষ্ঠাক শ্ৰেণী পৃষ্ঠালৈ স্থানান্তৰ কৰিবৰ বাবে আপোনাৰ অনুমতি নাই।",
        "newtitle": "নতুন শিৰোনামালৈ:",
        "move-watch": "এই পৃষ্ঠাটো লক্ষ্য কৰক",
        "movepagebtn": "পৃষ্ঠাটো স্থানান্তৰ কৰক",
        "import-logentry-interwiki": "আন্তঃৱিকি-স্থানান্তৰিত $1",
        "import-logentry-interwiki-detail": "$2ৱে কৰা $1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}",
        "javascripttest": "জাভাস্ক্ৰিপ্ট পৰীক্ষা।",
-       "javascripttest-title": "$1 পৰীক্ষাসমূহ চলোৱা হৈছে",
        "javascripttest-pagetext-noframework": "এই পৃষ্ঠাটো জাভাস্ক্ৰিপ্ট পৰীক্ষা চলোৱাৰ বাবে সংৰক্ষিত।",
        "javascripttest-pagetext-unknownframework": "অজ্ঞাত সম্পৰীক্ষা ফ্ৰেমৱৰ্ক \"$1\"।",
        "javascripttest-pagetext-frameworks": "অনুগ্ৰহ কৰি তলৰ যিকোনো এটা সম্পৰীক্ষা ফ্ৰেমৱৰ্ক বাছনি কৰক: $1",
        "javascripttest-pagetext-skins": "পৰীক্ষা কৰিবলৈ আৱৰণ এখন বাছনি কৰক:",
        "javascripttest-qunit-intro": "mediawiki.org-ত [$1 পৰীক্ষা নথিকৰণ] চাওক।",
-       "javascripttest-qunit-heading": "মিডিয়াৱিকি জাভাস্ক্ৰিপ্ট QUnit পৰীক্ষা চুট",
        "tooltip-pt-userpage": "আপোনাৰ সদস্য পৃষ্ঠা",
        "tooltip-pt-anonuserpage": "যি আই.পি. ঠিকনাৰ পৰা আপুনি সম্পাদনা কৰিছে তাৰ সদস্য পৃষ্ঠা",
        "tooltip-pt-mytalk": "আপোনাৰ আলোচনা পৃষ্ঠা",
        "tooltip-feed-atom": "এই পৃষ্ঠাৰ বাবে এটম ভুক্তি",
        "tooltip-t-contributions": "এই সদস্যজনৰ অৰিহনাসমূহৰ সূচী চাওক",
        "tooltip-t-emailuser": "এই সদস্যজনলৈ ই-মেইল পঠাওক",
+       "tooltip-t-info": "এই পৃষ্ঠাৰ বিষয়ে অধিক তথ্য",
        "tooltip-t-upload": "ফাইল আপল'ডৰ বাবে",
        "tooltip-t-specialpages": "বিশেষ পৃষ্ঠাসমূহৰ সূচী",
        "tooltip-t-print": "এই পৃষ্ঠাৰ ছপা উপযোগী সংস্কৰণ",
        "newimages-summary": "এই বিশেষ পৃষ্ঠাটোত শেহতীয়াকৈ আপল'ড কৰা ফাইলসমূহ দেখিব।",
        "newimages-legend": "ছেকনী",
        "newimages-label": "নথিৰ নাম (বা তাৰ এটা অংশ)",
+       "newimages-showbots": "ব'টৰ আপল'ড দেখুৱাওক",
        "noimages": "চাবলৈ একো নাই ।",
        "ilsubmit": "সন্ধান কৰক",
        "bydate": "তাৰিখ অনুযায়ী",
        "watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
        "watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-       "unknown_extension_tag": "অজ্ঞাত এক্সটেনচন টেগ \"$1\"",
        "duplicate-defaultsort": "'''সাৱধান!''' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক \"$2\"-এ আগৰ ক্ৰমসূচক \"$1\"ক বিস্থাপিত কৰিছে।",
        "version": "সংস্কৰণ",
        "version-extensions": "ইন্‌ষ্টল কৰা এক্সটেনচনসমূহ",
index 0bae445..d82ffbb 100644 (file)
        "watchlisttools-edit": "Ver y editar la llista de siguimientu",
        "watchlisttools-raw": "Editar la llista de siguimientu (ensin formatu)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|alderique]])",
-       "unknown_extension_tag": "Etiqueta d'estensión \"$1\" desconocida",
        "duplicate-defaultsort": "Avisu: La clave d'ordenación predeterminada \"$2\" anula la clave d'ordenación anterior \"$1\".",
        "duplicate-displaytitle": "<strong>Avisu:</strong> El títulu a amosar \"$2\" anula el títulu anterior \"$1\".",
        "version": "Versión",
diff --git a/languages/i18n/awa.json b/languages/i18n/awa.json
new file mode 100644 (file)
index 0000000..1dfdb60
--- /dev/null
@@ -0,0 +1,1612 @@
+{
+       "@metadata": {
+               "authors": [
+                       "1AnuraagPandey"
+               ]
+       },
+       "tog-underline": "कड़ि अधोरेखन:",
+       "tog-hideminor": "अबहिन कय बदलावमें छोट बदलाव लुकुआवा जाय",
+       "tog-hidepatrolled": "अबहिन कय बदलावमें परीक्षित बदलाव लुकुआवा जाय",
+       "tog-newpageshidepatrolled": "नवा पन्नन कय सूची में परीक्षित पन्ना लुकुआवा जाय",
+       "tog-extendwatchlist": "खाली हालिए कय नाहीं, बल्कि कुल बदलाव कय देखावे कय लिए ध्यानसूची कय विस्तारित करा जाय",
+       "tog-usenewrc": "अभिन कय बदलाव मे अउर ध्यानसूची में बदलाव कय पन्ना कय अनुसार समूह में बाँटा जाय",
+       "tog-numberheadings": "शीर्षक स्व-क्रमांकित करा जाय",
+       "tog-showtoolbar": "सम्पादन औज़ारपट्टी देखावो",
+       "tog-editondblclick": "दुई क्लिक से पन्ना संपादित करा जाय",
+       "tog-editsectiononrightclick": "अनुभाग शीर्षक पे दायाँ क्लिक कई कय अनुभाग सम्पादित कीन जाय",
+       "tog-watchcreations": "हमार बनावा पन्ना अव हमार अपलोड करल फाइल कय हमरे ध्यानसूची में जोडो",
+       "tog-watchdefault": "हमार सम्पादन करल पन्ना अव फाइल कय ध्यानसूची में जोडो",
+       "tog-watchmoves": "हमरे द्वारा  घुसकाइल पन्ना अव फ़ाइल कय हमरे ध्यानसूची में जोडो",
+       "tog-watchdeletion": "हमार हटावल पन्ना अव फाइल कय हमरे ध्यानसूची में जोडो",
+       "tog-watchrollback": "हमार प्रत्यापन्न (रोलबैक) करल  पन्ना कय हमरे ध्यानसूची में जोडो।",
+       "tog-minordefault": "हमार कुल सम्पादन छोट बदलाव होय",
+       "tog-previewontop": "सम्पादन बक्सा कय ऊप्पर झलक देखावो",
+       "tog-previewonfirst": "पहिला सम्पादन कय बाद झलक देखावो",
+       "tog-enotifwatchlistpages": "हमरे ध्यानसूची में दर्ज कवनो भी पन्ना अव फ़ाइल में परिवर्तन होय पे हम्मै ई-मेल करो",
+       "tog-enotifusertalkpages": "हमरे बातचीत पन्ना मे बदलाव होय पे हम्मै ई-मेल करो",
+       "tog-enotifminoredits": "छोटे परिवर्तन कय लिए भी हम्म्य ई-मेल पठवो",
+       "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई-मेल ठाँव देखावो",
+       "tog-shownumberswatching": "ध्यान रख्खय वाले सदस्यन् कय संख्या देखावो",
+       "tog-oldsig": "अभिन कय हस्ताक्षर:",
+       "tog-fancysig": "हस्ताक्षर कय विकिपाठ जैसन मानों (बिना स्वचालित कड़ी कय)",
+       "tog-uselivepreview": "सजिव देखो",
+       "tog-forceeditsummary": "यदि सम्पादन सारांश नाई दिहा है तो हम्मै बतावा जाय",
+       "tog-watchlisthideown": "हमरे ध्यानसूची से हमार करल बदलाव लुकुवाओ",
+       "tog-watchlisthidebots": "हमरे ध्यानसूची से बॉट कय करल परिवर्तन लुकुवाओ",
+       "tog-watchlisthideminor": "हमरे ध्यानसूची से छोट बदलाव लुकुवाओ",
+       "tog-watchlisthideliu": "हमरे ध्यानसूची में ल़ाग इन करल सदस्यन् कय सम्पादन ना देखावा जाय",
+       "tog-watchlisthideanons": "आइ॰पी सदस्यन् कय करल सम्पादन हमरे ध्यानसूची में ना देखाओ",
+       "tog-watchlisthidepatrolled": "परीक्षित सम्पादन हमरे ध्यानसूची में लुकुवाओ",
+       "tog-ccmeonemails": "हमरे द्वारा अउर सदस्यन् कय पठावल् ई-मेल कय प्रति हमहु कय पठओ",
+       "tog-diffonly": "अवतरणन् में अन्तर देखावत समय पुरान अवतरण ना देखाओ",
+       "tog-showhiddencats": "लुकुवावल श्रेणि देखाओ",
+       "tog-norollbackdiff": "सम्पादन वापिस लेवेक बाद अन्तर ना देखाओ",
+       "tog-useeditwarning": "जब हम कवनो सम्पादन पन्ना कय बिना सहेजे बदलाव कय साथे छोड दि तव हम्मै बतावो।",
+       "tog-prefershttps": "लॉगिन करेक बाद हमेशा सुरक्षित कनेक्शन कय प्रयोग करो",
+       "underline-always": "हमेशा",
+       "underline-never": "कब्बो नाई",
+       "underline-default": "देखावट या ब्राउज़र डिफ़ॉल्ट",
+       "editfont-style": "सम्पादन क्षेत्र कय मुद्रलिपि शैली:",
+       "editfont-default": "ब्राउज़र डिफ़ॉल्ट",
+       "editfont-monospace": "एकल स्थल मुद्रलिपि",
+       "editfont-sansserif": "बिना ऩोक वाला मुद्रलिपि",
+       "editfont-serif": "ऩोक वाला मुद्रलिपि",
+       "sunday": "अत्तवार",
+       "monday": "सोम",
+       "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": "डिसे.",
+       "january-date": "जनवरी $1",
+       "february-date": "फेब्रुअरी $1",
+       "march-date": "मार्च $1",
+       "april-date": "अप्रैल $1",
+       "may-date": "मई $1",
+       "june-date": "जून $1",
+       "july-date": "जुलाई $1",
+       "august-date": "अगस्त $1",
+       "september-date": "सेप्टेम्बर $1",
+       "october-date": "अक्टूबर $1",
+       "november-date": "नोभेम्बर $1",
+       "december-date": "डिसेम्बर $1",
+       "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणिन्}}",
+       "category_header": "\"$1\" श्रेणी में पन्ना",
+       "subcategories": "उपश्रेणिन्",
+       "category-media-header": "\"$1\" श्रेणी में पन्ना",
+       "category-empty": "''ई श्रेणी में यह समय कवनो पन्ना या मीडिया नाई है।''",
+       "hidden-categories": "{{PLURAL:$1|लुकुवावल श्रेणी|लुकुवावल श्रेणिन् कुल}}",
+       "hidden-category-category": "लुकुवावल श्रेणिन् कुल",
+       "category-subcat-count": "{{PLURAL:$2|इ श्रेणी मा खालि निचे दिहल उपश्रेणीन कुल हँय|इ श्रेणी मा निचे दिहल {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणिन कुल}} हँय, कुल उपश्रेणि $2}}",
+       "category-subcat-count-limited": "ई श्रेणी में निचे दिहल {{PLURAL:$1|उपश्रेणी हँय|$1 उपश्रेणिन कुल हँय}}।",
+       "category-article-count": "{{PLURAL:$2|इ श्रेणी में खालि निचे दिहल पन्ना है।|इ श्रेणी में निचे दिहल{{PLURAL:$1|पन्ना है|$1 पन्ना हैं}}, सब पन्ना $2}}",
+       "category-article-count-limited": "निचे दिहल {{PLURAL:$1|पन्ना|$1 पन्ना}} इ श्रेणी में है।",
+       "category-file-count": "{{PLURAL:$2|इ श्रेणी में खालि निचे दिहल फ़ाइल है।|इ श्रेणी में निचे दिहल {{PLURAL:$1|फ़ाइल|$1 फ़ाइल}} है, सब फ़ाइल $2}}",
+       "category-file-count-limited": "निचे दिहल {{PLURAL:$1|पन्ना|$1 पन्ना}} इ श्रेणी में है।",
+       "listingcontinuesabbrev": "आगे.",
+       "index-category": "सूचीबद्ध पन्ना",
+       "noindex-category": "असूचीबद्ध पन्ना",
+       "broken-file-category": "टूटल फ़ाइल कड़ि वाला पन्ना",
+       "about": "कय बारे में",
+       "article": "लेख",
+       "newwindow": "(नवा विंडो में खुलत अहै)",
+       "cancel": "रद्द करा जाय",
+       "moredotdotdot": "अउर...",
+       "morenotlisted": "ई पूरा सूची नाई होय।",
+       "mypage": "पन्ना",
+       "mytalk": "बातचीत",
+       "anontalk": "ई आइ॰पी कय खरतिन बातचीत",
+       "navigation": "घुमाई",
+       "and": "&#32;अउर",
+       "qbfind": "खोजा जाय",
+       "qbbrowse": "ब्राउज़",
+       "qbedit": "सम्पादन",
+       "qbpageoptions": "ई पन्ना",
+       "qbmyoptions": "हमार पन्ना",
+       "faq": "बहुत  पूछा जाय वाला प्रश्न",
+       "faqpage": "Project:ढेर पूछा जाय वाला सवाल",
+       "actions": "काम कुल",
+       "namespaces": "नामस्थान",
+       "variants": "संस्करण",
+       "navigation-heading": "दिक्चालन सूची",
+       "errorpagetitle": "त्रुटि",
+       "returnto": "$1 मे लौटो।",
+       "tagline": "{{SITENAME}} से",
+       "help": "मदद",
+       "search": "खोजा जाय",
+       "searchbutton": "खोजा जाय",
+       "go": "जावा जाय",
+       "searcharticle": "जावा जाय",
+       "history": "पन्ना कय इतिहास",
+       "history_short": "इतिहास",
+       "updatedmarker": "हमरे अन्तिम दाँइ आवे कय बाद कय अपडेट",
+       "printableversion": "छापए लायक संस्करण",
+       "permalink": "स्थायी कड़ी",
+       "print": "प्रिंट करा जाय",
+       "view": "देखा जाय",
+       "view-foreign": "$1 पे देखा जाय",
+       "edit": "सम्पादन",
+       "edit-local": "स्थानीय विवरण सम्पादन",
+       "create": "बनावो",
+       "create-local": "स्थानीय विवरण जोडो",
+       "editthispage": "ई पन्ना कय सम्पादन करा जाय",
+       "create-this-page": "ई पन्ना बनावा जाय",
+       "delete": "मिटावा जाय",
+       "deletethispage": "ई पन्ना मेटावा जाय",
+       "undeletethispage": "ई पन्ना कय पुनर्स्थापित करा जाय।",
+       "undelete_short": "{{PLURAL:$1|एक मेटाई गय}} बदलाव वापिस लाओ",
+       "viewdeleted_short": "देखा जाय {{PLURAL:$1|एक मेटावल सम्पादन|$1 मेटावल सम्पादन}}",
+       "protect": "सुरक्षित करा जाय",
+       "protect_change": "बदला जाय",
+       "protectthispage": "इ पन्ना कय सुरक्षित करा जाय",
+       "unprotect": "असुरक्षित",
+       "unprotectthispage": "ई पन्ना कय सुरक्षा स्तर बदला जाय",
+       "newpage": "नँवा पन्ना",
+       "talkpage": "ई पन्ना कय बारे मे चर्चा करा जाय",
+       "talkpagelinktext": "बातचीत",
+       "specialpage": "विशेष पन्ना",
+       "personaltools": "वैयक्तिक औज़ार",
+       "articlepage": "सामग्री पन्ना देखा जाय",
+       "talk": "चर्चा",
+       "views": "दर्शाव",
+       "toolbox": "साधन पेटी",
+       "userpage": "सदस्य पन्ना देखो",
+       "projectpage": "परियोजना पन्ना देखा जाय",
+       "imagepage": "फ़ाइल पन्ना देखा जाय",
+       "mediawikipage": "सनेशा पन्ना देखा जाय",
+       "templatepage": "साँचा पन्ना देखा जाय",
+       "viewhelppage": "मदद पन्ना देखा जाय",
+       "categorypage": "श्रेणी पन्ना  देखा जाय",
+       "viewtalkpage": "चर्चा देखा जाय",
+       "otherlanguages": "अउर भाषा सब",
+       "redirectedfrom": "($1 से पुनर्निर्देशित)",
+       "redirectpagesub": "पुनर्निर्देश पन्ना",
+       "redirectto": "पुनर्निर्देश करा जाय:",
+       "lastmodifiedat": "इ पन्ना कय पिछला बदलाव $1 कय $2 बजे भवा रहा।",
+       "viewcount": "ई पन्ना {{PLURAL:$1|एक|$1}} दाइँ देख़ गा है।",
+       "protectedpage": "सुरक्षित पन्ना",
+       "jumpto": "यहँ जावा जाय:",
+       "jumptonavigation": "घुमाई",
+       "jumptosearch": "खोजा जाय",
+       "view-pool-error": "क्षमा करा जाय, यह समय सर्वर पे ढेर बोझ है।\nबहुत ढेर प्रयोक्ता लोग इ पन्ना कय देखेक प्रयास करत हँय।\nतनी कुछ समय अगोरिकय फिर से इ पन्ना कय देखेक प्रयास करा जाय।\n\n$1",
+       "generic-pool-error": "क्षमा करा जाय, यह समय सर्वर पे ढेर बोझ है।\nबहुत ढेर प्रयोक्ता लोग इ चिज कय देखेक प्रयास करत हँय।\nतनी कुछ समय अगोरिकय फिर से इ चिज कय देखेक प्रयास करा जाय।\n\n$1",
+       "pool-timeout": "तालाबन्दी कय लिए अगोरे कय समय खतम",
+       "pool-queuefull": "पूल पंक्ति भरा है",
+       "pool-errorunknown": "अज्ञात त्रुटि",
+       "pool-servererror": "पूल काउंटर सेवा उपलब्ध नाई है ($1)।",
+       "poolcounter-usage-error": "प्रयोग त्रुटि:$1",
+       "aboutsite": "{{SITENAME}} कय बारे मे",
+       "aboutpage": "Project:परिचय",
+       "copyright": "उपलब्ध चिज $1 कय अधीन है जब तक अलग से उल्लेख नाई कई गा है।",
+       "copyrightpage": "{{ns:project}}:कॉपीराइट",
+       "currentevents": "अभिन कय घटना सब",
+       "currentevents-url": "Project:अभिन कय घटना सब",
+       "disclaimers": "अस्वीकरण",
+       "disclaimerpage": "Project:साधारण अस्वीकरण",
+       "edithelp": "सम्पादन सहायता",
+       "mainpage": "प्रधान पन्ना",
+       "mainpage-description": "प्रधान पन्ना",
+       "policy-url": "Project:नीति",
+       "portal": "समाज प्रधानपन्ना",
+       "portal-url": "Project:समाज प्रधानपन्ना",
+       "privacy": "गोपनीयता नीति",
+       "privacypage": "Project:गोपनीयता नीति",
+       "badaccess": "अनुमति त्रुटि",
+       "badaccess-group0": "जवने काम कय चिरौरी आप किहा गा है ओका करेक अनुमति आप कय नाइ है।",
+       "badaccess-groups": "आप जवन काम आजमावा गा है उ खाली {{PLURAL:$2|$1 समूह}} कय सदस्य ही कई सकत हैं।",
+       "versionrequired": "मीडीयाविकी कय $1 अवतरण ज़रूरी है।",
+       "versionrequiredtext": "ई पन्ना प्रयोग करेक के लिये मीडियाविकी का $1 अवतरण ज़रूरी है।\nदेखा जाय [[Special:Version|अवतरण पन्ना]]।",
+       "ok": "ठीक है",
+       "retrievedfrom": "\"$1\" से लई गा है",
+       "youhavenewmessages": "आप कय खरतिन $1 है। ($2)",
+       "youhavenewmessagesfromusers": "आपके खरतिन {{PLURAL:$3|एक दुसर सदस्य|$3 दुसर सदस्य कुल}} कय $1 होय। ($2)",
+       "youhavenewmessagesmanyusers": "आपके खरतिन $1 होय। ($2)",
+       "newmessageslinkplural": "{{PLURAL:$1|एकठु नवाँ सनेशा|999=नवाँ सनेशा}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|पिछला|999=पिछला कुल}} बदलाव",
+       "youhavenewmessagesmulti": "$1 पे आप कय खरतिन नवाँ सनेशा है",
+       "editsection": "सम्पादन",
+       "editold": "सम्पादन",
+       "viewsourceold": "स्रोत देखा जाय",
+       "editlink": "सम्पादन",
+       "viewsourcelink": "स्रोत देखा जाय",
+       "editsectionhint": "अनुभाग सम्पादन: $1",
+       "toc": "विषय सूची",
+       "showtoc": "देखाओ",
+       "hidetoc": "लुकुवाओ",
+       "collapsible-collapse": "छोट करो",
+       "collapsible-expand": "बडा करो",
+       "confirmable-confirm": "का {{GENDER:$1|आप}} निश्चित हव?",
+       "confirmable-yes": "हाँ",
+       "confirmable-no": "नाहीँ",
+       "thisisdeleted": "$1 देखो या वापिस लाओ?",
+       "viewdeleted": "$1 देखाओ?",
+       "restorelink": "{{PLURAL:$1|एक मेटावल|$1 मेटावल}} बदलाव",
+       "feedlinks": "फ़ीड:",
+       "feed-invalid": "गलत सब्स्क्रीप्शन फ़ीड प्रकार",
+       "feed-unavailable": "संघ फ़ीड उपलब्ध नाई है",
+       "site-rss-feed": "$1 कय आर॰एस॰एस फ़ीड",
+       "site-atom-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-special": "विशेष पन्ना",
+       "nstab-project": "परियोजना पन्ना",
+       "nstab-image": "फ़ाइल",
+       "nstab-mediawiki": "सनेशा",
+       "nstab-template": "साँचा",
+       "nstab-help": "मदद पन्ना",
+       "nstab-category": "श्रेणी",
+       "nosuchaction": "अईसन कवनो काम नाई है",
+       "nosuchactiontext": "इ यू॰आर॰एल से निर्दिष्ट काम अवैध है।\nआप यू॰आर॰एल गलत लिखा गा है, या कवनो गलत कड़ी कय प्रयोग करा गा है।\nई {{SITENAME}} कय सॉफ़्टवेयर में त्रुटि भी होई सकत है।",
+       "nosuchspecialpage": "अईसन कौनो विशेष पन्ना नाई है",
+       "nospecialpagetext": "<strong>आप  अवैध विशेष पन्ना माँगा गा है।</strong>\nवैध विशेष पन्नन कय सूची [[Special:SpecialPages|{{int:specialpages}}]] पे देखी सका जात है।",
+       "error": "त्रुटि",
+       "databaseerror": "डाटाबेस त्रुटि",
+       "databaseerror-text": "डाटाबेस अनुरोध त्रुटि हुई है।\nसंभवतः सॉफ़्टवेयर में गड़बड़ी है।",
+       "databaseerror-textcl": "डाटाबेस अनुरोध त्रुटि होई गवा है।",
+       "databaseerror-query": "अनुरोध: $1",
+       "databaseerror-function": "फ़ंक्शन: $1",
+       "databaseerror-error": "त्रुटि: $1",
+       "laggedslavemode": "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।",
+       "readonly": "डाटाबेस लॉक करा है",
+       "enterlockreason": "लॉक करने का कारण दीजिए, साथ ही लॉक खुलने के समय का लगभग आकलन दिजीये।",
+       "readonlytext": "शायद मेंटेनन्स के चलते डाटाबेस नये संपादन और अन्य बदलावों से लॉक किया गया है, जिसके बाद यह सामान्य स्थिति में आ जाना चाहिये।\n\nजिस प्रबंधक ने यह लॉक किया था उसने यह कारण दिया है: $1",
+       "missing-article": "डाटाबेस में $2 के अंदर कहीं भी \"$1\" नहीं मिला।\n\nआम तौर पर हटाए जा चुके पृष्ठ की इतिहास कड़ी का प्रयोग करने पर ऐसा होता है।\n\nअगर ऐसा नहीं है, तो शायद आपने सॉफ़्टवेयर में त्रुटि खोज ली है।\nकृपया यू॰आर॰एल पते समेत किसी [[Special:ListUsers/sysop|प्रबंधक]] को इसका ब्यौरा दें।",
+       "missingarticle-rev": "(अवतरण#: $1)",
+       "missingarticle-diff": "(अंतर: $1, $2)",
+       "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर के बराबर अद्यातानीत होने तक मुख्य डाटाबेस सर्वर लॉक हो गया है।",
+       "internalerror": "आन्तरिक त्रुटि",
+       "internalerror_info": "आन्तरिक त्रुटि: $1",
+       "filecopyerror": "\"$1\" फ़ाइल कय \"$2\" पे प्रतिलिपि नाई बनी पाए।",
+       "filerenameerror": "\"$1\" फ़ाइल कय नावँ बदली कय \"$2\" नाई राखी गय।",
+       "filedeleteerror": "\"$1\" फ़ाइल कय नाइ मेटाई  गय।",
+       "directorycreateerror": "\"$1\" डाइरेक्टरी नाई बनी।",
+       "directoryreadonlyerror": "$1 डाइरेक्ट्री खालि पढै वाला होय",
+       "directorynotreadableerror": "डाइरेक्ट्री \"$1\" नाई पढि सका जात अहै",
+       "filenotfound": "\"$1\" फ़ाइल नाई मिला।",
+       "unexpected": "अनपेक्षित मोल: \"$1\"=\"$2\".",
+       "formerror": "त्रुटि: फ़ॉर्म सबमिट नाई भए",
+       "badarticleerror": "यह पन्ना पे ई काम नाई कई सका जात अहै।",
+       "cannotdelete": "\"$1\" पन्ना या फ़ाइल कय नाई हटाय सका जात अहै।\nशायद केहु अउर एका पहिलवे हटाई दिहे है।",
+       "cannotdelete-title": "\"$1\" पन्ना नाई मेटाए सका जात है",
+       "delete-hook-aborted": "हुक द्वारा हटाना बीच में ही छोड़ा गया।\nइसने कोई कारण नहीं बताया।",
+       "no-null-revision": "\"$1\" पृष्ठ के लिए बिना बदलावों का नया अवतरण बनाने में असफल।",
+       "badtitle": "खराब शीर्षक",
+       "badtitletext": "आप कय द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जोड़ान अंतर-भाषीय या अंतर-विकि शीर्षक होय।\nएहमा एक या एक से ढेर अईसन कॅरेक्टर होई सकत हैं जवन शीर्षक में प्रयोग नाई कई  सका जात अहै।",
+       "perfcached": "नीचे दिया हुआ डेटा कैशे मेमोरी से लिया हुआ है, अतः हो सकता है कि इसका पूर्ण अद्यतन न हुआ हो। कैशे मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजे}} उपलब्ध हैं।",
+       "perfcachedts": "नीचे दिया हुआ डेटा कैशे मेमोरी से है, और इसका अंतिम अद्यतन $1 को हुआ था। कैशे मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजे}} उपलब्ध हैं।",
+       "querypage-no-updates": "इस पृष्ठ का नवीनीकरण करना मना है। अभी यहाँ के डाटा को ताज़ा नहीं कर सकते।",
+       "viewsource": "स्रोत देखा जाय",
+       "viewsource-title": "$1 कय लिए स्रोत देखा जाय",
+       "actionthrottled": "काम खतम कई दिहा है",
+       "actionthrottledtext": "स्पैम कय रोकेक् लिये, इ काम एतना कम समय में एकठु सीमा से ढेर दाँइ करे कय मिनाही है, अव आप इ सीमा कय पार कई चुका गा है।\nकृपया कुछ समय बाद फिर से प्रयास करा जाय।",
+       "protectedpagetext": "ई पन्ना संपादन अव अउर काम से सुरक्षित किहा है।",
+       "viewsourcetext": "आप इ पन्ना कय स्रोत देखी सका जात है औ ओकर नकल उतार सका जात है:",
+       "viewyourtext": "आप ई पन्ना में ''आपन सम्पादन'' कय स्रोत देखी सका जात है औ ओकर नकल उतार सका जात है:",
+       "protectedinterface": "इ पन्ना  विकी कय सॉफ़्टवेयर कय इंटरफ़ेस पाठ देत है,अव एकर गलत प्रयोग से बचावेक लिये सुरक्षित करा है।\nकुल विकिन् कय लिए अनुवाद जोड़य या बदलय कय लिए कृपया मीडियाविकि कय क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] कय प्रयोग करा जाय।",
+       "editinginterface": "<strong>चेतावनी:</strong> आप एकठु अइसन पन्ना कय बदलय जावा जात हैं जवन सॉफ़्टवेयर कय इंटरफ़ेस पाठ देत है।\nइ पन्ना कय बदलय से अउर सदस्यन् कय देखावेवाला इंटरफ़ेस कय शकल सूरत में बदलाव आई जाइ।",
+       "translateinterface": "कुल विकिन् कय ट्रान्सलेशन करय अव बदलय खर्तिन [//translatewiki.net/ ट्रान्शलेटविकि.नेट] कय प्रयोग करा जाय ।",
+       "cascadeprotected": "ई पन्ना सुरक्षित है, काहे से इ निचे दिहा {{PLURAL:$1|पन्ना|पन्नन्}} कय सुरक्षा-सीढ़ी में है:\n$2",
+       "namespaceprotected": "आप कय '''$1''' नामस्थान में रहल पन्नन कय बदलै कय अनुमति नाइ है।",
+       "customcssprotected": "आप कय इ CSS पन्ना कय संपादन करेक अनुमति नाई है, काहे से एहमा अउर सदस्य कय व्यक्तिगत सेटिंग्स शामिल है।",
+       "customjsprotected": "आप कय इ जावास्क्रिप्ट पन्ना कय संपादन करेक अनुमति नाई है, काहे से एहमा अउर सदस्य कय व्यक्तिगत सेटिंग्स शामिल है।",
+       "mycustomcssprotected": "आप कय इ CSS पन्ना कय संपादन करेक अनुमति नाई है ।",
+       "mycustomjsprotected": "आप कय इ जावास्क्रिप्ट पन्ना कय संपादन करेक अधिकार नाई है ।",
+       "myprivateinfoprotected": "आप कय लगे आपन व्यक्तिगत जानकारी बदलेक अनुमति नाई है।",
+       "mypreferencesprotected": "आप कय लगे आपन वरीयता बदलेक  अनुमति नाई है।",
+       "ns-specialprotected": "विशेष पन्ना सम्पादित नाई होइहैं।",
+       "titleprotected": "सदस्य [[User:$1|$1]] इ शीर्षक कय पन्ना बनावे से सुरक्षित करे हँय।\nएकरे लिये कारण होय: \"''$2''\"",
+       "filereadonlyerror": "\"$1\" फ़ाइल को बदलने में असक्षम क्योंकि भण्डार \"$2\" इस समय 'केवल पाठन हेतु' (रीड ओनली) है।\n\nजिस प्रबंधक ने ये प्रबंध लगाया है उन्होंने निम्न विवरण प्रदान किया है: \"$3\"।",
+       "invalidtitle-knownnamespace": "\"$2\" नामस्थान अउर \"$3\" नाँव वाला गलत शीर्षक",
+       "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 अउर नाँव \"$2\" वाला गलत शीर्षक",
+       "exception-nologin": "लॉग इन नाइ करे हव",
+       "exception-nologin-text": "इ पन्ना अव काम कय सक्षम करेक लिए कृपया [[Special:Userlogin|लॉग इन]] करा जाय।",
+       "exception-nologin-text-manual": "इ पन्ना अव काम कय सक्षम करेक लिए कृपया $1 करा जाय।",
+       "virus-badscanner": "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
+       "virus-scanfailed": "जाँच विफल (कूट $1)",
+       "virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
+       "logouttext": "'''अब आप लॉग आउट कई चुका हव।'''\nध्यान देवा जाय कि जब तक आप आपन ब्राउज़र कैशे खाली नाई करा जाई, कुछ पन्ना अभीनो अईसन देखाय सकते हैं जैसय कि आप अभीनो लॉगिन करे हव।",
+       "welcomeuser": "आप कय स्वागत है, $1!",
+       "welcomecreation-msg": "आप कय खाता बनी गए।\nआपन [[Special:Preferences|{{SITENAME}} वरीयता]] बदलेक ना भूलावा जाइ।",
+       "yourname": "सदस्यनावँ:",
+       "userlogin-yourname": "सदस्यनावँ",
+       "userlogin-yourname-ph": "आपन सदस्यनावँ लिखा जाय",
+       "createacct-another-username-ph": "सदस्यनावँ दिहा जाय",
+       "yourpassword": "गुप्त कुंजी:",
+       "userlogin-yourpassword": "गुप्त कुंजी(पासवर्ड)",
+       "userlogin-yourpassword-ph": "आपन गुप्त कुंजी लिखा जाय",
+       "createacct-yourpassword-ph": "गुप्त कुंजी(पासवर्ड)डारो",
+       "yourpasswordagain": "गुप्त कुंजी एक दाँइ अउर लिखो:",
+       "createacct-yourpasswordagain": "गुप्त कुंजी कय पुष्टि करो",
+       "createacct-yourpasswordagain-ph": "गुप्त कुंजी फिर से लिखो",
+       "remembermypassword": "इ ब्राउज़र पे हमार लॉगिन याद रखो (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} कय लिए)",
+       "userlogin-remembermypassword": "हम्मै लॉग्ड इन रखो",
+       "userlogin-signwithsecure": "सुरक्षित कनेक्शन कय प्रयोग करो",
+       "yourdomainname": "आप कय डोमेन:",
+       "password-change-forbidden": "आप इ विकि पे पासवर्ड नाई बदल सका जात है।",
+       "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि होई गवा है या फिर आप कय आपन बहरेक खाता अपडेट करेक अनुमति नाई है।",
+       "login": "लॉग इन",
+       "nav-login-createaccount": "लाग इन / खाता खोला जाय",
+       "userlogin": "लाग इन / खाता खोला जाय",
+       "userloginnocreate": "लॉग इन",
+       "logout": "बहरे निकरो",
+       "userlogout": "बहरे निकरो",
+       "notloggedin": "लॉग इन नाइ करा गा है",
+       "userlogin-noaccount": "खाता नाइ है?",
+       "userlogin-joinproject": "{{SITENAME}} से जुडव",
+       "nologin": "का आप सदस्यता नाई लीहे हव? '''$1'''।",
+       "nologinlink": "नवा खाता बनावा जाय",
+       "createaccount": "खाता बनावा जाय",
+       "gotaccount": "पहिले से आप कय खाता है? '''$1''' करा जाय।",
+       "gotaccountlink": "लॉग इन",
+       "userlogin-resetlink": "आपन प्रवेश जानकारी भूलाई गवा गय?",
+       "userlogin-resetpassword-link": "आपन गुप्त कुंजी भूलाई गवा गय?",
+       "userlogin-helplink2": "लॉग इन करे में सहायता",
+       "userlogin-loggedin": "आप {{GENDER:$1|$1}} कय रूप में पहीलवे से लॉग्ड इन होवा जात है।\nकवनो अउर सदस्य कय रूप में लॉग इन करय खरतिन निचे दिहा फ़ॉर्म कय प्रयोग करा जाय।",
+       "userlogin-createanother": "एकठु अउर खाता खोला जाय",
+       "createacct-emailrequired": "ई-मेल ठाँव",
+       "createacct-emailoptional": "ई-मेल ठाँव (वैकल्पिक)",
+       "createacct-email-ph": "आपन ई-मेल ठाँव लिखा जाय",
+       "createacct-another-email-ph": "ईमेल ठाँव दिहा जाय",
+       "createaccountmail": "एकठु अस्थायी मनलागा (रैंडम) गुप्त कुंजी चुना जाय अउर ओका निर्दिष्ट ई-मेल ठहर पे भेजा जाय",
+       "createacct-realname": "असली नावँ (वैकल्पिक)",
+       "createaccountreason": "कारण:",
+       "createacct-reason": "कारण",
+       "createacct-reason-ph": "आप दुसर खाता काहे बनावा जात है",
+       "createacct-captcha": "सुरक्षा जाँच",
+       "createacct-imgcaptcha-ph": "उपरा वाला पाठ लिखा जाय",
+       "createacct-submit": "आपन खाता बनावा जाय",
+       "createacct-another-submit": "एकठु अउर खाता खोला जाय",
+       "createacct-benefit-heading": "{{SITENAME}} आपय जैसन मनईन बनाए हँय।",
+       "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|योगदानकर्ता}}",
+       "badretype": "आप जवन गुप्त कुंजी दिहे हव उ एक दूसरे से नाइ मिलत है। फिर से लिखा जाय।",
+       "userexists": "आप कय दिहल सदस्यनाम पहिले से प्रयोग में है।\nकृपया कवनो दुसर सदस्यनाम चुना जाय।",
+       "loginerror": "लॉग इन त्रुटि",
+       "createacct-error": "खाता बनावेमे त्रुटि",
+       "createaccounterror": "खाता नाइ बनी पाय: $1",
+       "nocookiesnew": "आप कय खाता खोल दिहा गा है, लेकिन आप लॉग नाइ करा गा है।\n{{SITENAME}} पे लॉग इन करेक लिये कुकीज़ कय प्रयोग होत है।\nआप कुकीज़ बन्द करा गा है।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करा जाय, औ फिर आपन सदस्यनावँ अव गुप्त कुंजी से लॉग इन करा जाय।",
+       "nocookieslogin": "{{SITENAME}} पे लॉग इन करेक लिये कुकीज़ कय प्रयोग होत है।\nआप कुकीज़ बन्द करा गा है।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करा जाय, औ फिर से कोशिस करा जाय।",
+       "nocookiesfornew": "स्रोत कय पुष्टि ना होइ पावे कय कारण इ खाता  नाई बनाई गा है। \nसुनिश्चित करा जाय कि आप कय कुकीज़ बन्द है कि नाईं, पन्ना कय फिरसे लोड करा जाय अव फिरसे प्रयास करा जाय।",
+       "noname": "आप सही सदस्यनाम नाइ दिहा गा है।",
+       "loginsuccesstitle": "लॉग इन हो गवा",
+       "loginsuccess": "'''आप {{SITENAME}} में \"$1\" सदस्यनाम से लॉग इन होई {{GENDER:$1|चुके|चुकी|चुके}} हव।'''",
+       "nosuchuser": "\"$1\" नावँ कय कवनो सदस्य नाइ है।\nसदस्यनावँ में लघु औ दीर्घ अक्षरन् से फ़रक परत है।\nआपन अक्षर जाँचा जाय, या [[Special:UserLogin/signup|नवाँ खाता खोला जाय]]।",
+       "nosuchusershort": "\"$1\" नावँ कय कवनो सदस्य नाई है।\nकृपया आपन शब्द फिरसे जाँचा जाय।",
+       "nouserspecified": "सदस्यनावँ देब जरुरी है।",
+       "login-userblocked": "ई सदस्य प्रतिबन्धित है। सत्रारम्भ कय अनुमति नाई है।",
+       "wrongpassword": "आप जवन कूटशब्द लिखा गा है उ गलत है। कृपया फिरसे प्रयास करा जाय।",
+       "wrongpasswordempty": "गुप्त कुंजी खाली है।\nफिरसे लिखो।",
+       "passwordtooshort": "आप कय गुप्त कुंजी  कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरन्}} कय होएक चाहि।",
+       "password-name-match": "आप कय गुप्त कुंजी आप कय सदस्यनावँ से फरक होएक चाहि।",
+       "password-login-forbidden": "इ सदस्यनाँव अउर गुप्त कुंजी कय उपयोग नाई कै सका जात अहै।",
+       "mailmypassword": "गुप्त कुंजी पुनःस्थापित करा जाय",
+       "passwordremindertitle": "{{SITENAME}} कय लिए नवाँ अस्थाई गुप्त कुंजी",
+       "passwordremindertext": "केहु दुसर (शायद आपय, $1 आइ॰पी ठहर से) {{SITENAME}} ($4) पे इस्तेमाल कय खर्तिन नँवा गुप्त कुंजी मङावा गा है। सदस्य \"$2\" कय खर्तिन एकठु अस्थायी गुप्त कुंजी बनाइ दिहा गा है, अव इ अभीन \"$3\" होय। यदि इ आपय कय मंशा रहा, तव अब आप कय सत्रारंभ करय कय एकठु नँवा गुप्त कुंजी चुनयक् परि।\nआप कय अस्थायी गुप्त कुंजी कय समय {{PLURAL:$5 दिन}} में खतम होई जाइ।\nयदि इ चिरौरी केहु दुसर करे है, या आप आपन पुरान गुप्त कुंजी अब नाइ बदलयक् चाहा जात है काहे से आप कय आपन पुरान गुप्त कुंजी याद आई गा है, तव आप इ संदेश कय अनदेखा कई सका जात है, अव आपन पुरान गुप्त कुंजी कय पहिलेक जैसन इस्तेमाल कई सका जात है।",
+       "noemail": "\"$1\" सदस्य कय लिये कवनो भी ई-मेल पता दर्ज नाइ कई गा है।",
+       "noemailcreate": "आप कय असली ई-मेल ठाँव देक परि।",
+       "passwordsent": "\"$1\" कय ई-मेल ठाँव पे एक नवाँ गुप्त कुंजी भेजि गा है।\nई-मेल पावेक बाद कृपया दुबारा लॉग इन करा जाई।",
+       "blocked-mailpassword": "आप कय आइ॰पी ठाँव कय सम्पादन करे से अवरुद्ध कई गा है, अउर गलत इस्तेमाल रोकेक लिये गुप्त कुंजी फिरसे पावे कय सुविधा इ आइ॰पी पे बंद कई गा है।",
+       "eauthentsent": "दर्ज करल ई-मेल ठहर पे एकठु फुरवासाखी ई-मेल भेज दिहा गा है।\nआप का उ ई-मेल में दिहा निर्देशन् कय अनुसार ई-मेल ठहर कय सत्यापन करेक परि,ओकरे बादय ही हिँया से कवनो दूसर ई-मेल भेज जाई।",
+       "throttled-mailpassword": "पिछला {{PLURAL:$1|एक घंटा|$1 घंटन्}} मे एकठु गुप्त कुंजी स्मरण-पत्र भेजी गा है।\nदुरुपयोग से बचाव कय लिए हर {{PLURAL:$1|एक घंटा|$1 घंटन्}} में एक्कय गुप्त कुंजी स्मरण-पत्र भेजी जात है।",
+       "mailerror": "ई-मेल भेजय में त्रुटि: $1",
+       "acct_creation_throttle_hit": "आप कय आइ॰पी ठहर से आवे वाले मनई लोग पिछला चौबीस घंटन् में इ विकि पे {{PLURAL:$1|एक खाता|$1 खाता}} बनाई चुका हैं, इ समयावधि में ई अधिकतम सीमा होय।\n यह समय इ आइ॰पी  कय प्रयोग करय वाले आगंतुक अउर खाता नाइ खोल सकत हैं।",
+       "emailauthenticated": "आप कय ई-मेल ठहर $2 कय $3 बजे सत्यापित कै गय।",
+       "emailnotauthenticated": "आप कय ई-मेल ठहर कय यकिन नाइ भा है।\nनीचे दीहा कवनो भी सुविधा कय लिये आप कय ई-मेल नाई भेजी जाई।",
+       "noemailprefs": "इ सुविधन् कय प्रयोग करेक खर्तिन आपन पसंद में ई-मेल ठहर दिहा जाय।",
+       "emailconfirmlink": "आपन ई-मेल ठहर निश्चित करा जाय",
+       "invalidemailaddress": "ई-मेल ठहर नाई मानी जाई काहे से ई कवनो अवैध स्वरूप में है।\nकृपया एक सही तरीका से स्वरूपित ई-मेल ठहर दिहा जाय या उ कोष्ठक कय खालीय छोड दिहा जाय।",
+       "cannotchangeemail": "इस विकी पे सदस्य खाता कय ई-मेल ठहर नाइ बदल सका जात अहै।",
+       "emaildisabled": "ई साइट ई-मेल नाइ भेज सकत अहै।",
+       "accountcreated": "खाता बनी गवा है",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|बातचीत]]) कय लिये खाता बनाइ दिहा है।",
+       "createaccount-title": "{{SITENAME}} के लिये खाता बनावा जाय",
+       "createaccount-text": "आप कय ई-मेल ठहर कय खर्तीन केहु दुसर {{SITENAME}} ($4) पे \"$2\" सदस्य नाँव से \"$3\" गुप्तकुंजी (पासवर्ड) सहित खाता खोले हैं।\nआप कय लॉग इन कइकै आपन गुप्त कुंजी (पासवर्ड) तुरंतय बदल लेक चाहि।\n\nयदि इ खाता गलती से खोला गा है, तव आप इ मैसेज कय अनदेखा कै सका जात है।",
+       "login-throttled": "आप अबहिनय में कयु दाँइ लॉग इन करेक प्रयास किहा गा है।\nफिरसे प्रयास करय से पहीले तनी $1 रुका जाय।",
+       "login-abort-generic": "आप कय लाग-इन असफल रहा - निष्फलित",
+       "loginlanguagelabel": "भाषा: $1",
+       "suspicious-userlogout": "आप कय लॉग आउट करेक चिरौरी अस्वीकृत कई दिहा गा है काहे से अइसन लागत हय है कि ई कवनो खराब ब्राउज़र या कैश करय वाला प्रॉक्सी से भेजा ग रहा।",
+       "createacct-another-realname-tip": "असली नाँव देब आवश्यक नाई है।\nयदि आप देवा जाई तव एकर प्रयोग सदस्यन् कय योगदान कय लिये श्रेय (attribution) देक लिये कई जाई।",
+       "pt-login": "लॉग इन",
+       "pt-login-button": "लॉग इन",
+       "pt-createaccount": "खाता बनावा जाय",
+       "pt-userlogout": "बहरे निकरा जाय",
+       "php-mail-error-unknown": "PHP कय mail() फ़ंक्शन में अज्ञात त्रुटि होई गवा।",
+       "user-mail-no-addy": "ई-मेल ठहर कय बिना ई-मेल भेजय कय कोशिश कीहा गय।",
+       "user-mail-no-body": "एकठु खाली या बहुत छोट ई-मेल भेजय कय कोशिश कई गा है।",
+       "changepassword": "गुप्त कुंजी बदला जाय",
+       "resetpass_announce": "लॉग इन पुरा करेक लिये आप कय एक नँवा गुप्त कुंजी (पासवर्ड) देक परि।",
+       "resetpass_header": "खाता कय गुप्त कुंजी बदला जाय",
+       "oldpassword": "पुरान गुप्तकुंजी:",
+       "newpassword": "नँवा गुप्तकुंजी:",
+       "retypenew": "गुप्तकुंजी एक दाँइ अउर लिखा जाय:",
+       "resetpass_submit": "गुप्तकुंजी लिखा जाए अव लॉग इन करा जाय",
+       "changepassword-success": "आप कय गुप्तकुंजी बदल़ी गय!",
+       "changepassword-throttled": "आप अबहिनय में कयु दाँइ लॉग इन करेक प्रयास किहा गा है।\nफिरसे प्रयास करय से पहीले तनी $1 रुका जाय।",
+       "resetpass_forbidden": "गुप्तकुंजी नाइ बदल़ सका जात है",
+       "resetpass-no-info": "इ पन्ना कय सीधय प्रयोग करेक लिए आप कय लॉग इन करेक परि।",
+       "resetpass-submit-loggedin": "गुप्तकुंजी बदला जाय",
+       "resetpass-submit-cancel": "रद्द करा जाय",
+       "resetpass-wrong-oldpass": "अवैध अस्थायी या वर्तमान गुप्तकुंजी।\nसंभव है कि या तो आप पहिलवे सफलतापूर्वक आपन कूटशब्द बदल लिहा गा है , या आपन एक नवा अस्थायी गुप्तकुंजी कय अनुरोध किहा गा है।",
+       "resetpass-recycled": "रीसेट करेक लिए नवा पासवर्ड में कृपया आपन वर्तमान पासवर्ड कय अलावा कवनो दुस़र पासवर्ड कय प्रयोग करा जाय।",
+       "resetpass-temp-emailed": "आप एकठु अस्थायी ईमेल करल कोड कय साथे लॉग इन किहा गय।\nलॉग इन पुरा करेक लिए आप कय हिँया एकठु नँवा पासवर्ड सेट करेक परि:",
+       "resetpass-temp-password": "अस्थायी गुप्तकुंजी:",
+       "resetpass-abort-generic": "गुप्तकुंजी में बदलाव कवनो एक्सटेंशन से रुकि गवा है।",
+       "resetpass-expired": "आप कय पासवर्ड कय वैधता अवधि खतम होई चुका है। कृपया लॉग इन करेक लिए एकठु नँवा पासवर्ड सेट करा जाय।",
+       "resetpass-expired-soft": "आप कय पासवर्ड कय वैधता समय होइ गवा है अव ओका रीसेट करेक ज़रूरत है। कृपया एकठु नँवा पासवर्ड चुना जाय, या बाद में रीसेट करेक लिए \"{{int:resetpass-submit-cancel}}\" पे क्लिक करा जाय।",
+       "resetpass-validity-soft": "आप कय पासवर्ड मान्य नाई है: $1 \n\nकृपया अब एक नवा पासवर्ड चुना जाय, या ओका बाद में पुनर्स्थापित करेक लिए \"{{int:resetpass-submit-cancel}}\" पे क्लिक करा जाय।",
+       "passwordreset": "गुप्त कुंजी पुनःस्थापित(रीसेट) करा जाय",
+       "passwordreset-text-one": "आपन गुप्तकुंजी रीसेट करेक लिए ई फ़ॉर्म भरा जाय।",
+       "passwordreset-text-many": "{{PLURAL:$1|ईमेल कय माध्यम से एक अस्थायी पासवर्ड पावेक लिए कवनो एक डिब्बा भरा जाय।}}",
+       "passwordreset-legend": "गुप्तकुंजी पुनःस्थापित(रीसेट) करा जाय",
+       "passwordreset-disabled": "गुप्तकुंजी रीसेट करेक इ विकी अक्षम है।",
+       "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|आपन}} गुप्त कुंजी नाइ बदलेक चाहा जात है तव आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कै सका जात है।",
+       "passwordreset-emailtext-user": "{{SITENAME}} ($4) पे सदस्य $1 आपकय {{PLURAL:$3|खाता}} कय गुप्तकुंजी कय रीसेट करेक अनुरोध करे हैं। इ ई-मेल ठहर से इ {{PLURAL:$3|खाता जोडान है}}:\n\n$2\n\n{{PLURAL:$3|ई}} अस्थायी गुप्तकुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि।\nआप लॉग इन कइकै एकठु नँवा गुप्त कुंजी अभीन लै लेक चाहि। यदि इ अनुरोध केहु दुसर करे है, या फिर आप कय आपन गुप्त कुंजी याद आई गा है, अव आप {{PLURAL:$3|आपन}} गुप्तकुंजी नाई बदलेक चाहा जात है, आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कइ सका जात है।",
+       "passwordreset-emailelement": "सदस्यनाँव: $1\nअस्थायी गुप्तकुंजी: $2",
+       "passwordreset-emailsent": "एक गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
+       "passwordreset-emailsent-capture": "नीचे जवन देखावा है ओकर गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
+       "passwordreset-emailerror-capture": "नीचे दिहा गुप्त कुंजी रीसेट ई-मेल पैदा भा रहा, लेकिन ओका {{GENDER:$2|सदस्य}} कय भेजब असफल रहा।\nत्रुटि: $1",
+       "changeemail": "ईमेल ठाँव बदला जाय",
+       "changeemail-text": "अपना ई-मेल पता परिवर्तित करने के लिए इस फ़ॉर्म को पूरा करें। इस बदलाव की पुष्टि करने के लिये आपको अपना कूटशब्द पुनः लिखना पड़ेगा।",
+       "changeemail-no-info": "इ पन्ना कय सीधय प्रयोग करेक लिए आप कय लॉग इन करेक परि।",
+       "changeemail-oldemail": "अबहिन कय ई-मेल ठहर:",
+       "changeemail-newemail": "नँवा ई-मेल ठहर:",
+       "changeemail-none": "(केहु नाँइ)",
+       "changeemail-password": "आप कय {{SITENAME}} गुप्तकुंजी:",
+       "changeemail-submit": "ई-मेल बदला जाय",
+       "changeemail-throttled": "आप अबहिनय में कयु दाँइ लॉग इन करेक प्रयास किहा गा है।\nफिरसे प्रयास करय से पहीले तनी $1 रुका जाय।",
+       "resettokens": "टोकन रीसेट करा जाय",
+       "resettokens-no-tokens": "रीसेट करेक लिए कवनो टोकन नाई है।",
+       "resettokens-legend": "टोकन रीसेट करा जाय",
+       "resettokens-tokens": "टोकन:",
+       "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|आप कय ध्यानसूची कय पन्नन् में बदलाव]] कय वेब फ़ीड (Atom/RSS)कय नाते टोकन",
+       "resettokens-done": "टोकन रीसेट कई गय।",
+       "resettokens-resetbutton": "चुनल टोकन रीसेट करा जाय",
+       "bold_sample": "मोट लेख",
+       "bold_tip": "मोट लेख",
+       "italic_sample": "तिरछा लेख",
+       "italic_tip": "इटैलिक लेख",
+       "link_sample": "कड़ी शीर्षक",
+       "link_tip": "आंतरिक कड़ी",
+       "extlink_sample": "http://www.example.com कड़ी शीर्षक",
+       "extlink_tip": "बाहरी कड़ी (उपसर्ग http:// जरुर लगावा जाई)",
+       "headline_sample": "शीर्षक लेख",
+       "headline_tip": "द्वितीय-स्तर शीर्षक",
+       "nowiki_sample": "अप्रारूपित लेख यहँ डारा जाय",
+       "nowiki_tip": "विकि प्रारूपण नज़रंदाज़ करा जाय",
+       "image_tip": "एम्बेड करल फ़ाइल",
+       "media_tip": "फ़ाइल कय कड़ी",
+       "sig_tip": "आप कय हस्ताक्षर अव समय",
+       "hr_tip": "सिधा लाइन (कम इस्तेमाल करा जाई)",
+       "summary": "सारांश:",
+       "subject": "विषय/शीर्षक:",
+       "minoredit": "ई छोट सम्पादन होय ।",
+       "watchthis": "ई पन्ना कय ध्यानसुची मे डारा जाय",
+       "savearticle": "पन्ना सहेजा जाय",
+       "preview": "झलक",
+       "showpreview": "झलक देखावा जाय",
+       "showdiff": "बदलाव देखावा जाय",
+       "blankarticle": "<strong>चेतावनी:</strong>आप कय बनावा पन्ना खाली अहै ।\nअगर आप \"{{int:savearticle}}\" दबावा जाई तव,बिना कवनो पाठ कय पन्ना बनि जाई ।",
+       "anoneditwarning": "<strong>चेतावनी:</strong>आप लाग इन नाई करा गा है ।जब आप सम्पादन करा जाई तव आप कय IP address सब कय बिलगाइ। जब आप <strong>[$1 log in]</strong> या <strong>[$2 create an account]</strong> करा जाइ तब आप कय सम्पादन आप कय  सदस्यनाँव से जुडी जाई अव आप कय अउर सुविधओ मिली।",
+       "anonpreviewwarning": "''आप लॉग्ड नाई होआ जात है। पन्ना सहेजे पे आप कय आइ॰पी ठाँव इ पन्ना कय इतिहास में दर्ज कइ जाई।''",
+       "missingsummary": "'''ध्यान दिहा जाय:''' आप  संपादन सारांश नाइ दिहा गा है।\nअगर आप दुबारा \"{{int:savearticle}}\" पे क्लिक करा जाई तव आप कय संपादन बिना सारांश कय सहेज जाई।",
+       "missingcommenttext": "कृपया नीचे टिप्पणी दिहा जाय।",
+       "missingcommentheader": "'''ध्यान दिहा जाय:''' आप इ टिप्पणी कय कवनो शिर्षक नाइ दिहा गा है।\nअगर आप दुबारा \"{{int:savearticle}}\" पे क्लिक करा जाई तव आप कय बदलाव बिना शिर्षक कय सहेज जाई।",
+       "summary-preview": "सारांश कय झलक:",
+       "subject-preview": "विषय/शीर्षक कय झलक:",
+       "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आप कय कवनो प्रश्न में कृपया ई कुल जानकारी शामिल होएक चाही।",
+       "blockednoreason": "कवनो कारण नाइ दिहा है",
+       "whitelistedittext": "पन्ना संपादन करेक लिये आप कय $1 करेक परि।",
+       "confirmedittext": "संपादन करय से पहिले आपन ई-मेल प्रमाणित करब आवश्यक है।\nकृपया आपन [[Special:Preferences|सदस्य वरीयता]] में जाईकय आपन ई-मेल ठाँव दिहा जाय अव ओका प्रमाणित करा जाय।",
+       "nosuchsectiontitle": "अईसन कवनो अनुभाग शीर्षक नाई है",
+       "nosuchsectiontext": "आप अईसन अनुभाग कय सम्पादन करेक प्रयास करा जात है जवन अस्तित्व में नाई है।\nसंभव है कि जब आप पन्ना पढ़ा जात रहा तब ओका अपने जगह से हिलावा रहा गय या तो हटाई दिहा गा है।",
+       "loginreqtitle": "लॉग इन आवश्यक है",
+       "loginreqlink": "लॉग इन",
+       "loginreqpagetext": "अउर पन्ना देखेक लिये आप कय $1 करब आवश्यक है।",
+       "accmailtitle": "गुप्तकुंजी भेजी गय।",
+       "accmailtext": "[[User talk:$1|$1]] कय लिए एक यंत्र जनित गुप्त कुंजी $2 कय भेज दिहा गा है। लॉगिन करेक बाद एका '''[[Special:ChangePassword|गुप्त कुंजी बदला जाय]]'' वाला पन्नन् पे बदल सका जात है।",
+       "newarticle": "(नँवा)",
+       "newarticletext": "आप अईसन पन्ना पे आवा गा है जवन अभीन तक नाई बनावा है।\nपन्ना बनावेक लिये नीचे कय बौक्स में पाठ लिखा जाय। ढेर जानकारी कय लिये [$1 सहायता पन्ना] देखा जाय।\nअगर आप हिँया गलती से आवा गा हैं तव आपन ब्राउज़र कय बैक ('''back''') बटन पे क्लिक करा जाय।",
+       "anontalkpagetext": "----''ई बातचीत पन्ना उ बेनामी सदस्यन् कय खर्तीन होय जे या तव खाता नाई खोलें है या खाता कय प्रयोग नाइ करत हैं।\nइहिकै नाते वय लोगन कय पहिचान कय खर्तीन हम्मन कय वय लोगन कय आइ॰पी ठहर कय प्रयोग करेक परत है।\nआइ॰पी ठहर कयु सदस्यन् कय एक्कय होइ सकत है।\nयदि आप कवनो बेनामी सदस्य होआ जाय अव आप कय लागत है कि आप कय बारे में अप्रासंगिक टीका टिप्पणी कई गा है तव कृपया [[Special:UserLogin/signup|सदस्यता लिहा जाय]] या [[Special:UserLogin|सत्रारंभ करा जाय]] ताकि अउर बेनामी सदस्यन् में से आप कय अलग से पहिचान सका जाय।''",
+       "noarticletext": "अभीन इ पन्ना पे कवनो सामग्री नाई है।\nआप अउर पन्नन् में [[Special:Search/{{PAGENAME}}|इ शीर्षक कय खोज]] कई सका जात है,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} सम्बन्धित लॉग खोज सका जात है],\nया इस पृष्ठ को [{{fullurl:{{FULLPAGENAME}}|action=edit}} सम्पादित] कर सकते हैं</span>।",
+       "noarticletext-nopermission": "अभीन इ पन्ना पे कवनो चिज नाई है।\nआप अउर पन्नन् में [[Special:Search/{{PAGENAME}}|इ शीर्षक कय खोज]] कई सका जात है,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} से सम्बन्धित लॉग खोज सका जात है] </span>लेकिन आप कय इ पन्ना बनावे कय अनुमति नाई है ।",
+       "missing-revision": "\"{{FULLPAGENAME}}\" पन्ना कय अवतरण #$1 नाई है।\n\nखास कइकै ई एकठु मेटावल पन्ना कय पुरान लिंक पे क्लिक करय से होत है।\nढेर जानकारी कय खर्तिन आप [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटावे कय लॉग] देख सका जात है।",
+       "userpage-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नाई है।\nकृपया जाँच लिहा जाय कि आप ई पन्ना संपादन करय या बनावे चाहा जात है या नाहीं।",
+       "userpage-userdoesnotexist-view": "सदस्य \"$1\" पंजीकृत नाइ है।",
+       "blocked-notice-logextract": "ई सदस्य अभीन अवरोधित है।\nसदंर्भ कय लिए ताज़ातरीन अवरोध लॉग प्रविष्टि नीचा दीहा है:",
+       "clearyourcache": "'''ध्यान दिहा जाय:'''  सहेजय कय बाद बदलाव देखयक खर्तिन आप कय आपन ब्राउज़र कय कैश खाली करेक परी सकत है।\n* '''फ़ायरफ़ॉक्स / सफ़ारी:''' ''Reload'' (रीलोड) दबावत समय ''Shift'' (शिफ़्ट) दबावा जाय, या फिर ''Ctrl-F5'' (कंट्रोल-F5) या ''Ctrl-R'' (कंट्रोल-R) दबावा जाय (मैक पे ''⌘-R'')\n* '''गूगल क्रोम:''' ''Ctrl-Shift-R'' (कंट्रोल-शिफ़्ट-R) दबावा जाय (मैक पे ''⌘-Shift-R'')\n* '''इन्टर्नेट एक्सप्लोरर:''' ''Ctrl'' (कंट्रोल) दबाईकय ''Refresh'' (रिफ़्रेश) करा जाय या ''Ctrl-F5'' (कंट्रोल-F5) दबावा जाय\n* '''ऑपेरा:''' ''Tools → Preferences'' (उपकरण → पसंद) में कैश साफ़ करा जाय",
+       "usercssyoucanpreview": "'''टिप''': सहेजय से पहिले आपन नँवा सी॰एस॰एस जाँचय खर्तिन \"{{int:showpreview}}\" बटन कय प्रयोग करा जाय।",
+       "userjsyoucanpreview": "'''टिप''': सहेजय से पहिले आपन नँवा जावास्क्रिप्ट जाँचय खर्तिन \"{{int:showpreview}}\" बटन कय प्रयोग करा जाय।",
+       "usercsspreview": "'''ध्यान दिहा जाय कि आप आपन सी॰एस॰एस कय झलक देखा जात है।'''\n'''इ अभीन तक नाई सहेजा है!'''",
+       "userjspreview": "'''ध्यान दिहा जाय कि आप आपन जावास्क्रिप्ट  कय झलक देखा जात है।'''\n'''इ अभीन तक नाई सहेजा है!'''",
+       "sitecsspreview": "'''ध्यान दिहा जाय कि आप ई सी॰एस॰एस कय झलक देखा जात है।'''\n'''इ अभीन तक नाई सहेजा है!'''",
+       "sitejspreview": "'''ध्यान दिहा जाय कि आप ई जावास्क्रिप्ट कय झलक देखा जात है।'''\n'''इ अभीन तक नाई सहेजा है!'''",
+       "userinvalidcssjstitle": "'''चेतावनी:''' \"$1\" नाव कय कवनो त्वचा नाइ है।\nबदलल .css औ .js पन्नन कय शीर्षक नीचे स्तर कय लिपि (lowercase) कय प्रयोग करत है। उदाहरण: {{ns:user}}:Foo/vector.css नाई की {{ns:user}}:Foo/Vector.css",
+       "updated": "(अपडेट करल)",
+       "note": "'''सूचना:'''",
+       "previewnote": "'''याद रख्खा जाय, ई खाली एक झलक होय।'''\nआप कय बदलाव अभीन तक नाई सहेजा हैं!",
+       "continue-editing": "संपादन क्षेत्र मे चला जाय",
+       "previewconflict": "ई झलक ऊपरी पाठ सम्पादन क्षेत्र में करल बदलाव देखावत है, औ यदि आप अभीन सहेजा जाई तव इहै पाठ सहेज़ जाइ।",
+       "session_fail_preview": "'''क्षमा करा जाय! सेशन डाटा कय नष्ट होएक कारण आप कय बदलाव नाई सहेज मिला।'''\nकृपया फिरेसे प्रयास करा जाय।\nअगर एकरे बाद़ोमें अइसनय होइ तव कृपया [[Special:UserLogout|लॉग आउट]] कई कय फिरसे लॉग इन करा जाय।",
+       "session_fail_preview_html": "'''क्षमा करा जाय! सेशन डाटा नष्ट होएक नाते आपकय बदलाव नाई सहेजि गय।'''\n\n''काहे से {{SITENAME}} पे raw HTML सक्षम है, जावास्क्रिप्ट हमलन् से बचाव कय खर्तिन झलक नाइ देखाई गा है।''\n\n'''अगर ई आप कय सहि संपादन प्रयास रह, तव कृपया फिरसे प्रयास करा जाय।'''\nअगर एकरे बाद़ोमें अइसनय होइ तव कृपया [[Special:UserLogout|लॉग आउट]] कैकय फिरसे लॉग इन करा जाय।",
+       "token_suffix_mismatch": "'''आप कय करल बदलाव रद्द कै गा है काह से आपकय क्लायंट आपकय संपादन टोकन में दिहा विरामचिन्हन् में बदलाव करे हैं।'''\nलेख कय पाठ में खराबी ना आवे इहि कय नाते आपकय बदलाव रद्द कै गा है।\nअइसन तब्बय होइ सकत है जब आप कवनव खराब वेब-आधारित अनामक प्रौक्सी प्रयोग करा जात होय।",
+       "editing": "$1 सम्पादन",
+       "creating": "$1 बनावा जात है",
+       "editingsection": "$1 सम्पादन करा जात है (अनुभाग)",
+       "editingcomment": "$1 सम्पादन करा जात है (नँवा अनुभाग)",
+       "editconflict": "संपादन अंतर्विरोध: $1",
+       "yourtext": "आप कय पाठ",
+       "storedversion": "सहेज़ल अवतरण",
+       "yourdiff": "अंतर",
+       "protectedpagewarning": "'''चेतावनी: इ पन्ना कय सुरक्षित कई  गा है अव एका खालि प्रबंधक सम्पादित कई सकत हँय।'''\nनँवा लॉग प्रविष्टि संदर्भ कय लिये नीचे दीहा है:",
+       "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना बचावा है इही कय नाते खालि रजिष्टर करल सदस्य एका सम्पादन कई सकत हैं ।\nसंदर्भ कय खर्तिन अन्तिम दाइ कय लाग निचे दिहा है:",
+       "templatesused": "ई पन्ना इस्तेमाल करल {{PLURAL:$1|साँचा}}:",
+       "templatesusedsection": "ई अनुभागमें इस्तेमाल करल {{PLURAL:$1|साँचा}}:",
+       "template-protected": "(सुरक्षित)",
+       "template-semiprotected": "(अर्ध-सुरक्षित)",
+       "hiddencategories": "ई पन्ना निचे दिहा $1 लुकुआवल {{PLURAL:$1|श्रेणी|श्रेणिन्}} में श्रेणीबद्ध है:",
+       "nocreatetext": "{{SITENAME}} पे नँवा पन्ना बनावे कय मिनहा कई गा है।\nआप पीछे जाईकय कवनो वर्तमान पन्ना कय संपादित कई सका जात है, या [[Special:UserLogin|नँवा ख़ाता खोला जाय /अन्दर हला जाय]] ।",
+       "nocreate-loggedin": "आप कय नँवा पन्ना बनावे कय अनुमति नाई है ।",
+       "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नाई है",
+       "sectioneditnotsupported-text": "इ पन्ना पे अनुभाग सम्पादन समर्थित नाई है",
+       "permissionserrors": "अनुमति त्रुटि",
+       "permissionserrorstext": "निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते आप कय ऐसन करे कय अनुमति नाइ है:",
+       "permissionserrorstext-withaction": "आप कय $2 कय अनुमति नाई है,निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते से:",
+       "recreate-moveddeleted-warn": "'''चेतावनी: आप एक्ठु अइसन पन्ना बनावे जावा जात है जवन पहिले मेटावा रहा।'''\n\nआप विचार करा जाय कि का इ पन्ना कय संपादन करब उचित रही।\nसुविधा कय लिये इ पन्ना कय हटावे या घुस्कावे कय लॉग इहै है:",
+       "moveddeleted-notice": "ई पन्ना मेटावा है।\nसंदर्भ कय खरतिन पन्ना कय मेटावे औ घुस्कावे कय लॉग नीचे दिहा है।",
+       "log-fulllog": "पूरा लॉग देखा जाय",
+       "edit-hook-aborted": "फंदा से संपादन बीचवे मे छोड दिहा है।\nउ कवनो कारण नाई बताए है।",
+       "edit-gone-missing": "पन्ना अद्यतित(अपडेट) नाई कई सका जात है।\nलागत है एका मेटाई दिहा है।",
+       "edit-conflict": "संपादन अंतर्विरोध",
+       "edit-no-change": "आप कवनो बदलाव नाई करा गा है,इहीकै नाते आप कय इ संपादन कय अनदेखा कै गा है।",
+       "postedit-confirmation-created": "पन्ना बनी गा है।",
+       "postedit-confirmation-restored": "पन्ना पुरान स्थिति पे लाई गय।",
+       "postedit-confirmation-saved": "आप कय सम्पादन सहेजी गय।",
+       "edit-already-exists": "नवा पन्ना नाई बनाई सका जात है।\nई पन्ना पहीलवे से मौजूद है।",
+       "defaultmessagetext": "सनेशा कय डिफ़ॉल्ट पाठ",
+       "content-failed-to-parse": "$1 कय लिए $2 सामग्री कय पार्स करय में विफल, त्रुटि: $3",
+       "invalid-content-data": "अवैध डाटा सामग्री",
+       "content-not-allowed-here": "[[$2]] पन्ना पे \"$1\" सामग्री मिनाही है।",
+       "editwarning-warning": "इ पन्ना से हटे कय बाद आप कय करल बदलाव गायब होइ जाइ।\nयदि आप लॉग इन करा गा है तव आप इ सूचना कय देखाब आपन पसंद कय \"{{int:prefs-editing}}\" भाग में बंद कई सका जात है।",
+       "editpage-notsupportedcontentformat-title": "सामग्री स्वरूप समर्थित नाई है",
+       "editpage-notsupportedcontentformat-text": "$1 सामग्री स्वरूप $2 सामग्री मॉडल द्वारा समर्थित नाई है।",
+       "content-model-wikitext": "विकिटेक्स्ट",
+       "content-model-text": "सामान्य पाठ",
+       "content-model-javascript": "जावास्क्रिप्ट",
+       "content-json-empty-object": "खाली चिज",
+       "content-json-empty-array": "खाली एरे",
+       "expensive-parserfunction-category": "अईसन पन्ना जवन महङा पार्सर फ़ंक्शनन् कय ढेर प्रयोग करत हैं",
+       "post-expand-template-inclusion-warning": "'''चेतावनी:''' साँचा जोडे कय सीमा पार होई चुका है।\nकवनो-कवनो साँचा नाई जुड़ी।",
+       "post-expand-template-inclusion-category": "अईसन पन्ना जवने मे साँचा जोड़े कय सीमा पार होई गवा है",
+       "post-expand-template-argument-category": "अईसन पन्ना जवनेमें प्राचल छोड़ी दिहा है",
+       "parser-template-loop-warning": "साँचा चक्र मिला: [[$1]]",
+       "parser-template-recursion-depth-warning": "साँचा पुनरावर्ती गहराई सीमा पार ($1)",
+       "language-converter-depth-warning": "भाषा कन्वर्टर गहीराई सीमा से बहरे गय ( $1 )",
+       "node-count-exceeded-category": "पन्ना जवनन् में नोड-संख्या सीमा पार कई गा है",
+       "expansion-depth-exceeded-category": "पन्ना जवनेमें विस्तार गहिराई पार कई गा है",
+       "expansion-depth-exceeded-category-desc": "ई पन्ना विस्तार गहराई पार करत है।",
+       "expansion-depth-exceeded-warning": "पन्ना में विस्तार गहराई पार कई गा है",
+       "parser-unstrip-loop-warning": "Unstrip लूप मिला",
+       "parser-unstrip-recursion-limit": "Unstrip पुनरावर्तन सीमा पार कई गय ($1)",
+       "converter-manual-rule-error": "मैन्यूअल भाषा परिवर्तन नियम में त्रुटि",
+       "undo-success": "ई संपादन पहिले जैसन रहा वईसय कई सका जात है ।\nअईसन करेक लिये कृपया निचे लिखल पाठ कय ध्यान से दखीकय बदलाव सहेजा जाय।",
+       "undo-failure": "एकरे बीचे अउर बदलाव होएक कारण ई संपादन पहिले जैसन करब संभव नाई है।",
+       "undo-norev": "ई बदलाव वापिस नाई भय काहे से या तो एका पहीलवे से पलटाई गा है या फिर पन्ना हटाई दिहा है।",
+       "undo-nochange": "अईसन लागत है की ई सम्पादन कय पहिलवे पहिले जैसन कई दीहा है ।",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|बातचीत]]) कय करल बदलाव $1 कय पहिले जईसन कई गय",
+       "undo-summary-username-hidden": "लुकुआवल सदस्यन् कय करल बदलाव $1 कय पहिले जईसन कई गय",
+       "cantcreateaccounttitle": "खाता नाई खोली सका जात है",
+       "cantcreateaccount-text": "इ आइ॰पी ठहर ('''$1''') कय खाता बनावे कय [[User:$3|$3]] रोक लगाए हैँ।\n\nएकरे लिये $3 ''$2'' कारण दिहे हैं।",
+       "cantcreateaccount-range-text": "'''$1''' कय श्रेणी में आवे वाला आई॰पी ठहर से, जवनेमें आप कय आई॰पी ठहर ('''$4''') शामिल है, नँवा खाता बनावे कय लिए [[User:$3|$3]] अवरोधित कई गा है। \n\n$3 द्वारा दिया गया कारण है: \"$2\"",
+       "viewpagelogs": "इस पन्ना कय लॉग देखा जाय",
+       "nohistory": "इ पन्ना कय कवनो इतिहास नाई है।",
+       "currentrev": "अभिनै कय अवतरण",
+       "currentrev-asof": "$1 कय समय कय अवतरण",
+       "revisionasof": "$1 कय अवतरण",
+       "revision-info": "{{GENDER:$6|$2}} द्वारा परिवर्तित $1 कय अवतरण$7",
+       "previousrevision": "← पुरान अवतरण",
+       "nextrevision": "नँवा अवतरण →",
+       "currentrevisionlink": "अभिनै कय अवतरण",
+       "cur": "अभि",
+       "next": "अगला",
+       "last": "पिछला",
+       "page_first": "पहीला",
+       "page_last": "आखिरी",
+       "history-fieldset-title": "इतिहास कय विचरण करा जाय",
+       "history-show-deleted": "सूची में खाली लुकुआवल अवतरण देखा जाय",
+       "histfirst": "सबसे पुरान",
+       "histlast": "सबसे नँवा",
+       "historysize": "($1 {{PLURAL:$1|बाइट}})",
+       "historyempty": "(खाली)",
+       "history-feed-title": "अवतरण इतिहास",
+       "history-feed-description": "विकि मे उपलब्ध इ पन्ना कय अवतरण इतिहास",
+       "history-feed-item-nocomment": "$1 $3 कय $4 बजे",
+       "history-feed-empty": "अनुरोधित करल पन्ना  अस्तित्व में नाई है।\nई पन्ना या तो मेटावा है या फिर एकर नाँव बदल दिहा है।\n[[Special:Search|विकि पे खोजा जाय]] कय प्रयोग करा जाय।",
+       "rev-deleted-comment": "(सम्पादन सारांश हटाई गय)",
+       "rev-deleted-user": "(सदस्यनाँव हटाई गय)",
+       "rev-deleted-event": "(लाग जानकारी हटाइ गय)",
+       "rev-deleted-user-contribs": "[सदस्यनाँव या आइ॰पी ठहर लुकुआई गय- सम्पादन योगदान में से लुकुआई गय]",
+       "rev-deleted-text-permission": "ई पन्ना अवतरण हटाई गा है।\nएकर ढेर जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटावे कय लॉग] में मिली सकत है।",
+       "rev-suppressed-text-permission": "ई पन्ना अवतरण लुकुआइ गा है।\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}}/suppress|page={{FULLPAGENAMEE}}}} हटावे कय लॉग] में मिली सकत है।",
+       "rev-delundel": "देखावा जाय/लुकुआवा जाय",
+       "rev-showdeleted": "देखावा जाय",
+       "revisiondelete": "अवतरण हटावा जाय/पुनर्स्थापित करा जाय",
+       "revdelete-nooldid-title": "अमान्य लक्ष्य अवतरण",
+       "revdelete-nooldid-text": "इस क्रिया को करने के लिये आपने लक्ष्य अवतरण नहीं दिये हैं, या फिर आपने दिया हुआ अवतरण अस्तित्व में नहीं हैं या फिर आप सद्य अवतरण को छुपाने का प्रयत्न कर रहे हैं।",
+       "revdelete-no-file": "निर्दिष्ट फ़ाइल मौजूद नाई है।",
+       "revdelete-show-file-confirm": "का आप सही में फ़ाइल \"<nowiki>$1</nowiki>\" कय $2 कय $3 बजे बना, हटावल अवतरण कय देखय चाहा जात है?",
+       "revdelete-show-file-submit": "हाँ",
+       "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|कय}} चयनित अवतरण:",
+       "revdelete-selected-file": "[[:$2]] {{PLURAL:$1|कय}} चयनित फ़ाइल अवतरण:",
+       "logdelete-selected": "{{PLURAL:$1|चुनल}} लॉग इवेंट:",
+       "revdelete-legend": "दृश्य प्रतिबंध निश्चित करा जाय",
+       "revdelete-hide-text": "अवरतण पाठ",
+       "revdelete-hide-image": "फ़ाइल कय पाठ लुकुआवा जाय",
+       "revdelete-hide-name": "टार्गेट अव पारामिटर लुकुआवा जाय",
+       "revdelete-hide-comment": "संपादन सारांश",
+       "revdelete-hide-user": "संपादक कय सदस्यनाँव/आइ॰पी॰ ठहर",
+       "revdelete-hide-restricted": "प्रबंधक सहित कुल सदस्यन् से डाटा लुकुआवा जाय",
+       "revdelete-radio-same": "‍‌(ना बदला जाय)",
+       "revdelete-radio-set": "लुकुआवल",
+       "revdelete-radio-unset": "देखात है",
+       "revdelete-suppress": "प्रबंधक सहित कुल सदस्यन् से डाटा लुकुआवा जाय",
+       "revdelete-unsuppress": "पुनर्स्थापित अवतरणन् पे से प्रतिबन्ध हटावा जाय",
+       "revdelete-log": "कारण:",
+       "revdelete-submit": "चयनित {{PLURAL:$1|अवतरण}} पे लागू करा जाय",
+       "revdelete-success": "'''अवतरण दृश्यता सफलतापूर्वक अपडेट कई गय।'''",
+       "revdelete-failure": "'''अवतरण दृश्यता अपडेट नाइ भय:'''\n$1",
+       "logdelete-success": "'''लॉग दृष्यता बदलि गय।'''",
+       "logdelete-failure": "'''लॉग दृश्यता कय जमाव नाई भय:'''\n$1",
+       "revdel-restore": "देखावा जाय/लुकुआवा जाय",
+       "pagehist": "पन्ना कय इतिहास",
+       "deletedhist": "मेटावल इतिहास",
+       "revdelete-hide-current": "$2 कय, $1 बजे वाला मद नाई लुकुवाई गय: ई सबसे ताज़ा अवतरण होय।\nई नाइ लुकुआई सका जात है।",
+       "revdelete-modify-missing": "मद क्रमांक $1 कय बदलत समय त्रुटि आई गवा: इ डाटाबेस में नाइ है!",
+       "revdelete-no-change": "'''चेतावनी:''' $2, $1 वाले चिज में पहिलवे से ही इ आप कय कहल दृश्यता सेटिङ रहा।",
+       "revdelete-only-restricted": "$2, $1 कय तिथि कय आइटम कय लुकुआवे में त्रुटि: आप अउर दृश्यता विकल्प कय चुना जाय बिना प्रबंधक कय नजर से आइटम कय नाइ लुकुआइ सका जात है।",
+       "revdelete-reason-dropdown": "*हटावे कय आम कारण\n** सर्वाधिकार (कॉपीराइट) उल्लंघन\n** अनुचित टिप्पणी या निजी जानकारी\n** अनुचित सदस्यनाँव\n** मानहानिकारक जानकारी",
+       "revdelete-otherreason": "अउर/दुसर कारण:",
+       "revdelete-reasonotherlist": "दुसर कारण",
+       "revdelete-edit-reasonlist": "हटावेक कारण बदला जाय",
+       "revdelete-offender": "अवतरण संपादक:",
+       "suppressionlog": "लुकुआवेक लॉग",
+       "suppressionlogtext": "नीचे प्रबंधकन् से लुकुआवल ब्लॉक औ हटावल पन्नन कय सूची है।\nमौजूदा ब्लॉक अव बैन देखय खर्तीन [[Special:BlockList|ब्लॉक सूची]] देखा जाय।",
+       "mergehistory": "पन्ना कय इतिहास मिलावा जाय",
+       "mergehistory-box": "दुई पन्नन कय इतिहास मिलावा जाय:",
+       "mergehistory-from": "स्रोत पन्ना:",
+       "mergehistory-into": "लक्ष्य पन्ना:",
+       "mergehistory-list": "मिलावे लायक संपादन इतिहास",
+       "mergehistory-go": "मिलावे लायक संपादन देखावा जाय",
+       "mergehistory-submit": "अवतरण मिलावा जाय",
+       "mergehistory-empty": "कवनो भी अवतरण नाई मिलाई सका जात अहै।",
+       "mergehistory-no-source": "स्रोत पन्ना $1 मौजूद नाई है।",
+       "mergehistory-no-destination": "लक्ष्य पन्ना $1 मौजूद नाई है।",
+       "mergehistory-invalid-source": "स्रोत पन्ना कय शीर्षक वैध होब आवश्यक है।",
+       "mergehistory-invalid-destination": "लक्ष्य पन्ना कय शीर्षक वैध होब आवश्यक है।",
+       "mergehistory-autocomment": "[[:$2]] में [[:$1]] मिलावा जाय",
+       "mergehistory-comment": "[[:$2]] में [[:$1]] मिलाइ गय: $3",
+       "mergehistory-same-destination": "स्रोत अउर लक्ष्य पन्ना एक्कै नाई होई सकत हैं",
+       "mergehistory-reason": "कारण:",
+       "mergelog": "मिलावेक लॉग",
+       "revertmerge": "अलग करा जाअ",
+       "history-title": "\"$1\" कय अवतरण इतिहास",
+       "difference-title": "\"$1\" कय अवतरण में अंतर",
+       "difference-title-multipage": "\"$1\" अव \"$2\" पन्नन में अंतर",
+       "difference-multipage": "(पन्नन कय बीच अन्तर)",
+       "lineno": "पंक्ति $1:",
+       "compareselectedversions": "चुनल अवतरणन् कय तुलना करा जाय",
+       "showhideselectedversions": "चुनल अवतरण देखावा जाय/लुकुआवा जाय",
+       "editundo": "पहिले जैसन करा जाय",
+       "diff-empty": "(कवनो अंतर नाइ है)",
+       "diff-multi-sameuser": "(इ सदस्य कय {{PLURAL:$1|करल बीच कय एक अवतरण नाई देखाई गय |करल बीच कय कुल $1 अवतरण नाइ देखाइ गय}})",
+       "diff-multi-otherusers": "({{PLURAL:$2|एकठु दुसर सदस्य|$2 सदस्यन्}} कय {{PLURAL:$1|करल  बीच कय एकठु अवतरण नाई देखाइ गय|करल बीच कय कुल $1 अवतरण नाइ देखाइ गय}})",
+       "diff-multi-manyusers": "({{PLURAL:$2|एकठु योगदानकर्ता|$2 योगदानकर्तन्}} कय {{PLURAL:$1|करल बीच कय एकठु|करल बीच कय $1}} अवतरण नाई देखाइ गय।)",
+       "difference-missing-revision": "इ अंतर {{PLURAL:$2|कय एकठु अवतरण|कय $2 अवतरण}} ($1) नाइ {{PLURAL:$2|मिला}}।\n\nई आम तौर पे एकठु हटावल पन्ना कय अवतरण में अंतर खोजय पे होत है।ढेर जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटावे कय लॉग] में मिली।",
+       "searchresults": "खोज परिणाम",
+       "searchresults-title": "\"$1\" कय खरतीन खोज परिणाम",
+       "titlematches": "पन्ना शीर्षक मिलान",
+       "textmatches": "पन्ना पाठ मिलान",
+       "notextmatches": "कवनो भी पन्ना में ई सामान नाई मिला",
+       "prevn": "पहिलका {{PLURAL:$1|$1}}",
+       "nextn": "अगला {{PLURAL:$1|$1}}",
+       "prevn-title": "{{PLURAL:$1|पहिलका|}} $1 परिणाम",
+       "nextn-title": "{{PLURAL:$1|अगला}} $1 परिणाम",
+       "shown-title": "हर पन्ना पे $1 {{PLURAL:$1|परिणाम}} देखावा जाय",
+       "viewprevnext": "देखा जाय ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "'''इ विकि पे \"[[:$1]]\" नाँव कय एकठु पन्ना है'''",
+       "searchmenu-new": "<strong>इ विकि पे \"[[:$1]]\" नाँव कय पन्ना बनावा जाय!</strong>{{PLURAL:$2|0=|आप कय खोज से मिला पन्नओ देखा जाय।|खोज परिणाम भी देखा जाय।}}",
+       "searchprofile-articles": "सामग्री पन्ना",
+       "searchprofile-images": "मल्टीमीडिया",
+       "searchprofile-everything": "कुल चिज",
+       "searchprofile-advanced": "उन्नत",
+       "searchprofile-articles-tooltip": "$1 में खोजा जाय",
+       "searchprofile-images-tooltip": "फ़ाइल खोजा जाय",
+       "searchprofile-everything-tooltip": "(बातचीत पन्नन सहित) सारा सामग्री में खोजा जाय",
+       "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-section": "(अनुभाग $1)",
+       "search-category": "(श्रेणी $1)",
+       "search-file-match": "(फ़ाइल सामग्री से मिलत है)",
+       "search-suggest": "आप कय मतलब ई तव नाई रहा:$1",
+       "search-interwiki-caption": "दुसर परियोजना",
+       "search-interwiki-default": "$1 से परिणाम:",
+       "search-interwiki-more": "(अउर)",
+       "search-relatedarticle": "सम्बंधित",
+       "searchrelated": "सम्बंधित",
+       "searchall": "कुल",
+       "search-nonefound": "आप कय खोज से मिलत जुलत कवनो परिणाम नाई मिला।",
+       "powersearch-legend": "उन्नत खोज",
+       "powersearch-ns": "नामस्थानन् में खोजा जाय:",
+       "powersearch-togglelabel": "चुना जाय:",
+       "powersearch-toggleall": "कुल",
+       "powersearch-togglenone": "केहु नाई",
+       "search-external": "बाहरी खोज",
+       "preferences": "प्राथमिकता",
+       "mypreferences": "प्राथमिकता",
+       "prefs-edits": "सम्पादन गिन्ती",
+       "prefs-skin": "स्कीन",
+       "skin-preview": "झलक",
+       "datedefault": "खा़स प्राथमिकता नाँइ है",
+       "prefs-labs": "लैब विशेषता",
+       "prefs-user-pages": "सदस्य पन्ना",
+       "prefs-personal": "सदस्य व्यक्तिरेखा",
+       "prefs-rc": "अबहिन कय बदलाव",
+       "prefs-watchlist": "अवलोकन सुची",
+       "prefs-watchlist-days": "ध्यानसूची में दिखावै कय दिन:",
+       "prefs-watchlist-days-max": "अधिकतम $1 {{PLURAL:$1|दिन}}",
+       "prefs-watchlist-edits-max": "अधिकतम संख्या: एक हज़ार",
+       "prefs-watchlist-token": "ध्यानसूची टोकन",
+       "prefs-misc": "अउर",
+       "prefs-resetpass": "गुप्त कुंजी बदला जाय",
+       "prefs-changeemail": "ईमेल ठाँव बदला जाय",
+       "prefs-setemail": "ईमेल ठाँव दिहा जाय",
+       "prefs-email": "ई-मेल वरीयता",
+       "prefs-rendering": "शकलसूरत",
+       "saveprefs": "सहेजा जाय",
+       "prefs-editing": "संपादन होत है",
+       "rows": "कताँर:",
+       "columns": "कॉलम:",
+       "searchresultshead": "खोजा जाय",
+       "stub-threshold-disabled": "अक्षम करा है",
+       "savedprefs": "आप कय पसंद सहेजि गय",
+       "timezonelegend": "समयमंडल:",
+       "localtime": "स्थानीय समय:",
+       "timezoneuseoffset": "अउर कौनो(समयांतर निर्दिष्ट करा जाय)",
+       "servertime": "सर्वर कय समय:",
+       "guesstimezone": "ब्राउज़र से भरा जाय",
+       "timezoneregion-africa": "अफ्रिका",
+       "timezoneregion-america": "अमेरिका",
+       "timezoneregion-antarctica": "अंटार्कटिका",
+       "timezoneregion-arctic": "आर्कटिक",
+       "timezoneregion-asia": "एशिया",
+       "timezoneregion-atlantic": "एटलांटिक महासागर",
+       "timezoneregion-australia": "ऑस्ट्रेलिया",
+       "timezoneregion-europe": "यूरोप",
+       "timezoneregion-indian": "हिंद महासागर",
+       "timezoneregion-pacific": "प्रशांत महासागर",
+       "allowemail": "अउर सदस्यन् से ई-मेल सक्षम करा जाय",
+       "prefs-searchoptions": "खोजा जाय",
+       "prefs-namespaces": "नामस्थान",
+       "default": "डिफ़ॉल्ट",
+       "prefs-files": "फ़ाइल",
+       "prefs-custom-css": "खासमखास सी॰एस॰एस",
+       "prefs-custom-js": "खासमखास जावास्क्रिप्ट",
+       "prefs-common-css-js": "कुल स्किन कय लिए साझा सी॰एस॰एस/जावास्क्रिप्ट:",
+       "prefs-emailconfirm-label": "ईमेल सुनीश्चित करा जाय:",
+       "youremail": "ई-मेल:",
+       "username": "{{GENDER:$1|सदस्यनाँव}}:",
+       "prefs-memberingroups": "निचे दिहा {{PLURAL:$1|समूह|समूहन्}} कय {{GENDER:$2|सदस्य}}:",
+       "prefs-registration": "रजिष्ट्रेसन समय:",
+       "yourrealname": "वास्तविक नाँव:",
+       "yourlanguage": "भाषा",
+       "yourvariant": "सामग्री भाषा संस्करण:",
+       "yournick": "नँवा हस्ताक्षर:",
+       "prefs-help-signature": "बातचीत पन्नन पे करल टिप्पणिन् पे \"<nowiki>~~~~</nowiki>\" से हस्ताक्षर करेक परि, इ आप कय हस्ताक्षर अव समय में परिवर्तित होई जाइ।",
+       "badsig": "गलत कच्चा हस्ताक्षर।\nHTML टैग कय जाँच करा जाय।",
+       "badsiglength": "ई हस्ताक्षर बहुत बड़ा है।\nई $1 {{PLURAL:$1|कैरैक्टर}} से ढेर कय नाई होएक चाहि।",
+       "yourgender": "आप अपने आप कय कैसन बतावे चाहा जाइ?",
+       "gender-unknown": "हम कुछ नाई कहय चाहित अहन",
+       "gender-male": "एन सम्पादन करत हँय।",
+       "gender-female": "एन सम्पादन करत अहिन।",
+       "prefs-help-gender": "ई जानकारी देब वैकल्पिक होय।\nई सॉफ़्टवेयर में लिंग कय आधार पे आप कय लिए सही संबोधन कय नाते प्रयुक्त होत है।\nई जानकारी सार्वजनिक होइ।",
+       "email": "ई-मेल",
+       "prefs-help-email": "ई-मेल ठहर वैकल्पिक होय, लेकिन यदि आप आपन गुप्तकुंजी भूलाई गवा गय तव एकरे माध्यम से रीसेट कई सका जात है।",
+       "prefs-help-email-required": "ई-मेल ठहर जरुरी है।",
+       "prefs-info": "मूलभूत जानकारी",
+       "prefs-i18n": "अंतर्राष्ट्रीयकरण",
+       "prefs-signature": "हस्ताक्षर",
+       "prefs-dateformat": "तिथि प्रारूप",
+       "prefs-timeoffset": "समयांतर",
+       "prefs-advancedediting": "सामान्य विकल्प",
+       "prefs-editor": "सम्पादक",
+       "prefs-preview": "झलक",
+       "prefs-advancedrc": "उन्नत विकल्प",
+       "prefs-advancedrendering": "उन्नत विकल्प",
+       "prefs-advancedsearchoptions": "उन्नत विकल्प",
+       "prefs-advancedwatchlist": "उन्नत विकल्प",
+       "prefs-displayrc": "प्रदर्शन विकल्प",
+       "prefs-displaywatchlist": "प्रदर्शन विकल्प",
+       "prefs-tokenwatchlist": "टोकन",
+       "prefs-diffs": "अंतर",
+       "prefs-help-prefershttps": "ई प्राथमिकता आप कय अगला लॉगिन मे प्रभावी होई।",
+       "email-address-validity-invalid": "एकठु वैध ई-मेल ठहर दिहा जाय",
+       "userrights": "सदस्य अधिकार व्यवस्थापन",
+       "userrights-lookup-user": "सदस्य समूहन् कय व्यवस्थापन करा जाय",
+       "userrights-user-editname": "सदस्यनावँ दिहा जाय:",
+       "editusergroup": "सदस्य समूहन् कय संपादन करा जाय",
+       "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 कय अधिकार बदला जाय",
+       "userrights-editusergroup": "सदस्य समूहन् कय संपादन करा जाय",
+       "saveusergroups": "सदस्य समूहन् कय व्यवस्थापन सहेजा जाय",
+       "userrights-groupsmember": "निचे कय {{PLURAL:$1|समूह|समूहन्}} कय सदस्य:",
+       "userrights-groupsmember-auto": "निचे कय {{PLURAL:$1|समूह|समूहन्}} कय अंतर्निहित सदस्य:",
+       "userrights-reason": "कारण:",
+       "group": "गोल:",
+       "group-user": "सदस्य:",
+       "group-autoconfirmed": "अपने आप बनल सदस्य",
+       "group-bot": "बॉट",
+       "group-sysop": "प्रबंधक",
+       "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|प्रबंधक}}",
+       "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
+       "group-suppress-member": "{{GENDER:$1|ओवरसाईट}}",
+       "grouppage-user": "{{ns:project}}:सदस्य",
+       "grouppage-autoconfirmed": "{{ns:project}}:अपने आप बनल सदस्य",
+       "grouppage-bot": "{{ns:project}}:बॉट",
+       "grouppage-sysop": "{{ns:project}}:प्रबंधक",
+       "grouppage-bureaucrat": "{{ns:project}}:प्रशासक",
+       "grouppage-suppress": "{{ns:project}}:कॉपीराइट",
+       "right-read": "पन्ना पढा जाय",
+       "right-edit": "पन्ना सम्पादन करा जाय",
+       "right-createpage": "पन्ना बनावा जाय (जवन चर्चा पन्ना नाई होय)",
+       "right-createtalk": "बातचीत पन्ना बनावा जाय",
+       "right-createaccount": "नँवा सदस्य खाता बनावा जाय",
+       "right-minoredit": "अपने बदलाव कय छोट चिन्हित करा जाय",
+       "right-move": "पन्ना घुसकावा जाय",
+       "right-move-subpages": "पन्ना उपपन्नन सहित घुस्कावा जाय",
+       "right-move-rootuserpages": "मूल सदस्य पन्नन् कय घुस्कावा जाय",
+       "right-move-categorypages": "श्रेणी पन्नन् कय घुसकावा जाय",
+       "right-movefile": "फाइल घुसकावा जाय",
+       "right-suppressredirect": "पन्ना घुस्कावत कय समय पुनर्निर्देश ना छोड़ा जाय",
+       "right-upload": "फ़ाइल अपलोड करा जाय",
+       "right-reupload": "मौजूदा फ़ाईलन् पे फिर से लिखा जाय",
+       "right-reupload-own": "आपन अपलोड करल फ़ाइल पे फिर से लिखा जाय",
+       "right-reupload-shared": "शेअर्ड इमेज भण्डार में मौजूद फ़ाइलन् पे फिर से लिखा जाय",
+       "right-upload_by_url": "यू॰आर॰एल से फ़ाइल अपलोड करा जाय",
+       "right-purge": "पन्ना कय कैश मेमोरी खाली करा जाय",
+       "right-autoconfirmed": "आई॰पी ठहर आधारित रेट लिमिट्स से बेअसर होई जाय",
+       "right-bot": "स्वचलित प्रणाली माना जाय",
+       "right-delete": "पन्ना मेटावा जाय",
+       "right-bigdelete": "ढेर इतिहास वाले पन्नन्  कय हटावा जाय",
+       "right-deletelogentry": "विशिष्ट लॉग प्रविष्टिन् कय लुकुआवा जाय अव देखावा जाय",
+       "right-browsearchive": "हटावल पन्ना खोजा जाय",
+       "right-undelete": "ई पन्ना कय पुनर्स्थापित करा जाय।",
+       "right-suppressionlog": "खासगी लॉग देखा जाय",
+       "right-block": "अउर सदस्यन् कय सम्पादन करय से ब्लॉक करा जाय",
+       "right-blockemail": "अउर सदस्यन् कय ईमेल करै से रोका जाय",
+       "right-ipblock-exempt": "आइ॰पी ब्लॉक्स, ऑटो-ब्लॉक्स अव रेंज ब्लॉक्स कय अनदेखा करा जाय",
+       "right-proxyunbannable": "स्वचालित प्रौक्सी ब्लॉक्स कय अनदेखा करा जाय",
+       "right-unblockself": "अपने आप कय अनावरुद्ध करा जाय",
+       "right-protect": "सुरक्षा स्तर बदला जाय अव सीढ़ी-सुरक्षित पन्ना सम्पादन करा जाय",
+       "right-editprotected": "अइसन सुरक्षित पन्नन कय सम्पादन करा जाय जवने कय सम्पादन कय \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "अइसन पन्नन् कय सम्पादन करा जाय जवने कय सुरक्षा स्तर होय \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editusercssjs": "अउर सदस्यन् कय सी॰एस॰एस अव जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
+       "right-editusercss": "अउर सदस्यन् कय सी॰एस॰एस पन्ना सम्पादन करा जाय",
+       "right-edituserjs": "अउर सदस्यन् कय जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
+       "right-editmyusercss": "आपन सदस्य स्तर कय सी॰एस॰एस फ़ाइल कय सम्पादन करा जाय",
+       "right-editmyuserjs": "आपन सदस्य स्तर कय जावास्क्रिप्ट फ़ाइल सम्पादन करा जाय",
+       "right-viewmywatchlist": "आपन ध्यानसूची देखा जाय",
+       "right-editmywatchlist": "आपन ध्यानसूची सम्पादन करा जाय। ध्यान दिहा जाय कि कुछ काम इ अधिकार कय बिनव ध्यानसूची में पन्ना जोडिहैं।",
+       "right-viewmyprivateinfo": "आपन व्यक्तिगत डाटा देखा जाय (जैसय ई-मेल ठहर, असली नाँव)",
+       "right-editmyprivateinfo": "आपन व्यक्तिगत डाटा सम्पादन करा जाय (जैसय ई-मेल ठहर, असली नाँव)",
+       "right-editmyoptions": "आपन पसंद सम्पादन करा जाय",
+       "right-markbotedits": "वापिस लेवे में होए वाला संपादनन् कय बॉट सम्पादन चिन्हित करा जाय",
+       "right-noratelimit": "रेट लिमिट्स से बेअसर होइ जाय",
+       "right-import": "दुसर विकि से पन्ना लावा जाय",
+       "right-importupload": "फ़ाइल अपलोड से पन्ना लावा जाय",
+       "right-patrol": "अउर सदस्यन् कय सम्पादन परीक्षित चिन्हित करा जाय",
+       "right-unwatchedpages": "अइसन पन्नन कय सूची देखा जाय जवन केहु कय ध्यानसूची में नाइ है",
+       "right-mergehistory": "पन्ना इतिहास एकट्ठय करा जाय",
+       "right-userrights": "कुल सदस्य अधिकार बदला जाय",
+       "right-userrights-interwiki": "अउर विकिन् पे सदस्य अधिकार बदला जाय",
+       "right-siteadmin": "डाटाबेस कय ताला लगावा जाय या खोला जाय",
+       "right-override-export-depth": "पन्ना निर्यात करा जाय, पाँच स्तर कय गहराई तक जुड़ल पन्ना लइकय",
+       "right-sendemail": "अउर सदस्यन् कय ई-मेल पठवा जाय",
+       "right-passwordreset": "गुप्तकुंजी रीसेट ई-मेल देखा जाय",
+       "newuserlogpage": "सदस्य खाता बनावे कय लॉग",
+       "newuserlogpagetext": "ई सदस्य खाता बनावे कय लॉग होय।",
+       "rightslog": "सदस्य अधिकार लॉग",
+       "rightslogtext": "ई सदस्य अधिकारन् में करल बदलाव कय सूची होय।",
+       "action-read": "इ पन्ना कय पढ़ा जाय",
+       "action-edit": "ई पन्ना कय सम्पादन करा जाय",
+       "action-createpage": "पन्ना बनावा जाय",
+       "action-createtalk": "बातचीत पन्ना बनावा जाय",
+       "action-createaccount": "ई सदस्य खाता बनावा जाय",
+       "action-history": "इ पन्ना कय इतिहास देखेक",
+       "action-minoredit": "ई बदलाव छोट होय",
+       "action-move": "ई पन्ना घुस्कावा जाय",
+       "action-move-subpages": "ई पन्ना अव एकरे उप-पन्ना कय घुस्कावा जाय",
+       "action-move-rootuserpages": "मूल सदस्य पन्नन् कय घुस्कावेक",
+       "action-move-categorypages": "श्रेणी पन्नन् कय घुसकावेक",
+       "action-movefile": "ई पन्ना घुस्कावेक",
+       "action-upload": "इ फ़ाइल कय अपलोड करेक",
+       "action-reupload": "मौजूदा फ़ाईलन् पे फिर से लिखे कय",
+       "action-reupload-shared": "साझा भंडार में इ फ़ाइलन् कय ऊप्पर कुछ अउर डारे कय",
+       "action-upload_by_url": "यू॰आर॰एल से इ फ़ाइल कय चढ़ावे कय",
+       "action-writeapi": "लेखन ए॰पी॰आई कय प्रयोग करे कय",
+       "action-delete": "ई पन्ना मेटावे कय",
+       "action-deleterevision": "इ अवतरण कय हटावे कय",
+       "action-deletedhistory": "इ पन्ना कय मेटावल इतिहास कय देखे कय",
+       "action-browsearchive": "हटावल पन्ना खोजे कय",
+       "action-undelete": "ई पन्ना कय पुनर्स्थापित करे कय",
+       "action-suppressrevision": "इ लुकुआवल अवतरण कय देखे कय अव पुनर्स्थापित करे कय",
+       "action-suppressionlog": "इ निजी लॉग कय देखे कय",
+       "action-block": "ई सदस्य कय सम्पादन करय से ब्लॉक करे कय",
+       "action-protect": "इ पन्ना कय सुरक्षा स्तर बदले कय",
+       "action-rollback": "कवनो पन्ना कय अंतिम सम्पादन करय वाले सदस्यन् कय सम्पादन वापिस लेवे कय",
+       "action-import": "दुसर विकि से पन्ना लावे कय",
+       "action-importupload": "फ़ाइल अपलोड से पन्ना लावे कय",
+       "action-patrol": "अउर सदस्यन् कय सम्पादन परीक्षित चिन्हित करे कय",
+       "action-autopatrol": "आपन सम्पादन स्वचालित रूप से परीक्षित करे कय",
+       "action-unwatchedpages": "अईसन पन्ना जवन केहु कय ध्यानसूची में नाई है कय सूची देखे कय",
+       "action-mergehistory": "पन्ना इतिहास एकट्ठय करे कय",
+       "action-userrights": "कुल सदस्यन कय अधीकार बदले कय",
+       "action-siteadmin": "डाटाबेस कय ताला लगावा जाय या खोला जाय",
+       "action-sendemail": "ईमेल पठवा जाय",
+       "action-editmywatchlist": "ध्यानसूची सम्पादन करा जाय",
+       "action-viewmywatchlist": "आपन ध्यानसूची देखा जाय",
+       "action-viewmyprivateinfo": "आपन व्यक्तिगत जानकारी देखा जाय",
+       "action-editmyprivateinfo": "आपन व्यक्तिगत जानकारी बदला जाय",
+       "nchanges": "$1 {{PLURAL:$1|बदलाव}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम दाइ देखय कय बाद से}}",
+       "enhancedrc-history": "इतिहास",
+       "recentchanges": "हालिय कय बदलाव",
+       "recentchanges-legend": "हालिय कय बदलाव संबंधी विकल्प",
+       "recentchanges-label-newpage": "ई सम्पादन से नँवा पन्ना बना",
+       "recentchanges-label-minor": "ई छोट सम्पादन होय ।",
+       "recentchanges-label-bot": "ई सम्पादन एक्ठु ब़ा़ट करे है",
+       "recentchanges-legend-heading": "'''कुंजी:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नवा पन्नन् कय सूची]] कय भी देखा जाय)",
+       "rclistfrom": "$3 $2 से नँवा बदलाव देखावा जाय",
+       "rcshowhideminor": "छोट बदलाव $1",
+       "rcshowhideminor-show": "देखावा जाय",
+       "rcshowhideminor-hide": "लुकुआवा जाय",
+       "rcshowhidebots": "बॉट $1",
+       "rcshowhidebots-show": "देखावा जाय",
+       "rcshowhidebots-hide": "लुकुआवा जाय",
+       "rcshowhideliu": "पंजीकृत सदस्य $1",
+       "rcshowhideliu-show": "देखावा जाय",
+       "rcshowhideliu-hide": "लुकुआवा जाय",
+       "rcshowhideanons": "$1 अज्ञात प्रयोगकर्ता",
+       "rcshowhideanons-show": "देखावा जाय",
+       "rcshowhideanons-hide": "लुकुआवा जाय",
+       "rcshowhidepatr": "परीक्षित सम्पादन $1",
+       "rcshowhidepatr-show": "देखावा जाय",
+       "rcshowhidepatr-hide": "लुकुआवा जाय",
+       "rcshowhidemine": "हमार बदलाव $1",
+       "rcshowhidemine-show": "देखावा जाय",
+       "rcshowhidemine-hide": "लुकुआवा जाय",
+       "rclinks": "पिछला $2 दिन में करल $1 बदलाव देखावा जाय<br />$3",
+       "diff": "अंतर",
+       "hist": "इतिहास",
+       "hide": "लुकुआवा जाय",
+       "show": "देखावा जाय",
+       "minoreditletter": "छो",
+       "newpageletter": "न",
+       "boteditletter": "बॉ",
+       "number_of_watching_users_pageview": "[$1 ध्यान राखय वाले {{PLURAL:$1|सदस्य}}]",
+       "rc_categories_any": "कवनो भी",
+       "rc-change-size-new": "बदलाव कय बाद $1 {{PLURAL:$1|बाइट}}",
+       "newsectionsummary": "/* $1 */ नँवा अनुभाग",
+       "rc-enhanced-expand": "विस्तृत जानकारी देखावा जाय",
+       "rc-enhanced-hide": "विस्तृत जानकारी लुकुआवा जाय",
+       "rc-old-title": "मूल रूप से \"$1\" नाव से बनावा रहा",
+       "recentchangeslinked": "पन्ना से सम्बन्धित बदलाव",
+       "recentchangeslinked-feed": "पन्ना से सम्बन्धित बदलाव",
+       "recentchangeslinked-toolbox": "पन्ना से सम्बन्धित बदलाव",
+       "recentchangeslinked-title": "\"$1\" से जुड़ल बदलाव",
+       "recentchangeslinked-page": "पन्ना कय नाँव:",
+       "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें",
+       "upload": "फ़ाइल अपलोड करा जाय",
+       "uploadbtn": "फ़ाइल अपलोड करा जाय",
+       "reuploaddesc": "अपलोड रद्द करा जाय अव फिरसे अपलोड फ़ॉर्म पे जावा जाय",
+       "upload-tryagain": "संशोधित फ़ाइल विवरण भेजा जाय",
+       "uploadnologin": "लाग इन नाई करा गा है",
+       "uploadnologintext": "फाइल अपलोड करेक लिए $1 करब आवश्यक है",
+       "upload_directory_missing": "अपलोड डाइरेक्टरी ($1) मौजूद नाई है, अउर वेबसर्वर एकर निर्माण नाई कई पाय।",
+       "uploaderror": "अपलोड त्रुटि",
+       "uploadlogpage": "अपलोड लॉग",
+       "filename": "फ़ाइल कय नाँव",
+       "filedesc": "सारांश:",
+       "fileuploadsummary": "सारांश:",
+       "filereuploadsummary": "फ़ाइल में बदलाव:",
+       "filestatus": "कॉपीराइट स्थिति:",
+       "filesource": "स्रोत:",
+       "ignorewarning": "चेतावनि अनदेखा करा जाय अव फ़ाइल अपलोड करा जाय",
+       "ignorewarnings": "कुल चेतावनि कय अनदेखा करा जाय",
+       "minlength1": "फ़ाइल कय नाँव कम-से-कम एक अक्षर कय होएक चाहि।",
+       "filename-toolong": "फ़ाइल नाँव 240 बाइट से ढेर लम्मा नाई होई सकत है।",
+       "badfilename": "फ़ाइल कय नाँव बदल कय \"$1\" कई दिहा है।",
+       "filetype-mime-mismatch": "फाइल एक्सटेंशन \".$1\" फ़ाइल कय खोजेक MIME प्रकार ($2) से मेल नाई खात है।",
+       "filetype-badmime": "\"$1\" प्रकार कय फ़ाइल अपलोड करय कय अनुमति नाई है।",
+       "uploadwarning": "अपलोड चेतावनी",
+       "uploadwarning-text": "फ़ाइल विवरण कय मिलाई कय फिर कोशिश करा जाय।",
+       "savefile": "फ़ाइल सहेजा जाय",
+       "uploaddisabled": "अपलोड प्रतिबंधित हैं।",
+       "copyuploaddisabled": "यू॰आर॰एल द्वारा अपलोड अक्षम हैं।",
+       "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।",
+       "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद है।\nकृपया file_uploads जमाव कय जाँच करा जाय।",
+       "uploadscripted": "इ फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जवन वेब ब्राउज़र गलत पढि सकत है।",
+       "uploadscriptednamespace": "इ एस॰वी॰जी फ़ाइल में अमान्य नामजगह \"$1\" है।",
+       "uploadinvalidxml": "अपलोड करल फ़ाइल कय XML पार्स नाइ होई।",
+       "uploadvirus": "इ फ़ाइल में भाईरस हैं!ढेर जानकारी: $1",
+       "uploadjava": "ई फ़ाइल एकठु ज़िप फ़ाइल होय जवने मे एकठु जावा .class फ़ाइल है।\nजावा फ़ाइलन् कय अपलोड नाई कै सका जात है, काहेसे एकरे कारण सुरक्षा बाधा पार होइ जाई।",
+       "upload-source": "स्रोत फ़ाइल",
+       "sourcefilename": "स्रोत फ़ाइल कय नाँव:",
+       "sourceurl": "स्रोत यू॰आर॰एल:",
+       "destfilename": "लक्ष्य फ़ाइल नाव:",
+       "upload-maxfilesize": "अधिकतम फ़ाइल आकार: $1",
+       "upload-description": "फ़ाइल विवरण",
+       "upload-options": "अपलोड विकल्प",
+       "watchthisupload": "इ फ़ाइल पे ध्यान रक्खा जाय",
+       "upload-success-subj": "अपलोड होइ गय",
+       "upload-success-msg": "आप कय [$2] से अपलोड असफल रहा। ई [[:{{ns:file}}:$1]] पे उपलब्ध है",
+       "upload-failure-subj": "अपलोड समस्या",
+       "upload-failure-msg": "[$2] से आप कय अपलोड में एकठु समस्या रहा:\n\n$1",
+       "upload-warning-subj": "अपलोड चेतावनी",
+       "upload-warning-msg": "आप कय [$2] से अपलोड कय साथे एकठु समस्या रहा। आप इ समस्या कय ठीक करेक लिए [[Special:Upload/stash/$1|अपलोड फ़ॉर्म]] पे लौट सका जात है।",
+       "upload-proto-error": "गलत प्रोटोकॉल",
+       "upload-proto-error-text": "रिमोट अपलोड कय लिये यू॰आर॰एल कय नाँव <code>http://</code> या <code>ftp://</code> से शुरू होब आवश्यक है।",
+       "upload-file-error": "आन्तरिक त्रुटि",
+       "upload-file-error-text": "सर्वर पे अस्थायी फ़ाइल बनावत समय आंतरिक त्रुटि आई गय।\nकृपया कवनो [[Special:ListUsers/sysop|प्रबंधक]] से संपर्क करा जाय।",
+       "upload-misc-error": "अज्ञात अपलोड त्रुटि",
+       "upload-too-many-redirects": "इ यू॰आर॰एल में ढेर कुल पुनर्निर्देशन हैं",
+       "upload-http-error": "एकठु एच॰टी॰टी॰पी त्रुटि आई गय: $1",
+       "upload-copy-upload-invalid-domain": "कॉपी अपलोड इ डोमेन से उपलब्ध नाई हैं।",
+       "backend-fail-stream": "फ़ाइल $1 स्ट्रीम नाई होई पाई।",
+       "backend-fail-backup": "फ़ाइल $1 बैकअप नाई होई पाई।",
+       "backend-fail-notexists": "फ़ाइल $1 मौजूद नाई है।",
+       "backend-fail-hashes": "तुलना कय लिए फ़ाइलन् कय हैश नाई मिला।",
+       "backend-fail-notsame": "एकठु ग़ैर-समान फ़ाइल $1 पे पहिलवे से मौजूद है।",
+       "backend-fail-invalidpath": "$1 मान्य भंडारण पथ नाई है।",
+       "backend-fail-delete": "\"$1\" फ़ाइल कय नाइ मेटाई  गय।",
+       "backend-fail-describe": "फ़ाइल \"$1\" कय मेटाडाटा नाई बदल मिला।",
+       "backend-fail-alreadyexists": "फ़ाइल $1 पहिलवे से मौजूद है।",
+       "backend-fail-store": "फ़ाइल $1, $2 पे संग्रहीत नाई होई पाए।",
+       "backend-fail-copy": "\"$1\" फ़ाइल कय \"$2\" पे प्रतिलिपि नाई बनी पाए।",
+       "backend-fail-move": "फ़ाइल $1, $2 पे स्थानांतरित नाई होई पाए।",
+       "backend-fail-opentemp": "अस्थाई फ़ाइल खोल नाई खुला।",
+       "backend-fail-writetemp": "अस्थायी फ़ाइल पे लिखब संभव नाई है।",
+       "backend-fail-closetemp": "अस्थाई फ़ाइल बंद नाई होई पाय।",
+       "backend-fail-read": "फ़ाइल $1 नाई पढी मिला।",
+       "backend-fail-create": "फ़ाइल $1 लिखी नाई सका जात है।",
+       "backend-fail-maxsize": "फ़ाइल $1 नाई लिखी सका जात है काहे से ई {{PLURAL:$2|$2 बाईट}} से बड़ा है।",
+       "backend-fail-readonly": "भंडारण बैकेंड \"$1\" इ समय खाली पढ़ सका जात है (रीड-ओन्ली होय)। दिहल कारण रहा: \"$2\"",
+       "backend-fail-synced": "फ़ाइल \"$1\" आतंरिक भंडारण बैकेंड में असंगत स्थिति में है।",
+       "backend-fail-connect": "\"$1\" भंडारण बैकेंड से सम्पर्क स्थापित नाई कई मिला।",
+       "backend-fail-internal": "भंडारण बैकेंड \"$1\" में कवनो अज्ञात त्रुटि पैदा होइ गय।",
+       "uploadstash": "स्टैश अपलोड करा जाय",
+       "http-invalid-url": "अमान्य यू॰आर॰एल: $1",
+       "http-invalid-scheme": "\"$1\" से शुरू होय वाले यू॰आर॰एल स्वीकार्य नाई हैं।",
+       "http-request-error": "एच॰टी॰टी॰पी अनुरोध अज्ञात त्रुटि कय नाते असफल रहा।",
+       "http-read-error": "एच॰टी॰टी॰पी पढ़य में त्रुटि।",
+       "http-timed-out": "एच॰टी॰टी॰पी अनुरोध कय समय खतम (टाइम आउट)",
+       "http-curl-error": "यू॰आर॰एल $1 पावे में त्रुटि",
+       "http-bad-status": "एच॰टी॰टी॰पी अनुरोध कय समय समस्या रहा: $1 $2",
+       "upload-curl-error6": "यू॰आर॰एल तक नाई पहुँच मिला।",
+       "upload-curl-error6-text": "दिहल यू॰आर॰एल तक नाई पहुँचि मिला।\nकृपया एक दाइ फिर से जाँच लिहा जाय कि यू॰आर॰एल सही है औ उ साइट चलत है।",
+       "upload-curl-error28": "अपलोड टाइम‍आउट",
+       "license": "लाइसेन्सिंग:",
+       "license-header": "लाइसेन्सिंग",
+       "nolicense": "कवनो नाइ चुना गय",
+       "licenses-edit": "लाइसेंस विकल्प सम्पादन",
+       "license-nopreview": "(झलक उपलब्ध नाइ है)",
+       "upload_source_file": "(आप कय कम्प्युटरसे लिहल फाइल)",
+       "listfiles-delete": "मिटावा जाय",
+       "listfiles-summary": "इ विशेष पन्ना अपलोड करल कुल फ़ाइल देखावत है।",
+       "listfiles_search_for": "मीडिया नाँव कय खर्तिन खोजा जाय:",
+       "imgfile": "फ़ाइल",
+       "listfiles": "फ़ाइल सूची",
+       "listfiles_thumb": "अंगूठाकार",
+       "listfiles_date": "मिती",
+       "listfiles_name": "नाँव",
+       "listfiles_user": "सदस्य",
+       "listfiles_size": "आकार",
+       "listfiles_description": "विवरण",
+       "listfiles_count": "अवतरण",
+       "listfiles-show-all": "एहमा चित्रन् कय पुरान अवतरण है",
+       "listfiles-latestversion": "हालिए कय अवतरण",
+       "listfiles-latestversion-yes": "हाँ",
+       "listfiles-latestversion-no": "नाही",
+       "file-anchor-link": "फाइल",
+       "filehist": "फाइल कय इतिहास",
+       "filehist-help": "मिति/समय मे क्लिक कइकै फाइल उ समय कैसन बिलगात रहा देखा जाय",
+       "filehist-deleteall": "कुल मेटावा जाय",
+       "filehist-deleteone": "मेटावा जाय",
+       "filehist-revert": "पहिले जैसन करा जाय",
+       "filehist-current": "अबहिनै कय",
+       "filehist-datetime": "मिति/समय",
+       "filehist-thumb": "अंगूठाकार प्रारूप",
+       "filehist-thumbtext": "$1 अवतरण कय अंगूठाकार प्रारूप।",
+       "filehist-nothumb": "कवनो अंगूठाकार नाइ है",
+       "filehist-user": "सदस्य",
+       "filehist-dimensions": "आकार",
+       "filehist-filesize": "फ़ाइल कय आकार",
+       "filehist-comment": "टिप्पणी",
+       "imagelinks": "फ़ाइल कय उपयोग",
+       "linkstoimage": "निचे दिहा {{PLURAL:$1|पन्ना}} में इ फ़ाइल कय कड़ि हैं:",
+       "nolinkstoimage": "इ फाइल से कवनो पन्ना नाइ जोडान है ।",
+       "morelinkstoimage": "इ फ़ाइल कय [[Special:WhatLinksHere/$1|अउर कड़ि]] देखा जाय।",
+       "linkstoimage-redirect": "$1(फ़ाइल पुनर्निर्देश) $2",
+       "filepage-nofile": "ई नाँव कय कवनो फाइल नाइ है ।",
+       "filepage-nofile-link": "ई नाँव कय कवनो फाइल नाइ है,लेकिन आप [$1 कय अपलोड कई सका जात है]।",
+       "uploadnewversion-linktext": "ई फाइल कय नँवा अवतरण अप्लोड करा जाय",
+       "shared-repo-from": "$1 से",
+       "shared-repo": "एकठु साझा भंडार",
+       "upload-disallowed-here": "आप इ फाइल कय उप्पर नाइ लिखी सका जात है",
+       "filerevert": "$1 कय पहिले जैसन करा जाय",
+       "filerevert-legend": "फ़ाइल कय पहिले जैसन करा जाय",
+       "filerevert-intro": "आप '''[[Media:$1|$1]]''' कय [$4 $2 कय $3 बजे कय अवतरण] कय पहिले जैसन करा जात है ।",
+       "filerevert-comment": "कारण:",
+       "filerevert-defaultcomment": "$1 कय $2 बजे कय अवतरण कय पहिले जैसन कै गय",
+       "filerevert-submit": "पहिले जैसन करा जाय",
+       "filerevert-success": "'''[[Media:$1|$1]]''' कय [$4 $2 कय $3 बजे कय अवतरण] कय पहिले जैसन कै गा है।",
+       "filerevert-badversion": "दिहल समय से मिलए वाला इ फ़ाइल कय कवनो पुरान अवतरण नाइ है।",
+       "filedelete": "$1 मिटावा जाय",
+       "filedelete-legend": "फ़ाइल मिटावा जाय",
+       "filedelete-intro": "आप फ़ाइल '''[[Media:$1|$1]]''' इतिहास सहित हटावे जावा जात है।",
+       "filedelete-intro-old": "आप '''[[Media:$1|$1]]''' कय [$4 $2 कय $3 बजे कय अवतरण] हटावे जावा जात हैं।",
+       "filedelete-comment": "कारण:",
+       "filedelete-submit": "मिटावा जाय",
+       "filedelete-success": "'''$1''' मेटावा है।",
+       "filedelete-success-old": "'''[[Media:$1|$1]]''' कय $2 कय $3 बजे कय अवतरण हटाई गा है।",
+       "filedelete-nofile": "<strong>$1</strong> नाई है.",
+       "filedelete-otherreason": "अउर/दुसर कारण:",
+       "filedelete-reason-otherlist": "दुसर कारण",
+       "filedelete-reason-dropdown": "*हटावे कय साधारण कारण\n** कॉपीराइट उल्लंघन\n** डुप्लिकेट फ़ाइल",
+       "filedelete-edit-reasonlist": "हटावेक कारण बदला जाय",
+       "filedelete-maintenance": "रखरखाव चलत है अव रखरखाव कय दौरान फ़ाइलन् कय हटाइब औ पुनर्स्थापित करब मिनाही है।",
+       "filedelete-maintenance-title": "फ़ाइल नाइ हटाय सका जात है",
+       "mimesearch": "MIME खोज",
+       "mimetype": "MIME प्रकार:",
+       "download": "डाउनलोड",
+       "unwatchedpages": "ध्यान ना दिहल पन्ना",
+       "listredirects": "पुनर्निर्देशन कय सूची",
+       "unusedtemplates": "अप्रयुक्त साँचा",
+       "unusedtemplateswlh": "अउर कड़ि",
+       "randompage": "कवनो एक पन्ना",
+       "randomincategory": "श्रेणी में कवनो एक (रैंडम) पन्ना",
+       "randomincategory-invalidcategory": "\"$1\" एकठु मान्य श्रेणी नाँव नाइ होय।",
+       "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कवनो पन्ना नाई है।",
+       "randomincategory-category": "श्रेणी:",
+       "randomincategory-legend": "श्रेणी में कवनो एक (रैंडम) पन्ना",
+       "randomredirect": "कवनो एक पुनर्निर्देशन पे जावा जाय",
+       "randomredirect-nopages": "नामस्थान \"$1\" में कवनो पुनर्निर्देशन नाइ है।",
+       "statistics": "आँकड़ा:",
+       "statistics-header-pages": "पन्ना कय आँकड़ा",
+       "statistics-header-edits": "संपादन कय आँकड़ा",
+       "statistics-header-users": "सदस्य आँकड़ा",
+       "statistics-header-hooks": "अउर आँकड़ा",
+       "statistics-articles": "सामग्री पन्ना",
+       "statistics-pages": "पन्ना",
+       "withoutinterwiki-submit": "देखावा जाय",
+       "fewestrevisions": "सबसे कम अवतरण वाला पन्ना",
+       "nbytes": "$1 {{PLURAL:$1|बाइट|बाइट}}",
+       "ncategories": "{{PLURAL:$1|एक श्रेणी|श्रेणिन्}}",
+       "ninterwikis": "$1 अंतरविकी {{PLURAL:$1|कड़ी}}",
+       "nlinks": "$1 {{PLURAL:$1|कड़ी}}",
+       "nmembers": "$1 {{PLURAL:$1|सदस्य}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य}}",
+       "nrevisions": "$1 {{PLURAL:$1|अवतरण}}",
+       "nviews": "{{PLURAL:$1|एक|$1}} दाइ देखि गा है",
+       "nimagelinks": "$1 {{PLURAL:$1|पन्ना|पन्नन्}} पे प्रयुक्त",
+       "ntransclusions": "$1 {{PLURAL:$1|पन्ना|पन्नन}} पे प्रयुक्त",
+       "specialpage-empty": "इ ब्यौरा कय खर्तीन कवनो परिणाम नाई है।",
+       "lonelypages": "एकाकी पन्ना",
+       "lonelypagestext": "निचे दिहा पन्ना से ना तो {{SITENAME}} कय अउर पन्ना जोड़ात है औ ना उ कवनो अउर पन्ना कय भित्तर जोडान है।",
+       "uncategorizedpages": "अश्रेणीकृत पन्ना",
+       "uncategorizedcategories": "अश्रेणीकृत श्रेणि",
+       "uncategorizedimages": "अश्रेणीकृत फ़ाइल",
+       "uncategorizedtemplates": "अश्रेणीकृत साँचा",
+       "unusedcategories": "अप्रयुक्त श्रेणि",
+       "unusedimages": "अप्रयुक्त फ़ाइल",
+       "wantedcategories": "जवन श्रेणि चाहि",
+       "wantedpages": "जवन पन्ना चाहिँ",
+       "wantedpages-badtitle": "परिणामन् में अवैध शीर्षक: $1",
+       "wantedfiles": "जवन फाइल चाहिँ",
+       "wantedtemplates": "जवन साँचा चाहिँ",
+       "mostlinked": "सबसे ढेर जोड़ान पन्ना",
+       "mostlinkedcategories": "सबसे ढेर जोड़ान श्रेणि",
+       "mostlinkedtemplates": "सबसे ढेर ट्रांसक्लूड करल पन्ना",
+       "mostcategories": "सबसे ढेर श्रेणि वाले पन्ना",
+       "mostimages": "सबसे ढेर जोड़ान फाइल",
+       "mostinterwikis": "सबसे ढेर अंतरविकी कड़ि वाले पन्ना",
+       "mostrevisions": "सबसे ढेर अवतरण वाला पन्ना",
+       "prefixindex": "उपसर्ग अनुसार पन्ना",
+       "prefixindex-namespace": "उपसर्ग वाले कुल पन्ना ($1 नामस्थान)",
+       "prefixindex-strip": "सूची में उपसर्ग लुकुआवा जाय",
+       "shortpages": "छोट पन्ना",
+       "longpages": "लम्मा पन्ना",
+       "deadendpages": "बंद सिरा पन्ना",
+       "deadendpagestext": "नीचे दिहल पन्ना {{SITENAME}} कय अउर पन्नन् से नाइ जोडान है।",
+       "protectedpages": "सुरक्षित पन्ना",
+       "protectedpages-indef": "खालि अनिश्चितकालीन सुरक्षा",
+       "protectedpages-cascade": "कास्केडिङ सुरक्षा खालि",
+       "protectedpages-noredirect": "पुनर्निदेश लुकुआवा जाय",
+       "protectedpagesempty": "इ पारामिटर मे कवनो सुरक्षित पन्ना नाइ है ।",
+       "protectedpages-timestamp": "समय मोहर",
+       "protectedpages-page": "पन्ना",
+       "protectedpages-expiry": "खतम",
+       "protectedpages-performer": "सुरक्षित करय वाला सदस्य",
+       "protectedpages-params": "सुरक्षा प्राचल",
+       "protectedpages-reason": "कारण",
+       "protectedpages-unknown-timestamp": "अज्ञात",
+       "protectedpages-unknown-performer": "अज्ञात सदस्य",
+       "protectedtitles": "सुरक्षित शीर्षक",
+       "protectedtitles-summary": "इ पन्ना अइसन पन्ना शीर्षकन् कय सूची देत है जवने कय अभीन बनावै से सुरक्षित कई गा है। सुरक्षित पन्नन कय सूची देखेक खर्तिन [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] देखा जाय।",
+       "protectedtitlesempty": "इ नियमन् द्वारा कवनो भी शीर्षक सुरक्षित नाइ है।",
+       "listusers": "सदस्य सूची",
+       "listusers-editsonly": "अइसन सदस्य देखावा जाय जवन संपादन कै चुका हैँ ।",
+       "listusers-creationsort": "बनावै कय तिथि कय आधार पे क्रमांकन करा जाय",
+       "listusers-desc": "घटे कय क्रम मे मिलावा जाय",
+       "usereditcount": "$1 {{PLURAL:$1|सम्पादन}}",
+       "usercreated": "$1 कय $2 बजे बनाइ गय, सदस्यनाँव $3 होय",
+       "newpages": "नँवा पन्ना",
+       "newpages-username": "सदस्यनाँव:",
+       "ancientpages": "सबसे पुरान पन्ना",
+       "move": "घुस्कावा जाय",
+       "movethispage": "ई पन्ना कय नाँव बदला जाय",
+       "unusedcategoriestext": "निचे दिहा श्रेणी पन्ना मौजूद है लेकिन कवनो भी पन्ना या अउर श्रेणि एकर प्रयोग नाँइ करत हैं।",
+       "notargettitle": "लक्ष्य नाइ",
+       "notargettext": "इ काम कय करेक लिये आप लक्ष्य पन्ना या सदस्य नाइ बतावा गा है।",
+       "nopagetitle": "अइसन कवनो लक्ष्य पन्ना नाइ है",
+       "nopagetext": "आप कय द्वारा लक्षित पन्ना मौजूद नाइ है।",
+       "pager-newer-n": "{{PLURAL:$1|नँवा}} $1",
+       "pager-older-n": "{{PLURAL:$1|पुरान}} $1",
+       "suppress": "ओवरसाइट",
+       "querypage-disabled": "प्रदर्शन कारणन् से इ विशेष पन्ना अक्षम कै गा है।",
+       "apihelp": "API सहयोग",
+       "apihelp-no-such-module": "मोड्युल \"$1\" नाइ मिला ।",
+       "booksources": "किताबीन कय स्रोत",
+       "booksources-search-legend": "किताबीन कय स्रोत खोजा जाय",
+       "booksources-search": "खोजा जाय",
+       "specialloguserlabel": "करयवाला:",
+       "speciallogtitlelabel": "प्रयोजन (शीर्षक या सदस्यनाँव):",
+       "log": "लॉग",
+       "all-logs-page": "कुल सार्वजनिक लॉग",
+       "logempty": "लॉग में अइसन कवनो चिज नाइ है।",
+       "log-title-wildcard": "इ पाठ से शुरू होय वाला शीर्षक खोजा जाय",
+       "showhideselectedlogentries": "चुनल लाग प्रविष्टि देखावा जाय/लुकुआवा जाय",
+       "allpages": "कुल पन्ना",
+       "nextpage": "अगला पन्ना ($1)",
+       "prevpage": "पहिलका पन्ना ($1)",
+       "allpagesfrom": "इ अक्षर से शुरु होय वाला पन्ना देखावा जाय:",
+       "allpagesto": "इ अक्षर से खतम होय वाला पन्ना देखावा जाय:",
+       "allarticles": "कुल पन्ना",
+       "allinnamespace": "कुल पन्ना ($1 नामस्थान)",
+       "allpagessubmit": "जावा जाय",
+       "allpagesprefix": "इ उपपद से शुरू होय वाला पन्ना देखावा जाय:",
+       "allpagesbadtitle": "दिहल शीर्षक अयोग्य, ख़ाली या गलत जोड़ान अंतर-भाषीय या अंतर-विकि उपपद रहा।\nएहमा एक या एक से ढेर अईसन कॅरेक्टर होई सकत हैं जवन शीर्षक में प्रयोग नाई कई सका जात अहै।",
+       "allpages-bad-ns": "{{SITENAME}} में \"$1\" नामस्थान नाइ है।",
+       "allpages-hide-redirects": "पुनर्निर्देश लुकुआवा जाय",
+       "cachedspecial-refresh-now": "हालिए कय देखा जाय ।",
+       "categories": "श्रेणी",
+       "categoriesfrom": "इ अक्षर से शुरु होय वाला श्रेणी देखावा जाय:",
+       "special-categories-sort-count": "संख्या कय अनुसार क्रमांकित करा जाय",
+       "special-categories-sort-abc": "वर्णानुक्रम कय अनुसार देखावा जाय",
+       "deletedcontributions": "हटावल सदस्य योगदान",
+       "deletedcontributions-title": "हटावल सदस्य योगदान",
+       "sp-deletedcontributions-contribs": "योगदान",
+       "linksearch": "बाहरी कड़ी खोजा जाय",
+       "linksearch-pat": "खोजय खर्तीन पाठ:",
+       "linksearch-ns": "नामस्थान:",
+       "linksearch-ok": "खोजा जाय",
+       "linksearch-line": "$2 में से $1 जोडान है",
+       "listusersfrom": "इ अक्षर से शुरु होय वाले सदस्य देखावा जाय:",
+       "listusers-submit": "देखावा जाय",
+       "listusers-noresult": "कवनो सदस्य नाइ मिला ।",
+       "listusers-blocked": "(अवरोधित)",
+       "activeusers": "सक्रिय सदस्यन् कय सूची",
+       "activeusers-intro": "इ सक्रिय सदस्यन् कय सूची होय जे पिछला $1 {{PLURAL:$1|दिन}} में कुछ काम करें है।",
+       "activeusers-count": "$1 {{PLURAL:$1|काम}} पिछला $3 {{PLURAL:$3|दिन}} में",
+       "activeusers-from": "इ अक्षर से शुरु होय वाले सदस्य देखावा जाय:",
+       "activeusers-hidebots": "बॉट लुकुआवा जाय",
+       "activeusers-hidesysops": "प्रबंधक लुकुआवा जाय",
+       "activeusers-noresult": "कवनो सदस्य नाइ मिलें ।",
+       "listgrouprights": "सदस्य समूह अधिकार",
+       "listgrouprights-summary": "नीचे इ विकि खर्तीन परिभाषित सदस्य समूहन् कय सूची होय, सथवे में हर समूह से जोड़ान अधिकारो है।\nहर अधिकार कय बारे में [[{{MediaWiki:Listgrouprights-helppage}}|ढेर जानकरीओ]] उपलब्ध है।",
+       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">दिहल अधिकार</span>\n* <span class=\"listgrouprights-revoked\">हटावल अधिकार</span>",
+       "listgrouprights-group": "गोल",
+       "listgrouprights-rights": "अधिकार",
+       "listgrouprights-helppage": "Help:गोल अधिकार",
+       "listgrouprights-members": "(सदस्य सूची)",
+       "listgrouprights-addgroup": "{{PLURAL:$2|समूह}} जोड़ा जाय: $1",
+       "listgrouprights-removegroup": "समूह {{PLURAL:$2|हटावा जाय}}: $1",
+       "listgrouprights-addgroup-all": "कुल समूह जोड़ा जाय",
+       "listgrouprights-removegroup-all": "कुल समूह हटावा जाय",
+       "listgrouprights-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": "अइसन अधिकार जवन संपादन करय देत हैं",
+       "trackingcategories": "ट्रैक करय वाले श्रेणी",
+       "trackingcategories-msg": "ट्रैक करय वाले श्रेणी",
+       "trackingcategories-name": "सनेशा कय नाँव",
+       "watchlist": "अवलोकन सुची",
+       "undelete-nodiff": "कवनो पुरान अवतरण नाँइ मिला।",
+       "undeletebtn": "वापस लै आवा जाय",
+       "undeletelink": "देखा जाय/शुरु कय जैसन करा जाय",
+       "undeleteviewlink": "देखा जाय",
+       "undeleteinvert": "चुनाव उल्टा करा जाय",
+       "undeletecomment": "कारण:",
+       "undeletedrevisions": "{{PLURAL:$1|अवतरण पहिले जइसन कै गय}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 अवतरण|$1 अवतरण}} औ {{PLURAL:$2|1 फ़ाइल}} पहिले जइसन कै गय",
+       "undeletedfiles": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइल}} पहिले जइसन कै गय",
+       "cannotundelete": "पहिले जइसन नाइ कै मिला : $1",
+       "undeletedpage": "'''$1 कय पहिले जइसन कै गए'''\n\nहालिए में हटावल अव पुनर्स्थापित करल पन्नन् कय जानकारी कय खर्तीन [[Special:Log/delete|हटावे कय लॉग]] देखा जाय।",
+       "undelete-header": "हालिए में हटावल पन्ना द़ेखयक खर्तीन [[Special:Log/delete|हटावे कय लॉग]] देखा जाय।",
+       "undelete-search-title": "हटावल पन्ना खोजा जाय",
+       "undelete-search-box": "हटावल पन्ना खोजा जाय",
+       "undelete-search-prefix": "शुरूआती शब्द कय अनुसार पन्ना खोजा जाय:",
+       "undelete-search-submit": "खोजा जाय",
+       "undelete-no-results": "हटावल पन्नन कय लेखागार में मिलत जुलत कवनो पन्ना नाइ मिला।",
+       "undelete-filename-mismatch": "$1 कय फ़ाइल कय हटावल अवतरण पुनर्स्थापित नाइ कै सका जात है: फ़ाइल कय नाँव मिलत जुलत नाइ है ।",
+       "undelete-bad-store-key": "$1 कय फ़ाइल अवतरण पुनर्स्थापित नाइ कै सका जात है: हटावे से पहिले फ़ाइल मौजूद नाइ रहा।",
+       "undelete-cleanup-error": "लेखागार में से अप्रयुक्त फ़ाइल \"$1\" हटावै में त्रुटि।",
+       "undelete-error": "पन्ना पुनर्स्थापन में त्रुटि",
+       "undelete-error-short": "फ़ाइल पुनर्स्थापन में त्रुटि: $1",
+       "undelete-error-long": "फ़ाइल पुनर्स्थापन में आवल त्रुटि:\n\n$1",
+       "undelete-show-file-confirm": "का आप सहि में फ़ाइल \"<nowiki>$1</nowiki>\" कय $2 कय $3 बजे बनल, हटावल अवतरण कय देखेक चाहा जात है?",
+       "undelete-show-file-submit": "हाँ",
+       "namespace": "नामस्थान:",
+       "invert": "चुनाव उल्टा करा जाय",
+       "namespace_association": "सम्बद्ध नामस्थान",
+       "blanknamespace": "(मुख्य)",
+       "contributions": "{{GENDER:$1|सदस्य}} योगदान",
+       "contributions-title": "$1 कय योगदान",
+       "mycontris": "योगदान",
+       "contribsub2": "{{GENDER:$3|$1}} ($2) कय खर्तीन",
+       "contributions-userdoesnotexist": "सदस्य \"$1\" पंजीकृत नाइ है।",
+       "uctop": "(अबहिनै कय)",
+       "month": "इ महिन्नासे (औ पुरान):",
+       "year": "इ सालसे (औ पुरान):",
+       "sp-contributions-newbies": "खालि नँवा सदस्यन् कय योगदान देखावा जाय",
+       "sp-contributions-newbies-sub": "नँवा सदस्यन कय खर्तीन",
+       "sp-contributions-newbies-title": "नँवा सदस्यन् कय योगदान",
+       "sp-contributions-blocklog": "ब्लॉक सूची",
+       "sp-contributions-suppresslog": "हटावल सदस्य योगदान",
+       "sp-contributions-deleted": "हटावल सदस्य योगदान",
+       "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-submit": "खोजा जाय",
+       "whatlinkshere": "यँह काव काव जोडान है",
+       "whatlinkshere-title": "$1 से जोडान पन्ना",
+       "whatlinkshere-page": "पन्ना:",
+       "linkshere": "नीचे दिहा पन्ना '''[[:$1]]''' से जोडान है:",
+       "nolinkshere": "'''[[:$1]]''' से कुछ नाइ जोडान् है।",
+       "nolinkshere-ns": "चुनल नामस्थानसे '''[[:$1]]''' से कवनो पन्ना नाइ जोडान् है।",
+       "isredirect": "पुनर्निर्देशन पन्ना",
+       "istemplate": "मिलावा जाय",
+       "isimage": "फ़ाइल कय कड़ी",
+       "whatlinkshere-prev": "{{PLURAL:$1|पिछला}}",
+       "whatlinkshere-next": "{{PLURAL:$1|अगला}}",
+       "whatlinkshere-links": "← कड़ि",
+       "whatlinkshere-hideredirs": "$1 पुनर्निर्देश",
+       "whatlinkshere-hidetrans": "$1 ट्रान्स्क्ल्युजन्स",
+       "whatlinkshere-hidelinks": "$1 कड़ि",
+       "whatlinkshere-hideimages": "$1 फ़ाइल लिंक",
+       "whatlinkshere-filters": "छनना",
+       "autoblockid": "अपने आप अवरोध #$1",
+       "block": "सदस्य कय अवरोधित करा जाय।",
+       "unblock": "सदस्य कय अवरोध हटावा जाय।",
+       "blockip": "{{GENDER:$1|सदस्य}}",
+       "blockip-legend": "सदस्य कय अवरोधित करा जाय।",
+       "ipaddressorusername": "आईपी एड्रेस या सदस्यनाँव:",
+       "ipbexpiry": "समाप्ति:",
+       "ipbreason": "कारण:",
+       "ipbcreateaccount": "खाते बनावेकै रोका जाय",
+       "ipbemailban": "सदस्य कय ईमेल करै से रोका जाय",
+       "ipbsubmit": "इ सदस्य कय अउर बदलाव करय से रोका जाय",
+       "ipbother": "अउर समय:",
+       "ipboptions": "दुइ घंटा:2 hours,एक दिन:1 day,तीन दिन:3 days,एक हप्ता:1 week,दुइ हप्ता:2 weeks,एक महीना:1 month,तीन महीना:3 months,छः महीना:6 months,एक साल:1 year,हमेशा कय लिये:infinite",
+       "ipb-confirm": "अवरोधण कय पुष्टि करा जाय",
+       "badipaddress": "अमान्य आईपी ठहर।",
+       "blockipsuccesssub": "अवरोधन सफल ।(संपादन करय से रोक दिहा गा है)",
+       "ipb-edit-dropdown": "ब्लॉक कारण संपादित करा जाय",
+       "ipb-unblock-addr": "$1 कय अनब्लॉक करा जाय",
+       "ipb-unblock": "सदस्य या आईपी एड्रेस कय अनब्लॉक करा जाय",
+       "ipb-blocklist": "सद्य ब्लॉक देखा जाय",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} कय योगदान",
+       "unblockip": "सदस्य कय अवरोध हटावा जाय।",
+       "ipusubmit": "इ अवरोध हटावा जाय",
+       "unblocked": "[[User:$1|$1]] होइ गा हैं।",
+       "unblocked-range": "$1 अनब्लॉक होइ गा हैं।",
+       "unblocked-id": "अवरोध $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|ब्लॉक}}",
+       "infiniteblock": "इनफाईनाईट",
+       "expiringblock": "$1 कय $2 बजे समय खतम होत है",
+       "anononlyblock": "केवल बेनाम सदस्य",
+       "createaccountblock": "खाता बनावै कय रोक लगाए दिहा गा हैं",
+       "emailblock": "ईमेल अवरोधित",
+       "blocklist-nousertalk": "आपन बातचीत पन्ना भी संपादन नाइ कै सकत हैँ ।",
+       "ipblocklist-empty": "ब्लॉक सूची खाली है।",
+       "blocklink": "अवरोधित करा जाय",
+       "unblocklink": "अवरोध हटावा जाय",
+       "change-blocklink": "विभाग बदला जाय",
+       "contribslink": "योगदान",
+       "emaillink": "ईमेल पठवा जाय",
+       "blocklogpage": "ब्लॉक सूची",
+       "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": "सदस्य नाँव लुकुआवा है",
+       "ipb_expiry_invalid": "अवैध समाप्ति कालावधी।",
+       "ipb_already_blocked": "\"$1\" पहिलवे से ब्लॉक हैं",
+       "ipb-otherblocks-header": "अउर {{PLURAL:$1|ब्लॉक}}",
+       "ip_range_invalid": "गलत आईपी रेंज",
+       "proxyblocker": "प्रॉक्सी ब्लॉकर",
+       "lockdb": "डाटाबेस लॉक करा जाय",
+       "unlockdb": "डाटाबेस अनलॉक करा जाय",
+       "lockbtn": "डाटाबेस लॉक करा जाय",
+       "unlockbtn": "डाटाबेस अनलॉक करा जाय",
+       "movereason": "कारण:",
+       "revertmove": "पहिले जैसन करा जाय",
+       "export-submit": "निर्यात",
+       "export-addcat": "जोडव",
+       "export-addns": "जोडा जाय",
+       "allmessages": "व्यवस्था संदेश",
+       "allmessagesname": "नाँव",
+       "allmessagesdefault": "सनेशा कय डिफ़ॉल्ट पाठ",
+       "allmessagescurrent": "वर्तमान पाठ",
+       "allmessages-filter-unmodified": "अपरिवर्तित",
+       "allmessages-filter-all": "कुल",
+       "allmessages-filter-modified": "परिवर्तित",
+       "allmessages-language": "भाषा:",
+       "allmessages-filter-submit": "जावा जाय",
+       "import-interwiki-sourcepage": "स्रोत पन्ना:",
+       "import-interwiki-submit": "आयात",
+       "import-interwiki-namespace": "गंतव्य नामस्थान:",
+       "import-interwiki-rootpage": "गंतव्य पृष्ठ उपसर्ग (वैकल्पिक):",
+       "import-upload-filename": "फ़ाइल कय नाँव",
+       "import-comment": "टिप्पणी:",
+       "import-revision-count": "$1 {{PLURAL:$1|अवतरण}}",
+       "importunknownsource": "अज्ञात आयात स्रोत प्रकार",
+       "importcantopen": "आयात फ़ाइल खोल नाई खुला।",
+       "importbadinterwiki": "अवैध अन्तरविकि कड़ी",
+       "importlogpage": "आयात सूची",
+       "javascripttest": "जावास्क्रिप्ट परीक्षण",
+       "javascripttest-pagetext-unknownframework": "अज्ञात परीक्षण ढाँचा \"$1\"",
+       "tooltip-pt-userpage": "आप कय सदस्य पन्ना",
+       "tooltip-pt-mytalk": "आप कय बातचित पन्ना",
+       "tooltip-pt-preferences": "आप कय पसंद",
+       "tooltip-pt-logout": "बहरे निकरा जाय",
+       "tooltip-ca-protect": "इ पन्ना कय सुरक्षित करा जाय",
+       "tooltip-ca-unprotect": "ई पन्ना कय सुरक्षा स्तर बदला जाय",
+       "tooltip-ca-delete": "ई पन्ना मेटावा जाय",
+       "tooltip-ca-move": "ई पन्ना कय नाँव बदला जाय",
+       "tooltip-search": "{{SITENAME}} में खोजा जाय",
+       "tooltip-p-logo": "प्रधान पन्ना",
+       "tooltip-n-mainpage": "प्रधान पन्ना पे जावा जाय",
+       "tooltip-n-mainpage-description": "प्रधान पन्ना पे जावा जाय",
+       "tooltip-t-emailuser": "इ सदस्य कय इमेल पठवा जाय",
+       "tooltip-t-upload": "फ़ाइल अपलोड करा जाय",
+       "tooltip-t-specialpages": "कुल विशेष पन्नन कय सूची",
+       "tooltip-ca-nstab-main": "सामग्री वाला पन्ना देखा जाय",
+       "tooltip-ca-nstab-user": "सदस्य पन्ना देखा जाय",
+       "tooltip-ca-nstab-media": "मीडिया पन्ना देखा जाय",
+       "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-watchlistedit-normal-submit": "पन्ना हटावा जाय",
+       "tooltip-watchlistedit-raw-submit": "ध्यानसूची अपडेट करा जाय",
+       "tooltip-upload": "अपलोड शुरू करा जाय",
+       "tooltip-preferences-save": "पसंद सहेजा जाय",
+       "anonymous": "{{SITENAME}} कय {{PLURAL:$1||}} बेनामी सदस्य",
+       "siteuser": "विकिपीडिया सदस्य  $1",
+       "anonuser": "{{SITENAME}} अज्ञात उपयोगकर्ता $1"
+}
index 44cd1ee..d9f72e5 100644 (file)
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
-       "tog-hideminor": "Son dəyişikliklər kiçik redaktələri gizlə",
-       "tog-hidepatrolled": "Yoxlanılmış redaktələri son dəyişikliklərdə göstərmə",
-       "tog-newpageshidepatrolled": "Yoxlanılmış səhifələri yeni səhifə siyahısında göstərmə",
-       "tog-extendwatchlist": "Təkmil izləmə siyahısı",
-       "tog-usenewrc": "Son dəyişikliklərin təkmil versiyası (JavaScript)",
-       "tog-numberheadings": "Başlıqların avto-nömrələnməsi",
-       "tog-showtoolbar": "Redaktə zamanı alətlər qutusunu göstər (JavaScript)",
-       "tog-editondblclick": "Səhifələri iki kliklə redaktə etməyə başla (JavaScript)",
-       "tog-editsectiononrightclick": "Bölmələrin redaktəsini başlıqların üzərində sağ klik etməklə mümkün et (JavaScript)",
-       "tog-watchcreations": "Yaratdığım səhifələri izlədiyim səhifələrə əlavə et",
-       "tog-watchdefault": "Redaktə etdiyim səhifələri izlədiyim səhifələrə əlavə et",
-       "tog-watchmoves": "Adlarını dəyişdiyim səhifələri izlədiyim səhifələrə əlavə et",
-       "tog-watchdeletion": "Sildiyim səhifələri izlədiyim səhifələrə əlavə et",
-       "tog-minordefault": "Default olaraq bütün redaktələri kiçik redaktə kimi nişanla",
+       "tog-hideminor": "Son dəyişikliklər siyahısında kiçik redaktələri gizlə",
+       "tog-hidepatrolled": "Son dəyişikliklər siyahısında yoxlanılmış redaktələri gizlə",
+       "tog-newpageshidepatrolled": "Yeni səhifələr siyahısında yoxlanılmış səhifələri gizlə",
+       "tog-extendwatchlist": "Yalnız son dəyişiklikləri yox, bütün dəyişiklikləri göstərmək üçün izləmə siyahısını genişlət",
+       "tog-usenewrc": "Son dəyişikliklərdəki və izləmə siyahısındakı dəyişiklikləri qruplaşdır",
+       "tog-numberheadings": "Başlıqları avtomatik nömrələ",
+       "tog-showtoolbar": "Redaktə zamanı üstdəki alətlər qutusunu göstər",
+       "tog-editondblclick": "Səhifələri iki kliklə redaktə et",
+       "tog-editsectiononrightclick": "Bölmə başlığı üzərində siçanın sağ düyməsini klikləməklə bölmələri redaktə et",
+       "tog-watchcreations": "Yaratdığım səhifələri və yüklədiyim faylları izlədiyim səhifələrə əlavə et",
+       "tog-watchdefault": "Redaktə etdiyim səhifələri və faylları izlədiyim səhifələrə əlavə et",
+       "tog-watchmoves": "Adlarını dəyişdiyim səhifələri və faylları izlədiyim səhifələrə əlavə et",
+       "tog-watchdeletion": "Sildiyim səhifələri və faylları izlədiyim səhifələrə əlavə et",
+       "tog-minordefault": "Standart olaraq bütün redaktələri kiçik redaktə kimi nişanla",
        "tog-previewontop": "Sınaq göstərişi yazma sahəsindən əvvəl göstər",
        "tog-previewonfirst": "İlkin redaktədə sınaq göstərişi",
        "tog-enotifwatchlistpages": "İzləmə siyahısında olan məqalə redaktə olunsa, mənə e-məktub göndər",
@@ -53,7 +53,7 @@
        "tog-shownumberswatching": "İzləyən istifadəçilərin sayını göstər",
        "tog-oldsig": "İndiki imza:",
        "tog-fancysig": "Vikimətn şəklində imza (avtomatik keçid yaratmadan)",
-       "tog-uselivepreview": "Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)",
+       "tog-uselivepreview": "Canlı sınaq baxışını istifadə et",
        "tog-forceeditsummary": "Qısa məzmunu boş saxladıqda mənə bildir",
        "tog-watchlisthideown": "Mənim redaktələrimi izləmə siyahısında gizlət",
        "tog-watchlisthidebots": "Bot redaktələrini izləmə siyahısında gizlət",
        "viewsourcetext": "Siz bu səhifənin məzmununu görə və köçürə bilərsiniz:",
        "viewyourtext": "Bu səhifəyə '''etdiyiniz dəyişikliklərin''' mənbəyini görüntüləyib köçürə bilərsiniz:",
        "protectedinterface": "Bu səhifədə proqram təminatı üçün sistem məlumatları var və sui-istifadənin qarşısını almaq üçün mühafizə olunmalıdır.",
-       "editinginterface": "'''Diqqət!''' Siz proqram təminatı interfeysinin mətn olan səhifəsini redaktə edirsiniz.\nOnun dəyişdirilməsi digər istifadəçilərin interfeysinin xarici görünüşünə təsir göstərir.\nTərcümə üçün daha yaxşı olar ki, MediaWiki-nin lokallaşması üçün olan [//translatewiki.net/wiki/Main_Page?setlang=az translatewiki.net]  layihəsindən istifadə edəsiniz.",
+       "editinginterface": "<strong>Diqqət:</strong> Siz proqram təminatı üçün interfeys mətni olan səhifəni redaktə edirsiniz.\nOnun dəyişdirilməsi digər istifadəçilərin interfeysinin xarici görünüşünə təsir göstərəcək.",
        "cascadeprotected": "Səhifə mühafizə olunub, çünki o kaskad mühafizə olunan {{PLURAL:$1|növbəti səhifəyə|növbəti səhifələrə}} qoşulub:\n$2",
        "namespaceprotected": "Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.",
        "customcssprotected": "Bu səhifəni redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
        "invalidtitle-knownnamespace": "\"$2\" sahə adı üçün \"$3\" mətni keçərsiz bir başlıq",
        "invalidtitle-unknownnamespace": "Naməlum $1 ad sahəsi miqdarı və keçərsiz \"$2\" başlıq",
        "exception-nologin": "Giriş edilməmişdir",
-       "exception-nologin-text": "Bu səhifəyə daxi olmaq üçün [[Special:Userlogin|özünüzü təqdim]], edin.",
+       "exception-nologin-text": "Bu səhifəyə daxil olmaq və ya fəaliyyəti icra etmək üçün özünüzü sistemə təqdim edin.",
        "exception-nologin-text-manual": " bu səhifəyə və ya hərəkətə daxil olmaq üçün $1 lazımdır.",
        "virus-badscanner": "Düzgün olmayan konfiqurasiya: naməlum ''$1'' virus yoxlayanı",
        "virus-scanfailed": "Yoxlama başa çatmadı (kod $1)",
        "virus-unknownscanner": "naməlum antivirus",
-       "logouttext": "'''Sistemdən çıxdınız.'''\n\nSiz {{SITENAME}} saytını anonim olaraq istifadə etməyə davam edə bilər və ya eyni, yaxud başqa istifadəçi adı ilə <span class='plainlinks'>[$1 yenidən daxil ola]</span> bilərsiniz. Veb-brauzerin keş yaddaşını təmizləyənədək bəzi səhifələr hələ də sistemdə imişsiniz kimi görünə bilər.",
+       "logouttext": "<strong>Sistemdən çıxdınız.</strong>\n\nVeb-brauzerin keş yaddaşını təmizləyənədək bəzi səhifələr hələ də sistemdəymişsiniz kimi görünə bilər.",
        "welcomeuser": "Xoş gəldin $1!",
        "welcomecreation-msg": "Hesabınız yaradıldı.\n[[Special:Preferences|{{SITENAME}} nizamlamalarınızı]] dəyişdirməyi unutmayın.",
        "yourname": "İstifadəçi adı",
        "userlogout": "Çıxış",
        "notloggedin": "Daxil olmamısınız",
        "userlogin-noaccount": "İstifadəçi hesabınız yoxdur?",
-       "userlogin-joinproject": "{{SITENAME}} qoşulun",
+       "userlogin-joinproject": "{{SITENAME}} layihəsinə qoşulun",
        "nologin": "İstifadəçi hesabınız yoxdur? $1.",
-       "nologinlink": "Hesab yaradın",
-       "createaccount": "Hesab ",
+       "nologinlink": "Hesab yarat",
+       "createaccount": "Hesab yarat",
        "gotaccount": "İstifadəçi hesabınız varmı? '''$1'''.",
        "gotaccountlink": "Daxil olun",
        "userlogin-resetlink": "Daxilolma məlumatlarınızı unutmusunuz?",
-       "userlogin-resetpassword-link": "Parolu unutdunuzmu?",
+       "userlogin-resetpassword-link": "Parolunuzu unutmusunuz?",
+       "userlogin-helplink2": "Qeydiyyat barədə köməklik",
        "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, başqa bir istifadəçi kimi daxil ola bilərsiniz.",
        "userlogin-createanother": "Başqa bir istifadəçi hesabı yarat",
        "createacct-emailrequired": "E-poçt ünvanı",
        "cannotchangeemail": "Hesabın e-poçt ünvanı bu wiki üzərindən dəyişdirilə bilməz.",
        "emaildisabled": "Bu saytdan e-poçt göndərə bilməzsiniz.",
        "accountcreated": "Hesab yaradıldı",
-       "accountcreatedtext": "$1 üçün istifadəçi hesabı yaradıldı.",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) üçün istifadəçi hesabı yaradıldı.",
        "createaccount-title": "{{SITENAME}} hesabın yaradılması",
        "createaccount-text": "Biriləri {{SITENAME}} saytında ($4) sizin e-poçt ünvanınızdan istifadə edərək, parolu \"$3\" olan, \"$2\" adlı bir hesab yaratdı.\n\nSayta daxil olmalı və parolunuzu dəyişdirməlisiniz.\n\nƏgər istifadəçi hesabını səhvən yaratmısınızsa, bu mesajı gözardı edə bilərsiniz.",
-       "login-throttled": "Sistemə daxil olmaq üçün həddən artıq cəhd etmisiniz.\nYeni cəhd etməzdən əvvəl bir qədər gözləyin.",
+       "login-throttled": "Sistemə daxil olmaq üçün həddən artıq cəhd etmisiniz.\nYeni cəhd etməzdən əvvəl $1 gözləyin.",
        "login-abort-generic": "Giriş uğursuz alındı - Rədd",
        "loginlanguagelabel": "Dil: $1",
        "suspicious-userlogout": "Sizin çıxış üçün cəhdiniz uğursuz alındı. Bu, brouzerin yaxud proksi-keşləmənin düzgün işləməməsindən qaynaqlanır.",
        "createacct-another-realname-tip": "Gərçək adınız istəyə bağlıdır.\nƏgər gərçək adınızı göstərsəniz, çalışmalarınıza müraciət etmək üçün istifadə ediləcəkdir.",
        "pt-login": "Daxil ol",
        "pt-login-button": "Daxil ol",
-       "pt-createaccount": "Akkaunt yarat",
+       "pt-createaccount": "Hesab yarat",
        "pt-userlogout": "Çıxış",
        "php-mail-error-unknown": "PHP-nin mail() funksiyasında naməlum xəta",
        "user-mail-no-addy": "Bir e-poçt ünvanı olmadan e-poçt göndərməyə çalışdı.",
        "passwordreset-emailelement": "İstifadəçi adı: $1\nMüvəqqəti parol: $2",
        "passwordreset-emailsent": "Xəbərdarlıq məktubu e-maillə göndərildi.",
        "changeemail": "E-məktub ünvanını dəyiş",
-       "changeemail-oldemail": "Hazırki e-poçt ünvanı:",
+       "changeemail-oldemail": "Hazırkı e-poçt ünvanı:",
        "changeemail-newemail": "Yeni e-poçt ünvanı:",
        "changeemail-none": "(yoxdur)",
        "changeemail-submit": "E-poçtu dəyiş",
        "preview": "Sınaq görüntüsü",
        "showpreview": "Sınaq göstərişi",
        "showdiff": "Dəyişiklikləri göstər",
-       "anoneditwarning": "'''DİQQƏT!''' Siz özünüzü sistemə təqdim etməmisiniz. Sizin IP ünvanınız bu səhifənin tarixçəsinə qeyd olunacaq.",
+       "anoneditwarning": "<strong>Diqqət:</strong> Siz sistemə daxil olmamısınız. Hər hansı dəyişiklik etsəniz, sizin IP-ünvanınız hamıya görünəcək. Əgər <strong>[$1 daxil olsanız]</strong> və ya <strong>[$2 hesab yaratsanız]</strong>, redaktələriniz sizin istifadəçi adınıza yazılacaq və digər üstünlüklər də qazanacaqsınız.",
        "anonpreviewwarning": "Sistemə daxil olmamısınız. \"Səhifəni qeyd et\" düyməsini bassanız IP ünvanınız səhifənin tarixçəsində qeyd olunacaq.",
        "missingsummary": "'''Xatırlatma.''' Siz dəyişikliklərin qısa şərhini verməmisiniz. \"Səhifəni qeyd et\" düyməsinə təkrar basandan sonra sizin dəyişiklikləriniz şərhsiz qeyd olunacaq.",
        "missingcommenttext": "Zəhmət olmasa, aşağıda şərhinizi yazın.",
        "currentrev": "Hal-hazırkı versiya",
        "currentrev-asof": "Səhifəsinin $1 tarixinə olan son halı",
        "revisionasof": "$1 versiyası",
-       "revision-info": "$2 tərəfindən yaradılmış $1 tarixli dəyişiklik",
+       "revision-info": "$2$7 tərəfindən edilmiş $1 tarixli dəyişiklik",
        "previousrevision": "←Əvvəlki versiya",
        "nextrevision": "Sonrakı versiya→",
        "currentrevisionlink": "Hal-hazırkı versiya",
        "history-feed-empty": "Axtardığınız səhifə mövcud deyil.\nÇox guman ki, bu səhifə silinib və ya onun adı dəyişdirilib.\nVikidə buna bənzər səhifələri [[Special:Search|axtarmağa]] cəhd edin.",
        "rev-deleted-comment": "(şərhlər silindi)",
        "rev-deleted-user": "(İstifadəçi adı silindi)",
-       "rev-deleted-event": "(qeyd silindi)",
+       "rev-deleted-event": "(qeydiyyat detalları silindi)",
        "rev-deleted-user-contribs": "[istifadəçi adı və ya IP ünvanı silindi - dəyişiklik fəaliyyətlərdən çıxarıldı]",
        "rev-deleted-text-permission": "Səhifənin bu versiyası''' silinib'''.\nMümkündür ki, bunun səbəbi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərində] göstərilmişdir.",
        "rev-suppressed-text-unhide": "Səhifənin bu versiyası''' silinib'''.\nMümkündür ki, bunun səbəbi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərində] göstərilmişdir.\nSiz idarəçi olduğunuza görə silinən [$1 bu versiyanı] nəzərdən keçirə bilərsiniz.",
        "revdelete-show-file-submit": "Bəli",
        "logdelete-selected": "Jurnalın {{PLURAL:$1|seçilmiş qeydi|seçilmiş qeydləri}}:",
        "revdelete-legend": "Məhdudiyyətləri müəyyənləşdir:",
-       "revdelete-hide-text": "Səhifənin bu versiyasının mətnini gizlə",
+       "revdelete-hide-text": "Dəyişikliyin mətni",
        "revdelete-hide-image": "Faylın məzmununu gizlə",
-       "revdelete-hide-name": "Hərəkəti və məqsədi gizləmək",
-       "revdelete-hide-comment": "Dəyişikliklərin şərhini gizlə",
-       "revdelete-hide-user": "Redaktə müəllifinin istifadəçi adını/IP ünvanını gizlə",
+       "revdelete-hide-name": "Məqsədi və parametrləri gizlə",
+       "revdelete-hide-comment": "Dəyişikliklərin təsviri",
+       "revdelete-hide-user": "Redaktə müəllifinin istifadəçi adı/IP-ünvanı",
        "revdelete-hide-restricted": "Məlumatları idarəçilərdən də gizlə",
        "revdelete-radio-same": "(dəyişdirmə)",
        "revdelete-radio-set": "Gizli",
        "revdel-restore": "Görünüşü dəyiş",
        "pagehist": "Səhifənin tarixçəsi",
        "deletedhist": "Silmə qeydləri",
-       "revdelete-reason-dropdown": "*Ümumi silmə səbəbləri\n** Müəllif hüquqları pozuntusu\n** Uyğunsuz şəxsi məlumat",
+       "revdelete-reason-dropdown": "*Əsas silmə səbəbləri\n** Müəllif hüquqları pozuntusu\n** Uyğun olmayan şəxsi məlumat\n** Uyğun olmayan istifadəçi adı\n** Potensial böhtan xarakterli məlumat",
        "revdelete-otherreason": "Digər/əlavə səbəb:",
        "revdelete-reasonotherlist": "Digər səbəb",
        "revdelete-edit-reasonlist": "Silmə səbəblərini redaktə et",
        "search-section": "(bölmə $1)",
        "search-suggest": "Bəlkə, bunu nəzərdə tuturdunuz: $1",
        "search-interwiki-caption": "Qardaş layihələr",
-       "search-interwiki-default": "$1 nəticə:",
+       "search-interwiki-default": "$1 nəticələri:",
        "search-interwiki-more": "(yenə)",
        "search-relatedarticle": "əlaqədar",
        "searchrelated": "əlaqəli",
        "timezoneregion-indian": "Hind Okeanı",
        "timezoneregion-pacific": "Sakit Okean",
        "allowemail": "Digər istifadəçilər mənə e-məktub göndərə bilər",
-       "prefs-searchoptions": "Axtarış kriteriyaları",
+       "prefs-searchoptions": "Axtar",
        "prefs-namespaces": "Adlar fəzası",
        "default": "boş",
        "prefs-files": "Fayllar",
        "prefs-common-css-js": "Bütün skinlər üçün ümumi CSS/JavaScript:",
        "prefs-emailconfirm-label": "E-poçtun təsdiqlənməsi:",
        "youremail": "E-məktub:",
-       "username": "İstifadəçi adı:",
-       "prefs-memberingroups": "Üzvü olduğu {{PLURAL:$1|qrup|qrup}}:",
+       "username": "{{GENDER:$1|İstifadəçi adı}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Üzv}} olduğu {{PLURAL:$1|qrup}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Qeydiyyat vaxtı:",
        "prefs-registration-date-time": "$1",
        "yournick": "Ləqəb:",
        "badsig": "Səhv xam imza.\nHTML kodu yoxla.",
        "badsiglength": "İmzanız çox uzundur. İmza $1 {{PLURAL:$1|simvoldan|simvoldan}} uzun olmamalıdır.",
-       "yourgender": "Cins:",
-       "gender-unknown": "göstərmə",
-       "gender-male": "kişi",
-       "gender-female": "qadın",
+       "yourgender": "Hansı təsvir sizə daha uyğundur?",
+       "gender-unknown": "Bildirmək istəmirəm",
+       "gender-male": "Bu kişi istifadəçi viki-səhifələri redaktə edir",
+       "gender-female": "Bu qadın istifadəçi viki-səhifələri redaktə edir",
        "email": "E-məktub",
-       "prefs-help-realname": "Həqiqi adınızı daxil etmək məcburi deyil.\nBu seçimi etdiyiniz halda, adınız redaktələrinizə görə müəlliflik hüququnuzun tanınması üçün istifadə ediləcək.",
+       "prefs-help-realname": "Həqiqi adınızı daxil etmək məcburi deyil.\nDaxil etsəniz, adınız redaktələrinizin müəllifliyinin təyin edilməsi üçün istifadə edilə bilər.",
        "prefs-help-email": "E-poçt ünvanınızı daxil etmək məcburi deyil.\nBu, parolunuzu unutduğunuz halda, sizə yeni parol göndərməyə imkan verir.",
        "prefs-help-email-others": "Həmçinin, istifadəçi və ya müzakirə səhifənizdəki link vasitəsilə başqa istifadəçilərin sizinlə əlaqə yaratmasını seçə bilərsiniz. Bu halda sizin e-poçt ünvanınız heç kimə görünməyəcək.",
        "prefs-help-email-required": "Elektron ünvan tələb olunur.",
        "prefs-signature": "İmza",
        "prefs-dateformat": "Tarix formatı",
        "prefs-timeoffset": "Saat qurşağının fərqi",
-       "prefs-advancedediting": "Ətraflı variantlar",
+       "prefs-advancedediting": "Ümumi parametrlər",
        "prefs-advancedrc": "Ətraflı variantlar",
        "prefs-advancedrendering": "Ətraflı variantlar",
        "prefs-advancedsearchoptions": "Ətraflı variantlar",
        "userrights-no-interwiki": "Sizə başqa vikilayihələrdəki istifadəçilərin statusunu dəyişməyə icazə verilməyib",
        "userrights-nodatabase": "$1 verilənlər bazası ya mövcud deyil, ya da lokal deyil.",
        "userrights-nologin": "Siz istifadəçilərin hüquqlarını dəyişmək üçün sistemə idarəçi olaraq [[Special:UserLogin|daxil olmalısınız]].",
-       "userrights-notallowed": "Sizin istifadəçi hesabınıza digər istifadəçilərə hüquqlar vermək və ya almağa icazə verilməyib.",
+       "userrights-notallowed": "Sizin digər istifadəçilərə hüquqlar vermək və ya almaq icazəniz yoxdur.",
        "userrights-changeable-col": "Dəyişdirə bildiyiniz qruplar",
        "userrights-unchangeable-col": "Dəyişdirə bilmədiyiniz qruplar",
        "userrights-irreversible-marker": "$1*",
        "right-createaccount": "Yeni istifadəçi hesabları açmaq",
        "right-minoredit": "Redaktələri kiçik redaktə kimi nişanlamaq",
        "right-move": "Səhifənin adını dəyişdir",
-       "right-move-subpages": "Səhifənin adının onların alt səhifələrin adı ilə dəyişdirilməsi",
+       "right-move-subpages": "Səhifələrin adını onların alt səhifələrinin adları ilə birlikdə dəyişdir",
        "right-move-rootuserpages": "əsas istifadəçi səhifələrinin adını dəyişmək",
        "right-movefile": "Faylın adını dəyişdir",
        "right-suppressredirect": "Səhifənin adını dəyişən zaman kohnə addan istiqamətlənmə yaradıla bilinmir",
        "right-reupload-own": "Mövcud faylın yeni versiyasının həmin istifadəçi tərəfindən yüklənməsi",
        "right-reupload-shared": "ümumi anbarda olan faylın adının lokal adla dəyişdirilməsi",
        "right-upload_by_url": "URL-dən fayl yüklə",
-       "right-autoconfirmed": "Yarım mühafizə edilmiş səhifənin redaktəsi",
+       "right-autoconfirmed": "IP-ünvana görə sürət məhdudiyyəti yoxdur",
        "right-bot": "Avtomatik proses hesab edilir",
        "right-apihighlimits": "API sorğularında yüksək həddən istifadə et",
        "right-writeapi": "Redaktələrdən zamanı API-dən (İnterfeys proqramlaşdıran proqram) istifadə",
        "right-hideuser": "İstifadəçi adına qadağa qoy və adın görünməsinin qarşısını al",
        "right-ipblock-exempt": "IP bloklanmalarını, avtobloklanmalarını və diapazon bloklanmalarını keç",
        "right-proxyunbannable": "Proksilərin avtomatik bloklanmalarını keç",
-       "right-unblockself": "Özünün blokunun qaldırılması",
-       "right-protect": "Mühafizə səviyyəsi dəyiş və mühafizə altında olan səhifəni redaktə et",
-       "right-editprotected": "Mühafizə olunmuş səhifələri redaktə (kaskad mühafizə daxil olmaqla)",
+       "right-unblockself": "Öz blokunuzun açılması",
+       "right-protect": "Mühafizə səviyyəsinin dəyişilməsi və kaskad mühafizə olunan səhifələrin redaktə edilməsi",
+       "right-editprotected": "\"{{int:protect-level-sysop}}\" mühafizə səviyyəsinə malik səhifələrin redaktə edilməsi",
        "right-editinterface": "İstifadəçi interfeysini dəyişmək",
        "right-editusercssjs": "Digər istifadəçilərin CSS və JavaScript fayllarını redaktə",
        "right-editusercss": "Digər istifadəçilərin CSS faylını redaktə",
        "action-edit": "bu səhifəni redaktə etmək",
        "action-createpage": "səhifələrin yaradılması",
        "action-createtalk": "müzakirə səhifələrinin yaradılması",
-       "action-createaccount": "bu istifadəçi hesabının yaradılması",
+       "action-createaccount": "bu istifadəçi hesabını yaratmaq",
        "action-minoredit": "bunu kiçik redaktə kimi nişanla",
        "action-move": "bu səhifənin adını dəyişmək",
        "action-move-subpages": "bu səhifənin və onun altsəhifələrinin adını dəyişmək",
        "recentchanges-label-bot": "Bu redaktə bot tərəfindən edilmişdir",
        "recentchanges-label-unpatrolled": "Bu redaktə hələ nəzərdən keçirilməmişdir",
        "recentchanges-label-plusminus": "Səhifənin ölçüsü bayt miqdarı ilə təyin edilir",
-       "recentchanges-legend-newpage": "$1 - yeni səhifə",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (həmçinin bax: [[Special:NewPages|yeni səhifələrin siyahısı]])",
        "rcnotefrom": "Aşağıda <strong>$2</strong>-dən bu yana olan dəyişikliklər göstərilib (<strong>$1</strong>-dən çox olmayaraq).",
        "rclistfrom": "$3 $2 vaxtından başlayaraq yeni dəyişiklikləri göstər",
        "rcshowhideminor": "Kiçik redaktələri $1",
        "backend-fail-delete": "\"$1\" faylı sililmədi.",
        "backend-fail-copy": "\"$1\" faylı \"$2\" faylına kopyalanmır.",
        "backend-fail-read": "\"$1\" faylı oxunmadı.",
-       "backend-fail-create": "\"$1\" faylı yaranmadı.",
+       "backend-fail-create": "\"$1\" faylı yazıla bilmədi.",
        "uploadstash": "Gizli yükləmə",
        "uploadstash-clear": "Müvəqqəti faylları təmizlə",
        "uploadstash-refresh": "Fayl siyahısını yenilə",
        "license": "Lisenziya",
        "license-header": "Lisenziya",
        "nolicense": "Heç biri seçilməmişdir",
-       "upload_source_url": " (keçərli, hər kəsin daxil ola biləcəyi bir URL)",
-       "upload_source_file": " (kompyuterinizdəki bir fayl)",
+       "upload_source_url": "(siz düzgün, hər kəsin daxil ola biləcəyi URL seçdiniz)",
+       "upload_source_file": "(siz kompüterinizdəki faylı seçdiniz)",
        "listfiles_search_for": "Media adı üçün axtar:",
        "imgfile": "fayl",
        "listfiles": "Fayl siyahısı",
        "statistics-users-active": "Aktiv istifadəçilər",
        "statistics-users-active-desc": "Son {{PLURAL:$1|gün|$1 gündə}} iş görən istifadəçilər",
        "doubleredirects": "İkiqat istiqamətləndirmələr",
-       "double-redirect-fixed-move": "[[$1]] dəyişdirilib.\nHazırda [[$2]]-yə istiqamətlənib.",
-       "double-redirect-fixed-maintenance": "[[$1]]-dən [[$2]]-yə ikiqat istiqamətlənmə düzəldilir.",
+       "double-redirect-fixed-move": "[[$1]] səhifəsinin yeri dəyişdirilib.\nO avtomatik yenilənib və [[$2]] səhifəsinə yönləndirilib.",
+       "double-redirect-fixed-maintenance": "[[$1]] səhifəsindən [[$2]] səhifəsinə ikiqat yönləndirmə avtomatik düzəldilir.",
        "double-redirect-fixer": "Yönləndirmə səhvdir",
        "brokenredirects": "Xətalı istiqamətləndirmə",
        "brokenredirectstext": "Aşağıdakı istiqamətləndirmələr mövcud olmayan səhifələrə keçid verir:",
        "wantedtemplates": "Tələb olunan şablonlar",
        "mostlinked": "Ən çox keçidlənən səhifələr",
        "mostlinkedcategories": "Ən çox məqaləsi olan kateqoriyalar",
-       "mostlinkedtemplates": "Ən çox istifadə olunan şablonlar",
+       "mostlinkedtemplates": "Ən çox istifadə olunan səhifələr",
        "mostcategories": "Kateqoriyası ən çox olan məqalələr",
        "mostimages": "Ən çox istifadə edilmiş şəkillər",
        "mostrevisions": "Ən çox nəzərdən keçirilmiş (versiyalı) məqalələr",
        "booksources-text": "Aşağıda yeni və işlənmiş kitablar satan xarici keçidlərdə siz axtardığınız kitab haqqında əlavə məlumat ala bilərsiz:",
        "specialloguserlabel": "İcraçı:",
        "speciallogtitlelabel": "Məqsəd (başlıq və ya istifadəçi):",
-       "log": "Loglar",
+       "log": "Qeydlər",
        "all-logs-page": "Bütün ictimai qeydlər",
        "alllogstext": "{{SITENAME}} üçün bütün mövcud qeydlərin birgə göstərişi.\nQeyd növü, istifadəçi adı və ya təsir edilmiş səhifəni seçməklə daha spesifik ola bilərsiniz.",
        "logempty": "Jurnalda uyğun qeyd tapılmadı.",
        "linksearch-line": "$2-dən $1 keçid verilib",
        "listusers-submit": "Göstər",
        "listusers-noresult": "İstifadəçi tapılmadı.",
-       "listusers-blocked": "(bloklan)",
+       "listusers-blocked": "(bloklanıb)",
        "activeusers": "Aktiv istifadəçilərin siyahısı",
-       "activeusers-count": "$1 {{PLURAL:$1|edit|redaktə}} son {{PLURAL:$3|day|$3 gün}}",
+       "activeusers-count": "Son {{PLURAL:$3|gündə|$3 gündə}} $1 {{PLURAL:$1|redaktə|redaktə}}",
        "activeusers-hidebots": "Botları gizlə",
        "activeusers-hidesysops": "İdarəçiləri gizlə",
        "activeusers-noresult": "İstifadəçi tapılmadı.",
        "listgrouprights": "İstifadəçi qruplarının hüquqları",
        "listgrouprights-summary": "Bu vikidə olan istifadəçi siyahıları və onların hüquqları aşağıda göstərilmişdir.\nFərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-helppage}}]] səhifəsində tapa bilərsiniz",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Verilmiş hüquqlar</span>\n* <span class=\"listgrouprights-revoked\">Ləğv edilmiş hüquqlar</span>",
+       "listgrouprights-key": "İzah:\n* <span class=\"listgrouprights-granted\">Verilmiş hüquqlar</span>\n* <span class=\"listgrouprights-revoked\">Geri alınmış hüquqlar</span>",
        "listgrouprights-group": "Qrup",
        "listgrouprights-rights": "Hüquqlar",
        "listgrouprights-helppage": "Help:Qrup hüquqları",
        "mywatchlist": "İzləmə siyahısı",
        "watchlistfor2": "$1 $2 üçün",
        "nowatchlist": "İzləmə siyahınız böşdur.",
-       "watchlistanontext": "Lütfən, izlədiyiniz səhifələri görmək və ya redaktə etmək üçün $1.",
+       "watchlistanontext": "Lütfən, izlədiyiniz səhifələri görmək və ya redaktə etmək üçün sistemə daxil olun.",
        "watchnologin": "Daxil olmamısınız",
        "addwatch": "İzləmə siyahısına əlavə et",
        "addedwatchtext": "\"[[:$1]]\" səhifəsi [[Special:Watchlist|izlədiyiniz səhifələr]] siyahısına əlavə edildi. Bu səhifədə və əlaqəli müzakirə səhifəsindəki bütün dəyişikliklər orada göstəriləcək və səhifə asanlıqla seçiləbilmək üçün [[Special:RecentChanges|son dəyişikliklərdə]] qalın şriftlərlə görünəcəkdir. <p> Səhifəni izləmə siyahınızdan çıxarmaq üçün yan lövhədəki \"izləmə\" düyməsinə vurun.",
        "deletereason-dropdown": "*Əsas silmə səbəbi\n** Müəllif istəyi\n** Müəllif hüququ pozuntusu\n** Vandalizm",
        "delete-edit-reasonlist": "Silmə səbəblərinin redaktəsi",
        "rollback": "əvvəlki halına qaytar",
-       "rollback_short": "əvvəlki halına qaytar",
        "rollbacklink": "əvvəlki halına qaytar",
        "rollbacklinkcount": "$1 {{PLURAL:$1|dəyişikliyi|dəyişikliyi}} geri qaytar",
        "rollbackfailed": "Geri qaytarma uğursuzdur",
        "protect-default": "Bütün istifadəçilərə icazə ver",
        "protect-fallback": "\"$1\" icazəsi tələb olunur",
        "protect-level-autoconfirmed": "Yeni və anonim istifadəçiləri blokla",
-       "protect-level-sysop": "Yalnız idarəçilər",
+       "protect-level-sysop": "Yalnız idarəçilərə icazə verilir",
        "protect-summary-cascade": "kaskad mühafizə",
        "protect-expiring": "$1 (UTC)- tarixində vaxtı bitir",
        "protect-expiring-local": "$1-də bitir",
        "undeletedrevisions": "Cəmi {{PLURAL:$1|1 redaktə|$1 redaktə}} geri qaytarıldı.",
        "undeletedrevisions-files": "{{PLURAL:$1|1 versiya|$1 versiya}} və {{PLURAL:$2|1 fayl|$2 fayl}} bərpa edildi",
        "undeletedfiles": "{{PLURAL:$1|1 fayl|$1 fayl}} bərpa olundu",
-       "cannotundelete": "Bərpaetmə xətası. Başqa istifadəçi sizdən əvvəl səhifəni bərpa edib.",
+       "cannotundelete": "Bərpaetmə xətası:\n$1",
        "undeletedpage": "'''$1 bərpa edildi'''\n\nMəqalələrin bərpa edilməsi və silinməsi haqqında son dəyişiklikləri nəzərdən keçirmək üçün [[Special:Log/delete|silmə qeydlərinə]] baxın.",
        "undelete-header": "Son silinmiş səhifələrə baxmaq üçün [[Special:Log/delete|silmə qeydlərinə]] bax.",
        "undelete-search-title": "Silinmiş səhifələri axtar",
        "sp-contributions-newbies": "Ancaq yeni istifadəçilərin fəaliyyətlərini göstər",
        "sp-contributions-newbies-sub": "Yeni istifadəçilər üçün",
        "sp-contributions-newbies-title": "Yeni hesablar üçün istifadəçi fəaliyyətləri",
-       "sp-contributions-blocklog": "Bloklama qeydləri",
+       "sp-contributions-blocklog": "bloklama qeydləri",
        "sp-contributions-deleted": "silinmiş istifadəçi fəaliyyətləri",
        "sp-contributions-uploads": "yüklənənlər",
-       "sp-contributions-logs": "Loqlar",
-       "sp-contributions-talk": "Müzakirə",
+       "sp-contributions-logs": "qeydlər",
+       "sp-contributions-talk": "müzakirə",
        "sp-contributions-userrights": "istifadəçi hüquqları idarəsi",
        "sp-contributions-blocked-notice": "Bu istifadəçi hal-hazırda bloklanmışdır.\nBloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:",
        "sp-contributions-blocked-notice-anon": "Bu IP-ünvan hal-hazırda bloklanmışdır.\nBloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:",
        "autoblockid": "Avtoblok #$1",
        "block": "İstifadəçini blokla",
        "unblock": "İstifadəçinin blokunu götür",
-       "blockip": "İstifadəçini blokla",
+       "blockip": "{{GENDER:$1|İstifadəçini}} blokla",
        "blockip-legend": "İstifadəçinin bloklanması",
        "ipaddressorusername": "IP-ünvanı və ya istifadəçi adı",
        "ipbexpiry": "Bitmə müddəti:",
        "ipb-change-block": "Bu səbəblərlə istifadəçini yenidən blokla",
        "ipb-confirm": "Bloku təsdiqlə",
        "badipaddress": "Səhv IP",
-       "blockipsuccesssub": "bloklandı",
-       "blockipsuccesstext": "[[Special:Contributions/$1| $1]]bloklanıb..<br />\nBax [[Special:BlockList|IP blok siyahısı]] bloklanmış IP-lər.",
+       "blockipsuccesssub": "Bloklandı",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bloklanıb.<br />\nBlokları yoxlamaq üçün [[Special:BlockList|bloklama siyahısına]] baxın.",
        "ipb-blockingself": "Özünü bloklayacaqsınız.! Bunu etmək istədiyinizdən əminsinizmi?",
        "ipb-confirmhideuser": "İstifadəçini bloklamaq və redaktə siyahısından onun adını silmək üzərəsiniz. Bunu etmək istədiyinizdən əminsinizmi?",
        "ipb-edit-dropdown": "Bloklama səbəblərini redaktə et",
        "ipb-unblock-addr": "$1 üzərindəki blok götürüldü",
        "ipb-unblock": "Bloku götür",
        "ipb-blocklist": "Mövcud blokları göstər",
-       "ipb-blocklist-contribs": "$1 istifadəçi fəaliyyətləri",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} istifadəçi hesabının fəaliyyətləri",
        "unblockip": "İstifadəçinin blokunu götür",
        "unblockiptext": "Əvvəlcədən bloklanmış bir IP ünvanına və ya istifadəçi adına yazma geri vermek için aşağıdakı formadan istifadə edin.",
        "ipusubmit": "Bu bloku götür",
        "blocklog-showsuppresslog": "Bu istifadəçi daha əvvəl bloklanmışdır. Bloklama gündəliyi referans üçün aşağıda göstərilib:",
        "blocklogentry": "tərəfindən [[$1]] bloklandı, blok müddəti: $2 $3",
        "reblock-logentry": "[[$1]] üçün bloklama parametrlərini, başa çatma tarixi $2 $3 olmaqla, dəyişdirdi",
-       "blocklogtext": "İstifadəçilərin bloklanması və blokun götürülməsi siyahısı.\nAvtomatik bloklanmış IP-ünvanlar burada göstərilmir.\nHal-hazırkı [[Special:BlockList|qadağaların və bloklamaların siyahısı]]na bax.",
+       "blocklogtext": "İstifadəçilərin bloklanması və blokun götürülməsi siyahısı.\nAvtomatik bloklanmış IP-ünvanlar burada göstərilmir.\nHazırkı [[Special:BlockList|qadağaların və bloklamaların siyahısına bax]].",
        "unblocklogentry": "$1 üzərindəki blok götürüldü",
        "block-log-flags-anononly": "yalnız qeydiyyatsız istifadəçilər",
        "block-log-flags-nocreate": "yeni hesab yaratma bloklanıb",
        "range_block_disabled": "İdarəçilərə diapazonu bloklamaq qadağandır.",
        "ipb_expiry_invalid": "Bitmə vaxtı səhvdir",
        "ipb_expiry_temp": "Gizli istifadəçi adı bloklamaları müddətsiz olmalıdır.",
-       "ipb_hide_invalid": "İstifadəçi hesabınln gizlədilməsi qeyri-mümkündür; həddən çox redaktəsi var.",
+       "ipb_hide_invalid": "Bu istifadəçi hesabının gizlədilməsi mümkün deyil, onun töhfəsi {{PLURAL:$1|bir redaktədən|$1 redaktədən}} çoxdur.",
        "ipb_already_blocked": "\"$1\" artıq bloklanıb",
        "ipb-needreblock": "$1 artıq bloklanıb.\nBloklama şərtlərini dəyişmək istəyirsiniz?",
        "ipb-otherblocks-header": "Başqa {{PLURAL:$1|bloklama|bloklamalar}}",
        "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
        "move-page": "Dəyişdir $1",
        "move-page-legend": "Səhifənin adını dəyiş",
-       "movepagetext": "Aşağıdakı formadan istifədə etmə səhifənin adını, bütün tarixçəsini də köçürməklə yeni başlığa dəyişəcək.\nƏvvəlki başlıq yeni başlığa istiqamətləndirmə səhifəsinə çevriləcək.\nKöhnə səhifəyə keçidləri avtomatik olaraq dəyişə bilərsiniz.\nBu seçimi etmədiyiniz halda, [[Special:DoubleRedirects|təkrarlanan]] və ya [[Special:BrokenRedirects|qırıq istiqamətləndirmələri]] yoxlamağı yaddan çıxarmayın.\nKeçidlərin lazımi yerə istiqamətləndirilməsini təmin etmək sizin məsuliyyətinizdədir.\n\nNəzərə alın ki, hədəf başlığı altında bir səhifə mövcuddursa yerdəyişmə '''baş tutmayacaq'''. Buna həmin səhifənin boş olması və ya istiqamətləndirmə səhifəsi olması və keçmişdə redaktə edilməməsi halları istisnadır. Bu o deməkdir ki, səhvən adını dəyişdiyiniz səhifələri geri qaytara bilər, bununla yanaşı artıq mövcud olan səhifənin üzərinə başqa səhifə yaza bilməzsiniz.\n\n'''XƏBƏRDARLIQ!'''\nBu yerdəyişmə populiyar səhifə üçün əsaslı və gözlənilməz ola bilər, ona görə də bu dəyişikliyi yerinə yetirməzdən əvvəl, bunun mümkün nəticələrini başa düşdüyünüzdən əmin olun.",
+       "movepagetext": "Aşağıdakı formadan istifədə etməklə səhifənin adını və bütün tarixçəsini yeni başlığa dəyişəcəksiniz.\nƏvvəlki başlıq yeni başlığa yönləndirmə səhifəsinə çevriləcək.\nKöhnə səhifəyə keçidləri avtomatik olaraq dəyişə bilərsiniz.\nBunu etməsəniz, zəhmət olmasa, [[Special:DoubleRedirects|təkrarlanan]] və ya [[Special:BrokenRedirects|qırılmış istiqamətləndirmələri]] yoxlamağı unutmayın.\nKeçidlərin lazımi yerə istiqamətləndirilməsini təmin etmək sizin məsuliyyətinizdədir.\n\nNəzərə alın ki, hədəflədiyiniz adda bir səhifə artıq mövcuddursa, addəyişmə <strong>baş tutmayacaq</strong>. Lakin həmin səhifənin boş olması, istiqamətləndirmə səhifəsi olması və redaktə tarixçəsinin olmaması halları istisnadır. Bu o deməkdir ki, səhvən adını dəyişdiyiniz səhifələri geri qaytara bilər, amma artıq mövcud olan səhifənin üzərinə başqa səhifə yaza bilməzsiniz.\n\n<strong>XƏBƏRDARLIQ!</strong>\nPopulyar səhifələrin adlarının dəyişdirilməsi əsaslı və gözlənilməz nəticələrə səbəb ola bilər. Ona görə də bu dəyişikliyi yerinə yetirməzdən əvvəl, bunun mümkün nəticələrini başa düşdüyünüzdən əmin olun.",
        "movepagetalktext": "Uyğun müzakirə səhifəsi avtomatik hərəkət edəcək '''əgər:'''\n* boş olmayan müzakirə səhifəsi yeni adla artıq mövcuddursa, və ya\n* Siz bayrağı aşağıdan götürsəniz.\n\nHəmin hallarda , ehtiyac yaranarsa siz səhifələri əllə birləşdirmək məcburiyyətində qalacaqsınız",
        "movearticle": "Səhifənin adını dəyişdir",
        "movenotallowed": "Siz səhifələrin adını dəyişə bilməzsiniz.",
        "articleexists": "Bu adda səhifə artıq mövcuddur və ya sizin seçdiyiniz ad uyğun deyil.\nZəhmət olmasa başqa ad seçin.",
        "movetalk": "Bu səhifənin müzakirə səhifəsinin də adını dəyişdir.",
        "move-subpages": "Yarımsəhifələri köçür ($1-ə qədər)",
-       "move-talk-subpages": "Müzakirə səhifələrinin alt səhifələrini köçür ($1-ə qədər)",
+       "move-talk-subpages": "Müzakirə səhifəsinin alt səhifələrinin adını dəyiş ($1-ə qədər)",
        "movepage-page-moved": "$1 səhifəsi $2 səhifəsinə köçürülüb.",
        "movepage-page-unmoved": "$1 səhifəsi $2 səhifəsinə köçürülə bilinmir.",
        "movelogpage": "Yerdəyişmə qeydləri",
-       "movesubpage": "{{PLURAL:$1|alt səhifə}}",
+       "movesubpage": "{{PLURAL:$1|Alt səhifə|Alt səhifələr}}",
+       "movesubpagetext": "Bu səhifənin aşağıda göstərilən $1 {{PLURAL:$1|alt səhifəsi|alt səhifəsi}} var.",
        "movenosubpage": "Bu səhifənin altsəhifəsi yoxdur.",
        "movereason": "Səbəb:",
        "revertmove": "Əvvəlki vəziyyətinə",
        "import-upload": "XML-veriləni yüklə",
        "import-token-mismatch": "Seans məlumatlarının itirilməsi. Lütfən, yenidən cəhd edin.",
        "import-invalid-interwiki": "Göstərilən vikidən köçürmək mümkün deyil",
-       "import-error-edit": "\"$1\" səhifəsi idxal edilə bilinmir, çünki onu dəyişmək səlahiyyətiniz yoxdur.",
-       "import-error-create": "\"$1\" səhifəsi açılmır, çünki onu yaratmaq səlahiyyətiniz yoxdur.",
+       "import-error-edit": "\"$1\" səhifəsi idxal edilmədi, çünki sizin onu dəyişmək səlahiyyətiniz yoxdur.",
+       "import-error-create": "\"$1\" səhifəsi idxal edilmədi, çünki sizin onu yaratmaq səlahiyyətiniz yoxdur.",
        "importlogpage": "Çıxarılma gündəliyi",
        "importlogpagetext": "Səhifələrin idarəçilər tərəfindən digər vikilərdən dəyişiklik tarixçəsi ilə birlikdə köçürülməsi",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|dəyişiklik}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}} idxal edildi.",
        "import-logentry-interwiki": "vikilərarası idxal $1",
-       "import-logentry-interwiki-detail": "$2-dən $1 {{PLURAL:$1|dəyişiklik|dəyişikliklər}}",
+       "import-logentry-interwiki-detail": "$2 vikidən $1 {{PLURAL:$1|dəyişiklik|dəyişiklik}} idxal edildi",
        "tooltip-pt-userpage": "İstifadəçi səhifəniz",
        "tooltip-pt-anonuserpage": "The user page for the ip you",
        "tooltip-pt-mytalk": "Danışıq səhifəm",
        "spambot_username": "MediaViki spam təmizləməsi",
        "pageinfo-title": "\"$1\" üçün məlumat",
        "pageinfo-header-basic": "Əsas məlumatlar",
-       "pageinfo-header-edits": "Redaktələr",
+       "pageinfo-header-edits": "Redaktə tarixçəsi",
        "pageinfo-header-restrictions": "Səhifə mühafizəsi",
        "pageinfo-header-properties": "Səhifə xüsusiyyətləri",
-       "pageinfo-watchers": "Baxış sayı",
+       "pageinfo-watchers": "Səhifəyə baxışların sayı",
        "pageinfo-firstuser": "Səhifəni yaradan",
        "pageinfo-firsttime": "Səhifənin yaranma tarixi",
        "pageinfo-lastuser": "Sonuncu redaktor",
        "pageinfo-lasttime": "Sonuncu redaktənin tarixi",
-       "pageinfo-edits": "Redaktələrin sayı",
-       "pageinfo-authors": "Fərqli müəlliflərin sayı",
+       "pageinfo-edits": "Redaktələrin ümumi sayı",
+       "pageinfo-authors": "Fərqli müəlliflərin ümumi sayı",
        "pageinfo-toolboxlink": "Əsas məlumatlar",
        "pageinfo-redirectsto": "İstiqamətləndirmə",
        "pageinfo-redirectsto-info": "məlumat",
        "exif-personinimage": "Təsvir edilmiş şəxs",
        "exif-compression-1": "Sıxılmış",
        "exif-copyrighted-true": "Müəlliflik hüququ ilə qorunur",
-       "exif-copyrighted-false": "İctimai istifadə",
+       "exif-copyrighted-false": "Müəlliflik hüququ göstərilməyib",
        "exif-unknowndate": "Naməlum tarix",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Üfüqi çevrilib",
        "watchlistedit-raw-done": "İzləmə səhifələriniz qeyd olundu.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 başlıq}} əlavə edildi:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 başlıq}} çıxarıldı:",
+       "watchlisttools-clear": "İzləmə siyahısını təmizlə",
        "watchlisttools-view": "Siyahıdakı səhifələrdə edilən dəyişikliklər",
        "watchlisttools-edit": "İzlədiyim səhifələri göstər və redaktə et",
        "watchlisttools-raw": "Adi mətn kimi redaktə et",
-       "unknown_extension_tag": "\"$1\" Naməlum ayırma teqi",
        "duplicate-defaultsort": "<strong>Diqqət:</strong> Susmaya görə \"$2\" çeşidləmə açarı susmaya görə əvvəlki \"$1\" çeşidləmə açarını inkar edir.",
        "version": "Versiya",
        "version-extensions": "NIzamlanmış genişlənmələr",
-       "version-skins": "Üzlük",
+       "version-skins": "Yüklənmiş üzlüklər",
        "version-specialpages": "Xüsusi səhifələr",
        "version-parserhooks": "Parser hooks",
        "version-variables": "Dəyişkənlər",
        "version-hook-name": "Çəngəlin adı",
        "version-hook-subscribedby": "Abunə olan",
        "version-version": "(Versiya $1)",
-       "version-license": "Lisenziya",
+       "version-license": "MediaViki lisenziyası",
        "version-ext-license": "Lisenziya",
        "version-ext-colheader-version": "Versiya",
        "version-ext-colheader-license": "Lisenziya",
        "specialpages": "Xüsusi səhifələr",
        "specialpages-group-maintenance": "Cari məruzələr",
        "specialpages-group-other": "Digər xüsusi səhifələr",
-       "specialpages-group-login": "Daxil ol/ hesab yarat",
+       "specialpages-group-login": "Daxil ol / hesab yarat",
        "specialpages-group-changes": "Son dəyişikliklər və qeydlər",
        "specialpages-group-media": "Media məruzələri və yükləmələr",
        "specialpages-group-users": "İstifadəçilər və hüquqlar",
        "specialpages-group-highuse": "Ən çox istifadə edilən səhifələr",
        "specialpages-group-pages": "Səhifələrin siyahıları",
        "specialpages-group-pagetools": "Səhifə alətləri",
-       "specialpages-group-wiki": "Viki məlumatları və alətləri",
+       "specialpages-group-wiki": "Məlumatlar və alətlər",
        "specialpages-group-redirects": "Xüsusi istiqamətləndirmə səhifələri",
        "specialpages-group-spam": "Spam alətləri",
        "blankpage": "Boş səhifə",
        "compare-rev2": "Dəyişiklik 2",
        "compare-submit": "Qarşılaşdır",
        "dberr-problems": "Üzr istəyirik! Bu saytda texniki problemlər var.",
-       "dberr-info": "($1: Məlumat bazası ilə əlaqə yoxdur)",
+       "dberr-info": "(Məlumat bazası ilə əlaqə yoxdur: $1)",
        "htmlform-invalid-input": "Girişinizin bir qismilə əlaqədəar problemlər var",
        "htmlform-select-badoption": "İşarə etdiyiniz xüsus keçərli deyil.",
        "htmlform-int-invalid": "Göstərdiyiniz ifadə tam ədəd deyil.",
        "htmlform-selectorother-other": "Digər",
        "sqlite-has-fts": "$1 tam mətn axtarma ilə",
        "sqlite-no-fts": "$1 tam mətn axtarma olmadan",
-       "logentry-suppress-delete": "$1 suppressed page $3",
+       "logentry-suppress-delete": "$1 $3 səhifəsini {{GENDER:$2|gizlətdi}}",
        "revdelete-content-hid": "gizli mətn",
        "revdelete-summary-hid": "gizli tarixçə",
        "revdelete-uname-hid": " gizli istifadəçi adı",
        "revdelete-unrestricted": "idarəçilər üçün götürülmüş məhdudiyyətlər",
        "logentry-move-move": "$1 $3 səhifəsinin adını $4 olaraq {{GENDER:$1|dəyişdi|dəyişdi}}.",
        "logentry-move-move_redir": "$1 $3 səhifəsinin adını yönləndirmənin əksinə dəyişərək, $4 {{GENDER:$2|adlandırdı}}",
-       "logentry-newusers-newusers": "$1istifadəçi hesabını yaratdı",
-       "logentry-newusers-create": "$1 istifadəçi hesabı yaratdı",
-       "logentry-newusers-create2": "$1 $3 üçün istifadəçi hesabı yaratdı",
-       "logentry-newusers-autocreate": "$1 hesabı avtomatik yaradıldı",
+       "logentry-newusers-newusers": "$1 istifadəçi hesabı yaradıldı",
+       "logentry-newusers-create": "$1 istifadəçi hesabı yaradıldı",
+       "logentry-newusers-create2": "$3 istifadəçi hesabı $1 tərəfindən yaradıldı",
+       "logentry-newusers-autocreate": "$1 istifadəçi hesabı avtomatik yaradıldı",
        "rightsnone": "(yoxdur)",
        "revdelete-summary": "redaktə xülasəsi",
        "feedback-subject": "Mövzu:",
index 96eeb13..401d4e7 100644 (file)
        "watchlisttools-edit": "ایزله‌دیکلره باخ و اونلاری دَییشدیر",
        "watchlisttools-raw": "چیی ایزله‌دیکلری دَییشدیر",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|دانیشیق]])",
-       "unknown_extension_tag": "تانینمامیش گنیشلندیرمه اِتیکِتی «$1»",
        "duplicate-defaultsort": "'''دیقت:''' احتیمال ائدیلن «$2» دفالت آچاری، قاباقکی «$1» دفالت آچارینی گئچرسیز ائدیر.",
        "version": "نوسخه‌",
        "version-extensions": "قورولموش گنیشلندیرمه‌لر",
index 9c6aefc..1808272 100644 (file)
        "watchlisttools-edit": "Күҙәтеү исемлеген ҡарарға/төҙәтергә",
        "watchlisttools-raw": "Текст һымаҡ үҙгәртеү",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|әңгәмә]])",
-       "unknown_extension_tag": "Билдәһеҙ \"$1\" киңәйтеү тегы",
        "duplicate-defaultsort": "'''Иҫкәртеү:''' \"$2\" ғәҙәттәге тәпртипкә килтереү асҡысы элекке \"$1\" ғәҙәттәге тәртипкә килтереү асҡысын үҙгәртә.",
        "version": "MediaWiki өлгөһө",
        "version-extensions": "Ҡуйылған киңәйтеүҙәр",
index f038e86..59d1773 100644 (file)
        "hebrew-calendar-m10-gen": "تموز",
        "hebrew-calendar-m11-gen": "آو",
        "hebrew-calendar-m12-gen": "الول",
-       "unknown_extension_tag": "ناشناس برجسب الحاق  \"$1\"",
        "duplicate-defaultsort": "هژاری: ترتیب پیش فرض «$2» ترتیب پیش فرض پیشگین «$1» را باطل کنت.",
        "version": "نسخة",
        "version-extensions": "نصب بوتگیت الحاق آن",
        "specialpages-group-wiki": "وسایل و دیتا وی کی",
        "specialpages-group-redirects": "غیر مستقیم بیگنت صفحات حاصین",
        "specialpages-group-spam": "وسایل اسپم",
+       "specialpages-group-developer": "وسایل پیشبروک",
        "blankpage": "هالیکین صفحه",
        "intentionallyblankpage": "ای صفحه عمدا هالیک هلگ بوتت و په محک زتن ویا دگه چیز.",
        "external_image_whitelist": " #ای خطء هنچوش که هستن بلیت<pre>\n#اصطلاحات منظمء جهل بلیت (قسمتان باید بین شی بیاینت //) جهلء\n#شی گون یو ار ال درای لینک عکسان هم دپ بیت\n#ایانی که هم دپ بنت په داب عکس پیش دارگ بنت وگرنه فقط یک لینکی په عکس پیشداریت\n#خطوطی که گون # شروع بنت په داب نظر جاه کاینت\n\n#کل بخشان رجکسء بالادء ای خظ بل. ای خط هنچوش که هست بلی</pre>",
index 1b350c0..8a5852f 100644 (file)
        "pool-queuefull": "Чарга запытаў поўная",
        "pool-errorunknown": "Невядомая памылка",
        "pool-servererror": "Служба лічыльніка пулу недаступная ($1).",
+       "poolcounter-usage-error": "Памылка выкарыстаньня: $1",
        "aboutsite": "Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}",
        "aboutpage": "Project:Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}",
        "copyright": "Зьмест даступны на ўмовах $1, калі не пазначана іншае.",
        "viewsource-title": "Прагляд крыніцы для $1",
        "actionthrottled": "Дзеяньне прытрыманае",
        "actionthrottledtext": "У межах барацьбы са спамам Вы абмежаваныя ў надта частым выкананьні гэтага дзеяньня за кароткі прамежак часу, і Вы перавысілі гэтае абмежаваньне. Калі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
-       "protectedpagetext": "Гэтая старонка была абароненая для перадухіленьня зьменаў ці іншых дзеяньняў.",
+       "protectedpagetext": "Гэтая старонка была абароненая для прадухіленьня зьменаў ці іншых дзеяньняў.",
        "viewsourcetext": "Вы можаце праглядаць і капіяваць крынічны тэкст гэтай старонкі:",
-       "viewyourtext": "Вы можаце праглядзець і скапіяваць крынічны тэкст '''вашых рэдагаваньняў''' на гэтую старонку:",
+       "viewyourtext": "Вы можаце праглядзець і скапіяваць крынічны тэкст <strong>вашых рэдагаваньняў</strong> на гэтай старонцы:",
        "protectedinterface": "Гэтая старонка ўтрымлівае інтэрфэйснае паведамленьне праграмнага забесьпячэньня, і яе зьмена забаронена. Каб дадаць ці зьмяніць пераклад ва ўсіх праектах, зьвярніцеся на [//translatewiki.net/ translatewiki.net], праект для перакладу MediaWiki.",
        "editinginterface": "<strong>Увага:</strong> Вы рэдагуеце старонку, якая ўтрымлівае тэкст інтэрфэйсу праграмнага забесьпячэньня.\nЯе зьмена паўплывае на вонкавы выгляд інтэрфэйсу іншых удзельнікаў у гэтай вікі.",
        "translateinterface": "Каб дадаць ці зьмяніць пераклады для ўсіх вікі, калі ласка, крыстаецеся [//translatewiki.net/ translatewiki.net], лякалізацыйным праектам MediaWiki.",
        "cascadeprotected": "Гэтая старонка абароненая ад рэдагаваньня, таму што яна ўключаная ў {{PLURAL:$1|1=наступную старонку, якая была абароненая|наступныя старонкі, якія былі абароненыя}} з актывізаванай опцыяй «каскаднай абароны»:\n$2",
-       "namespaceprotected": "Вы ня маеце правоў на рэдагаваньне старонак у прасторы назваў '''$1'''.",
+       "namespaceprotected": "Вы ня маеце правоў на рэдагаваньне старонак у прасторы назваў <strong>$1</strong>.",
        "customcssprotected": "Вы ня маеце правоў на рэдагаваньне гэтай CSS-старонкі, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
        "customjsprotected": "Вы ня маеце правоў на рэдагаваньне гэтай старонкі JavaScript, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
        "mycustomcssprotected": "Вы ня маеце дазволу рэдагаваць гэтую CSS-старонку.",
        "myprivateinfoprotected": "Вы ня маеце дазволу на зьмяненьне ўласных прыватных зьвестак.",
        "mypreferencesprotected": "Вы ня маеце дазволу на зьмяненьне сваіх наладаў.",
        "ns-specialprotected": "Немагчыма рэдагаваць спэцыяльныя старонкі.",
-       "titleprotected": "Стварэньне старонкі з такой назвай было забароненае ўдзельнікам [[User:$1|$1]].\nПрычына забароны: ''$2''.",
-       "filereadonlyerror": "Немагчыма зьмяніць файл «$1», бо файлавае сховішча «$2» знаходзіцца ў рэжыме толькі для чытаньня\n\nАдміністратар, які абмежаваў доступ, пазначыў прычыну: «$3».",
-       "invalidtitle-knownnamespace": "Няслушная назва ў прасторы «$2»: «$3»",
-       "invalidtitle-unknownnamespace": "Няслушная назва ў невядомай прасторы $1: «$2»",
+       "titleprotected": "Стварэньне старонкі з такой назвай было забароненае {{GENDER:$1|ўдзельнікам|ўдзельніцай}} [[User:$1|$1]].\nПрычына забароны: «<em>$2</em>».",
+       "filereadonlyerror": "Немагчыма зьмяніць файл «$1», бо файлавае сховішча «$2» знаходзіцца ў рэжыме толькі для чытаньня.\n\nАдміністратар, які абмежаваў доступ, пазначыў прычыну: «$3».",
+       "invalidtitle-knownnamespace": "Няслушны загаловак з прасторай назваў «$2» і тэкстам «$3»",
+       "invalidtitle-unknownnamespace": "Няслушны загаловак зь невядомым нумарам прасторы назваў $1 і тэкстам «$2»",
        "exception-nologin": "Вы не ўвайшлі ў сыстэму",
        "exception-nologin-text": "Неабходна ўвайсьці, каб атрымаць доступ да гэтай старонкі або дзеяньня.",
        "exception-nologin-text-manual": "Неабходна $1, каб мець доступ да гэтай старонкі або дзеяньня.",
-       "virus-badscanner": "Няслушная канфігурацыя: невядомы антывірусны сканэр: ''$1''",
+       "virus-badscanner": "Няслушная канфігурацыя: невядомы антывірусны сканэр: <em>$1</em>",
        "virus-scanfailed": "памылка сканаваньня (код $1)",
        "virus-unknownscanner": "невядомы антывірус:",
-       "logouttext": "'''Вы выйшлі з сыстэмы.'''\n\nНекаторыя старонкі могуць яшчэ паказваць, нібы вы ў сыстэме. Каб гэтага пазьбегнуць, трэба ачысьціць кэш браўзэра.",
+       "logouttext": "<strong>Вы выйшлі з сыстэмы.</strong>\n\nНекаторыя старонкі могуць яшчэ паказваць, нібы вы ў сыстэме. Каб гэтага пазьбегнуць, трэба ачысьціць кэш браўзэра.",
        "welcomeuser": "Вітаем, $1!",
-       "welcomecreation-msg": "Ð\92аÑ\88 Ñ\80аÑ\85Ñ\83нак Ð±Ñ\8bÑ\9e Ñ\81Ñ\82воÑ\80анÑ\8b.\nÐ\9dе Ð·Ð°Ð±Ñ\83дзÑ\8cÑ\86еÑ\81Ñ\8f Ð·Ñ\8cмÑ\8fнÑ\96Ñ\86Ñ\8c Ð\92аÑ\88Ñ\8bÑ\8f [[Special:Preferences|наладÑ\8b Ñ\9e {{GRAMMAR:меÑ\81нÑ\8b|{{SITENAME}}}}]].",
+       "welcomecreation-msg": "Ð\92аÑ\88 Ñ\80аÑ\85Ñ\83нак Ð±Ñ\8bÑ\9e Ñ\81Ñ\82воÑ\80анÑ\8b.\nÐ\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð·Ñ\8cмÑ\8fнÑ\96Ñ\86Ñ\8c Ð\92аÑ\88Ñ\8bÑ\8f [[Special:Preferences|наладÑ\8b Ñ\9e {{GRAMMAR:меÑ\81нÑ\8b|{{SITENAME}}}}]], ÐºÐ°Ð»Ñ\96 Ð¿Ð°Ð¶Ð°Ð´Ð°ÐµÑ\86е.",
        "yourname": "Імя ўдзельніка:",
        "userlogin-yourname": "Імя ўдзельніка",
        "userlogin-yourname-ph": "Увядзіце вашае імя ўдзельніка",
        "anoneditwarning": "<strong>Папярэджаньне</strong>: вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе бачны ўсім, калі вы адрэдагуеце старонку. Калі вы <strong>[$1 ўвойдзеце]</strong> або <strong>[$2 створыце рахунак]</strong>, вашыя рэдагаваньні будуць зьвязаныя з вашым імем карыстальніка, а таксама вам будуць даступныя дадатковыя перавагі.",
        "anonpreviewwarning": "''Вы не ўвайшлі ў сыстэму. Падчас захаваньня Ваш IP-адрас будзе дададзены ў гісторыю рэдагаваньняў старонкі.''",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
-       "selfredirect": "<strong>Папярэджаньне:</strong> вы ствараеце перанакіраваньне на гэты самы артыкул.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
+       "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
        "missingcommentheader": "'''Напамін:''' Вы не пазначылі загаловак камэнтара.\nКалі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Ваш камэнтар захаваецца бяз тэмы.",
        "summary-preview": "Папярэдні прагляд апісаньня:",
        "content-model-text": "просты тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Пусты аб’ект",
+       "content-json-empty-array": "Пусты масіў",
        "duplicate-args-category": "Старонкі, на якіх у шаблёнах выкарыстоўваюцца парамэтры-дублікаты",
        "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.\n\nПавінна быць ня болей за $2 {{PLURAL:$2|зварот|звароты|зваротаў}}, а цяпер ўтрымліваецца {{PLURAL:$1|$1 зварот|$1 звароты|$1 зваротаў}}.",
        "history-feed-empty": "Запатрабаванай старонкі не існуе.\nМагчыма, яна была выдаленая альбо яе перанесьлі.\nПаспрабуйце [[Special:Search|пашукаць]] падобныя старонкі.",
        "rev-deleted-comment": "(апісаньне зьменаў выдаленае)",
        "rev-deleted-user": "(імя ўдзельніка выдаленае)",
-       "rev-deleted-event": "(запÑ\96Ñ\81 Ð· Ð¶Ñ\83Ñ\80нала Ð¿Ð°Ð´Ð·ÐµÑ\8fÑ\9e Ð²Ñ\8bдаленÑ\8b)",
+       "rev-deleted-event": "(падÑ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\96 Ð²Ñ\8bдаленÑ\8bÑ\8f Ð· Ð¶Ñ\83Ñ\80нала Ð¿Ð°Ð´Ð·ÐµÑ\8fÑ\9e)",
        "rev-deleted-user-contribs": "[імя ўдзельніка альбо IP-адрас выдалены — рэдагаваньне схаванае з унёску]",
        "rev-deleted-text-permission": "Гэтая вэрсія старонкі была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "rev-suppressed-text-permission": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "revdelete-legend": "Усталяваць абмежаваньні бачнасьці",
        "revdelete-hide-text": "Тэкст вэрсіі",
        "revdelete-hide-image": "Схаваць зьмест файла",
-       "revdelete-hide-name": "СÑ\85аваÑ\86Ñ\8c Ð´Ð·ÐµÑ\8fнÑ\8cне Ñ\96 Ð¼Ñ\8dÑ\82Ñ\83",
+       "revdelete-hide-name": "СÑ\85аваÑ\86Ñ\8c Ð¼Ñ\8dÑ\82Ñ\83 Ñ\96 Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\8b",
        "revdelete-hide-comment": "Апісаньне зьменаў",
        "revdelete-hide-user": "Імя ўдзельніка/IP-адрас",
        "revdelete-hide-restricted": "Ужываць гэтыя абмежаваньні таксама і для адміністратараў",
        "uploaderror": "Памылка загрузкі",
        "upload-recreate-warning": "'''Увага: файл з такой назвай быў выдалены альбо перанесены.'''\n\nЖурнал выдаленьняў і пераносаў гэтай старонкі для зручнасьці пададзены тут:",
        "uploadtext": "Ужывайце форму ніжэй для загрузкі файлаў.\nКаб паглядзець ці адшукаць раней загружаныя файлы, глядзіце [[Special:FileList|сьпіс загружаных файлаў]], загрузкі таксама запісваюцца ў [[Special:Log/upload|журнал загрузак]], а выдаленьні — у [[Special:Log/delete|журнал выдаленьняў]].\n\nКаб улучыць файл у старонку, ужывайце адзін з наступных варыянтаў:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' для поўнай вэрсіі файла\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Подпіс да выявы]]</nowiki></code>''' для выявы шырынёй 200 піксэляў у рамцы і тэкстам «Подпіс да выявы» ў якасьці подпісу\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' для простай спасылкі на файл безь яго адлюстраваньня.",
-       "upload-permitted": "Дазволеныя тыпы файлаў: $1.",
-       "upload-preferred": "Пажаданыя тыпы файлаў: $1.",
-       "upload-prohibited": "Забароненыя тыпы файлаў: $1.",
+       "upload-permitted": "{{PLURAL:$2|Дазволены тып|Дазволеныя тыпы}} файлаў: $1.",
+       "upload-preferred": "{{PLURAL:$2|Пажаданы тып|Пажаданыя тыпы}} файлаў: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Забаронены тып|Забароненыя тыпы}} файлаў: $1.",
        "uploadlogpage": "Журнал загрузак",
        "uploadlogpagetext": "Сьпіс апошніх загружаных файлаў.",
        "filename": "Назва файла",
        "deleteprotected": "Вы ня можаце выдаліць гэтую старонку, таму што яна абароненая.",
        "deleting-backlinks-warning": "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншыя старонкі]] ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
        "rollback": "Адкаціць рэдагаваньні",
-       "rollback_short": "Адкат",
        "rollbacklink": "адкат",
        "rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
        "rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
        "namespace": "Прастора назваў:",
        "invert": "Адваротны выбар",
        "tooltip-invert": "Пазначце гэтае поле каб схаваць зьмены ў старонках з выбранай прасторы назваў (і зьвязнай прасторы назваў, калі пазначана)",
+       "tooltip-whatlinkshere-invert": "Адзначце гэтае поле, каб схаваць спасылкі з старонак у вызначанай прасторы назваў",
        "namespace_association": "Зьвязаная прастора назваў",
        "tooltip-namespace_association": "Пазначце гэтае поле каб уключыць простору назваў абмеркаваньняў (альбо прадметную), зьвязаных з выбранай прасторай назваў",
        "blanknamespace": "(Асноўная)",
        "thumbnail-temp-create": "Немагчыма стварыць часовы файл мініятуры",
        "thumbnail-dest-create": "Немагчыма захаваць мініятуру ў месцы прызначэньня",
        "thumbnail_invalid_params": "Няслушныя парамэтры мініятуры",
+       "thumbnail_toobigimagearea": "Файл з памерамі большымі, чым $1",
        "thumbnail_dest_directory": "Немагчыма стварыць мэтавую дырэкторыю",
        "thumbnail_image-type": "Тып выявы не падтрымліваецца",
        "thumbnail_gd-library": "Няпоўная канфігурацыя бібліятэкі GD: няма функцыі $1",
        "import-logentry-interwiki": "імпартавана зь іншай вікі $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|вэрсія імпартаваная|вэрсіі імпартаваныя|вэрсіяў імпартаваныя}} з $2",
        "javascripttest": "Тэставаньне JavaScript",
-       "javascripttest-title": "Праводзіцца тэставаньне $1",
        "javascripttest-pagetext-noframework": "Гэтая старонка трымаецца для правядзеньня тэстаў JavaScript.",
        "javascripttest-pagetext-unknownframework": "Невядомая бібліятэка тэставаньня «$1».",
+       "javascripttest-pagetext-unknownaction": "Невядомае дзеяньне «$1».",
        "javascripttest-pagetext-frameworks": "Калі ласка, выберыце адну з прапанаваных бібліятэка тэставаньня: $1",
        "javascripttest-pagetext-skins": "Выберыце афармленьне для тэставаньня:",
        "javascripttest-qunit-intro": "Глядзіце [$1 дакумэнтацыю па тэставаньні] на mediawiki.org.",
-       "javascripttest-qunit-heading": "Набор QUnit-тэстаў для MediaWiki JavaScript",
        "tooltip-pt-userpage": "Вашая ўласная старонка",
        "tooltip-pt-anonuserpage": "Старонка ўдзельніка для IP-адрасу, зь якога Вы рэдагуеце",
        "tooltip-pt-mytalk": "Ваша старонка гутарак",
        "watchlisttools-raw": "Рэдагаваць як тэкст",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|гутаркі]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Невядомы тэг пашырэньня «$1»",
        "duplicate-defaultsort": "Папярэджаньне: Ключ сартыроўкі па змоўчваньні «$2» замяняе папярэдні ключ сартыроўкі па змоўчваньні «$1».",
        "duplicate-displaytitle": "<strong>Папярэджаньне:</strong> назва для адлюстраваньня «$2» перапісвае ранейшую назву для адлюстраваньня «$1».",
        "invalid-indicator-name": "<strong>Памылка:</strong> атрыбут <code>name</code> індыкатараў статусу старонкі ня мусіць быць пустым.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Шлях да артыкула]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Пуць да скрыпту]",
+       "version-libraries": "Усталяваныя бібліятэкі",
+       "version-libraries-library": "Бібліятэка",
+       "version-libraries-version": "Вэрсія",
        "redirect": "Перанакіраваньне да файла, удзельніка, старонкі або вэрсіі старонкі",
        "redirect-legend": "Перанакіраваньне да файла або старонкі",
        "redirect-summary": "Гэтая спэцыяльная старонка перанакіруе да файла (паводле імя файла), старонкі (паводле нумару вэрсіі або старонкі) або старонкі ўдзельніка (паводле нумару ўдзельніка). Ужываньне: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Пазначаная вэрсія не існуе.",
        "dberr-problems": "Прабачце! На гэтым сайце ўзьніклі тэхнічныя цяжкасьці.",
        "dberr-again": "Паспрабуйце пачакаць некалькі хвілінаў і абнавіць.",
-       "dberr-info": "(Немагчыма злучыцца з сэрвэрам базы зьвестак: $1)",
-       "dberr-info-hidden": "(немагÑ\87Ñ\8bма Ð·Ð»Ñ\83Ñ\87Ñ\8bÑ\86Ñ\86а Ð· Ñ\81Ñ\8dÑ\80вÑ\8dÑ\80ам базы зьвестак)",
+       "dberr-info": "(Немагчыма злучыцца з базай зьвестак: $1)",
+       "dberr-info-hidden": "(Ð\9dÑ\8fма Ð´Ð¾Ñ\81Ñ\82Ñ\83пÑ\83 Ð´Ð° базы зьвестак)",
        "dberr-usegoogle": "Вы можаце пакуль паспрабаваць пашукаць праз Google.",
        "dberr-outofdate": "Увага, індэксы нашага зьместу могуць быць састарэлымі.",
        "dberr-cachederror": "Наступная старонка была загружана з кэшу і можа быць састарэлай.",
index d7e2743..39e7748 100644 (file)
        "watchlisttools-edit": "Паказаць спіс назірання",
        "watchlisttools-raw": "Паказаць нефарматаваны спіс назірання",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|размовы]])",
-       "unknown_extension_tag": "Невядомая метка пашырэння \"$1\"",
        "duplicate-defaultsort": "Увага: прадвызначаная клавіша ўпарадкавання \"$2\" замяніла ранейшую такую клавішу \"$1\".",
        "duplicate-displaytitle": "<strong>Папярэджанне:</strong> Паказаная назва \"$2\" перасягае ранейшую назву \"$1\".",
        "version": "Версія",
index 78e6b1a..e47b9ab 100644 (file)
        "tog-hideminor": "Скриване на малки редакции в последните промени",
        "tog-hidepatrolled": "Скриване на патрулираните редакции от списъка с последните промени",
        "tog-newpageshidepatrolled": "Скриване на патрулираните редакции от списъка на новите страници",
-       "tog-extendwatchlist": "Разширяване на списъка, така че да показва всички промени, не само най-скорошните",
-       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\80ане Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð½Ð° Ð¿Ñ\80омениÑ\82е и списъка за наблюдение",
-       "tog-numberheadings": "Ð\9dомериране на заглавията",
-       "tog-showtoolbar": "Ð\9fоказване Ð½Ð° Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82иÑ\82е за редактиране",
+       "tog-extendwatchlist": "Разширяване на списъка за наблюдение, така че показва всички промени, не само последните",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\80ане Ð½Ð° Ð¿Ñ\80омени Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð½Ð° Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени и списъка за наблюдение",
+       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82иÑ\87но Ð½омериране на заглавията",
+       "tog-showtoolbar": "Ð\9fоказване Ð½Ð° Ð»ÐµÐ½Ñ\82аÑ\82а Ñ\81 Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82и за редактиране",
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "tog-editsectiononrightclick": "Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му",
        "tog-watchcreations": "Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение",
        "tog-previewonfirst": "Показване на предварителен преглед при първа редакция",
        "tog-enotifwatchlistpages": "Уведомяване по е-пощата при промяна на страница или файл от списъка ми за наблюдение",
        "tog-enotifusertalkpages": "Уведомяване по е-пощата при промяна на беседата ми",
-       "tog-enotifminoredits": "УведомÑ\8fване Ð¿Ð¾ Ðµ-поÑ\89аÑ\82а Ð´Ð°Ð¶Ðµ Ð¿Ñ\80и Ð¼Ð°Ð»ÐºÐ¸ Ð¿Ñ\80омени Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸Ð»Ð¸ Ñ\84айлове",
+       "tog-enotifminoredits": "Уведомяване по е-пощата при малки промени на страници или файлове",
        "tog-enotifrevealaddr": "Показване на електронния ми адрес в известяващите писма",
        "tog-shownumberswatching": "Показване на броя на потребителите, наблюдаващи дадена страница",
        "tog-oldsig": "Текущ подпис:",
        "tog-fancysig": "Без превръщане на подписа в препратка към потребителската страница",
-       "tog-uselivepreview": "Използване на бърз предварителен преглед (експериментално)",
+       "tog-uselivepreview": "Използване на бърз предварителен преглед",
        "tog-forceeditsummary": "Предупреждаване при празно поле за резюме на редакцията",
        "tog-watchlisthideown": "Скриване на моите редакции в списъка ми за наблюдение",
        "tog-watchlisthidebots": "Скриване на редакциите на ботове в списъка ми за наблюдение",
@@ -70,7 +70,7 @@
        "underline-always": "Винаги",
        "underline-never": "Никога",
        "underline-default": "Според настройките на облика или браузъра",
-       "editfont-style": "Стил на шрифта в кутията за редактиране",
+       "editfont-style": "Стил на шрифта в кутията за редактиране:",
        "editfont-default": "По подразбиране за браузъра",
        "editfont-monospace": "Равноширок шрифт",
        "editfont-sansserif": "Безсерифен шрифт",
        "filereadonlyerror": "Файлът „$1“ не може да бъде променен, тъй като файловото хранилище „$2“ е в режим само за четене.\n\nАдминистраторът, който го е заключил, е посочил следната причина: „$3“.",
        "invalidtitle-knownnamespace": "Невалидно заглавие с именно пространство $2\" и текст \"$3\"",
        "invalidtitle-unknownnamespace": "Невалидно заглавие с неразпознато именно пространство номер $1 и текст „$2“",
-       "exception-nologin": "Не сте влезли",
+       "exception-nologin": "Не сте влезли в системата",
        "exception-nologin-text": "За достъп до избраното действие или страница е необходимо влизане в системата.",
        "exception-nologin-text-manual": "За достъп до избраното действие или страница е необходимо $1 в системата.",
        "virus-badscanner": "Лоша конфигурация: непознат скенер за вируси: ''$1''",
        "userloginnocreate": "Влизане",
        "logout": "Излизане",
        "userlogout": "Излизане",
-       "notloggedin": "Не сте влезли",
+       "notloggedin": "Не сте влезли в системата",
        "userlogin-noaccount": "Нямате сметка?",
        "userlogin-joinproject": "Присъединяване към {{SITENAME}}",
        "nologin": "Нямате потребителско име? $1.",
        "nosuchuser": "Не съществува потребител с име „$1“.\nПотребителските имена са чувствителни на малки и главни букви.\nПроверете изписването или [[Special:UserLogin/signup|създайте нова сметка]].",
        "nosuchusershort": "Не съществува потребител с името „$1“. Проверете изписването.",
        "nouserspecified": "Необходимо е да се посочи потребителско име.",
-       "login-userblocked": "Този Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ел Ðµ Ð±Ð»Ð¾ÐºÐ¸Ñ\80ан. Ð\9dе Ñ\81е Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fва Ð²Ð»Ð¸Ð·Ð°Ð½Ðµ.",
+       "login-userblocked": "Този Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ел Ðµ Ð±Ð»Ð¾ÐºÐ¸Ñ\80ан. Ð\92лизанеÑ\82о Ð² Ñ\81иÑ\81Ñ\82емаÑ\82а Ð½Ðµ Ðµ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾.",
        "wrongpassword": "Въведената парола е невалидна. Опитайте отново.",
        "wrongpasswordempty": "Въведената парола е празна. Опитайте отново.",
        "passwordtooshort": "Необходимо е паролата да съдържа поне {{PLURAL:$1|1 знак|$1 знака}}.",
        "userinvalidcssjstitle": "'''Внимание:''' Не съществува облик „$1“. Необходимо е да се знае, че имената на потребителските ви страници за CSS и Джаваскрипт трябва да се състоят от малки букви, например: „{{ns:user}}:Иван/vector.css“ (а не „{{ns:user}}:Иван/Vector.css“).",
        "updated": "(обновена)",
        "note": "'''Забележка:'''",
-       "previewnote": "'''Важно е да се помни, че това е само предварителен преглед. Промените все още не са съхранени!'''",
+       "previewnote": "<strong>Обърнете внимание, че това е само предварителен преглед.</strong>\nПромените все още не са съхранени!",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
        "session_fail_preview": "'''За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия. Опитайте отново. Ако все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново.'''",
        "content-failed-to-parse": "Неуспех при анализиране на съдържанието от тип $2 за модела $1: $3",
        "invalid-content-data": "Невалидни данни за съдържание",
        "content-not-allowed-here": "\nНа страницата [[$2]] не е позволено използването на $1",
-       "editwarning-warning": "Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. \nАко сте влезли в системата, можете да изключите това предупреждение през меню \"Редактиране\" във вашите лични настройки.",
+       "editwarning-warning": "Ако излезете от тази страница, може да загубите всички несъхранени промени, които сте направили. \nАко сте влезли в системата, можете да изключите това предупреждение чрез менюто \"Редактиране\" в личните ви настройки.",
        "editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа",
        "content-model-wikitext": "уикитекст",
        "content-model-text": "обикновен текст",
        "revdelete-legend": "Задаване на ограничения:",
        "revdelete-hide-text": "Текст на версията",
        "revdelete-hide-image": "Скриване на файловото съдържание",
-       "revdelete-hide-name": "Скриване на действието и целта",
+       "revdelete-hide-name": "Скриване на цели и параметри",
        "revdelete-hide-comment": "Скриване на резюмето",
        "revdelete-hide-user": "Потребителско име/IP адрес на редактора",
        "revdelete-hide-restricted": "Прилагане на тези ограничения и за администраторите",
        "showhideselectedversions": "Показване/скриване на избрани версии",
        "editundo": "връщане",
        "diff-empty": "(Няма разлика)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребителя}})",
+       "diff-multi-sameuser": "({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от същия потребител)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от {{PLURAL:$2|друг потребител|{{PLURAL:$2|2=двама|3=трима|4=четирима|$2}} потребители}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от {{PLURAL:$2|един потребител|$2 потребители}})",
        "difference-missing-revision": "{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).\n\nТова обикновено се случва, когато е последвана остаряларазликова препратка на страница,коятоебила изтрита.\nПовече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "searchresults": "Резултати от търсенето",
        "searchresults-title": "Резултати от търсенето за „$1“",
        "search-result-category-size": "{{PLURAL:$1|1 член|$1 члена}} ({{PLURAL:$2|1 подкатегория|$2 подкатегории}}, {{PLURAL:$3|1 файл|$3 файла}})",
        "search-redirect": "(пренасочване $1)",
        "search-section": "(раздел $1)",
+       "search-category": "(категория $1)",
        "search-suggest": "Вероятно имахте предвид: $1",
        "search-interwiki-caption": "Сродни проекти",
        "search-interwiki-default": "Резултати от $1:",
        "powersearch-togglelabel": "Избор:",
        "powersearch-toggleall": "Всички",
        "powersearch-togglenone": "Никои",
+       "powersearch-remember": "Запомняне на избора за бъдещи търсения",
        "search-external": "Външно търсене",
        "searchdisabled": "Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.",
        "search-error": "Възникна грешка при търсене: $1",
        "recentchanges": "Последни промени",
        "recentchanges-legend": "Настройки на списъка с последни промени",
        "recentchanges-summary": "Проследяване на последните промени в {{SITENAME}}.\n\nЛегенда: '''тек''' = разлика на текущата версия,\n'''ист''' = история на версиите",
-       "recentchanges-noresult": "Ð\9dе Ð±Ñ\8fÑ\85а Ð½Ð°Ð¼ÐµÑ\80ени Ð¿Ñ\80омени Ð·Ð° Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\8f Ð¿ÐµÑ\80иод, ÐºÐ¾Ð¸Ñ\82о отговарят на критериите.",
+       "recentchanges-noresult": "Ð\97а Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\8f Ð¿ÐµÑ\80иод Ð½Ðµ Ð±Ñ\8fÑ\85а Ð½Ð°Ð¼ÐµÑ\80ени Ð¿Ñ\80омени, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° отговарят на критериите.",
        "recentchanges-feed-description": "Проследяване на последните промени в {{SITENAME}}.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Това е малка промяна",
-       "recentchanges-label-bot": "Тази редакция е извършена от робот",
+       "recentchanges-label-bot": "Тази редакция е извършена от бот",
        "recentchanges-label-unpatrolled": "Тази редакция все още не е проверена",
        "recentchanges-label-plusminus": "Размерът на страницата е променен с този брой байтове",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "mostrevisions": "Страници с най-много версии",
        "prefixindex": "Всички страници с представка",
        "prefixindex-namespace": "Всички страници с представка (именно пространство $1)",
+       "prefixindex-strip": "Скриване на представката в списъка с резултати",
        "shortpages": "Кратки страници",
        "longpages": "Дълги страници",
        "deadendpages": "Задънени страници",
        "querypage-disabled": "Тази специална страница е изключена, защото затруднява производителността на уикито.",
        "booksources": "Източници на книги",
        "booksources-search-legend": "Търсене на информация за книга",
+       "booksources-search": "Търсене",
        "booksources-text": "По-долу е списъкът от връзки към други сайтове, продаващи нови и използвани книги или имащи повече информация за книгите, които търсите:",
        "booksources-invalid-isbn": "Предоставеният ISBN изглежда е невалиден; проверете за грешки и копирайте от оригиналния източник.",
        "specialloguserlabel": "Изпълнител:",
        "alllogstext": "Смесено показване на записи от всички налични дневници в {{SITENAME}}.\nМожете да ограничите прегледа, като изберете вид на дневника, потребителско име или определена страница.",
        "logempty": "Дневникът не съдържа записи, отговарящи на избрания критерий.",
        "log-title-wildcard": "Търсене на заглавия, започващи със",
+       "showhideselectedlogentries": "Промяна на видимостта на избраните записи",
        "allpages": "Всички страници",
        "nextpage": "Следваща страница ($1)",
        "prevpage": "Предходна страница ($1)",
        "delete-edit-reasonlist": "Редактиране на причините за изтриване",
        "delete-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Изтриването на такива страници е ограничено, за да се предотвратят евентуални поражения на {{SITENAME}}.",
        "delete-warning-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Възможно е изтриването да наруши някои операции в базата данни на {{SITENAME}}; необходимо е особено внимание при продължаване на действието.",
+       "deleteprotected": "Не можете да изтриете страницата, защото е защитена.",
        "rollback": "Отмяна на промените",
-       "rollback_short": "Отмяна",
        "rollbacklink": "отмяна",
        "rollbacklinkcount": "отмяна на $1 {{PLURAL:$1|редакция|редакции}}",
        "rollbacklinkcount-morethan": "отмяна на повече от $1 {{PLURAL:$1|редакция|редакции}}",
        "movepagetalktext": "Ако съществува, съответната дискусионна страница ще бъде преместена автоматично заедно с нея, '''освен ако:'''\n* не местите страницата от едно именно пространство в друго,\n* вече съществува непразна дискусионна страница с това име или\n* не сте отметнали долната кутийка.\n\nВ тези случаи, ако желаете, ще е необходимо да преместите страницата ръчно.",
        "movearticle": "Преместване на страница:",
        "moveuserpage-warning": "'''Внимание:''' Предприели сте опит да преместите потребителска страница. Забележете, че от преместването на страницата '''няма''' да последва преименуване на потребителя.",
+       "movecategorypage-warning": "<strong>Внимание:</strong> На път сте да преместите категорийна страница. Моля, обърнете внимание, че ще бъде преместена само страницата на категорията. <em>Никоя</em> от страниците в старата категория <em>няма</em> да бъде прекатегоризирана.",
        "movenologintext": "Необходимо е да [[Special:UserLogin|влезете]], за да може да премествате страници.",
        "movenotallowed": "Нямате права за преместване на страници.",
        "movenotallowedfile": "Нямате права да премествате файлове.",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Една страница беше премахната|$1 страници бяха премахнати}}:",
        "watchlistedit-clear-legend": "Изчистване на списъка за наблюдение",
        "watchlistedit-clear-submit": "Изчистване на списъка за наблюдение (Необратимо!)",
+       "watchlistedit-clear-done": "Списъкът за наблюдение беше изчистен.",
        "watchlisttools-clear": "Изчистване на списъка за наблюдение",
        "watchlisttools-view": "Преглед на списъка за наблюдение",
        "watchlisttools-edit": "Преглед и редактиране на списъка за наблюдение",
        "watchlisttools-raw": "Редактиране на необработения списък за наблюдение",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|беседа]])",
-       "unknown_extension_tag": "Непознат етикет на разширение „$1“",
        "duplicate-defaultsort": "Внимание: Ключът за сортиране по подразбиране „$2“ отменя по-ранния ключ „$1“.",
        "version": "Версия",
        "version-extensions": "Инсталирани разширения",
        "version-entrypoints-header-entrypoint": "Входна точка",
        "version-entrypoints-header-url": "Адрес",
        "redirect-submit": "Отваряне",
+       "redirect-value": "Стойност:",
        "redirect-user": "Потребителски номер",
        "redirect-page": "Номер на страницата",
        "redirect-revision": "Версия на страницата",
        "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 ('''изключено''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''изключено''')",
+       "mediastatistics": "Медия статистики",
+       "mediastatistics-table-mimetype": "MIME тип",
+       "mediastatistics-header-audio": "Аудио",
+       "mediastatistics-header-video": "Видео",
+       "json-error-syntax": "Синтактична грешка"
 }
diff --git a/languages/i18n/bgn.json b/languages/i18n/bgn.json
new file mode 100644 (file)
index 0000000..394db69
--- /dev/null
@@ -0,0 +1,697 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Baloch Afghanistan"
+               ]
+       },
+       "tog-underline": "لینکانی جهلگا خط کشیتین",
+       "tog-hideminor": "کمین تغیرات شه آخیرین تغیراتانی لڑلیستا چیهر داته بئینت",
+       "tog-hidepatrolled": "گشت وارته گین ایڈ\tیٹان شه آخیرین ایڈ\tیٹانی لڑلیستا چیهر داته بئینت",
+       "tog-showtoolbar": "نشان داتین ایڈیٹی نوارئ",
+       "tog-editondblclick": "تاکدیمانی ایڈیٹ کورتین گو دو کلیک ئا",
+       "tog-editsectiononrightclick": "پئال کورتین بخشانی ایڈیٹی گو راست کلیکا بی ئنوانی سرا",
+       "tog-watchcreations": "تاکدیمان که من جوڑ ئه کنین یا فایلان که بُرز ( ڈ\tانلوڈ\t) ئه کنین بی نئ واچلیست ئا اضافه بیئنت",
+       "tog-watchdefault": "تاکدیمان و فایلان که من ایڈ\tیٹ ئه کنین بی نئ واچلیست ئا اضافه بیئنت",
+       "tog-watchmoves": "تاکدیمان و فایلان که من جابجا ئه کنین بی نئ واچلیست ئا اضافه بیئنت",
+       "tog-watchdeletion": "تاکدیمان و فایلان که من ڈ\tیلیٹ ئه کنین بی نئ واچلیست ئا اضافه بیئنت",
+       "tog-watchrollback": "تاکدیمان  که من بیر گردینته ئون بی نئ واچلیست ئا اضافه بیئنت",
+       "tog-minordefault": "مارک یا ئلامت جتین موچین ایڈ\tیٹانی بی جزئی رقما",
+       "tog-previewontop": "پیش نمایش دیم شه ایڈ\tیٹ باکس ئه نشان داته بیئت",
+       "tog-previewonfirst": "پیش نمایش اولین ایڈ\tیٹئ وختا  نشان داته بیئت",
+       "tog-enotifwatchlistpages": "اگه شه نئ واچلیستا گوجام تاکدیم یا فایل ایڈ\tیٹ ئه بیئت په من ایمیل دیم داته بیئت",
+       "tog-enotifusertalkpages": "اگه شه نئ کار زوروکین تاکدیم ( یوزیر تاک) ایڈ\tیٹ ئه بیئت په من ایمیل دیم داته بیئت",
+       "tog-enotifminoredits": "په گوُنڈین ایڈ\tیٹان  تاکدیمانی یا فایلان خاتیرا په من ایمیل دیم داته بیئت",
+       "tog-enotifrevealaddr": "نی ایمیل ادرس بی ایمیلئ ناٹیپیشن ئانی تا نشان داته بیئت",
+       "tog-shownumberswatching": "دیستوکین کارزورکانی اندازه نشان داته بیئت",
+       "tog-oldsig": "انونین امضاء:",
+       "tog-fancysig": "امضا باید بی  ویکی‌متنئ رکما بی نظر گیپته بیئت (بدون شه اتوماتیکین لینکی درج کورتینا)",
+       "tog-uselivepreview": "استفاده شه زنده ئین پیش نمایش ئا",
+       "underline-always": "موچین وختا",
+       "underline-never": "هیچ وخت",
+       "editfont-monospace": "گو ثابیتین اندزه ئی قلم ئا",
+       "editfont-sansserif": "قلم بی شه گوشه ئا",
+       "editfont-serif": "گوشه دارین قلم",
+       "sunday": "یکشمی",
+       "monday": "دوشمی",
+       "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": "ڈ\tسمبر",
+       "january-gen": "جنوری",
+       "february-gen": "فیبروری",
+       "march-gen": "مارچ",
+       "april-gen": "اپریل",
+       "may-gen": "می",
+       "june-gen": "جون",
+       "july-gen": "جولای",
+       "august-gen": "اگوست",
+       "september-gen": "سیپٹمبر",
+       "october-gen": "اکتوبر",
+       "november-gen": "نوامبر",
+       "december-gen": "ڈ\tسمبر",
+       "jan": "جنوری",
+       "feb": "فیبروری",
+       "mar": "مارچ",
+       "apr": "اپریل",
+       "may": "می",
+       "jun": "جون",
+       "jul": "جولای",
+       "aug": "اگوست",
+       "sep": "سیپٹمبر",
+       "oct": "اکتوبر",
+       "nov": "نوامبر",
+       "dec": "ڈ\tسمبر",
+       "january-date": "$1 جنوری",
+       "february-date": "$1 فیبروری",
+       "march-date": "$1 مارچ",
+       "april-date": "$1 اپریل",
+       "may-date": "$1 می",
+       "june-date": "$1 جون",
+       "july-date": "$1 جولای",
+       "august-date": "$1 اگوست",
+       "september-date": "$1 سیپٹ\tمبر",
+       "october-date": "$1 اکتوبر",
+       "november-date": "$1 نوامبر",
+       "december-date": "$1 ڈ\tسمبر",
+       "pagecategories": "{{PLURAL:$1|تهر|تهرئان}}",
+       "category_header": "تهرِ تاکدیمان «$1»",
+       "subcategories": "گونڈ\t تهرئان",
+       "category-media-header": "میڈ\tیا بی تهری تا «$1»",
+       "category-empty": "<em>ای تهر بی انون وختا هیچ تاکدیمئ یا میڈ\tیاین دیمی نه اینت.</em>",
+       "hidden-categories": "{{PLURAL:$1|چیهرین تهر|چیهرین تهرئان}}",
+       "hidden-category-category": "چیهرین تهرئان",
+       "category-subcat-count": "{{PLURAL:$2|ای تهر تانا جئلگین مطالبانا داریت.|{{PLURAL:$1|ای گوُنڈ\t تهر|ای $1 گوُنڈ\t تهر}} بی ای تهر ئی تا {{PLURAL:$1|داریت|دارنت}}؛ بی ای تهر تا مجموئان  $2 گوُنڈ\t تهر انت.}}",
+       "category-subcat-count-limited": "ای تهر شامل شه جهلگین{{PLURAL:$1|یک|$1}} گونڈ\tتهر ئه انت .",
+       "listingcontinuesabbrev": "(ادامه)",
+       "index-category": "آ تاکدیمان که دیسته بوته گنت",
+       "noindex-category": "آ تاکدیمان که دیسته نه بوته گنت",
+       "broken-file-category": "تاکدیمان گو خرابین لینکان بی فایلا",
+       "about": "بی باره ها",
+       "article": "محتوائین تاکدیم",
+       "newwindow": "(نوکین دَروازگی تا پاچ بیئت)",
+       "cancel": "کنسیل",
+       "moredotdotdot": "گیشتیر...",
+       "morenotlisted": "ای لڑ\t لیست کامل نه اینت.",
+       "mypage": "تاکدیم",
+       "mytalk": "گپ",
+       "anontalk": "ای آی پی نشانی ئی باره ئا گپ",
+       "navigation": "ناوبری",
+       "and": "&#32;و",
+       "qbfind": "ودی کورتین",
+       "qbbrowse": "مرور",
+       "qbedit": "ایڈیٹ",
+       "qbpageoptions": "ای تاکدیم",
+       "qbmyoptions": "نئ تاکدیمان",
+       "faq": "متداولین سوالان",
+       "faqpage": "Project:متداولین سوالان",
+       "actions": "عملکردهان",
+       "namespaces": "نامانی فضاهان",
+       "variants": "لهجه ئان",
+       "navigation-heading": "ناوبری مینو",
+       "errorpagetitle": "خطا",
+       "returnto": "بیئرگشت بئ $1.",
+       "tagline": "شه {{SITENAME}}",
+       "help": "کومک",
+       "search": "گشتین",
+       "searchbutton": "گشتین",
+       "go": "برا",
+       "searcharticle": "برا",
+       "history": "تاکدیمی تاریخچه",
+       "history_short": "تاریخچه",
+       "updatedmarker": "نئ آخرین آپڈیٹا نشان داتین",
+       "printableversion": "چاپ وڑی ویرژن",
+       "permalink": "ثابتین لبنک",
+       "print": "چاپ",
+       "view": "نمایش",
+       "view-foreign": "دیستین بی $1",
+       "edit": "ایڈیٹ",
+       "edit-local": "محل و جای توضیئانی ایڈ\tیٹ کورتین",
+       "create": "جوڑ\t کورتین",
+       "create-local": "محل و جای توضیئانی اضافه کورتین",
+       "editthispage": "ایڈ\tیٹ کورتین ای تاکدیمئ",
+       "create-this-page": "جوڑ کورتین ای تاکدیمئ",
+       "delete": "پاک کورتین",
+       "deletethispage": "پاک کورتین ای تاکدیمئ",
+       "undeletethispage": "بی جاه آورتین ای تاکدیمئ",
+       "undelete_short": "بی جاه آورتین {{PLURAL:$1|یک ایڈیٹ|$1 ایڈیٹ}}",
+       "viewdeleted_short": "نشان داتین {{PLURAL:$1|یکین ڈ\tیلیٹ بوتگین ایڈ\tیٹئ |$1 ڈ\tیلیٹ بوتگین ایڈ\tیٹئ}}",
+       "protect": "ساتیتئن",
+       "protect_change": "تغیر",
+       "protectthispage": "ای تاکدیمئ قُلپ کورتین",
+       "unprotect": "قُلپئ ٹگل داتین",
+       "unprotectthispage": "ای تاکدیمی قُلپئ ٹگل داتین",
+       "newpage": "نوکین تاکدیم",
+       "talkpage": "ای تاکدیم باره ئا هبر و گپ",
+       "talkpagelinktext": "گپ",
+       "specialpage": "خاصین تاکدیم",
+       "personaltools": "شخصین وسایل",
+       "articlepage": "تاکدیمی محتوائانی نمایش",
+       "talk": "هبر و گپ",
+       "views": "دیستینین",
+       "toolbox": "وسایللان",
+       "userpage": "کارزوروکین تاکدیمی دیستین",
+       "projectpage": "پروژه ئی تاکدیمی دیستین",
+       "imagepage": "فایلی تاکدیما نشان داتین",
+       "mediawikipage": "پیامی تاکدیما نشان داتین",
+       "templatepage": "تراشوانئ تاکدیما نشان داتین",
+       "viewhelppage": "کومکی تاکدیما نشان داتین",
+       "categorypage": "دیستین تهری تاکدیمی",
+       "viewtalkpage": "گپ تاکدیمی نشان داتین",
+       "otherlanguages": "بی دیگه زبانانی تا",
+       "redirectedfrom": "(تغییرمسیر داتین شه $1)",
+       "redirectpagesub": "تاکدیمی تغییرمسیر داتین",
+       "redirectto": "تغییر مسیر بی:",
+       "lastmodifiedat": "ای تاکدیم آخرین‌ وارا بی $1 سائت $2 تا تغییر بوته.",
+       "viewcount": "شه ای تاکدیما کسی {{PLURAL:$1|یکوار|$1ور}} دیدن کورته.",
+       "protectedpage": "قُلپ بوتگین تاکدیم",
+       "jumpto": "جوپ کورتین بی:",
+       "jumptonavigation": "ناوبری",
+       "jumptosearch": "گشتین",
+       "pool-timeout": "تمام بوتین انتظارمهلتئ په قُلپ کورتینئ خاتیرا",
+       "pool-queuefull": "مخزن ئی صف پر اینت",
+       "pool-errorunknown": "ناشناخته ئین خطا",
+       "pool-servererror": "پول سنتر سرویس بی دسترس ئا نه اینت ( $1 ).",
+       "poolcounter-usage-error": "خطا استفاده شه: $1",
+       "aboutsite": "بی بارها {{SITENAME}}",
+       "aboutpage": "Project:بی بارها",
+       "edithelp": "کومک په ایدیت ئی خاتیرا",
+       "mainpage": "بُنیادی تاکدیم",
+       "mainpage-description": "بُنیادی تاکدیم",
+       "policy-url": "Project:سیاست‌ئان",
+       "portal": "کار زوروکانئ داخل بوتین",
+       "portal-url": "Project:کار زوروکانئ داخل بوتین",
+       "privacy": "سیاست محرمانگی",
+       "privacypage": "Project:سیاست محرمانگی",
+       "badaccess": "دسترسی ئی خطا",
+       "ok": "قبول داشتین",
+       "retrievedfrom": "گیپته بوته شه  «$1»",
+       "youhavenewmessages": "$1 داریت ($2).",
+       "youhavenewmessagesfromusers": "شما شه {{PLURAL:$3|یک دیگه کار زوروکئ|$3  کار زوروک}} $1 داریت ($2).",
+       "youhavenewmessagesmanyusers": "شما شه تعدادی کار زوروک $1 داریت ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|نوکین پیام|999=نوکین پیامان}}",
+       "newmessagesdifflinkplural": "{{formatnum:$1}} {{PLURAL:$1|ٹگل|999=ٹگل}} اخیر",
+       "youhavenewmessagesmulti": "نوکین پیام بی  $1 تاداریت.",
+       "editsection": "ایڈیٹ",
+       "editold": "ایڈیٹ",
+       "viewsourceold": "نشان داتین مبدائی",
+       "editlink": "ایڈیٹ",
+       "viewsourcelink": "نشان داتین مبدائی",
+       "editsectionhint": "ایدیت کورتین : $1 بخشی",
+       "toc": "محتویات",
+       "showtoc": "نشان داتین",
+       "hidetoc": "چیهر داتین",
+       "collapsible-collapse": "بستین",
+       "collapsible-expand": "پراخ کورتین",
+       "confirmable-confirm": "{{GENDER:$1|شما}} مطمئن هستیت؟",
+       "confirmable-yes": "هان",
+       "confirmable-no": "نه",
+       "thisisdeleted": "نشان داتین یا جوڑ\t کورتین $1 ئی؟",
+       "viewdeleted": "نشان داتین $1؟",
+       "restorelink": "{{PLURAL:$1|یک|$1}} ڈ\tیلیٹ بوتگینئ ایڈ\tیٹ",
+       "feedlinks": "حبر وان:",
+       "nstab-main": "تاکدیم",
+       "nstab-user": "کار زوروکی تاکدیم",
+       "nstab-media": "میڈ\tیای تاکدیم",
+       "nstab-special": "خاصین تاکدیم",
+       "nstab-project": "پروژه ئی تاکدیم",
+       "nstab-image": "فایل",
+       "nstab-mediawiki": "پیام",
+       "nstab-template": "تراشوان",
+       "nstab-help": "کومکین تاکدیم",
+       "nstab-category": "تهر",
+       "nosuchaction": "ایرنگین ئملی وجود نداریت",
+       "nosuchactiontext": "ای ئملی که شما مشخص کورته ئیت بی انترنیتئین ادرسی تا جواز نداریت .\nممکن اینت که انترنتین ادرسا جوان وارد نه کورته ئیت یا مشکل والا ئین لینک ئیا وارد کوره ئیت .\nیا امکان داریت که شه نرم افزاری که شما بی{{SITENAME}} تا استفاده کورته ئیت مشکل داشته بیئت.",
+       "error": "خطا",
+       "databaseerror": "مئلوماتین بانکئ خطا",
+       "databaseerror-text": "مشکلی بی مئلوماتین بانکی تا رخ داته. \nای ممکن اینت شه مشکلا بی نرم افزاری تا بیئت .",
+       "databaseerror-query": "پرس‌وجو: $1",
+       "databaseerror-function": "تابع: $1",
+       "databaseerror-error": "خطا: $1",
+       "missingarticle-rev": "(شمارهٔ نسخه: $1)",
+       "missingarticle-diff": "(تفاوت: $1، $2)",
+       "internalerror": "داخلین خطا",
+       "internalerror_info": "داخلین خطا: $1",
+       "filecopyerror": "نه شه فایل «$1» بی «$2» کاپی بیئت.",
+       "filerenameerror": "نه شه فایل «$1» بی «$2» تغیر نام بیئت.",
+       "filedeleteerror": "نه بوت فایل «$1» پاک بیئت.",
+       "directorycreateerror": "نه بوت مسیر $1 ئا جوڑ کورت.",
+       "directoryreadonlyerror": "دایرکتوری \"$1\" فقط وانتینئ اینت.",
+       "directorynotreadableerror": "دایرکتوری \"$1\" وانتینئ نه اینت.",
+       "filenotfound": "فایل «$1» ودی نه بوت.",
+       "unexpected": "غیرمنتظرئین اندازه: «$1»=«$2».",
+       "formerror": "خطا: نه توانن فرم ئا دیم دی ین.",
+       "badarticleerror": "نه توانن ای ئملا په ای تاکدیما انجام دی ین .",
+       "badtitle": "خرابین ئنوان",
+       "viewsource": "نشان داتین مبدائی",
+       "viewsource-title": "مبدا ئی نشان داتین په $1",
+       "actionthrottled": "شمی ئملی دیم گیپته بوت",
+       "viewsourcetext": "شما ئه توانیت ای تاکدیمی مبدائا بگیندیت و یا کاپی بکنیت:",
+       "exception-nologin": "لاگین نه بوته ئیت",
+       "virus-scanfailed": "ناکامین سکن  (کود $1)",
+       "virus-unknownscanner": "نامئلومین انتی ویروس:",
+       "welcomeuser": "وش آتیت $1!",
+       "welcomecreation-msg": "شمی کار زوروکین حساب جوڑ بوت.\nبی هوش مکنیت که وتئ [[Special:Preferences|تنظیماتان ئا {{SITENAME}}]] تغیر بدهیت.",
+       "yourname": "کار زوروکین نام:",
+       "userlogin-yourname": "کار زوروکین نام",
+       "userlogin-yourname-ph": "وتئ کار زوروکین ناما داخل بکنیت",
+       "createacct-another-username-ph": "کار زوروکین ناما داخل بکنیت",
+       "yourpassword": "چیهر گال یا پاسورد:",
+       "userlogin-yourpassword": "چیهر گال یا پاسورد",
+       "userlogin-yourpassword-ph": "وتئ پاسوردا داخل بکنیت",
+       "createacct-yourpassword-ph": "پاسوردا داخل بکنیت",
+       "yourpasswordagain": "پاسوردی تکرار کورتین",
+       "createacct-yourpasswordagain": "پاسوردا تایید کورتین",
+       "createacct-yourpasswordagain-ph": "پاسوردا پدا داخل کورتین دومین وارا",
+       "userlogin-remembermypassword": "نا داخل بوتگ بسات",
+       "userlogin-signwithsecure": "شه امنیت ئا استفاده بکنیت",
+       "yourdomainname": "شمی دامنهٔ:",
+       "password-change-forbidden": "شما ئا نه توانیت که بی ای ویکی تا پاسوردا تغیر بدهیت",
+       "login": "داخل بوتین",
+       "nav-login-createaccount": "داخل بوتین  / کار زوروکین حسابي جوڑ کورتین",
+       "userlogin": "داخل بوتین  / کار زوروکین حسابي جوڑ کورتین",
+       "userloginnocreate": "داخل بوتین",
+       "logout": "در بوتین",
+       "userlogout": "در بوتین",
+       "notloggedin": "لاگین نه بوته ئیت",
+       "userlogin-noaccount": "شما کار زوروکین حسابئ نداریت؟",
+       "userlogin-joinproject": "بی  {{SITENAME}} تا نام‌نویسی کنیت!",
+       "nologin": "شما کار زوروکین حسابئ نداریت ؟ $1.",
+       "nologinlink": "یک نوکین کار زوروکین حسابئ جوڑ کنیت",
+       "createaccount": "نوکین کار زوروکین حسابئ جوڑ کورتین",
+       "gotaccount": "شما کار زوروکین حسابئ داریت ؟ $1.",
+       "gotaccountlink": "داخل بوتین",
+       "userlogin-resetlink": "وتئ داخل بوتینئ مئلوماتان شه هوشا بورته ئیت؟",
+       "userlogin-resetpassword-link": "شمی پاسورد شه شمی دهوشا شُوته؟",
+       "userlogin-helplink2": "کومک گو داخل بوتینا",
+       "userlogin-loggedin": "شما انون بی ئنوان {{GENDER:$1|$1}} داخل بوته ئیت .\nشه جهلگین فورما په داخل بوتینا بی ئنوان دیگرین کار زوروکا استفاده بکنیت .",
+       "userlogin-createanother": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
+       "createacct-emailrequired": "ایمیل ادرس",
+       "createacct-emailoptional": "ایمیل ادرس (اختیاری)",
+       "createacct-email-ph": "وتئ ایمیل ادرسا داخل بکنیت",
+       "createacct-another-email-ph": "ایمیل ادرسی داخل کورتین",
+       "createaccountmail": "استفاده شه تصادفین پاسوردا و آیی دیم داتین بی مشخصین ایمیل ادرسیا",
+       "createacct-realname": "واقئین نام (اختیاری)",
+       "createaccountreason": "دلیل:",
+       "createacct-reason": "دلیل",
+       "createacct-reason-ph": "پچی شما لوٹیت که دیگرین کار زوروکین حساب جوڑ کنیت؟",
+       "createacct-captcha": "امنیتئ چیک کورتین",
+       "createacct-imgcaptcha-ph": "په بُرزه گین اکسا کی گیندیت متنی داخل کنیت",
+       "createacct-submit": "وتئ کار زوروکین حسابا جوڑ کنیت",
+       "createacct-another-submit": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
+       "createacct-benefit-heading": "ای {{SITENAME}} چو شمیا همیرنگین مردمانی واسطه ئا جوڑ بوته",
+       "createacct-benefit-body1": "{{PLURAL:$1|ایڈیٹ}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|تاکدیم}}",
+       "createacct-benefit-body3": "آخیرین {{PLURAL:$1|شریکان}}",
+       "badretype": "پاسوردانا که شما داخل کورته ئیت یکرنگ نه انت.",
+       "userexists": "ای کار زوروکین ناما که شما داخل کورته ئیت دیمتیرا استفاده بوته.\nمهربانی بکنیت یک دیگه نامئ بیلیئت .",
+       "loginerror": "خطا بی داخل بوتینی تا",
+       "createacct-error": "کار زوروکین حسابئ جوڑ کورتینی خطا",
+       "createaccounterror": "ای حسابئ جوڑ کورتین امکان نداریت: $1",
+       "passwordtooshort": "پاسورد باید کم شه کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته بیئت.",
+       "mailmypassword": "پاک کورتین پاسوردئ",
+       "accountcreated": "کار زوروکین حساب جوڑ بوت",
+       "loginlanguagelabel": "زبان: $1",
+       "pt-login": "داخل بوتین",
+       "pt-login-button": "داخل بوتین",
+       "pt-createaccount": "کار زوروکین حسابئ جوڑ کورتین",
+       "pt-userlogout": "در بوتین",
+       "resetpass_header": "پاسوردئ تغیر داتین",
+       "oldpassword": "دیمئ پاسورد:",
+       "newpassword": "نوکین پاسورد:",
+       "retypenew": "نوکین پاسوردا پدا داخل کورتین",
+       "resetpass_submit": "پاسوردی تنظیم و داخل بوتین",
+       "changepassword-success": "شمی پاسوردئ تغیر کامیاب بوت و پاسورد تغیر کورت",
+       "resetpass-submit-loggedin": "پاسوردی تغیر داتین",
+       "resetpass-submit-cancel": "کنسیل",
+       "resetpass-temp-password": "موقیئتین پاسورد:",
+       "passwordreset": "پاک کورتین پاسوردئ",
+       "passwordreset-legend": "پاک کورتین پاسوردئ",
+       "passwordreset-username": "کار زوروکین نام:",
+       "passwordreset-domain": "دامنه:",
+       "changeemail": "ایمیل ادرسی تغیر داتین",
+       "changeemail-oldemail": "انونین ایمیل ادرس:",
+       "changeemail-newemail": "نوکین ایمیل ادرس:",
+       "changeemail-none": "(هیچ)",
+       "changeemail-submit": "ایمیل ادرسی تغیر",
+       "bold_sample": "پر رنگین متن",
+       "bold_tip": "پر رنگین متن",
+       "media_tip": "فایل لینک",
+       "summary": "خلاصه:",
+       "watchthis": "دیستین ای تاکدیمی",
+       "savearticle": "ای تاکدیم ذخیره بیئت",
+       "preview": "دیم دیست",
+       "showpreview": "دیم دیست",
+       "showdiff": "تغیراتانئ نشان داتین",
+       "blankarticle": "<strong>هشدار:</strong> شما انون یک خالین تاکدیمی جوڑ کورتینی حالا وَیت .\nاگر «{{int:savearticle}}» ئا پدا  کلیک کنیت، یک تاکدیمی بدون شه محتوائا جوڑ ئه بیئت.",
+       "anoneditwarning": "<strong>هشدار:</strong> شما داخل نه بوته ئیت. شمی آی‌پی نشانگ ئا موچی ئه تواننت بگیندنت اگر شما هر تغیری بیاریت . اگر <strong>[$1 داخل بئیت]</strong> یا <strong>[$2 یک کار زوروکین حساب جوڑ بکنیت]</strong>، شمی ایڈیٹ\t بی شمی کار زوروکین ناما شینک ئه بیئنت و گون گو دیگرین مزایان .",
+       "blockedtitle": "کار زوروک بسته بوته",
+       "loginreqtitle": "لوگین بوتین ضروری اینت",
+       "loginreqlink": "داخل بوتین",
+       "accmailtitle": "پاسورد دیم داته بوت.",
+       "newarticle": "(نوکین)",
+       "continue-editing": "شوتین بی ایڈ\tیٹ\tی نیمگا",
+       "editing": "بی ایڈ\tیٹ\t کورتینی حالا $1",
+       "creating": "بی جوڑ کورتینی حالا $1",
+       "yourtext": "شمی متن",
+       "content-model-wikitext": "ویکی‌متن",
+       "content-model-text": "ساده گین متن",
+       "content-model-javascript": "جاوااسکریپت",
+       "content-json-empty-object": "خالین چیز",
+       "content-json-empty-array": "خالین صف",
+       "previousrevision": "→ قدیمین نخسه",
+       "nextrevision": "نوکین نخسه ←",
+       "currentrevisionlink": "انونین نخسه یی نشان داتین",
+       "cur": "فعلی",
+       "next": "بعدی",
+       "last": "دیمتیرین",
+       "page_first": "اولین",
+       "page_last": "آخیرین",
+       "histfirst": "کهنگتیرین",
+       "histlast": "نوکتیرین",
+       "historyempty": "(خالی)",
+       "history-feed-item-nocomment": "$1 بی $2",
+       "rev-deleted-user": "(کار زوروکین نام پاک بوت)",
+       "rev-delundel": "نمایش/نهفتن",
+       "rev-showdeleted": "نشان داتین",
+       "revdelete-show-file-submit": "هان",
+       "revdelete-radio-set": "چیهر داتین",
+       "revdelete-radio-unset": "نمایان",
+       "revdelete-log": "دلیل:",
+       "revdel-restore": "نمایش/نهفتن",
+       "pagehist": "تاکدیمی تاریخچه",
+       "deletedhist": "پاک بوتگینانی تاریخچه",
+       "revdelete-reasonotherlist": "دیگرین دلیل",
+       "mergehistory-reason": "دلیل:",
+       "mergelog": "سیاههٔ ادغام",
+       "lineno": "سطر $1:",
+       "editundo": "خنثی‌ کورتین",
+       "diff-empty": "(بدون تفاوت)",
+       "searchprofile-articles-tooltip": "گشتین بی $1",
+       "searchprofile-images-tooltip": "گشتین په فایلان",
+       "search-redirect": "(تغییرمسیر $1)",
+       "search-section": "(بخش $1)",
+       "search-category": "(تهر  $1)",
+       "search-interwiki-more": "(گیشتیر)",
+       "search-relatedarticle": "مرتبط",
+       "searchrelated": "مرتبط",
+       "searchall": "موچ",
+       "powersearch-togglelabel": "چیک کورتین:",
+       "powersearch-toggleall": "موچ",
+       "powersearch-togglenone": "هیچ‌گوجام",
+       "prefs-misc": "متفرقه",
+       "prefs-resetpass": "پاسوردی تغیر داتین",
+       "prefs-changeemail": "ایمیل ادرسی تغیر داتین",
+       "prefs-setemail": "ایمیل ادرسی تنظیم کورتین",
+       "prefs-email": "ایملی آپشن ئان",
+       "prefs-rendering": "نمایشی تاکدیم",
+       "saveprefs": "ذخیره",
+       "restoreprefs": "بیر گردینتین موچین تنظیمان بی اولی ئین رقما",
+       "prefs-editing": "ایڈیٹ کورتین",
+       "rows": "تعداد سطرها:",
+       "columns": "تعداد ستون‌ها:",
+       "searchresultshead": "گشتین",
+       "timezonelegend": "منطقهٔ زمانی:",
+       "localtime": "محلی ئن وخت:",
+       "timezoneregion-africa": "آفریقا",
+       "timezoneregion-america": "آمریکا",
+       "timezoneregion-arctic": "قطب شمالی",
+       "timezoneregion-asia": "آسیا",
+       "timezoneregion-atlantic": "بحر اتلانتیک",
+       "timezoneregion-australia": "استرالیا",
+       "timezoneregion-europe": "اروپا",
+       "timezoneregion-indian": "بحر هند",
+       "timezoneregion-pacific": "بحر آرام",
+       "prefs-searchoptions": "گشتین",
+       "default": "پیش‌فرض",
+       "prefs-files": "فایل ئان",
+       "prefs-custom-css": "سی‌اس‌اس شخصی",
+       "youremail": "ایمیل:",
+       "prefs-registration": "راجیسترئ وخت",
+       "yourrealname": "واقیئین نام:",
+       "yourlanguage": "زبان:",
+       "prefs-editor": "ایڈیٹور",
+       "prefs-preview": "دیم دیست",
+       "prefs-advancedrc": "پیشرفته ئین کیلی ئان",
+       "prefs-advancedrendering": "پیشرفته ئین کیلی ئان",
+       "prefs-advancedsearchoptions": "پیشرفته ئین کیلی ئان",
+       "prefs-advancedwatchlist": "پیشرفته ئین کیلی ئان",
+       "prefs-displayrc": "نمایش ئین کیلی ئان",
+       "prefs-displaywatchlist": "نمایش ئین کیلی ئان",
+       "prefs-tokenwatchlist": "نشانه گ",
+       "prefs-diffs": "تفاوت‌ئان",
+       "userrights-reason": "دلیل:",
+       "group": "گروپ:",
+       "group-user": "کار زوروکان",
+       "group-autoconfirmed": "تائید بُوته ئین کار زوروکان",
+       "group-bot": "ربات‌هان",
+       "group-sysop": "مدیر ئان",
+       "group-bureaucrat": "دیوان‌سالار ئان",
+       "group-suppress": "گیندوک ئان",
+       "group-all": "(موچ)",
+       "group-user-member": "{{GENDER:$1|کار زوروک}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|تائید بَوته ئین کار زوروک}}",
+       "group-bot-member": "ربات",
+       "group-sysop-member": "{{GENDER:$1|مدیر}}",
+       "group-bureaucrat-member": "{{GENDER:$1|دیوان‌سالار}}",
+       "group-suppress-member": "{{GENDER:$1|نظارت}}",
+       "grouppage-user": "{{ns:project}}:کارزورک ئان",
+       "grouppage-autoconfirmed": "{{ns:project}}:تائید بُوته ئین کار زوروک ئان",
+       "grouppage-bot": "{{ns:project}}:ربات‌ ئان",
+       "grouppage-sysop": "{{ns:project}}:مدیر ئان",
+       "grouppage-bureaucrat": "{{ns:project}}:دیوان‌سالار ئان",
+       "grouppage-suppress": "{{ns:project}}:نظارت",
+       "right-read": "وانتین تاکدیمی",
+       "right-edit": "ایڈ\tیٹ کورتین تاکدیمی",
+       "right-createpage": "تاکدیمی جوڑ\t کورتین (بی غیر گپ ئین موردی تاکدیمان )",
+       "right-createtalk": "گپ ئی تاکدیمی جوڑ\t کورتین",
+       "right-createaccount": "کار زوروکئ حسابئ جوڑ\t کورتین",
+       "right-move": "تاکدیمی انتقال",
+       "right-move-categorypages": "تهر تاکدیمئ انتکال",
+       "right-movefile": "فایلی انتقال",
+       "right-upload": "فایلی بُرز کورتین",
+       "action-read": "وانتین ای تاکدیمئ",
+       "action-edit": "ایڈ\tیٹ کورتین ای تاکدیمئ",
+       "action-createpage": "تاکدیم جوڑ کورتین",
+       "action-move-categorypages": "تهر تاکدیمئ انتکال",
+       "action-movefile": "ای فایلی انتقال داتین",
+       "action-upload": "ای فایلی اپلود یا بُرز کورتین",
+       "action-writeapi": "استفاده شه نیویشتینی API",
+       "action-delete": "پاک کورتین ای تاکدیمئ",
+       "action-deleterevision": "ای نخسه یی پاک کورتین",
+       "rcshowhideminor-show": "نشان داتین",
+       "rcshowhideminor-hide": "چیهر داتین",
+       "rcshowhidebots": "$1 ربات‌هان",
+       "rcshowhidebots-show": "نشان داتین",
+       "rcshowhidebots-hide": "چیهر داتین",
+       "rcshowhideliu-show": "نشان داتین",
+       "rcshowhideliu-hide": "چیهر داتین",
+       "rcshowhideanons-show": "نشان داتین",
+       "rcshowhideanons-hide": "چیهر داتین",
+       "rcshowhidepatr-show": "نشان داتین",
+       "rcshowhidepatr-hide": "چیهر داتین",
+       "rcshowhidemine-show": "نشان داتین",
+       "rcshowhidemine-hide": "چیهر داتین",
+       "diff": "تفاوت",
+       "hist": "تاریخچه",
+       "hide": "چیهر داتین",
+       "show": "نشان داتین",
+       "minoreditletter": "جز",
+       "newpageletter": "نوک",
+       "boteditletter": "ر",
+       "rc_categories_any": "هر گوجام",
+       "recentchangeslinked-page": "تاکدیم نام:",
+       "upload": "فایلی بُرز کورتین",
+       "uploadbtn": "فایلی بُرز کورتین",
+       "uploaderror": "خطا بی اپلودی تا",
+       "filename": "فایلئ نام",
+       "filedesc": "خلاصه",
+       "fileuploadsummary": "خلاصه:",
+       "filesource": "منبع:",
+       "license": "اجازه‌نامه:",
+       "license-header": "اجازه‌نامه",
+       "nolicense": "هیچگوجام انتخاب نه بوته",
+       "listfiles-delete": "پاک کورتین",
+       "imgfile": "فایل",
+       "listfiles": "فایل لیست",
+       "listfiles_thumb": "ناحُننک",
+       "listfiles_date": "تاریخ",
+       "listfiles_name": "نام",
+       "listfiles_user": "کار زوروک",
+       "listfiles_size": "اندازه",
+       "listfiles_description": "توضیح",
+       "listfiles-latestversion-yes": "هان",
+       "listfiles-latestversion-no": "نه",
+       "file-anchor-link": "فایل",
+       "filehist": "فایلی تاریخچه",
+       "filehist-deleteall": "موچانی پاک کورتین",
+       "filehist-deleteone": "پاک کورتین",
+       "filehist-revert": "بیرگردینتین",
+       "filehist-current": "انونین نسخه",
+       "filehist-datetime": "تاریخ/ساعت",
+       "filehist-thumb": "ناحُننک",
+       "filehist-nothumb": "بی ناحُننک",
+       "filehist-user": "کار زوروک",
+       "shared-repo-from": "شه $1",
+       "filedelete": "پاک کورتین $1",
+       "filedelete-legend": "فایلی پاک کورتین",
+       "filedelete-comment": "دلیل:",
+       "filedelete-submit": "پاک کورتین",
+       "mimesearch": "گشتین بی اساس MIME",
+       "download": "ائیر کورتین",
+       "randomincategory-category": "تهر:",
+       "pageswithprop-submit": "برا",
+       "brokenredirects-edit": "ایڈیٹ",
+       "brokenredirects-delete": "پاک کورتین",
+       "withoutinterwiki-legend": "دیموند",
+       "withoutinterwiki-submit": "نشان داتین",
+       "protectedpages-page": "تاکدیم",
+       "newpages-username": "کار زوروکین نام:",
+       "booksources-search": "گشتین",
+       "specialloguserlabel": "مجری:",
+       "log": "سیاهه‌ها",
+       "allarticles": "موچین تاکدیمان",
+       "allpagessubmit": "برا",
+       "categories": "تهرئان",
+       "listusers-submit": "نشان داتین",
+       "listgrouprights-group": "گروپ",
+       "emailuser-title-notarget": "کار زوروکی ایمیل",
+       "emailpage": "کار زوروکی ایمیل",
+       "emailusername": "کار زوروکین نام:",
+       "emailusernamesubmit": "ثبت کورتین",
+       "emailfrom": "شه:",
+       "emailto": "بی:",
+       "emailsubject": "ئنوان:",
+       "emailmessage": "پیام:",
+       "emailsend": "دیم دئ",
+       "emailsent": "ایمیل دیم دئ",
+       "watchlist": "واچلیست",
+       "mywatchlist": "واچلیست",
+       "watchlistfor2": "په $1 $2",
+       "watch": "دیستین",
+       "unwatch": "اوشتارین تین دیستینی",
+       "deletepage": "تاکدیمی پاک کورتین",
+       "confirm": "تأیید کورتین",
+       "delete-confirm": "پاک کورتین «$1»",
+       "delete-legend": "پاک کورتین",
+       "deletecomment": "دلیل:",
+       "rollbacklink": "بیجا آورتین",
+       "protectcomment": "دلیل:",
+       "restriction-edit": "ایڈیٹ",
+       "restriction-move": "انتقال",
+       "restriction-create": "جوڑ\t کورتین",
+       "restriction-upload": "بُرز کورتین",
+       "undelete-search-submit": "گشتین",
+       "undelete-show-file-submit": "هان",
+       "blanknamespace": "(بُنیادی)",
+       "sp-contributions-logs": "سیاهه‌ها",
+       "sp-contributions-talk": "گپ",
+       "sp-contributions-submit": "گشتین",
+       "whatlinkshere-page": "تاکدیم:",
+       "whatlinkshere-links": "→ لینک",
+       "ipbreason": "دلیل:",
+       "blocklist-target": "هدف",
+       "blocklist-reason": "دلیل",
+       "ipblocklist-submit": "گشتین",
+       "movearticle": "تاکدیمی انتقال:",
+       "movereason": "دلیل:",
+       "export-addcat": "اڈ\tڈ\t کورتین",
+       "export-addns": "اڈ\tڈ\t کورتین",
+       "allmessagesname": "نام",
+       "allmessages-filter-all": "موچ",
+       "allmessages-language": "زبان:",
+       "allmessages-filter-submit": "برا",
+       "allmessages-filter-translate": "ترجمه",
+       "thumbnail-more": "ٹُوه کورتین",
+       "filemissing": "فایل وجود نداریت",
+       "tooltip-search": "گشتین بی {{SITENAME}}",
+       "tooltip-p-logo": "بُنیاد ئین تاکدیمی دیستین",
+       "tooltip-n-mainpage": "بُنیاد ئین تاکدیمی دیستین",
+       "tooltip-n-mainpage-description": "بُنیاد ئین تاکدیمی دیستین",
+       "tooltip-t-upload": "فایلی بُرز کورتین",
+       "tooltip-upload": "بُرز کورتینی شرو",
+       "pageinfo-article-id": "تاکدیمی آی دی",
+       "pageinfo-robot-noindex": "نامجاز",
+       "pageinfo-contentpage-yes": "هان",
+       "pageinfo-protect-cascading-yes": "هان",
+       "pageinfo-category-pages": "تاکدیمانی نمبر",
+       "ilsubmit": "گشتین",
+       "bydate": "شه تاریخی رُوگا",
+       "just-now": "همی انون",
+       "hours-ago": "$1 سائت دیما",
+       "minutes-ago": "$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",
+       "exif-languagecode": "زبان",
+       "exif-iimcategory": "تهر",
+       "exif-sharpness-0": "ساددگ",
+       "exif-sharpness-1": "نرم",
+       "exif-sharpness-2": "سک",
+       "exif-subjectdistancerange-0": "نامئلوم",
+       "exif-subjectdistancerange-1": "ماکرو",
+       "exif-iimcategory-spo": "سپورت",
+       "exif-iimcategory-war": "جنگ ، لٹ و کوٹ و ناآرامی",
+       "exif-iimcategory-wea": "آپ و هوا",
+       "exif-urgency-normal": "ئادی ($1)",
+       "exif-urgency-low": "کم ($1)",
+       "exif-urgency-high": "باز ($1)",
+       "namespacesall": "موچ",
+       "monthsall": "موچ",
+       "confirmemail": "ایمیل ادرسی تائید کورتین",
+       "confirm_purge_button": "قبول داشتین",
+       "confirm-watch-button": "قبول داشتین",
+       "confirm-unwatch-button": "قبول داشتین",
+       "imgmultipageprev": "&rarr; دیمتیری تاکدیم",
+       "imgmultipagenext": "بئدین تاکدیم &larr;",
+       "imgmultigo": "برا!",
+       "imgmultigoto": "شوتین بی $1 تاکدیمی تا",
+       "img-lang-default": "(پیش‌فرض ئین زبان)",
+       "img-lang-info": "ارایه کورتین ای اکسی بی  $1 .  $2",
+       "img-lang-go": "برا",
+       "table_pager_limit_submit": "برا",
+       "redirect-submit": "برا",
+       "redirect-lookup": "گشتین:",
+       "feedback-message": "پیام:",
+       "feedback-cancel": "کنسیل",
+       "searchsuggest-search": "گشتین",
+       "duration-seconds": "$1 ثانیه",
+       "duration-minutes": "$1 دقیقه",
+       "duration-hours": "$1 سائت",
+       "duration-days": "$1 روچ",
+       "duration-weeks": "$1 هپتگ",
+       "duration-years": "$1 سال",
+       "duration-decades": "$1 دههگ",
+       "duration-centuries": "$1 قرن",
+       "duration-millennia": "{{PLURAL:$1|هزار سال |$1 هزار سال}}",
+       "expand_templates_ok": "قبول داشتین",
+       "pagelang-name": "تاکدیم",
+       "pagelang-language": "زبان",
+       "pagelang-use-default": "استفاده کورتین شه پیش فرض ئین زبانا",
+       "pagelang-select-lang": "زبانی انتخاب"
+}
index d7d71e6..fdb5e4e 100644 (file)
@@ -21,7 +21,8 @@
                        "Usarker",
                        "Wikitanvir",
                        "Zaheen",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "Aftabuzzaman"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "pool-queuefull": "পুলের লাইন পূর্ণ",
        "pool-errorunknown": "অজানা ত্রুটি",
        "pool-servererror": "পুল কাউন্টার সার্ভিস নিষ্ক্রিয় ($1)।",
+       "poolcounter-usage-error": "ব্যবহারের ত্রুটি: $1",
        "aboutsite": "{{SITENAME}} বৃত্তান্ত",
        "aboutpage": "Project:বৃত্তান্ত",
        "copyright": "বিষয়বস্তু $1-এর আওতায় প্রকাশিত যদি না অন্য কিছু নির্ধারিত থাকে।",
        "content-model-text": "সাধারণ লেখা",
        "content-model-javascript": "জাভাস্ক্রিপ্ট",
        "content-model-css": "সিএসএস",
+       "content-json-empty-object": "খালি অবজেক্ট",
+       "content-json-empty-array": "খালি অ্যারে",
        "duplicate-args-category": "টেমপ্লেট আহ্বানে সদৃশ আর্গুমেন্ট ব্যবহার করা পাতা",
        "duplicate-args-category-desc": "এই পাতায় টেমপ্লেট আহ্বান উপস্থিত রয়েছে যা সদৃশ আর্গুমেন্ট ব্যবহার করেছে, যেমন <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> বা <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>।",
        "expensive-parserfunction-warning": "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।\n\nএটি $2-এর চেয়ে কম পরিমাণ {{PLURAL:$2|কল|কল}} থাকা উচিত, যেখানে মোট কলের সংখ্যা {{PLURAL:$1|বর্তমানে $1|বর্তমানে $1}}।",
        "history-feed-empty": "অনুরোধকৃত পাতাটির কোন অস্তিত্ব নেই।\nহয়ত পাতাটি উইকি থেকে মুছে ফেলা হয়েছে, কিংবা নতুন নামকরণ করা হয়েছে।\nপ্রাসঙ্গিক নতুন পাতাগুলির জন্য [[Special:Search|উইকি অনুসন্ধানের]] চেষ্টা করুন।",
        "rev-deleted-comment": "(সম্পাদনা সারাংশ অপসারিত)",
        "rev-deleted-user": "(ব্যবহারকারীর নাম সরিয়ে নেওয়া হয়েছে)",
-       "rev-deleted-event": "(লà¦\97 à¦\85à§\8dযাà¦\95শন সরানো হয়েছে)",
+       "rev-deleted-event": "(লà¦\97 à¦¤à¦¥à§\8dয সরানো হয়েছে)",
        "rev-deleted-user-contribs": "ব্যবহারকারীর নাম অথবা আইপি ঠিকানা অপসারিত হয়েছে - অবদান থেকে সম্পাদনা আড়াল করা হয়েছে",
        "rev-deleted-text-permission": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।",
        "rev-suppressed-text-permission": "পাতার সংশোধনটি <strong>গোপন</strong> করা হয়েছে।\nবিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} গোপনকার্যের লগে] থাকতে পারে।",
        "revdelete-legend": "দৃষ্টিপাত সীমাবদ্ধ করো",
        "revdelete-hide-text": "সংস্করণের লেখা",
        "revdelete-hide-image": "ফাইলের বিষয়বস্তু আড়াল করো",
-       "revdelete-hide-name": "à¦\95াà¦\9c à¦\8fবà¦\82 à¦²à¦\95à§\8dষà§\8dয আড়াল করো",
+       "revdelete-hide-name": "লà¦\95à§\8dষà§\8dয à¦\93 à¦ªà§\8dযারামিà¦\9fার আড়াল করো",
        "revdelete-hide-comment": "সম্পাদনা সারাংশ",
        "revdelete-hide-user": "সম্পাদকে ব্যবহারকারীর নাম/আইপি",
        "revdelete-hide-restricted": "প্রশাসকবৃন্দ এবং অন্যদের ক্ষেত্রে এই ডাটা রোধ করো",
        "action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
        "action-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন",
        "nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
-       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}}",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}} $1টি",
        "enhancedrc-history": "ইতিহাস",
        "recentchanges": "সাম্প্রতিক পরিবর্তনসমূহ",
        "recentchanges-legend": "সাম্প্রতিক পরিবর্তনের পছন্দসমূহ",
        "uploaderror": "আপলোড এ সমস্যা হয়েছে",
        "upload-recreate-warning": "'''সতর্কতা: এই নামের ফাইলটি অপসারণ অথবা স্থানান্তর করা হয়েছে।'''\n\nকাজের সুবিধার জন্য অপসারণ এবং স্থানান্তর লগ এখানে দেখানো হল:",
        "uploadtext": "ফাইল আপলোড করতে নিচের ফরমটি ব্যবহার করুন।</br>\nপূর্বে আপলোড করা ফাইল দেখতে বা অনুসন্ধানে [[Special:FileList|পূর্বে আপলোড করা ফাইলের তালিকা]] দেখুন। (পুনঃ)আপলোড করা ফাইল এর নাম  [[Special:Log/upload|আপলোড লগে]] যোগ হয়, অপসারিত ফাইলের নাম [[Special:Log/delete|অপসারণ লগে]] রয়েছে।\n\nকোনো নিবন্ধে ছবি যোগ করতে হলে নিচের উদাহরণ অনুযায়ী সংযোগ দিন:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' অথবা\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
-       "upload-permitted": "যà§\87সব à¦«à¦¾à¦\87লà§\87র à¦§à¦°à¦¨ à¦\85নà§\81মà§\8bদিত: $1।",
-       "upload-preferred": "যà§\87সব à¦«à¦¾à¦\87লà§\87র à¦§à¦°à¦¨ à¦ªà¦\9bনà§\8dদনà§\80য়: $1।",
-       "upload-prohibited": "যà§\87সব à¦«à¦¾à¦\87লà§\87র à¦§à¦°à¦¨ à¦¨à¦¿à¦·à¦¿à¦¦à§\8dধ: $1।",
+       "upload-permitted": "à¦\85নà§\81মà§\8bদিত à¦«à¦¾à¦\87লà§\87র {{PLURAL:$2|ধরন}}: $1।",
+       "upload-preferred": "পà¦\9bনà§\8dদনà§\80য় à¦«à¦¾à¦\87লà§\87র {{PLURAL:$2|ধরন}}: $1।",
+       "upload-prohibited": "নিষিদà§\8dধ à¦«à¦¾à¦\87লà§\87র {{PLURAL:$2|ধরন}}: $1।",
        "uploadlogpage": "আপলোড লগ",
        "uploadlogpagetext": "নিচে সম্প্রতিক আপলোডকৃত ফাইলের তালিকা রয়েছে।\nসংক্ষেপচিত্র সহ দেখতে [[Special:NewFiles|নতুন ফাইলের গ্যালারি]] দেখুন।",
        "filename": "ফাইলের নাম",
        "php-uploaddisabledtext": "পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।\nঅনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
+       "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "uploadvirus": "এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1",
        "uploadjava": "এটি একটি ZIP ফরম্যাটের ফাইল, যেখানে একটি জাভা .class ফরম্যাটের ফাইল রয়েছে।\nজাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।",
        "upload-source": "উৎস ফাইল",
        "deleteprotected": "আপনি এই পাতাটি মুছে ফেলতে পারবেন না কারণ এটি সুরক্ষিত করা হয়েছে।",
        "deleting-backlinks-warning": "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা [[Special:WhatLinksHere/{{FULLPAGENAME}}|অন্যান্য পাতাসমূহে]] সংযুক্ত অথবা অন্তর্ভুক্ত রয়েছে।",
        "rollback": "সম্পাদনা ফিরিয়ে নিন",
-       "rollback_short": "ফিরিয়ে নিন",
        "rollbacklink": "পুনর্বহাল",
        "rollbacklinkcount": "$1টি {{PLURAL:$1|সম্পাদনা}} রোলব্যাক করুন",
        "rollbacklinkcount-morethan": "$1টির বেশি {{PLURAL:$1|সম্পাদনা|সম্পাদনাগুলো}} রোলব্যাক করুন",
        "import-logentry-interwiki": "$1 উইকি-স্থানান্তরিত",
        "import-logentry-interwiki-detail": "$2-এর থেকে $1টি {{PLURAL:$1|সংশোধন}} করা হয়েছে",
        "javascripttest": "জাভাস্ক্রিপ্ট পরীক্ষা",
-       "javascripttest-title": "$1 পরীক্ষা চলছে",
        "javascripttest-pagetext-noframework": "এই পাতাটি জাভাস্ক্রিপ্ট পরীক্ষার জন্য সংরক্ষিত।",
        "javascripttest-pagetext-unknownframework": "পরীক্ষার অজানা ফ্রেমওয়ার্ক \"$1\"।",
+       "javascripttest-pagetext-unknownaction": "অজানা কার্য \"$1\"।",
        "javascripttest-pagetext-frameworks": "অনুগ্রহ করে নিচের কোনো একটি ফ্রেমওয়ার্ক নির্ধারণ করুন: $1",
        "javascripttest-pagetext-skins": "পরীক্ষার জন্য একটি স্কীন নির্ধারণ করুন:",
        "javascripttest-qunit-intro": "mediawiki.org থেকে [$1 পরীক্ষার ডলুমেন্টেশন] দেখুন।",
-       "javascripttest-qunit-heading": "মিডিয়াউইকি জাভাস্ক্রিপ্ট কিউইউনিট টেস্ট স্যুট",
        "tooltip-pt-userpage": "আপনার ব্যবহারকারী পাতা",
        "tooltip-pt-anonuserpage": "যে আইপি ঠিকানা থেকে আপনি সম্পাদনা করছেন, তার ব্যবহারকারী পাতা",
        "tooltip-pt-mytalk": "আপনার আলাপের পাতা",
        "tooltip-pt-mycontris": "আপনার অবদানগুলোর তালিকা",
        "tooltip-pt-login": "আপনার লগ-ইন করাটা বাঞ্চনীয়, কিন্তু তা বাধ্যতামূলক নয়।",
        "tooltip-pt-logout": "প্রস্থান",
+       "tooltip-pt-createaccount": "আপনাকে একটি অ্যাকাউন্ট তৈরি করে প্রবেশ করার পরামর্শ দেওয়া হচ্ছে; তবে এটা বাধ্যতামূলক নয়",
        "tooltip-ca-talk": "বিষয়বস্তু পাতা সম্পর্কে আলোচনা",
        "tooltip-ca-edit": "আপনি এই পাতা সম্পাদনা করতে পারেন। অনুগ্রহ করে সংরক্ষণের আগে প্রাকদর্শন করুন।",
        "tooltip-ca-addsection": "নতুন অনুচ্ছেদ শুরু করুন।",
        "exif-subjectlocation": "বিষয়বস্তুর অবস্থান",
        "exif-exposureindex": "আলোকসম্পাত সূচক",
        "exif-sensingmethod": "সংবেদন পদ্ধতি",
-       "exif-filesource": "ফাইল সোর্স",
+       "exif-filesource": "ফাইলের উৎস",
        "exif-scenetype": "দৃশ্যের ধরন",
        "exif-customrendered": "পছন্দমাফিক ছবি প্রক্রিয়াকরণ",
        "exif-exposuremode": "আলোকসম্পাত মোড",
        "hebrew-calendar-m12": "এলুল",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|আলাপ]])",
        "timezone-utc": "ইউটিসি",
-       "unknown_extension_tag": "অজানা এক্সটেনশন ট্যাগ \"$1\"",
        "duplicate-defaultsort": "' ' ' সাবধান: ' ' '  ডিফল্ট সাজানোর কীঃ \"$2\" পূর্বে ডিফল্ট সাজানোর কীঃ \"$1\" কে অগ্রাহ্য করে।",
        "version": "সংস্করণ",
        "version-extensions": "ইন্সটলকৃত এক্সটেনশনসমূহ",
        "version-entrypoints": "শুরুর ইউআরএল",
        "version-entrypoints-header-entrypoint": "শুরু",
        "version-entrypoints-header-url": "ইউআরএল",
+       "version-libraries-version": "সংস্করণ",
        "redirect": "পাতা, ফাইল, ব্যবহারকরী, অথবা সংশোধন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে",
        "redirect-legend": "একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে",
        "redirect-summary": "এই বিশেষ পাতাটি একটি ফাইলে (ফাইলের নাম), একটি পাতায় (সংস্করণ আইডি বা পাতা আইডি), অথবা একটি ব্যবহারকরী পাতায় (সংখ্যায় লেখা ব্যবহারকারী আইডি) পুনঃনির্দেশিত হয়েছে। ব্যবহার:  [[{{#Special:Redirect}}/file/উদাহরণ.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], অথবা [[{{#Special:Redirect}}/user/101]]।",
        "compare-revision-not-exists": "আপনার কাঙ্ক্ষিত সংস্করণটি নেই।",
        "dberr-problems": " দুঃখিত! এই সাইটটি বর্তমানে কারীগরী অসুবিধার মুখোমুখি হয়েছে।",
        "dberr-again": "কয়েক মিনিট পর পুনরায় পরিদর্শনের চেষ্টা করুন।",
-       "dberr-info": "(ডà§\87à¦\9fাবà§\87à¦\9c à¦¸à¦¾à¦°à§\8dভার $1-à¦\8fর à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97 à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿)",
-       "dberr-info-hidden": "(ডাà¦\9fাবà§\87à¦\9c à¦¸à¦¾à¦°à§\8dভারà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦\82যà§\8bà¦\97 à¦¦à§\87য়া à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾)",
+       "dberr-info": "(ডà§\87à¦\9fাবà§\87à¦\9c à¦ªà§\8dরবà§\87শ à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿: $1)",
+       "dberr-info-hidden": "(ডà§\87à¦\9fাবà§\87à¦\9c à¦ªà§\8dরবà§\87শ à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿)",
        "dberr-usegoogle": "এই পরিস্থিতিতে আপনি গুগলের মাধ্যমে অনুসন্ধান করার চেষ্টা করতে পারেন।",
        "dberr-outofdate": "খেয়াল করুন যে, আমাদের বিষয়বস্তু সম্পর্কিত তাদের সূচি মেয়াদ উত্তীর্ণ হতে পারে।",
        "dberr-cachederror": "এটি অনুরোধকৃত পাতার ক্যাশে লিপি, যা হালনাগাতকৃত নাও হতে পারে।",
        "sqlite-no-fts": "$1 বাদে পূর্ণ টেক্সট সার্চ সমর্থন",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
        "logentry-delete-restore": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে",
-       "logentry-delete-event": "$1 {{PLURAL:$5|à¦\8fà¦\95à¦\9fি à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fà§\87র|$5 à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র}} à¦­à¦¿à¦\9cিবিলিà¦\9fি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
-       "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
-       "logentry-delete-event-legacy": "$1 $3à¦\9fায় à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র à¦­à¦¿à¦\9cিবিলিà¦\9fি {{GENDER:$2|পরিবর্তন}} করেছেন",
-       "logentry-delete-revision-legacy": "$1 $3à¦\9fায় à¦¸à¦\82সà§\8dà¦\95রণসমà§\82হà§\87র à¦­à¦¿à¦\9cিবিলিà¦\9fি {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-delete-event": "$1 {{PLURAL:$5|à¦\8fà¦\95à¦\9fি à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fà§\87র|$5 à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র}} à¦¦à§\83শà§\8dযমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
+       "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
+       "logentry-delete-event-legacy": "$1 $3à¦\9fায় à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র à¦¦à§\83শà§\8dযমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-delete-revision-legacy": "$1 $3à¦\9fায় à¦¸à¦\82সà§\8dà¦\95রণসমà§\82হà§\87র à¦¦à§\83শà§\8dযমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-suppress-delete": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে",
-       "logentry-suppress-event": "$1 à¦\97à§\8bপনà§\87 {{PLURAL:$5|à¦\8fà¦\95à¦\9fি à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fà§\87র|$5 à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র}} à¦­à¦¿à¦\9cিবিলিà¦\9fি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
-       "logentry-suppress-revision": "$1 গোপনে {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
-       "logentry-suppress-event-legacy": "$1 à¦\97à§\8bপনà§\87 $3à¦\9fায় à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র à¦­à¦¿à¦\9cিবিলিà¦\9fি {{GENDER:$2|পরিবর্তন}} করেছেন",
-       "logentry-suppress-revision-legacy": "$1 à¦\97à§\8bপনà§\87 $3à¦\9fায় à¦¸à¦\82সà§\8dà¦\95রণসমà§\82হà§\87র à¦­à¦¿à¦\9cিবিলিà¦\9fি {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-suppress-event": "$1 à¦\97à§\8bপনà§\87 {{PLURAL:$5|à¦\8fà¦\95à¦\9fি à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fà§\87র|$5 à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র}} à¦¦à§\83শà§\8dযমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
+       "logentry-suppress-revision": "$1 গোপনে {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
+       "logentry-suppress-event-legacy": "$1 à¦\97à§\8bপনà§\87 $3à¦\9fায় à¦²à¦\97 à¦\87ভà§\87নà§\8dà¦\9fসমà§\82হà§\87র à¦¦à§\83শà§\8dযমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-suppress-revision-legacy": "$1 à¦\97à§\8bপনà§\87 $3à¦\9fায় à¦¸à¦\82সà§\8dà¦\95রণসমà§\82হà§\87র à¦¦à§\83শà§\8dযমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
        "revdelete-content-hid": "বিষয়বস্তু লুকায়িত",
        "revdelete-summary-hid": "সম্পাদনা সারাংশ লুকায়িত",
        "revdelete-uname-hid": "ব্যবহারকারী নাম লুকায়িত",
        "mediastatistics-header-office": "অফিস",
        "mediastatistics-header-archive": "সংকুচিত বিন্যাস",
        "json-error-unknown": "JSON-এ একটি সমস্যা রয়েছে। ত্রুটি: $1",
-       "json-error-syntax": "সিনট্যাক্স ত্রুটি"
+       "json-error-state-mismatch": "অকার্যকর বা ত্রুটিপূর্ণ JSON",
+       "json-error-ctrl-char": "অক্ষর নিয়ন্ত্রণ ত্রুটি, সম্ভবত ভুল এনকোডকৃত",
+       "json-error-syntax": "সিনট্যাক্স ত্রুটি",
+       "json-error-utf8": "ত্রুটিপূর্ণ ইউটিএফ-৮ অক্ষর, সম্ভবত ভুল এনকোডকৃত",
+       "json-error-unsupported-type": "এনকোড করা যাবে না এমন একটি মানের ধরন দেয়া হয়েছে"
 }
index c468220..da14afa 100644 (file)
        "content-model-text": "testenn blaen",
        "content-model-javascript": "Javascript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Elfenn goullo",
        "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.",
        "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.",
        "search-result-category-size": "{{PLURAL:$1|1|$1}} ezel ({{PLURAL:$2|1|$2}} is-rummad, {{PLURAL:$3|1|$3}} restr)",
        "search-redirect": "(adkas $1)",
        "search-section": "(rann $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-interwiki-caption": "Raktresoù kar",
        "iranian-calendar-m11": "11vet miz Jalāli",
        "iranian-calendar-m12": "12vet miz Jalāli",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kaozeal]])",
-       "unknown_extension_tag": "Balizenn astenn \"$1\" dianav",
        "duplicate-defaultsort": "Diwallit : Frikañ a ra an alc'hwez dre ziouer \"$2\" an hini a oa a-raok \"$1\".",
        "version": "Stumm",
        "version-extensions": "Astennoù staliet",
        "specialpages-group-wiki": "Roadennoù ar wiki hag ostilhoù",
        "specialpages-group-redirects": "Adkas ar pajennoù dibar",
        "specialpages-group-spam": "Ostilh enepstrob",
+       "specialpages-group-developer": "Ostilhoù diorren",
        "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>",
index 7f11733..18ba747 100644 (file)
@@ -35,6 +35,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje uređujem na moj spisak praćenih članaka",
        "tog-watchmoves": "Dodaj stranice i datoteke koje pomjerim na moj spisak praćenih članaka",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenih članaka",
+       "tog-watchrollback": "Sve stranice za koje sam izvršio povrat izmjena stavi na spisak praćenja",
        "tog-minordefault": "Označi sve izmjene malim isprva",
        "tog-previewontop": "Prikaži pretpregled prije polja za izmjenu a ne poslije",
        "tog-previewonfirst": "Prikaži izgled pri prvoj izmjeni",
        "pool-timeout": "Zaustavi čekanje na zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "Nepoznata greška",
+       "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}}",
        "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je navedeno drugačije.",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$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.",
        "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
        "filenotfound": "Ne može se naći datoteka \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "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\"",
        "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",
        "badtitletext": "Zahtjevani naslov stranice je bio neispravan, prazan ili neispravno povezan međujezički ili interviki naslov.",
        "perfcached": "Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.",
        "viewsourcetext": "Možete vidjeti i kopirati izvorni tekst ove stranice:",
        "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
-       "editinginterface": "'''Upozorenje:''' Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda svih wikija, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
        "cascadeprotected": "Uređivanje ove stranice je zabranjeno jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:\n$2",
        "namespaceprotected": "Vi nemate dozvulu da mijenjate stranicu '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "mypreferencesprotected": "Nemate dozvolu da uređujete svoje postavke.",
        "ns-specialprotected": "Specijalne stranice se ne mogu uređivati.",
        "titleprotected": "Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].\nIz razloga \"''$2''\".",
+       "filereadonlyerror": "Ne mogu promijeniti datoteku \"$1\" jer je skladište datoteka \"$2\" zaključano samo za čitanje.\n\nAdministrator koji ga je zaključao naveo je ovo objašnjenje: \"$3\".",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom \"$2\" i tekstom \"$3\"",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom \"$2\"",
        "exception-nologin": "Niste prijavljeni",
        "badretype": "Šifre koje ste unijeli se ne poklapaju.",
        "userexists": "Korisničko ime koje ste unijeli je već u upotrebi.\nMolimo Vas da izaberete drugo ime.",
        "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. {{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem računaru. Molimo Vas da ih omogućite, a onda se prijavite sa svojim novim korisničkim imenom i šifrom.",
        "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.",
        "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promijeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
        "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
+       "login-migrated-generic": "Vaš račun je premješten, a vaše korisničko ime više ne postoji na ovoj wiki.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez navedene e-mail adrese.",
        "user-mail-no-body": "Pokušano slanje e-poruke s praznim ili nerazumno kratkim sadržajem.",
        "changepassword": "Promijeni lozinku",
-       "resetpass_announce": "Prijavili ste se sa privremenim kodom koji ste dobili na e-mail.\nDa biste završili prijavu, morate unijeti novu šifru ovdje:",
+       "resetpass_announce": "Da biste završili prijavu, morate postaviti novu šifru.",
        "resetpass_text": "<!-- Unesi tekst ovdje -->",
        "resetpass_header": "Obnovi šifru za račun",
        "oldpassword": "Stara šifra:",
        "resetpass-temp-password": "Privremena šifra:",
        "resetpass-abort-generic": "Promjenu šifre/lozinke je prekinula ekstenzija.",
        "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
+       "resetpass-expired-soft": "Vaša šifra je istekla i mora se resetirati. Molimo odaberite sada novu šifru ili kliknite  \"{{int:resetpass-submit-cancel}}\" da je resetirate kasnije.",
+       "resetpass-validity-soft": "Vaša šifra nije valjana: $1\n\nMolimo odaberite novu šifru ili kliknite \"{{int:resetpass-submit-cancel}}\" da je resetirate kasnije.",
        "passwordreset": "Poništavanje šifre",
        "passwordreset-text-one": "Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako biste dobili privremenu lozinku putem e-pošte.}}",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
+       "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "resettokens": "Resetovanje žetona",
+       "resettokens-text": "Možete ponovno postaviti tokene koji će vam omogućiti pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTrebali bi to učiniti ako ih mimo volje podijelite s nekim ili ako je vaš račun ugrožen.",
+       "resettokens-no-tokens": "Nema žetona za resetovanje.",
+       "resettokens-legend": "Resetovanje žetona",
+       "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
+       "resettokens-watchlist-token": "Token za web niz (Atom/RSS) [[Special:Watchlist|promjena na stranicama sa vašeg spiska praćenja]]",
+       "resettokens-done": "Žetoni su resetovani",
+       "resettokens-resetbutton": "Resetuj izabrane žetone",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Kurzivan tekst",
        "preview": "Pregled stranice",
        "showpreview": "Prikaži izgled",
        "showdiff": "Prikaži izmjene",
-       "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni. \nVaša IP adresa će biti zabilježena u historiji ove stranice.",
+       "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.",
+       "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.",
        "missingcommentheader": "'''Podsjetnik:''' Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na ''{{int:savearticle}}'', Vaše izmjene će biti spašene bez teme/naslova.",
        "summary-preview": "Pregled sažetka:",
        "edit-conflict": "Sukob izmjena.",
        "edit-no-change": "Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.",
        "postedit-confirmation-created": "Stranica je napravljena.",
+       "postedit-confirmation-restored": "Stranica je vraćena.",
        "postedit-confirmation-saved": "Vaša izmjena je sačuvana.",
        "edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
        "defaultmessagetext": "Uobičajeni tekst poruke",
+       "content-failed-to-parse": "Neuspjeh u parsiranju $2 sadržaja za $1 model: $3",
        "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-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-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prazan objekat",
+       "content-json-empty-array": "Prazan niz",
        "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>.",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.\n\nTrebalo bi imati manje od $2 {{PLURAL:$2|poziv|poziva}}, a sad ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "expensive-parserfunction-category": "Stranice sa previše poziva parserskih funkcija",
        "post-expand-template-inclusion-warning": "Pažnja: Šablon koji je uključen je prevelik.\nNeki šabloni neće biti uključeni.",
        "parser-template-recursion-depth-warning": "Dubina uključivanja šablona prekoračena ($1)",
        "language-converter-depth-warning": "Prekoračena granica dubine jezičkog pretvarača ($1)",
        "node-count-exceeded-category": "Stranice sa prekoračenim brojem čvorova",
-       "node-count-exceeded-warning": "Stranice koje imaju prevelik broj čvorova",
+       "node-count-exceeded-category-desc": "Stranica je prešla najviši broj čvorova.",
+       "node-count-exceeded-warning": "Stranice koje su prekoračile broj čvorova",
        "expansion-depth-exceeded-category": "Stranice koje su prekoračile dubinu proširenja",
+       "expansion-depth-exceeded-category-desc": "Stranica je prešla najveću dubinu proširenja.",
        "expansion-depth-exceeded-warning": "Stranice koje su prekoračile dubinu proširenja",
        "parser-unstrip-loop-warning": "Pronađena petlja",
        "parser-unstrip-recursion-limit": "Prekoračeno ograničenje rekurzije ($1)",
        "undo-success": "Izmjena se može vratiti.\nMolimo da provjerite usporedbu ispod da budete sigurni da to želite učiniti, a zatim spremite promjene da bi ste završili vraćanje izmjene.",
        "undo-failure": "Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.",
        "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.",
+       "undo-nochange": "Izgleda da je izmjena već vraćena.",
        "undo-summary": "Vraćena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
        "cantcreateaccounttitle": "Nije moguće napraviti korisnički račun",
        "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
+       "cantcreateaccount-range-text": "Pravljenje računa sa IP adresa u rasponu '''$1''', koji uključuje i vašu IP adresu ('''$4'''), je blokirao korisnik [[User:$3|$3]].\n\nNavedeni razlog korisnika $3 je ''$2''",
        "viewpagelogs": "Pogledaj protokol ove stranice",
        "nohistory": "Ne postoji historija izmjena za ovu stranicu.",
        "currentrev": "Trenutna revizija",
        "currentrev-asof": "Trenutna revizija na dan $1",
        "revisionasof": "Revizija od $1",
-       "revision-info": "Izmjena od $1 korisnika $2",
+       "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "←Starije izmjene",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "rev-deleted-event": "(stavka zapisa obrisana)",
        "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}}}} zapisu 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": "Revizija ove stranice je '''obrisana'''.\nDetalje o tome može se vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nVi je i dalje možete [$1 vidjeti ovu reviziju] ako želite da nastavite.",
        "rev-suppressed-text-unhide": "Ova revizija stranice je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].\nVi je i dalje možete [$1 vidjeti ovu reviziju] ako želite.",
        "rev-deleted-text-view": "Revizija ove stranice je '''obrisana'''.\nVi je možete vidjeti; detalji o tome se mogu vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisu brisanja].",
        "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-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.",
+       "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-suppress-text": "Ograničenja bi trebala biti korištena '''samo''' u slijedećim slučajevima:\n* Osjetljive korisničke informacije\n*: ''kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.''",
+       "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-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij akciju i cilj",
+       "revdelete-hide-name": "Sakrij cilj i parametre",
        "revdelete-hide-comment": "Uredi sažetak",
        "revdelete-hide-user": "Korisničko ime urednika/IP",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "mergehistory-empty": "Nema revizija za spajanje.",
        "mergehistory-success": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice [[:$1]] uspješno spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+       "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.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati validan naslov.",
        "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
        "editundo": "ukloni ovu izmjenu",
        "diff-empty": "(Nema razlike)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije}} istog 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].",
        "searchresults": "Rezultati pretrage",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
        "search-category": "(kategorija $1)",
+       "search-file-match": "(podudara se sadržaj datoteke)",
        "search-suggest": "Da li ste mislili: $1",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "$1 rezultati:",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
-       "restoreprefs": "Vrati sve pretpostavljene postavke",
+       "restoreprefs": "Vrati sve pretpostavljene postavke (u svim sekcijama)",
        "prefs-editing": "Veličine tekstualnog polja",
        "rows": "Redova",
        "columns": "Kolona",
        "gender-unknown": "Ne previše detaljno",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
-       "prefs-help-gender": "Optionalno: koristi se za ispravke gramatičkog roda u porukama softvera. Ova informacija će biti javna.",
+       "prefs-help-gender": "Postavljanje ovih podešavanja je optionalno: Softver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova informacija bit će javna.",
        "email": "E-mail",
-       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
+       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke izgleda",
        "prefs-displaywatchlist": "Postavke izgleda",
+       "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "email-address-validity-valid": "Izgleda valjano",
        "right-move": "Preusmjeravanje stranica",
        "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
+       "right-move-categorypages": "Pomakni stranice kategorije",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
        "right-upload": "Postavljanje datoteka",
        "right-reupload-shared": "Postavljanje novih lokalnih verzija datoteka identičnih onima u zajedničkoj ostavi",
        "right-upload_by_url": "Postavljanje datoteke sa URL adrese",
        "right-purge": "Osvježavanje keša za stranice bez konfirmacije",
-       "right-autoconfirmed": "Uređivanje poluzaštićenih stranica",
+       "right-autoconfirmed": "Bez ograničavanja 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-apihighlimits": "Korištenje viših ograničenja u API upitima",
        "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled i povratak revizija sakrivenih od administratora",
+       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
        "right-suppressionlog": "Gledanje privatnih zapisa",
        "right-block": "Blokiranje uređivanja drugih korisnika",
        "right-blockemail": "Blokiranje korisnika da šalje e-mail",
        "action-move": "pomjerite ovu stranicu",
        "action-move-subpages": "pomjerite ovu stranicu, i njene podstranice",
        "action-move-rootuserpages": "pomjerite stranice osnovnog korisnika",
+       "action-move-categorypages": "pomakni stranice kategorije",
        "action-movefile": "pomjeri ovu datoteku",
        "action-upload": "postavljate ovu datoteku",
        "action-reupload": "stavite novu verziju postojeće datoteke",
        "action-block": "blokirate uređivanje ovog korisnika",
        "action-protect": "promijeniti nivo zaštite za ovu stranicu",
        "action-rollback": "brzo vraćanje izmjena zadnjeg korisnika koji je uređivao određenu stranicu",
-       "action-import": "uvozite ovu stranicu iz druge wiki",
-       "action-importupload": "uvezete ovu stranicu putem postavljanja datoteke",
+       "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-unwatchedpages": "pregledate spisak nepraćenih stranica",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
-       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
+       "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 $2",
        "rcshowhideminor": "$1 male izmjene",
        "rcshowhideminor-show": "Pokaži",
        "largefileserver": "Ova datoteka je veća nego što server dopušta.",
        "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.",
-       "fileexists": "Datoteka sa ovim imenom već postoji.\nMolimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.\n[[$1|thumb]]",
+       "fileexists": "Datoteka sa ovim imenom već postoji, molimo Vas provjerite <strong>[[:$1]]</strong> ako {{GENDER:|niste}} sigurni da je želite promjeniti.\n[[$1|thumb]]",
        "filepageexists": "Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.\nSažetak koji ste naveli neće se pojaviti na stranici opisa.\nDa bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo Vas da izaberete drugačiji naziv.",
+       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nDa li možda želite koristiti drugačiji naziv?",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nAko je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
        "fileexists-forbidden": "Datoteka s ovim imenom već postoji i ne može biti prepisana.\nAko i dalje želite postaviti ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "license-header": "Licenciranje",
        "nolicense": "Ništa nije odabrano",
        "license-nopreview": "(Pregled nije dostupan)",
-       "upload_source_url": " (validni, javno dostupni URL)",
-       "upload_source_file": " (datoteka na Vašem računaru)",
+       "upload_source_url": "(vaša izabrana datoteka od validnih, javno dostupnih URL-a)",
+       "upload_source_file": "(vaša odabrana datoteka sa Vašeg računara)",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži medije po imenu:",
        "filedelete-maintenance": "Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.",
        "filedelete-maintenance-title": "Ne mogu da obrišem datoteku",
        "mimesearch": "MIME pretraga",
-       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta ili vrstasadržaja/*, npr. <code>image/jpeg</code>.",
        "mimetype": "MIME tip:",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "randompage": "Slučajna stranica",
        "randompage-nopages": "Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: \"$1\".",
        "randomincategory": "Slučajna stranica u kategoriji",
+       "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Slučajna stranica u kategoriji",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
-       "double-redirect-fixed-move": "[[$1]] je premješten, sada je preusmjerenje na [[$2]]",
-       "double-redirect-fixed-maintenance": "Ispravljanje dvostrukih preusmjerenja sa [[$1]] na [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] je premješten.\nAutomatski je ažuriran i sada preusmjerava na [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatsko ospravljanje dvostrukih preusmjerenja sa [[$1]] na [[$2]] je posao održavanja.",
        "double-redirect-fixer": "Popravljač preusmjerenja",
        "brokenredirects": "Pokvarena preusmjerenja",
        "brokenredirectstext": "Slijedeća preusmjerenja vode na nepostojeće stranice:",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Članci sa najviše linkova",
        "mostlinkedcategories": "Kategorije sa najviše linkova",
-       "mostlinkedtemplates": "Najviše upotrebljavani šabloni",
+       "mostlinkedtemplates": "Najviše uključene stranice",
        "mostcategories": "Članci sa najviše kategorija",
        "mostimages": "Najviše linkovane slike",
        "mostrevisions": "Članci sa najviše izmjena",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-noredirect": "Sakrij preusmjerenja",
        "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena ovim parametrima.",
+       "protectedpages-timestamp": "Vremenska oznaka",
        "protectedpages-page": "Stranica",
        "protectedpages-expiry": "Istječe",
+       "protectedpages-performer": "Zaštita korisnika",
+       "protectedpages-params": "Parametri zaštite",
        "protectedpages-reason": "Razlog",
        "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.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
+       "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "usercreated": "{{GENDER:$3|Napravio|Napravila}} dana $1 u $2",
        "newpages": "Nove stranice",
        "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
        "suppress": "Nazdor",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
+       "apihelp": "API pomoć",
+       "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources": "Štampani izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-search": "Traži",
        "listgrouprights-removegroup-self": "Može ukloniti {{PLURAL:$2|grupu|grupe|grupa}} sa svog računa: $1",
        "listgrouprights-addgroup-self-all": "Može dodati sve grupe na svoj račun",
        "listgrouprights-removegroup-self-all": "Može ukloniti sve grupe sa svog računa",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
+       "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
+       "trackingcategories-desc": "Kriterij uključenja kategorije",
        "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
        "emailuser": "Pošalji e-poštu ovom korisniku",
        "mywatchlist": "Praćeni članci",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
+       "watchlistanontext": "Molimo logujte se da vidite ili uredite stavke na Vašem spisku praćenja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
        "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
        "unwatchthispage": "Ukinite praćenje",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Revizija je obrisana",
-       "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
+       "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "wlnote": "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
+       "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.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "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 osima ako 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 e-mail 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",
+       "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",
        "deletepage": "Obrišite stranicu",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
+       "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "confirmdeletetext": "Brisanjem ćete obrisati stranicu ili sliku zajedno sa historijom iz baze podataka, ali će se iste moći vratiti kasnije.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Akcija završena",
        "actionfailed": "Akcija nije uspjela",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Ostali/dodatni razlozi:",
        "deletereasonotherlist": "Ostali razlozi",
-       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Zahtjev autora\n** Kršenje autorskih prava\n** Vandalizam",
+       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Spam\n** Vandalizam\n** Kršenje autorskih prava\n** Zahtjev autora\n** Pokvareno preusmjerenje",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "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.",
        "rollback": "Vrati izmjene",
-       "rollback_short": "Vrati",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}",
        "rollbacklinkcount-morethan": "vrati više od $1 {{PLURAL:$1|izmjene|izmjene|izmjena}}",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite se ne mogu mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' je:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je tenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.\nMožete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.\nPromijene stepena zaštite ove stranice neće uticati na prenosnu zaštitu.",
        "protect-default": "Dopusti svim korisnicima",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
        "protect-level-autoconfirmed": "Dopustite samo automatski potvrđenim korisnicima",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
-       "ipb-blocklist-contribs": "Doprinosi za $1",
+       "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$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",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Pogrešno vrijeme trajanja.",
        "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.",
-       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; možda ima isuviše izmjena.",
+       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.",
        "ipb_already_blocked": "\"$1\" je već blokiran",
        "ipb-needreblock": "$1 je već blokiran. Da li želite promijeniti postavke?",
        "ipb-otherblocks-header": "Ostale {{PLURAL:$1|blokada|blokade}}",
        "importuploaderrortemp": "Postavljanje uvozne datoteke nije uspjelo.\nNedostaje privremeni folder.",
        "import-parse-failure": "Greška pri parsiranju XML uvoza",
        "import-noarticle": "Nema stranica za uvoz!",
-       "import-nonewrevisions": "Sve revizije su prethodno uvežene.",
+       "import-nonewrevisions": "Nijedna revizija nije uvezena (ili su sve već prisutne ili su preskočene zbog greške).",
        "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-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-error-special": "Stranica \"$1\" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.",
-       "import-error-invalid": "Stranica \"$1\" nije uvezena jer je njen naziv neispravan.",
+       "import-error-invalid": "Stranica \"$1\" nije uvezena jer je naziv pod kojim treba biti uvezena nije valjan na ovoj wiki.",
        "import-options-wrong": "{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Navedena osnovna stranica ima neispravan naslov.",
        "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": "uvezena stranica [[$1]] putem postavljanja datoteke",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena jedna revizija|Uvezene $1 revizije|Uvezeno $1 revizija}}",
        "import-logentry-interwiki": "uveženo (''transwikied'') $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}} od $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena $1 revizija|Uvezene $1 revizije|Uvezeno $1 revizija}} od $2",
        "javascripttest": "Testiranje JavaScript-e",
-       "javascripttest-title": "Pokretanje $1 testova",
        "javascripttest-pagetext-noframework": "Ova stranica je određena za pokretanje JavaScript testova.",
        "javascripttest-pagetext-unknownframework": "Nepoznat radni okvir testiranja\"$1\".",
        "javascripttest-pagetext-frameworks": "Molimo Vas izaberite jednu od sljedećih testnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojom temom želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit testni alati",
        "tooltip-pt-userpage": "Vaša korisnička stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za ip koju Vi uređujete kao",
        "tooltip-pt-mytalk": "Vaša stranica za razgovor",
        "spam_reverting": "Vraćanje na posljednju verziju koja ne sadrži linkove ka $1",
        "spam_blanking": "Sve revizije koje sadrže linkove ka $1, očisti",
        "spam_deleting": "Sve revizije koje sadrže linkove na $1, brišem",
-       "simpleantispam-label": "Provjera protiv spama.\n'''NE''' popunjavaj ovo!",
+       "simpleantispam-label": "Provjera protiv spama.\n<strong>NE</strong> popunjavajte ovo!",
        "pageinfo-title": "Informacije za \"$1\"",
        "pageinfo-not-current": "Nažalost, nemoguće je dati ove informacije za starije revizije.",
        "pageinfo-header-basic": "Osnovne informacije",
        "newimages-summary": "Ova specijalna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
+       "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "watchlistedit-raw-done": "Vaš spisak praćenja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 naslov je dodan|$1 naslova su dodana|$1 naslova je dodano}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:",
+       "watchlistedit-clear-title": "Očišćen spisak nadgledanja",
+       "watchlistedit-clear-legend": "Očisti spisak nadgledanja",
+       "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz vašeg spiska nadgledanja",
+       "watchlistedit-clear-titles": "Naslovi:",
+       "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
+       "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
        "watchlisttools-clear": "Očisti spisak nadgledanja",
        "watchlisttools-view": "Pregled promjena praćenih stranica",
        "watchlisttools-edit": "Pogledaj i uredi listu praćenih članaka.",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "KSV",
-       "unknown_extension_tag": "Nepoznata oznaka ekstenzije \"$1\"",
        "duplicate-defaultsort": "Upozorenje: Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
-       "version-skins": "Kože",
+       "version-skins": "Instalirane kože",
        "version-specialpages": "Posebne stranice",
        "version-parserhooks": "Kuke parsera",
        "version-variables": "Promjenjive",
        "version-hook-name": "Naziv kuke",
        "version-hook-subscribedby": "Pretplaćeno od",
        "version-version": "(Verzija $1)",
+       "version-no-ext-name": "[nema imena]",
        "version-license": "Licenca",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Proširenje",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Izaberite opciju",
        "htmlform-cloner-create": "Dodaj još",
+       "htmlform-cloner-delete": "Ukloni",
        "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage cijelog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "duration-centuries": "$1 {{PLURAL:$1|vijek|vijeka|vijekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenij|milenija}}",
        "rotate-comment": "Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu",
+       "limitreport-cputime": "Vrijeme korištenja CPU",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "limitreport-walltime": "Korištenje u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "expandtemplates": "Proširi šablone",
-       "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<nowiki>{{</nowiki>#language:…}} i varijable poput\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;u principu gotovo sve između dvostrukih zagrada.\nOvo se uradi putem poziva relevantnog parserskog nivoa iz same MediaWiki.",
+       "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<code><nowiki>{{</nowiki>#language:…}}</code> i varijable poput\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. U principu proširuje gotovo sve između dvostrukih zagrada.",
        "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:",
        "expand_templates_input": "Tekst unosa:",
        "expand_templates_output": "Rezultat",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Onemogući oznake <nowiki> u rezultatima",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
+       "expand_templates_generate_rawhtml": "Pokaži izvorni HTML",
        "expand_templates_preview": "Pregled",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-header-unknown": "Nepoznato",
+       "mediastatistics-header-drawing": "Crteži (vektorske slike)",
+       "mediastatistics-header-audio": "Zvuk",
+       "mediastatistics-header-video": "Videa",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Kancelarija",
+       "mediastatistics-header-text": "Tekstualno",
+       "mediastatistics-header-executable": "Izvršni",
+       "mediastatistics-header-archive": "Kompresovani formati",
        "json-error-syntax": "Sintaksna greška"
 }
index 882a312..5d95fa2 100644 (file)
        "pool-queuefull": "La cua de treball és plena",
        "pool-errorunknown": "Error desconegut",
        "pool-servererror": "El servei de recompte de la reserva no és disponible ($1).",
+       "poolcounter-usage-error": "Error d'ús: $1",
        "aboutsite": "Quant al projecte {{SITENAME}}",
        "aboutpage": "Project:Quant a",
        "copyright": "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
        "anoneditwarning": "<strong>Avís</strong>: No heu iniciat cap sessió. Per tant, la vostra adreça IP serà visible públicament si feu qualsevol modificació. Si <strong>[$1 inicieu una sessió]</strong> o <strong>[$2 creeu un compte]</strong>, les vostres edicions s'atribuiran al vostre nom d'usuari, juntament amb altres beneficis.",
        "anonpreviewwarning": "''No us heu identificat amb un compte d'usuari. La vostra adreça IP quedarà registrada a l'historial d'aquesta pàgina.''",
        "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
+       "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
        "missingcommentheader": "'''Recordatori:''' No heu proporcionat un assumpte/encapçalament per al comentari. Si cliqueu de nou al botó \"{{int:savearticle}}\", la vostra contribució se desarà sense cap.",
        "summary-preview": "Previsualització del resum:",
        "content-model-text": "text net",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objecte buit",
+       "content-json-empty-array": "Matriu buida",
        "duplicate-args-category": "Pàgines amb arguments duplicats en utilització de plantilles",
+       "duplicate-args-category-desc": "La pàgina conté crides a plantilles que fan servir duplicats d'arguments, com ara <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.\n\nActualment n'hi ha {{PLURAL:$1|$1|$1}} i, com a molt, {{PLURAL:$2|hauria|haurien}} de ser $2.",
        "expensive-parserfunction-category": "Pàgines amb massa crides de parser function",
        "post-expand-template-inclusion-warning": "Avís: La mida d'inclusió de la plantilla és massa gran.\nNo s'inclouran algunes plantilles.",
        "history-feed-empty": "La pàgina demanada no existeix.\nPotser s'ha suprimit o reanomenat.\nIntenteu [[Special:Search|cercar al mateix wiki]] per a noves pàgines rellevants.",
        "rev-deleted-comment": "(resum d'edició eliminat)",
        "rev-deleted-user": "(s'ha suprimit el nom d'usuari)",
-       "rev-deleted-event": "(s'ha suprimit el registre d'accions)",
+       "rev-deleted-event": "(s'han suprimit els detalls del registre)",
        "rev-deleted-user-contribs": "[nom d'usuari o adreça IP esborrada - modificació ocultada de les contribucions]",
        "rev-deleted-text-permission": "S'ha '''suprimit''' aquesta versió de la pàgina.\nVegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "rev-suppressed-text-permission": "S'ha '''suprimit''' aquesta versió de la pàgina.\nVegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "revdelete-legend": "Defineix restriccions en la visibilitat",
        "revdelete-hide-text": "Text de la revisió",
        "revdelete-hide-image": "Amaga el contingut del fitxer",
-       "revdelete-hide-name": "Acció d'amagar i objectiu",
+       "revdelete-hide-name": "Amaga objectiu i paràmetres",
        "revdelete-hide-comment": "Resum de modificacions",
        "revdelete-hide-user": "Nom d'usuari / adreça IP de l'editor",
        "revdelete-hide-restricted": "Suprimir les dades als administradors així com a la resta.",
        "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
        "stub-threshold": "Límit per a formatar l'enllaç com <a href=\"#\" class=\"stub\">esborrany</a> (en octets):",
-       "stub-threshold-disabled": "Deshabilitat",
+       "stub-threshold-disabled": "Inhabilitat",
        "recentchangesdays": "Dies a mostrar en els canvis recents:",
        "recentchangesdays-max": "(màxim $1 {{PLURAL:$1|dia|dies}})",
        "recentchangescount": "Nombre d'edicions a mostrar per defecte:",
        "enotif_body_intro_moved": "La pàgina $1 de {{SITENAME}} ha estat reanomenada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.",
        "enotif_body_intro_restored": "La pàgina $1 de {{SITENAME}} ha estat restaurada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.",
        "enotif_body_intro_changed": "La pàgina $1 de {{SITENAME}} ha estat canviada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.",
-       "enotif_lastvisited": "Vegeu $1 per a tots els canvis que s'han fet d'ença de la vostra darrera visita.",
+       "enotif_lastvisited": "Vegeu $1 per a tots els canvis que s'han fet d'ençà de la vostra darrera visita.",
        "enotif_lastdiff": "Consulteu $1 per a visualitzar aquest canvi.",
        "enotif_anon_editor": "usuari anònim $1",
        "enotif_body": "Benvolgut/uda $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResum de l'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacteu amb l'editor:\ncorreu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo rebreu més notificacions en cas de més activitat a menys que visiteu aquesta pàgina havent iniciat sessió.\nTambé podeu canviar el mode de notificació de les pàgines que vigileu en la vostra llista de seguiment.\n\nEl servei de notificacions del projecte {{SITENAME}}\n\n--\nPer a canviar les opcions de notificació per correu electrònic aneu a\n{{canonicalurl:{{#special:Preferences}}}}\n\nPer a canviar les opcions de la vostra llista de seguiment aneu a\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer eliminar la pàgina de la vostra llista de seguiment aneu a\n$UNWATCHURL\n\nSuggeriments i ajuda:\n$HELPPAGE",
        "deleteprotected": "No podeu eliminar la pàgina perquè ha estat protegida.",
        "deleting-backlinks-warning": "'''Avís:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
        "rollback": "Reverteix edicions",
-       "rollback_short": "Revoca",
        "rollbacklink": "Reverteix",
        "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
        "rollbacklinkcount-morethan": "reverteix més de $1 {{PLURAL:$1|edició|edicions}}",
        "namespace": "Espai de noms:",
        "invert": "Inverteix la selecció",
        "tooltip-invert": "Marqueu aquesta casella per ocultar els canvis a les pàgines de l'espai de noms seleccionat (i l'espai de noms associat si està activat)",
+       "tooltip-whatlinkshere-invert": "Marca aquest requadre per amagar els enllaços de pàgines en l'espai de noms seleccionat.",
        "namespace_association": "Espai de noms associat",
        "tooltip-namespace_association": "Marqueu aquesta casella per incloure l'espai de noms de discussió o de no discussió associat a l'espai de noms seleccionat",
        "blanknamespace": "(Principal)",
        "thumbnail-temp-create": "No s'ha pogut creat el fitxer de miniatura temporal",
        "thumbnail-dest-create": "No es pot desar la miniatura a la destinació",
        "thumbnail_invalid_params": "Els paràmetres de les miniatures no són vàlids",
+       "thumbnail_toobigimagearea": "Fitxer amb dimensions més gran que $1",
        "thumbnail_dest_directory": "No s'ha pogut crear el directori de destinació",
        "thumbnail_image-type": "Tipus d'imatge no contemplat",
        "thumbnail_gd-library": "Configuració de la biblioteca GD incompleta: falta la funció $1",
        "import-logentry-interwiki": "s'ha importat $1 via interwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisió|revisions}} importades de $2",
        "javascripttest": "Proves de JavaScript",
-       "javascripttest-title": "S'estan executant $1 proves",
        "javascripttest-pagetext-noframework": "Es reserva la pàgina per a l'execució de tests amb JavaScript.",
        "javascripttest-pagetext-unknownframework": "L'entorn de proves «$1» és desconegut.",
+       "javascripttest-pagetext-unknownaction": "Acció desconeguda «$1».",
        "javascripttest-pagetext-frameworks": "Trieu un dels següents entorns de prova: $1",
        "javascripttest-pagetext-skins": "Trieu un tema on executar-hi els tests:",
        "javascripttest-qunit-intro": "Consulteu la [documentació de tests de $1] a mediawiki.org.",
-       "javascripttest-qunit-heading": "Entorn de proves JavaScript QUnit per al MediaWiki",
        "tooltip-pt-userpage": "La vostra pàgina d'usuari",
        "tooltip-pt-anonuserpage": "La pàgina d'usuari per la ip que utilitzeu",
        "tooltip-pt-mytalk": "La vostra pàgina de discussió.",
        "watchlisttools-edit": "Visualitza i edita la llista de seguiment",
        "watchlisttools-raw": "Edita la llista de seguiment sense format",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussió]])",
-       "unknown_extension_tag": "Etiqueta d'extensió desconeguda «$1»",
        "duplicate-defaultsort": "Atenció: La clau d'ordenació per defecte \"$2\" invalida l'anterior clau \"$1\".",
        "duplicate-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$2» sobreescriu l'anterior títol a mostrar «$1».",
+       "invalid-indicator-name": "<strong>Error:</strong> No pot estar buit l'atribut <code>name</code> dels indicadors d'estat de la pàgina.",
        "version": "Versió",
        "version-extensions": "Extensions instaŀlades",
        "version-skins": "Temes instal·lats",
        "version-entrypoints": "URL de punts d'entrada",
        "version-entrypoints-header-entrypoint": "Punt d'entrada",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Biblioteques instal·lades",
+       "version-libraries-library": "Biblioteca",
+       "version-libraries-version": "Versió",
        "redirect": "Redirigeix per fitxer, usuari, pàgina o ID de la revisió",
        "redirect-legend": "Redirigeix a un fitxer o a una pàgina",
        "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donats un ID de la revisió o un ID de pàgina), o a una pàgina d'usuari (donat un ID numèric d'usuari). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "La revisió que heu especificat no existeix.",
        "dberr-problems": "Ho sentim. Aquest lloc web està experimentant dificultats tècniques.",
        "dberr-again": "Intenteu esperar uns minuts i tornar a carregar.",
-       "dberr-info": "(No es pot contactar amb el servidor de dades: $1)",
-       "dberr-info-hidden": "(No es pot contactar amb el servidor de la base de dades)",
+       "dberr-info": "(No es pot accedir a la base de dades: $1)",
+       "dberr-info-hidden": "(No es pot accedir a la base de dades)",
        "dberr-usegoogle": "Podeu intentar fer la cerca via Google mentrestant.",
        "dberr-outofdate": "Tingueu en compte que la seva indexació del nostre contingut pot no estar actualitzada.",
        "dberr-cachederror": "A continuació hi ha una còpia emmagatzemada de la pàgina demanada, que pot no estar actualitzada.",
        "revdelete-uname-unhid": "ha revelat un nom d'usuari que era ocult",
        "revdelete-restricted": "ha aplicat restriccions als administradors",
        "revdelete-unrestricted": "ha tret les restriccions als administradors",
+       "logentry-merge-merge": "$1 {{GENDER:$2|ha fusionat}} $3 en $4 (revisions fins a $5)",
        "logentry-move-move": "$1 ha mogut $3 a $4",
        "logentry-move-move-noredirect": "$1 ha mogut $3 a $4 sense deixar una redirecció",
        "logentry-move-move_redir": "$1 ha mogut $3 a $4 sobre una redirecció",
        "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
        "api-error-stasherror": "S'ha produït un error en carregar el fitxer al dipòsit.",
+       "api-error-stashedfilenotfound": "No s'ha trobat el fitxer de l'espai temporal quan es provava de carregar-lo d'allà.",
+       "api-error-stashpathinvalid": "El camí on s'havia trobar el fitxer de l'espai temporal no és vàlid.",
+       "api-error-stashfilestorage": "S'ha produït un error en emmagatzemar el fitxer en l'espai temporal.",
+       "api-error-stashzerolength": "El servidor no ha pogut desar el fitxer a l'espai temporal perquè tenia longitud zero.",
+       "api-error-stashnotloggedin": "Cal haver iniciat una sessió per desar fitxers en l'espai temporal de càrrega.",
+       "api-error-stashwrongowner": "El fitxer que provàveu d'accedir en l'espai temporal no us pertany.",
+       "api-error-stashnosuchfilekey": "La clau de fitxer que provàveu d'accedir en l'espai temporal no existeix.",
        "api-error-timeout": "El servidor no ha respost en el temps esperat.",
        "api-error-unclassified": "S'ha produït un error desconegut",
        "api-error-unknown-code": "Error desconegut: «$1»",
index 3a9a46d..25333f2 100644 (file)
@@ -37,7 +37,7 @@
        "tog-shownumberswatching": "顯示監視用戶其數量",
        "tog-oldsig": "存在其簽名",
        "tog-fancysig": "共簽名當成維基文本(無自動鏈接)",
-       "tog-uselivepreview": "使即時預覽(敆𡅏實驗)",
+       "tog-uselivepreview": "使即時預覽",
        "tog-forceeditsummary": "提醒我行遘蜀萆空白其編輯總結",
        "tog-watchlisthideown": "趁監視單𡅏囥起我其修改",
        "tog-watchlisthidebots": "囥起監視單其機器人其修改",
        "laggedslavemode": "'''警告:'''頁面可能無最近其更新。",
        "readonly": "數據庫乞鎖起咯",
        "enterlockreason": "拍底汝鎖定數據庫其原因,包括汝估計其釋放鎖其時間",
-       "readonlytext": "Só-gé̤ṳ-kó cī-buàng ké̤ṳk nè̤ng sō̤ kī lāu, mâ̤-sāi siā sĭng dèu-mĕ̤k hĕ̤k có̤ siŭ-gāi, ô kō̤-nèng sê ôi-lāu nĭk-siòng mì-hô, cĭ-hâiu cêu â̤ ciáng-siòng.\n\nSō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1",
+       "readonlytext": "數據庫茲滿乞儂鎖定了,𣍐使寫新條目或者做修改。有可能是日常維護,之後就會正常。\n\n\n鎖起數據庫其管理員總款解釋:$1",
        "missing-article": "數據庫未討遘本身應當著討遘其名叫\"$1\"其頁面$2其文本。\n\n嚽可能是下底其過時其diff或者已經删除其歴史鏈接造成其。\n\n如果伓是茲兩種情況,汝可能發現著蜀萆服務器其缺陷。\n起動汝共茲蜀萆缺陷匯報乞[[Special:ListUsers/sysop|管理員]],附上網址。",
        "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(比並:$1、$2)",
        "yourpasswordagain": "重新拍囇密碼:",
        "createacct-yourpasswordagain": "確定密碼",
        "createacct-yourpasswordagain-ph": "再輸入蜀回密碼",
-       "remembermypassword": "共我敆茲蜀萆瀏覽器其躒底記錄記定幾日(最価$1日){{PLURAL:$1}}",
-       "userlogin-remembermypassword": "保持我躒底其",
+       "remembermypassword": "共我敆茲蜀萆瀏覽器其登錄記錄記定幾日(最価$1日){{PLURAL:$1}}",
+       "userlogin-remembermypassword": "保持我登錄其",
        "userlogin-signwithsecure": "使安全其連接",
        "yourdomainname": "汝其域名:",
        "password-change-forbidden": "汝𣍐使敆茲蜀萆維基百科𡅏修改密碼。",
        "createacct-benefit-body3": "最近其{{PLURAL:$1|貢獻者}}",
        "badretype": "汝輸底其密碼𣍐蜀様。",
        "userexists": "用戶名已經乞別人使去了。\n起動另外再起蜀萆名字。",
-       "loginerror": "躒底有鄭",
+       "loginerror": "登錄有鄭",
        "createacct-error": "賬戶開出毛病咯",
        "createaccounterror": "無能獃開賬戶:$1",
        "nocookiesnew": "用戶賬號已經創建好了,但是汝未登錄。\n{{SITENAME}}使cookie來記錄已經登錄其用戶。\n但是汝禁用了cookie。\n起動汝開啟cookie,然後再使汝其新用戶共密碼來登錄。",
        "nocookieslogin": "{{SITENAME}}使cookies來記錄已經登錄其用戶。\n但是汝禁用了cookie。\n起動汝開起cookie,然後再試蜀試。",
        "noname": "汝未指定蜀萆合法其用戶名。",
-       "loginsuccesstitle": "躒底成功",
-       "loginsuccess": "'''汝現在已經「$1」其成功躒底{{SITENAME}}了。'''",
+       "loginsuccesstitle": "登錄成功",
+       "loginsuccess": "'''汝現在已經「$1」其成功登錄{{SITENAME}}了。'''",
        "nosuchuser": "無總款其用戶名「$1」。\n用户名是大小写敏感其。\n检查汝其拼写,或者覷蜀覷[[Special:UserLogin/signup|開新賬戶]]。",
        "nosuchusershort": "無總款其用戶名「$1」。\n檢查汝其拼寫。",
        "nouserspecified": "汝著指定蜀萆用戶名。",
-       "login-userblocked": "茲隻用戶已經乞封鎖去了。躒底是𣍐允許其。",
+       "login-userblocked": "茲隻用戶已經乞封鎖去了。登錄是𣍐允許其。",
        "wrongpassword": "密碼鄭咯。\n起動再查蜀下。",
        "wrongpasswordempty": "未輸入密碼。\n請再查蜀下。",
        "passwordtooshort": "密碼著設最少{{PLURAL:$1|$1萆字符}}。",
        "password-login-forbidden": "茲蜀萆用戶名共密碼應經乞禁止去了。",
        "mailmypassword": "重新設置密碼",
        "passwordremindertitle": "{{SITENAME}}其新其臨時密碼",
-       "passwordsent": "新密碼已經寄遘「$1」註冊其電子郵件地址了。\n收遘後,請再躒底蜀頭部。",
+       "passwordsent": "新密碼已經寄遘「$1」註冊其電子郵件地址了。\n收遘後,請再登錄蜀頭部。",
        "mailerror": "發電子郵件有賺:$1",
        "acct_creation_throttle_hit": "使汝其IP訪問茲蜀萆維基百科訪問者其已經敆最後蜀日創建{{PLURAL:$1|$1萆賬戶}}去了。茲蜀段時間最価若允許創建茲滿価萆賬戶。故此講使茲蜀萆IP訪問其儂敆現刻時𣍐使再開賬戶了。",
        "emailauthenticated": "汝其電子郵件地址已經敆$2$3確定過了。",
        "accountcreated": "賬戶創建了",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|talk]])用戶已經創建。",
        "createaccount-title": "{{SITENAME}}其開賬戶",
-       "login-abort-generic": "汝其躒底𣍐成功——放棄去了",
+       "login-abort-generic": "汝其登錄𣍐成功——放棄去了",
        "loginlanguagelabel": "語言:$1",
        "pt-login": "登錄",
        "pt-login-button": "登錄",
        "oldpassword": "舊密碼:",
        "newpassword": "新密碼:",
        "retypenew": "確認密碼:",
-       "resetpass_submit": "設置密碼再躒底",
+       "resetpass_submit": "設置密碼再登錄",
        "resetpass_forbidden": "密碼改𣍐來",
-       "resetpass-no-info": "汝著躒底乍會使直接看茲蜀頁。",
+       "resetpass-no-info": "汝著登錄乍會使直接看茲蜀頁。",
        "resetpass-submit-loggedin": "修改密碼",
        "resetpass-submit-cancel": "取消",
        "resetpass-temp-password": "臨時密碼:",
        "blockedtitle": "用戶乞封鎖了",
        "blockednoreason": "無掏出原因",
        "whitelistedittext": "汝必須$1乍會使修改頁面。",
-       "loginreqtitle": "需要躒底",
-       "loginreqlink": "躒底",
-       "loginreqpagetext": "è\91\97$1æ\89\8dæ\9c\83使看其它頁面。",
+       "loginreqtitle": "需要登錄",
+       "loginreqlink": "登錄",
+       "loginreqpagetext": "èµ·å\8b\95æ±\9d$1以å¾\8cå\86\8d看其它頁面。",
        "accmailtitle": "密碼寄出了",
        "accmailtext": "共[[User talk:$1|$1]]用戶隨機生成其密碼已經發遘$2了。汝登錄以後會使敆[[Special:ChangePassword|修改密碼]]頁面修改茲蜀萆密碼。",
        "newarticle": "(新)",
        "newarticletext": "汝已經跟鏈接跟遘無存在其頁面了。\n卜想創建頁面,敆下底其框框𡅏拍字(覷蜀覷[$1 幫助頁面]有無更更価其幫助)。\n如果汝是無注意來遘茲蜀萆頁面,篤囇汝其瀏覽器上其「返回」按鈕。",
-       "anontalkpagetext": "''茲是未躒底其用戶討論頁面。''\n故此儂家著使數字IP來確定伊。\n總款其IP地址會乞雅価用戶共享。\n如果蜀隻未躒底其用戶見覺無關係其評論指向汝,起動[[Special:UserLogin/signup|開賬戶]]或者[[Special:UserLogin|躒底]]來避免以後共其它未躒底其用戶混蜀堆。",
+       "anontalkpagetext": "<em>茲是未登錄其用戶討論頁面。</em>\n故此儂家著使數字IP來確定伊。\n總款其IP地址會乞雅価用戶共享。\n如果蜀隻未登錄其用戶見覺無關係其評論指向汝,起動[[Special:UserLogin/signup|開賬戶]]或者[[Special:UserLogin|登錄]]來避免以後共其它未登錄其用戶混蜀堆。",
        "noarticletext": "現在敆茲蜀頁𡅏無文字。汝會使敆其它其頁面𡅏[[Special:Search/{{PAGENAME}}|討蜀討茲蜀萆標題]],<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 討相關其記錄],或者[{{fullurl:{{FULLPAGENAME}}|action=edit}}編輯茲蜀頁]</span>。",
        "clearyourcache": "'''注意:'''保存以後,汝可能固著刷新汝其瀏覽器緩存來看遘變化。\n* '''火狐/Safari:'''擪下''Shift''篤蜀篤''重新載入'',或者擪蜀擪''Ctrl+F5''或者''Ctrl+R'' (''⌘-R''敆Mac懸頂)\n* '''Google Chrome:'''擪''Ctrl+Shift+R''(敆Mac𡅏使''⌘-Shift-R'')\n* '''Internet Explorer:'''擪''Ctrl''其時候篤蜀篤''刷新'',或者擪''Ctrl+F5''\n* '''Opera:'''敆''工具→首選項''𡅏清除緩存",
        "note": "<strong>注意:</strong>",
        "histlegend": "差別揀選:選擇卜比並其版本,再擪「回車」('''Enter''')或者擪底底其'''比並揀選版本'''。<br />\n說明:(伶)=共第一新其版本比並,(前)=共前蜀版本比並,~=過幼修改。",
        "history-fieldset-title": "瀏覽歷史",
        "history-show-deleted": "囇刪掉去",
-       "histfirst": "最",
+       "histfirst": "最",
        "histlast": "最遲",
        "historysize": "({{PLURAL:$1|$1字節}})",
        "history-feed-title": "修改歷史",
        "upload": "上傳文件",
        "uploadbtn": "上傳文件",
        "reuploaddesc": "取消上傳,轉去上傳頁面",
-       "uploadnologin": "未躒底",
+       "uploadnologin": "未登錄",
        "uploadnologintext": "汝著$1才會使上傳文件。",
        "uploaderror": "上傳有鄭",
        "uploadlogpage": "上傳日誌",
        "allpagesprefix": "按頭部顯示頁面:",
        "allpagesbadtitle": "給出其頁面其標題是𣍐合法其,或者有蜀萆跨語言或跨維基其前綴。伊可能包括蜀萆或者価萆𣍐使廮標題裏勢其字符。",
        "categories": "類別",
-       "deletedcontributions": "乞刪其用戶貢獻",
-       "deletedcontributions-title": "乞刪其用戶貢獻",
+       "deletedcontributions": "乞刪其用戶貢獻",
+       "deletedcontributions-title": "乞刪其用戶貢獻",
        "linksearch-ok": "尋討",
        "linksearch-line": "$1是趁$2𡅏鏈接過其",
        "emailuser": "寄電子郵件乞茲隻用戶",
        "watchlist": "我其監視單",
        "mywatchlist": "我其監視單",
        "nowatchlist": "汝其監視單𡅏無項目。",
-       "watchnologin": "未躒底",
+       "watchnologin": "未登錄",
        "addedwatchtext": "頁面「[[:$1]]」已經加遘汝其[[Special:Watchlist|監視單]]。以後敆茲蜀頁其改變共伊關聯其討論頁都會列敆嚽塊。",
        "removewatch": "趁汝其監視單臺中移去",
        "removedwatchtext": "頁面「[[:$1]]」已經趁[[Special:Watchlist|汝其監視單]]移去了。",
        "deletionlog": "刪除日誌",
        "deletecomment": "原因:",
        "rollback": "在修改轉去",
-       "rollback_short": "轉",
        "rollbacklink": "轉",
        "rollbackfailed": "轉𣍐去",
        "cantrollback": "𣍐使恢復修改;最後其貢獻者是茲蜀頁其唯一其作者。",
        "sp-contributions-newbies": "囇顯示新開賬戶其貢獻",
        "sp-contributions-newbies-sub": "才來其",
        "sp-contributions-blocklog": "封鎖日誌",
-       "sp-contributions-deleted": "開除來其用戶貢獻",
+       "sp-contributions-deleted": "乞刪唻其用戶貢獻",
        "sp-contributions-uploads": "上傳",
        "sp-contributions-logs": "日誌",
        "sp-contributions-talk": "討論",
        "movepagetext": "使下底其表單來重新共茲蜀頁起蜀萆名字,移動伊所有其歷史遘伊其新名字。\n舊其標題會變成新其標題其重定向頁。\n汝會使自動更新重定向許蜀點遘原底其標題。\n如果伊結果伓是總款咯,許汝著檢查[[Special:DoubleRedirects|雙重重定向]]或者[[Special:BrokenRedirects|獃其重定向]]。\n汝著為鏈接會使繼續鏈遘伊應該跳轉其地方負責任。\n\n注意如果許塊已經有蜀頁去了,噲頁面就'''𣍐'''移過了,除開許囇是蜀萆重定向固加無舊底其修改歷史。\n茲其意思就是講如果汝名字起賺了,汝會使共茲蜀萆頁面重新起伊原底其名字,但是𣍐使覆蓋已經存在其頁面。\n\n'''警告!'''\n茲可能會對一般頁面造成過大其固加無辦法預見遘其改變;\n起動汝著敆做之前會意總款做其後果。",
        "movepagetalktext": "相關其討論頁會自動共伊移遘'''無挃''':\n* 汝其新其用戶名已經有蜀頁有內容其討論頁,或者\n* 汝取消下底其框框。\n\n若總款,汝會使自家移動或者是合併頁面。",
        "movearticle": "移動頁面",
-       "movenologintext": "著[[Special:UserLogin|躒底]]才會使移動頁面。",
+       "movenologintext": "著[[Special:UserLogin|登錄]]才會使移動頁面。",
        "newtitle": "遘新題目:",
        "move-watch": "監視茲頁",
        "movepagebtn": "移動頁面",
        "tooltip-pt-preferences": "汝其設定",
        "tooltip-pt-watchlist": "汝監視其頁面有改過其單單",
        "tooltip-pt-mycontris": "汝其貢獻其單單",
-       "tooltip-pt-login": "希望汝躒底其;當然,無逼汝總款做。",
-       "tooltip-pt-logout": "出",
+       "tooltip-pt-login": "希望汝登錄其;當然,無逼汝總款做。",
+       "tooltip-pt-logout": "退出",
        "tooltip-ca-talk": "茲蜀頁其討論",
        "tooltip-ca-edit": "汝會使修改茲蜀頁。起動敆保存以前使預覽按鈕",
        "tooltip-ca-addsection": "開始蜀萆新其部分",
        "confirmemail_needlogin": "汝著$1來確定汝其電子郵件地址。",
        "confirmemail_loggedin": "汝其電子郵件地址現在已經確定去了。",
        "confirmemail_body": "有人(可能是汝)敆IP地址$1𡅏已經使茲蜀萆電子郵件地址來註冊蜀萆賬戶「$2」去了。\n\n卜想確認茲蜀萆賬戶當真是汝其,固加敆{{SITENAME}}激活電子郵件特點,許敆汝其瀏覽器𡅏拍開茲蜀萆鏈接:\n\n$3\n\n如果汝*無*註冊茲賬戶,單擊茲蜀萆鏈接來取消電子郵件確認:\n\n$5\n\n茲蜀萆確認代碼會敆$4時候過期。",
-       "deletedwhileediting": "'''警告:'''茲蜀頁敆汝編輯以前已經乞刪唻了!",
+       "deletedwhileediting": "<strong>警告:</strong>茲蜀頁敆汝編輯以前已經乞刪唻了!",
        "recreate": "重新開",
        "confirm_purge_button": "好",
        "imgmultipageprev": "← 前蜀頁",
index 180a185..fba767f 100644 (file)
        "tagline": "Гlирс хlокхуьна бу {{grammar:genitive|{{SITENAME}}}}",
        "help": "ГӀо",
        "search": "Лахар",
-       "searchbutton": "Лаха",
+       "searchbutton": "Лахар",
        "go": "Дехьа гӀо",
        "searcharticle": "Дехьа гӀо",
        "history": "Истори",
        "protectedpage": "ГӀароллийца йолу агӀо",
        "jumpto": "Дехьа гӀо:",
        "jumptonavigation": "Навигаци",
-       "jumptosearch": "лаÑ\85а",
+       "jumptosearch": "Ð\9bаÑ\85аÑ\80",
        "view-pool-error": "Бехк цабиллар доьха, хӀинц сервераш йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.\n\n$1",
        "generic-pool-error": "Бехк цабиллар доьха, хӀинц сервер йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.",
        "pool-timeout": "Блоктоха еза хан тӀех йаьлла",
        "pool-queuefull": "Дехаршан чоь юьззина ю",
        "pool-errorunknown": "Дойзаш доцу гӀалат",
        "pool-servererror": "Пулан ларар тӀекхочучехь дац ($1).",
+       "poolcounter-usage-error": "Лелочун гӀалат: $1",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьцна",
        "aboutpage": "Project:Цуьнах лаьцна",
        "copyright": "Чулацам лело мега $1 лицензица (кхениг билгалйина яцахь).",
        "protectedpagetext": "ХӀара агӀо дӀакъоьвлина ю тадарш ца дайта.",
        "viewsourcetext": "Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:",
        "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а цуна копи ян а:",
-       "protectedinterface": "ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо ю. Куьйгалхошна бен иза хийца цало.",
-       "editinginterface": "<strong>Тергам бе:</strong> Ахьа таеш ю интерфейсан йоза долу агӀо програмин латторан.\nЦуна бина хийцам хьокху википедин кхечу декъашхошна гур бу.",
+       "protectedinterface": "ХӀокху агӀона чохь интерфейсан программа латторан хаам бу. Зулам ца дайта цуна хийцам бан куьйгалхошна бен цало.\nХӀокху хааман гоч тӀетоха я хийца лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net]",
+       "editinginterface": "<strong>Тергам бе:</strong> Ахьа таеш ю интерфейсан йоза долу агӀо программин латторан.\nЦуна бина хийцам хьокху Википедин кхечу декъашхошна гур бу.",
+       "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "АгӀо хийцам ца байта гӀоралла дина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀераш чохь тадарш да «$1».",
        "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
        "sig_tip": "Хьан куьгтаlор аъ хlоттина хан",
        "hr_tip": "Ана сиз (сих сиха ма леладайша)",
        "summary": "Хийцамех лаьцна:",
-       "subject": "Дlахьедар/коьрта могlа:",
+       "subject": "ДӀахьедар/коьрта могӀа:",
        "minoredit": "Жим хийцам",
        "watchthis": "Латайе хӀара агӀо тергаме могӀанан юкъахь",
        "savearticle": "АгӀо дӀаязъяр",
        "yourdiff": "Башхаллаш",
        "copyrightwarning": "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцушсанна оцу бакъойалар хьоляхь $2 (хьаж. $1).\nНагахь хьо лууш вацахь хьай йозанаш маьрша даржа а кхечаьрга хийцам байта, мадаха уьш кху чу.<br />\nИшта чlагlо йой ахьа, айхьа далош долучуьн хьо куьг да ву аьлла, йа хьаэцна цхьан\nхьостера, хийцам ба а дlаса даржада а чулацам болуш.<br />\n'''МАТОХИЙШ БАКЪО ЙОЦУ ГlИРСАШ КХУ ЧУ, КУЬГ ДЕ БАКЪО ЛАР ЙЕШ ЙОЛУ!'''",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
-       "protectedpagewarning": "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:",
+       "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо гӀаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьхьара бина болу хийцамна тептар чура:",
        "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо гӀаролла йина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "parser-unstrip-loop-warning": "ДӀачӀагӀанца pre карина",
        "undo-success": "Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.",
        "undo-failure": "Юккъера хийцамаш бахьнехь нисдар юхадаккха йиш яц.",
+       "undo-norev": "Нисдар юхадаккха цало, иза доцу делла я дӀаяьккхина дела.",
+       "undo-nochange": "Нисдар хьалхо юхадяьккхиначух тера ду.",
        "undo-summary": "Юхадаьккхина {{GENDER:$2|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) нисдар $1",
        "undo-summary-username-hidden": "Юхадаьккхина декъашхочун нисдарш $1, цунна цӀе дӀахьулйина",
        "cantcreateaccounttitle": "Декъашхочун дӀаяздар кхолла йиш яц",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Массанхьа",
        "searchprofile-advanced": "Шуьйра",
-       "searchprofile-articles-tooltip": "Лаха оцу $1",
+       "searchprofile-articles-tooltip": "$1 чохь лахар",
        "searchprofile-images-tooltip": "Файлаш лахар",
-       "searchprofile-everything-tooltip": "Ð\9bаÑ\85а Ð¼Ð°Ñ\81Ñ\81о Ð°Ð³lонаÑ\88каÑ\85Ñ\8c (дийÑ\86аÑ\80е Ð°Ð³lонаÑ\88Ñ\86ани)",
-       "searchprofile-advanced-tooltip": "Ð\9bаÑ\85а Ð´ÐµÑ\85аÑ\80Ñ\86а Ñ\85lокÑ\85Ñ\83 Ð°Ð½Ð° Ñ\86lеÑ\80аÑ\88каÑ\85Ñ\8c",
+       "searchprofile-everything-tooltip": "Ð\9cаÑ\81Ñ\81о Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c Ð»Ð°Ñ\85аÑ\80 (дийÑ\86аÑ\80е Ð°Ð³Ó\80онаÑ\88Ñ\86а)",
+       "searchprofile-advanced-tooltip": "Ð\94еÑ\85аÑ\80Ñ\86а Ð¹Ð¾Ð»Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82игаÑ\88каÑ\85Ñ\8c Ð»Ð°Ñ\85аÑ\80",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешнаш}})",
        "search-result-category-size": "$1 {{PLURAL:$1|юкъаяр}} ($2 {{PLURAL:$2|1=бухара категори|бухара категореш}}, $3 {{PLURAL:$3|1=файл|файлаш}}).",
        "search-redirect": "(дlасахьажийна $1)",
        "searchall": "массо",
        "showingresults": "Лахахьа {{PLURAL:$1|гойту}} <strong>$1</strong> {{PLURAL:$1|хилам}}, дӀаболало кху № <strong>$2</strong>.",
        "showingresultsinrange": "Лахахь гайтина {{PLURAL:$1|<strong>1</strong> хилам}} диапазонехь <strong>$2</strong> тӀера <strong>$3</strong> кхаччалц.",
-       "search-showingresults": "{{PLURAL:$4|Ð\9aаÑ\80ийна <strong>$1</strong> â\80\94 Ñ\86Ñ\85Ñ\8cаÑ\8a Ð°Ð³Ó\80о|Ð\9aаÑ\80ийна <strong>$3</strong> Ð°Ð³Ó\80о, Ñ\86аÑ\80аÑ\85 Ð°Ð³Ó\80онгаÑ\85Ñ\8c гойту $2 агӀо}}",
+       "search-showingresults": "{{PLURAL:$4|Ð\9aаÑ\80ийна <strong>$1</strong> â\80\94 Ñ\86Ñ\85Ñ\8cаÑ\8a Ð°Ð³Ó\80о|Ð\98 Ð´Ð¾Ñ\88 ÐºÐ°Ñ\80ийна <strong>$3</strong> Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c, Ñ\86аÑ\80еÑ\85 гойту $2 агӀо}}",
        "search-nonefound": "Дехаре терра цхьа хӀума ца карийна.",
        "powersearch-legend": "Шуьйра лахар",
        "powersearch-ns": "ЦӀерийн меттигашкахь лахар:",
        "timezoneregion-indian": "Индин океан",
        "timezoneregion-pacific": "Тийна океан",
        "allowemail": "Магийта декъашхошна хьайга электрони почтехула кехат кхехьийта",
-       "prefs-searchoptions": "Лаха",
+       "prefs-searchoptions": "Лахар",
        "prefs-namespaces": "ЦӀерийн ана",
        "default": "Iад йитарца",
        "prefs-files": "Файлаш",
        "fileexists-forbidden": "Иштта цӀе йолу файл йолуш ю цундела тӀехула дӀаязян йиш яц.\nТӀаккха а хьара файл чуяккха лууш делахь, дехар до, юха а гӀой файлан цӀе хийца а яй чуяккха файл. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "ХӀара файл лахарчу {{PLURAL:$1|1=файлан|файлийн}} дубликат ю:",
        "file-deleted-duplicate": "Иштта файл ([[:$1]]) хӀинцале дӀаяьккхина хилла. Дехар до, юху файл чуяккхале файл дӀаяккхаран историга хьажа.",
-       "uploadwarning": "Дlахьедар",
+       "uploadwarning": "ДӀахьедар",
        "uploadwarning-text": "Дехар до, лахара файлах лаьцнарг хийца а дай юху а гӀорта файл чуяккха.",
        "savefile": "ДӀаязъе файл",
        "uploaddisabled": "Чуяккхар магийна дац",
        "filedelete-intro-old": "<span class=\"plainlinks\">Ахьа дӀайоккхуш ю верси '''[[Media:$1|$1]]''' цу [$4 $3, $2].</span>",
        "filedelete-comment": "Бахьна:",
        "filedelete-submit": "ДӀаяккха",
-       "filedelete-success": "$1 дӀаяккхи.",
+       "filedelete-success": "$1 дӀаяьккхи.",
        "filedelete-success-old": "Верси '''[[Media:$1|$1]]''' цу $3 $2 дӀаяьккхина.",
        "filedelete-nofile": "'''$1''' яц.",
        "filedelete-otherreason": "Кхин бахьна:",
        "unwatchedpages": "Цхьамо тергам ца беш йолу агӀонаш",
        "listredirects": "ДIасахьажоран могIам",
        "listduplicatedfiles": "Файлийн могӀам дубликатшца",
+       "listduplicatedfiles-summary": "ХӀара файлийн могӀам бу, кхузахь тӀехьарчу файлан верси цхьайолу тӀехьарчу файлийн версийн дубликат лоруш ю. Локальни файлаш бен лоруш яц.",
        "listduplicatedfiles-entry": "Файлан [[:File:$1|$1]] — [[$3|{{PLURAL:$2|дубликат ю}}]].",
        "unusedtemplates": "Лелош йоцу кепаш",
        "unusedtemplatestext": "Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу.\nДиц ма делахь хьажа кеп агӀонашкахь лелош юй.",
        "usercreated": "{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2",
        "newpages": "Керла агӀонаш",
        "newpages-username": "Декъашхо:",
-       "ancientpages": "ТÓ\80еÑ\85Ñ\8cаÑ\80а Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82адаÑ\80 Ð´ина яззамаш",
+       "ancientpages": "ТÓ\80аÑ\8cÑ\85Ñ\8cаÑ\80леÑ\80аÑ\87Ñ\83 Ñ\85енаÑ\86а Ð½Ð¸Ñ\81бина яззамаш",
        "move": "ЦӀе хийца",
        "movethispage": "ХӀокху агӀон цӀе хийца",
        "unusedimagestext": "Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нийсса йогӀу хьажорг (URL) хӀокху хӀуман, хӀокху могӀаме йогӀуш ялахь яцахь а иза хила мега жигара лелош.",
        "apihelp-no-such-module": "Модуль «$1» цакарий.",
        "booksources": "Жайнан хьосташ",
        "booksources-search-legend": "Жайнех лаьцна хаам лахар",
-       "booksources-search": "Лаха",
+       "booksources-search": "Лахар",
        "booksources-text": "ХӀокху агӀонгахь гул бина сайтийн тӀе хьажоргийн могӀам оцу чохь шуна жайнах лаьцна хаам каро мега. И ю интернет-туьканаш а категорийн библиотекийн категорешкахь лахаран система а.",
        "specialloguserlabel": "Декъашхо:",
        "speciallogtitlelabel": "Ӏалашо (цӀе я декъашхо):",
        "linksearch": "Арахьара хьажорг",
        "linksearch-pat": "Лехарна кеп:",
        "linksearch-ns": "ЦӀерийн ана:",
-       "linksearch-ok": "Лаха",
+       "linksearch-ok": "Лахар",
        "linksearch-text": "Лело мега хӀоттош йолу символаш, масала, <code>*.wikipedia.org</code>.\nЛакхара даржан домен мукъа хила еза , масала<code>*.org</code><br />\nЛовш йолу {{PLURAL:$2|1=протокол|протоколаш}}: <code>$1</code> (Iад йитарца http://, протокол бакъалла язъен яцахь).",
        "linksearch-line": "$2 — хьажорг кху $1",
        "listusersfrom": "Гучé баха декъашхой, болалуш болу тӀера:",
        "delete-edit-reasonlist": "Бахьанин могӀам нисбар",
        "deleting-backlinks-warning": "'''ДӀахьедар:''' Ахьа дӀайоккхуш йолчун тӀе товжийна [[Special:WhatLinksHere/{{FULLPAGENAME}}|кхин агӀонаш]] ю.",
        "rollback": "Юхабаккха хийцам",
-       "rollback_short": "Юхаяккхар",
        "rollbacklink": "юхаяккха",
        "rollbacklinkcount": "юхадаккха $1 {{PLURAL:$1|1=нисдар|нисдарш}}",
        "rollbacklinkcount-morethan": "Юхадаккха $1 дукха {{PLURAL:$1|нисдар|нисдарш|нисдарш}}",
        "undelete-search-title": "ДӀаяхна агӀонаш лахар",
        "undelete-search-box": "ДӀаяхна агӀонаш лахар",
        "undelete-search-prefix": "Гайта агӀонаш йолалуш йолу тӀера:",
-       "undelete-search-submit": "Лаха",
+       "undelete-search-submit": "Лахар",
        "undelete-no-results": "Архив чохь йогӀуш агӀонаш цакарий.",
        "undelete-error": "АгӀо меттахӀоттаяран гӀалат",
        "undelete-error-short": "Файл меттахӀоттаяран гӀалат: $1",
        "sp-contributions-username": "IP-адрес я декъашхочун цӀе:",
        "sp-contributions-toponly": "ТӀаьхьара бина хийцамаш гайта",
        "sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
-       "sp-contributions-submit": "Лаха",
+       "sp-contributions-submit": "Лахар",
        "whatlinkshere": "Хьажоргаш кхузе",
        "whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
        "whatlinkshere-page": "Агlо:",
-       "linkshere": "ТÓ\80аÑ\8cÑ\85Ñ\8cайогÓ\80Ñ\83 Ð°Ð³Ó\80онаÑ\88 Ð¾Ñ\86Ñ\83 '''[[:$1]]''': Ñ\85Ñ\8cажоÑ\80агÑ\86а Ñ\8e",
+       "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажоргца ю",
        "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
        "nolinkshere-ns": "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш",
        "isredirect": "агӀо-дӀасахьажорг",
        "import-logentry-interwiki": "«$1» — викиюкъара импорт",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|верси импорт йина|версеш импорт йина}} $2 чура",
        "javascripttest": "JavaScript хьажар",
-       "javascripttest-title": "$1 хьожуш бу",
        "tooltip-pt-userpage": "Декъашхочуьна агlо",
        "tooltip-pt-mytalk": "Сан дийцаре агlо",
        "tooltip-pt-preferences": "Хьан гlирс нисбар",
        "tooltip-pt-watchlist": "Ахьа тергам бо агӀонийн хийцаман могӀам",
        "tooltip-pt-mycontris": "Хьан нисдаран могӀам",
-       "tooltip-pt-login": "Ð¥lокÑ\85Ñ\83 Ð³lиÑ\80Ñ\81а Ñ\87оÑ\85Ñ\8c Ð´lавазвала/Ñ\8fла Ð¼ÐµÐ³Ð°, Ð°Ð¼Ð¼Ð° Ð¸Ð·Ð° Ñ\82lедожоÑ\88 дац.",
+       "tooltip-pt-login": "Ð\9aÑ\85Ñ\83заÑ\85Ñ\8c Ð´Ó\80аÑ\8fздаÑ\80 ÐºÑ\85олла Ð¼ÐµÐ³Ð°, Ð°Ð¼Ð¼Ð° Ð¸Ð·Ð° Ñ\82Ó\80едожийна дац.",
        "tooltip-pt-logout": "Дlадерзадо болх бар",
+       "tooltip-pt-createaccount": "Шу йиш ю дӀаяздар кхоьллина системин чудаха, амма иза тӀедожийна дац.",
        "tooltip-ca-talk": "Дийцаре агlон чулацам",
        "tooltip-ca-edit": "Хlара агlо хийцалур ю. Лелайе, дехар до, хьалххьажар айхьа чутохале lалашан",
        "tooltip-ca-addsection": "Кхолла керла дакъа",
        "pageinfo-category-subcats": "Бухара категорийн дукхалла",
        "pageinfo-category-files": "Файлийн дукхалла",
        "markaspatrolleddiff": "Билгалйе теллина санна",
-       "markaspatrolledtext": "Билгала йе хӀара агӀо хьаьжна сана",
+       "markaspatrolledtext": "Билгалъе хӀара агӀо хьаьжна сана",
        "markedaspatrolled": "ДӀадахка теллина санна хилар",
        "markedaspatrolledtext": "Хаьржина [[:$1]] агӀона верси къобалйина сана билгалйина.",
        "rcpatroldisabled": "ТӀехьара бина хийцамаш къобалбан магийна дац",
        "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна тае",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
-       "unknown_extension_tag": "«$1» шордаран ца йоьвзу тег",
        "version": "Верси MediaWiki",
        "version-extensions": "ДӀахӀоттийна шордарш",
        "version-skins": "ДӀахӀоттийна кечяран темаш",
        "tags-active-no": "ХӀахӀа",
        "tags-edit": "нисъе",
        "tags-hitcount": "$1 {{PLURAL:$1|хийцам|хийцамаш}}",
-       "comparepages": "АгӀонаш муха ю хьажар",
+       "comparepages": "АгӀонаш юстар",
        "compare-page1": "Дуьххьаралера агӀо",
        "compare-page2": "ШолгӀа агӀо",
        "compare-rev1": "Дуьххьаралера верси",
        "compare-rev2": "ШолгӀа верси",
-       "compare-submit": "Ð\9cÑ\83Ñ\85а Ñ\8e Ñ\85Ñ\8cажа",
+       "compare-submit": "ЮÑ\81Ñ\82а",
        "compare-invalid-title": "Ахьа язйина йолу цӀе ца магайо.",
        "compare-title-not-exists": "Иштта цӀе яц.",
        "compare-revision-not-exists": "Иштта версеш яц.",
        "feedback-submit": "Дахьийта хетарг",
        "feedback-adding": "АгӀона хетарг тӀетохар...",
        "feedback-close": "Кийчча ю",
-       "searchsuggest-search": "Лаха",
+       "searchsuggest-search": "Лахар",
        "searchsuggest-containing": "чуьраниг…",
        "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|1=[$2 кхин файл]|[$2 кхин файлаш]}} йолуш ю",
        "api-error-duplicate-popup-title": "{{PLURAL:$1|1=Файлан|Файлийн}} дубликат.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (латина)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''дӀаяйина''')",
        "mediastatistics": "Медиа-статистика",
+       "mediastatistics-summary": "Чуяьхна файлийн тайпанийн статистикин хаамаш. Кху чохь тӀаьххьара чуяьхна файлийн версеш бен яц. Шираниш я дӀаяхнарш лоруш яц.",
        "mediastatistics-nbytes": "$1 {{PLURAL:$1|байт}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-тайп",
        "mediastatistics-table-extensions": "Хила мега шордарш",
index ad2fe74..de8be5c 100644 (file)
@@ -41,7 +41,7 @@
        "tog-shownumberswatching": "ژمارەی بەکارھێنەرە چاودێرەکان نیشان بدە",
        "tog-oldsig": "واژووی ئێستا:",
        "tog-fancysig": "وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)",
-       "tog-uselivepreview": "Ù\84Û\95 Ù¾Û\8eشبÛ\8cÙ\86Û\8cÙ\86Û\8c Ø²Û\8cÙ\86دÙ\88Ù\88 Ú©Û\95ÚµÚ© Ù\88Û\95ربگرÛ\95 (تاÙ\82Û\8cکارÛ\8câ\80\8c)",
+       "tog-uselivepreview": "Ù¾Û\8eشبÛ\8cÙ\86Û\8cÙ\86Û\8c Ø²Û\8cÙ\86دÙ\88Ù\88 Ø¨Û\95 Ú©Ø§Ø± Ø¨Ú¾Û\8eÙ\86Û\95",
        "tog-forceeditsummary": "ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ",
        "tog-watchlisthideown": "دەستکارییەکانم بشارەوە لە پێرستی چاودێری",
        "tog-watchlisthidebots": "دەستکارییەکانی بات بشارەوە لە لیستی چاودێری",
        "otherlanguages": "بە زمانەکانی تر",
        "redirectedfrom": "(ڕەوانەکراوە لە $1ەوە)",
        "redirectpagesub": "پەڕەی ڕەوانەکەر",
+       "redirectto": "ڕەوانەکردن بۆ:",
        "lastmodifiedat": "ئەم پەڕەیە دواجار لە $2ی $1 نوێ کراوەتەوە.",
        "viewcount": "ئەم پەڕەیە {{PLURAL:$1|یەکجار|$1 جار}} بینراوە.",
        "protectedpage": "پەڕەی پارێزراو",
        "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی:",
        "viewyourtext": "دەتوانی ژێدەری '''دەستکارییەکەت''' لەم پەڕەیەدا ببینی و کۆپی بکەی:",
        "protectedinterface": "ئەم پەڕەیە دەقی ڕواڵەتی نەرمامێری ئەم ویکییە نیشان دەدات و بۆ بەرگری لە خراپکاری پارێزراوە.\nبۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [//translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
-       "editinginterface": "'''ئاگاداری:''' تۆ خەریکی دەستکاریی پەڕەیەکی کە بۆ دابینکردنی دەقی ڕواڵەتی نەرمامێر بە کار دەھێنرێت.\nگۆڕانکاریی  ئەم پەڕەیە کاریگەر دەبێت لە سەر ڕواڵەتی پەڕەکانی بەکارھێنەرانی تر لەم ویکییەدا.\nبۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [//translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
+       "editinginterface": "<strong>ھۆشیار بە:</strong> خەریکی دەستکاریی پەڕەیەک دەکەیت کە بۆ دابینکردنی دەقی ڕووکاری نەرمامێر بەکاردێت.\nگۆڕانکارییەکانی لەم پەڕەیەدا کاریگەر دەبێت لە سەر ڕواڵەتی پەڕەکانی بەکارھێنەرانی تر لەم ویکییەدا.",
        "cascadeprotected": "ئەم لاپەڕە پارێزراوە لە دەستکاریی، چونکا خراوەتە سەر ڕیزی ئەم {{PLURAL:$1|لاپەڕانه‌، کە}} که‌ به‌ هه‌ڵکردنی بژارده‌ی داڕژان هه‌ڵکراوه‌:\n$2",
        "namespaceprotected": "تۆ ناتوانی لاپەڕەکانی ناو نەیمسپەیسی '''$1''' بگۆڕی.",
        "customcssprotected": "دەسەڵاتی دەستکارییکردنی ئەم پەڕەی CSS ـەت نییە چوونکە ڕێکخستنەکانی کەسێکی تر لەخۆ دەگرێت.",
        "accountcreatedtext": "هەژماری بەکارهێنەری [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|لێدوان]]) دروست کراوە.",
        "createaccount-title": "درووست‌کردنی هەژمارە بۆ {{SITENAME}}",
        "createaccount-text": "کەسێک هەژمارەیەکی بۆ ئی‌مێڵ ئەدرەسەکی تۆ لەسەر {{SITENAME}} ($4) بەناوی \"$2\"، بە وشەی نهێنی \"$3\".\nئێستا دەبێ بڕۆیتە ژوورەوە و وشەی نهێنی بگۆڕیت.\n\nئەگەر ئەو هەژمارە بە هەڵە درووست‌کراوە، ئەم برووسکە لە بەرچاو مەگرە.",
-       "login-throttled": "ژمارەیەکی زۆر هەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە پێش هەوڵی دووبارە، نەختێک بوەستە.",
+       "login-throttled": "زۆر زۆر ھەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە $1 بوەستە پێش ھەوڵی دووبارە.",
        "loginlanguagelabel": "زمان: $1",
        "pt-login": "بچۆ ژوورەوە",
        "pt-login-button": "بچۆ ژوورەوە",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
        "changepassword": "تێپەڕوشە بگۆڕە",
-       "resetpass_announce": "بÛ\95 Ú©Û\86دÛ\8c Ú©Ø§ØªÛ\8cÛ\8c Ø¦Û\8cÙ\85Û\95Û\8cÙ\84â\80\8cکراÙ\88 Ú¾Ø§ØªÙ\88Ù\88Û\8cتÛ\95 Ú\98Ù\88Ù\88رÛ\95Ù\88Û\95.\nبÛ\86 Ø¯Ù\88اÛ\8cÛ\8c Ú¾Ø§ØªÙ\86Û\8c Ú\86Ù\88Ù\88Ù\86Û\95 Ú\98Ù\88Ù\88رÛ\95Ù\88Û\95Ø\8c Ø¦Û\95Ø´Û\8e ØªÛ\8eÙ¾Û\95Ú\95Ù\88Ø´Û\95Û\8cÛ\95Ú©Û\8c Ù\86Ù\88Û\8e Ú¾Û\95ڵبÚ\98Û\8eرÛ\8c Ù\84Û\8eرÛ\95:",
+       "resetpass_announce": "بÛ\86 Ú©Û\86تاÛ\8cÛ\8c Ú\86Ù\88Ù\88Ù\86Û\95 Ú\98Ù\88Ù\88رÛ\95Ù\88Û\95Ø\8c Ø¯Û\95بÛ\8eت ØªÛ\8eÙ¾Û\95Ú\95Ù\88Ø´Û\95Û\8cÛ\95Ú©Û\8c Ù\86Ù\88Û\8e Ø¯Ø§Ø¨Ù\86Û\8eÛ\8cت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "resetpass_header": "گۆڕینی تێپەڕوشەی ھەژمار",
        "oldpassword": "تێپەڕوشەی پێشو:",
        "compareselectedversions": "پیاچوونەوە ھەڵبژێردراوەکان ھەڵسەنگێنە",
        "showhideselectedversions": "دیاریکردنی پێداچوونەوە ھەڵبژێردراوەکان بگۆڕە",
        "editundo": "پووچەڵکردنەوە",
+       "diff-empty": "(بەبێ جیاوازی)",
        "searchresults": "ئاکامەکانی گەڕان",
        "searchresults-title": "ئاکامەکانی گەڕان بۆ «$1»",
        "titlematches": "سەردێڕی پەڕە پێی ئەخوا",
        "search-result-category-size": "{{PLURAL:$1|١ ئەندام|$1 ئەندام}} ({{PLURAL:$2|١ ژێرپۆل|$2 ژێرپۆل}}, {{PLURAL:$3|١ پەڕگە|$3 پەڕگە}})",
        "search-redirect": "(ڕەوانەکەر $1)",
        "search-section": "(بەشی $1)",
+       "search-category": "(پۆلی $1)",
        "search-suggest": "ئایا مەبەستت ئەمە بوو: $1",
        "search-interwiki-caption": "پرۆژە خوشکەکان",
        "search-interwiki-default": "ئاکام لە $1:",
        "gender-female": "ژن",
        "prefs-help-gender": "دڵخواز: بۆ بانگ کردنی دروست بە دەستی نەرمامێر.\nئەم زانیارییە گشتی ئەبێ.",
        "email": "ئیمەیل",
-       "prefs-help-realname": "Ù\86اÙ\88Û\8c Ú\95استÛ\8c Ø¯ÚµØ®Ù\88ازÛ\95.\nئÛ\95Ú¯Û\95ر Ù¾Û\8eت Ø®Û\86Ø´ Ø¨Û\8eت Ø¨Û\8cدÛ\95Û\8cØ\8c Ø²Û\86رتر Ú\95اتدÛ\95Ú©Û\8eØ´Û\8eت Ø¨Û\86 Ú©Ø§Ø±Û\95کاÙ\86ت.",
+       "prefs-help-realname": "Ù\86اÙ\88Û\8c Ú\95استÛ\95Ù\82Û\8cÙ\86Û\95 Ø¯ÚµØ®Ù\88ازÛ\95.\nئÛ\95Ú¯Û\95ر Ø¨Ù\86Ù\88Ù\88سرÛ\8eتØ\8c Ù\84Û\95Ù\88اÙ\86Û\95Û\8cÛ\95 Ø¨Û\86 Ø¦Ø§Ù\85اÚ\98Û\95داÙ\86 Ø¨Û\95رھÛ\95Ù\85Û\95Ú©Û\95ت Ø¨Û\95 Ú©Ø§Ø± Ø¨Ú¾Û\8eÙ\86رÛ\8eت.",
        "prefs-help-email": "دانانی ناونیشانی ئیمەیل دڵخوازانەیە، بەڵام ئەگەر تێپەڕوشەکەت لەیادکرد، بۆ نوێ‌کردنەوەی تێپەڕوشە پێویست دەبێت.",
        "prefs-help-email-others": "ھەروەھا دەتوانی ھەڵبژێری کە بەکارھێنەرانی دیکە لە ڕێگەی پەڕەی بەکارھێنەرییەکەت یان لێدوانەکەت بێ ئاشکراکردنی کەسایەتیت پێوەندیت لەگەڵ بگرن.",
        "prefs-help-email-required": "ناونیشانی ئیمەیل پێویستە.",
        "userrights-no-interwiki": "دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.",
        "userrights-nodatabase": "بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.",
        "userrights-nologin": "بۆ دانانی مافەکانی بەکارهێنەر دەبێ بە هەژماری بەڕێوبەری [[Special:UserLogin|بچیتە ژووروە]].",
-       "userrights-notallowed": "ھەژمارەکەی تۆ دەسەڵاتی دانان یان لابردنی مافەکانی بەکارھێنەری نییە.",
+       "userrights-notallowed": "تۆ دەسەڵاتی دانان یان لابردنی مافەکانی بەکارھێنەرانت نییە.",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
        "group": "گرووپ:",
        "right-deletedtext": "دیتنی دەقە سڕاوەکان و گۆڕانکارییەکانی نێوان پێداچوونەوە سڕاوەکان",
        "right-browsearchive": "گەڕانی پەڕە سڕاوەکان",
        "right-undelete": "ھێنانەوەی پەڕەیەک",
-       "right-suppressrevision": "بÛ\95سÛ\95رداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95 Ù\88 Ú¾Û\8eÙ\86اÙ\86Û\95Ù\88Û\95Û\8c Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95 Ø´Ø§Ø±Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ù\84Û\95 Ø¨Û\95Ú\95Û\8eÙ\88بÛ\95راÙ\86",
+       "right-suppressrevision": "بÛ\8cÙ\86Û\8cÙ\86Ø\8c Ø´Ø§Ø±Ø¯Ù\86Û\95Ù\88Û\95 Ù\88 Ú¾Û\8eÙ\86اÙ\86Û\95Ù\88Û\95Û\8c Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95 ØªØ§Û\8cبÛ\95تÛ\95کاÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86 Ù\84Û\95 Ù\84اÛ\8cÛ\95Ù\86 Ú¾Û\95ر Ø¨Û\95کارھÛ\8eÙ\86Û\95رÛ\8eÚ©Û\95Ù\88Û\95",
        "right-suppressionlog": "دیتنی لۆگە نھێنییەکان",
        "right-block": "بەربەستنی بەکارھێنەرانی تر لە دەستکاریکردن",
        "right-blockemail": "بەربەستنی بەکارھێنەرێک لە ناردنی ئیمەیل",
        "rcshowhideanons-hide": "بشارەوە",
        "rcshowhidepatr": "گۆرانکارییە پاس دراوەکان $1",
        "rcshowhidepatr-show": "نیشان بدە",
+       "rcshowhidepatr-hide": "بیشارەوە",
        "rcshowhidemine": "دەستکارییەکانم $1",
        "rcshowhidemine-show": "نیشان بدە",
        "rcshowhidemine-hide": "بشارەوە",
        "nolicense": "ھیچ ھەڵنەبژێردراوە",
        "license-nopreview": "(پێشبینین ئامادەی کەڵک وەرگرتن نییە)",
        "upload_source_url": " (URLـی بەکار، بۆ دەست‌پێگەیشتنی  گشتی)",
-       "upload_source_file": " (پەڕگەیەک لەسەر کۆمپیوتەرەکەت)",
+       "upload_source_file": "(پەڕگەی ھەڵبژێرراوت لەسەر کۆمپیوتەرەکەت)",
        "listfiles-delete": "بیسڕەوە",
        "listfiles-summary": "ئەم پەڕە تایبەتە ھەموو پەڕگە بارکراوەکان نیشان دەدات.",
        "listfiles_search_for": "بگەڕێ بۆ ناوی میدیای:",
        "allpagesbadtitle": "سەردێڕی لاپەڕە گونجاو نەبوو یان پێشگڕێکی بەینی‌زمانی یان بەینی‌ویکی هەبوو.\nلەوانەیە یەک یان زیاتر پیتی نەگونجاو بۆ سەردێڕی لەخۆ گرتبێ.",
        "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|پۆلە خوازراوەکان]]یش ببینە.",
        "notvisiblerev": "پیاچوونەوە سڕاوەتەوە",
        "watchlist-details": "{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.",
        "wlheader-enotif": "ئاگاداری بە ئیمەیل چالاکە.",
-       "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
-       "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین '''$1''' گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}}دا ھەتا $4 لە $3.",
-       "wlshowlast": "دوایین $1 کاتژمێر $2 ڕۆژی  نیشان بدە",
+       "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دوایین سەردانت دەستکاری کراون بە <strong>ئەستوور</strong> نیشان دراون.",
+       "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین <strong>$1</strong> گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|<strong>$2</strong> کاتژمێر}}دا ھەتا $4ی $3.",
+       "wlshowlast": "دوایین $1 کاتژمێری $2 ڕۆژ نیشان بدە",
        "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری",
        "watching": "چاودێری...",
        "unwatching": "لابردنی چاودێری...",
        "exbeforeblank": "ناوەرۆک بەر لە واڵاکردنەوە ئەمە بوو: «$1»",
        "delete-confirm": "سڕینەوەی «$1»",
        "delete-legend": "بیسڕەوە",
-       "historywarning": "'''وشیار بە:''' پەڕەیەک کە دەتەوێ بیسڕیتەوە مێژوویەکی ھەیە بە نزیکەی $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}وە:",
+       "historywarning": "<strong>ھۆشیار بە:</strong> پەڕەیەک کە خەریکیت دەیسڕیتەوە مێژوویەکی ھەیە بە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}وە:",
        "confirmdeletetext": "تۆ خەریکی پەڕەیەک بە ھەموو مێژووەکەیەوە دەسڕیتەو.\nتکایە پشتڕاستی بکەوە کە دەتەوێت ئەم کارە بکەی، لە ئاکامەکەی تێدەگەی، و ئەم کارە بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] ئەنجام دەدەی.",
        "actioncomplete": "کردەوە بە ئاکام گەییشت",
        "actionfailed": "کردارەکە سەرنەکەوت",
        "exif-subjectnewscode-value": "$2 ($1)",
        "exif-compression-1": "نەپەستێنراو",
        "exif-copyrighted-true": "خاوەنی مافی بڵاوکردنەوە",
-       "exif-copyrighted-false": "پاوانی گشتی",
+       "exif-copyrighted-false": "ڕەوشی مافی لەبەرگرتنەوە دیاری نەکراوە",
        "exif-unknowndate": "ڕێکەوتی نەزانراو",
        "exif-orientation-1": "ئاسایی",
        "exif-orientation-2": "ئاسۆیی هەڵگێڕدراوەتەوە",
        "hebrew-calendar-m7-gen": "نیسان",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|لێدوان]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "تاگی درێژکراوەی نەناسراو \"$1\"",
        "duplicate-defaultsort": "'''ئاگاداری''' کلیلی پۆلێنکردنی \"$2'' چووەتە شوێنی کلیلی پۆلێنکردنی  \"$1\"",
        "version": "وەشان",
        "version-extensions": "پێوەکراوە دامەزراوەکان",
-       "version-skins": "پێستەکان",
+       "version-skins": "پێستە دامەزراوەکان",
        "version-specialpages": "پەڕە تایبەتەکان",
        "version-parserhooks": "قولاپە لێککەرەکان",
        "version-variables": "گۆڕاوەکان",
        "duration-decades": "$1 {{PLURAL:$1|دەیە|دەیە}}",
        "duration-centuries": "$1 {{PLURAL:$1|سەدە|سەدە}}",
        "duration-millennia": "$1 {{PLURAL:$1|ھەزارە|ھەزارە}}",
-       "expand_templates_ok": "باشە"
+       "expand_templates_output": "ئاکام",
+       "expand_templates_ok": "باشە",
+       "expand_templates_preview": "پێشبینین",
+       "pagelang-name": "پەڕە",
+       "pagelang-language": "زمان",
+       "pagelang-select-lang": "زمان ھەڵبژێرە",
+       "right-pagelang": "زمانی پەڕە بگۆڕە",
+       "action-pagelang": "زمانی پەڕەکە بگۆڕە",
+       "mediastatistics": "ئامارەکانی میدیا",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایت}} ($2؛ $3%)",
+       "mediastatistics-table-mimetype": "جۆری MIME",
+       "mediastatistics-table-count": "ژمارەی پەڕگەکان",
+       "mediastatistics-header-unknown": "نەزانراو",
+       "mediastatistics-header-bitmap": "وێنەی Bitmap",
+       "mediastatistics-header-audio": "دەنگ",
+       "mediastatistics-header-video": "ڤیدیۆکان",
+       "json-error-syntax": "ھەڵەی ئیملایی"
 }
index 7df6b42..54b4a8b 100644 (file)
        "pool-queuefull": "Fronta ve fondu je plná",
        "pool-errorunknown": "Neznámá chyba",
        "pool-servererror": "Služba řídící přístup k serverům není dostupná ($1).",
+       "poolcounter-usage-error": "Chyba užití: $1",
        "aboutsite": "O&nbsp;{{grammar:6sg|{{SITENAME}}}}",
        "aboutpage": "Project:{{SITENAME}}",
        "copyright": "Obsah je dostupný pod $1, pokud není uvedeno jinak.",
        "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, bude vaše IP adresa zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, budou vaše editace připsány vašemu uživatelskému jménu a získáte i další výhody.",
        "anonpreviewwarning": "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
        "missingsummary": "'''Připomenutí:''' Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána bez shrnutí.",
-       "selfredirect": "<strong>Upozornění:</strong> Vytváříte přesměrování na týž článek. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude přesměrování vytvořeno.",
+       "selfredirect": "<strong>Upozornění:</strong> Pokušíte se tuto stránku přesměrovat samu na sebe.\nMožná jste uvedli chybný cíl přesměrování nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude přesměrování přesto vytvořeno.",
        "missingcommenttext": "Zadejte komentář",
        "missingcommentheader": "'''Připomenutí:''' Nezadali jste předmět/nadpis pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána i bez toho.",
        "summary-preview": "Náhled shrnutí:",
        "content-model-text": "čistý text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prázdný objekt",
+       "content-json-empty-array": "Prázdné pole",
        "duplicate-args-category": "Stránky s duplicitními argumenty ve voláních šablon",
        "duplicate-args-category-desc": "Stránka obsahuje volání šablony, které používá duplicitní argumenty, např. <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> nebo <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Varování:''' Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí syntaktického analyzátoru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $1 volání|zde je $1 volání}}.",
        "history-feed-empty": "Požadovaná stránka neexistuje.\nMohla být smazána či přejmenována.\nZkuste [[Special:Search|hledání]].",
        "rev-deleted-comment": "(shrnutí editace odstraněno)",
        "rev-deleted-user": "(uživatelské jméno odstraněno)",
-       "rev-deleted-event": "(záznam odstraněn)",
+       "rev-deleted-event": "(podrobnosti odstraněny)",
        "rev-deleted-user-contribs": "[uživatelské jméno nebo IP adresa odstraněny – editace v příspěvcích skryta]",
        "rev-deleted-text-permission": "Tato revize byla '''smazána'''.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "rev-suppressed-text-permission": "Tato revize byla <strong>utajena</strong>. Podrobnosti jsou uvedeny v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} knize utajení].",
        "revdelete-legend": "Nastavit omezení viditelnosti",
        "revdelete-hide-text": "Text revize",
        "revdelete-hide-image": "Skrýt obsah souboru",
-       "revdelete-hide-name": "Skrýt událost a cíl",
+       "revdelete-hide-name": "Skrýt cíl a parametry",
        "revdelete-hide-comment": "Shrnutí editace",
        "revdelete-hide-user": "Uživatelské jméno / IP adresa",
        "revdelete-hide-restricted": "Utajit data i před správci",
        "deleteprotected": "Tuto stránku nemůžete smazat, protože je zamčena.",
        "deleting-backlinks-warning": "'''Upozornění:''' Stránka, kterou se chystáte smazat, je [[Special:WhatLinksHere/{{FULLPAGENAME}}|na jiných stránkách]] odkazována nebo je do nich vložena.",
        "rollback": "Vrátit zpět editace",
-       "rollback_short": "Vrátit zpět",
        "rollbacklink": "vrácení zpět",
        "rollbacklinkcount": "vrácení $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbacklinkcount-morethan": "vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět",
        "namespace": "Jmenný prostor:",
        "invert": "Obrátit výběr",
        "tooltip-invert": "Zaškrtnutím tohoto políčka skryjete změny stránek ve zvoleném jmenném prostoru (a souvisejícím jmenném prostoru, pokud je zaškrtnuto)",
+       "tooltip-whatlinkshere-invert": "Zaškrtnutím tohoto políčka skryjete odkazy ze stránek ve zvoleném jmenném prostoru.",
        "namespace_association": "Související jmenný prostor",
        "tooltip-namespace_association": "Zaškrtnutím tohoto políčka zahrnete i diskusní či obsahový jmenný prostor příslušný k vybranému jmennému prostoru",
        "blanknamespace": "(Hlavní)",
        "thumbnail-temp-create": "Dočasný soubor náhledu nelze vytvořit.",
        "thumbnail-dest-create": "Náhled nelze uložit na dané místo.",
        "thumbnail_invalid_params": "Neplatný parametr náhledu",
+       "thumbnail_toobigimagearea": "Soubor s rozměry většími než $1",
        "thumbnail_dest_directory": "Nelze vytvořit cílový adresář",
        "thumbnail_image-type": "Nepodporovaný typ obrázku",
        "thumbnail_gd-library": "Neúplná konfigurace knihovny GD: chybí funkce $1",
        "import-logentry-interwiki": "přenesl $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|naimportována $1 revize|naimportovány $1 revize|naimportováno $1 revizí}} z $2",
        "javascripttest": "Testování JavaScriptu",
-       "javascripttest-title": "Spouštějí se testy v $1",
        "javascripttest-pagetext-noframework": "Tato stránka je vyhrazena pro spouštění testů JavaScriptu.",
        "javascripttest-pagetext-unknownframework": "Neznámá testovací knihovna „$1“.",
+       "javascripttest-pagetext-unknownaction": "Neznámá akce „$1“.",
        "javascripttest-pagetext-frameworks": "Zvolte jednu z následujících testovacích knihoven: $1",
        "javascripttest-pagetext-skins": "Zvolte vzhled, pod kterým se mají testy spustit:",
        "javascripttest-qunit-intro": "Vizte [$1 dokumentaci testování] na mediawiki.org",
-       "javascripttest-qunit-heading": "Sada testů JavaScriptu v MediaWiki pomocí QUnit",
        "tooltip-pt-userpage": "Vaše uživatelská stránka",
        "tooltip-pt-anonuserpage": "Uživatelská stránka pro IP adresu, ze které editujete",
        "tooltip-pt-mytalk": "Vaše diskusní stránka",
        "hebrew-calendar-m11-gen": "avu",
        "hebrew-calendar-m12-gen": "elulu",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuse]])",
-       "unknown_extension_tag": "Neznámá značka rozšíření: „$1“",
        "duplicate-defaultsort": "Upozornění: Implicitní klíč řazení (DEFAULTSORTKEY) „$2“ přepisuje dříve nastavenou hodnotu „$1“.",
        "duplicate-displaytitle": "<strong>Upozornění:</strong> Předchozí zobrazovaný název „$1“ je nahrazen zobrazovaným názvem „$2“.",
        "invalid-indicator-name": "<strong>Chyba:</strong> Atribut <code>name</code> indikátoru stavu stránky nesmí být prázdný.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Cesta k článkům]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Cesta ke skriptům]",
+       "version-libraries": "Nainstalované knihovny",
+       "version-libraries-library": "Knihovna",
+       "version-libraries-version": "Verze",
        "redirect": "Přesměrování podle souboru, uživatele, stránky nebo ID revize",
        "redirect-legend": "Přesměrování na soubor či stránku",
        "redirect-summary": "Tato speciální stránka přesměrovává na soubor (podle názvu), stránku (podle ID stránky nebo revize) nebo uživatele (podle číselného uživatelského ID). Použití: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] nebo [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Zadaná revize neexistuje.",
        "dberr-problems": "Promiňte! Tento server má v tuto chvíli technické problémy.",
        "dberr-again": "Zkuste několik minut počkat a poté znovu načíst stránku.",
-       "dberr-info": "(Nelze navázat spojení s databázovým serverem: $1)",
-       "dberr-info-hidden": "(Nelze navázat spojení s databázovým serverem)",
+       "dberr-info": "(Nelze se připojit k databázi: $1)",
+       "dberr-info-hidden": "(Nelze se připojit k databázi)",
        "dberr-usegoogle": "Mezitím můžete zkusit hledat pomocí Google.",
        "dberr-outofdate": "Uvědomte si, že jejich vyhledávací index našeho obsahu může být zastaralý.",
        "dberr-cachederror": "Následující stránka je kopie z cache a nemusí být aktuální.",
        "api-error-stashzerolength": "Server nemohl soubor uložit do skrýše, protože má nulovou délku.",
        "api-error-stashnotloggedin": "Pro ukládání souboru do skrýše musíte být přihlášeni.",
        "api-error-stashwrongowner": "Soubor, ke kterému se ve skrýši pokoušíte přistoupit, vám nepatří.",
-       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterém se ve skrýši pokoušíte přistoupit, neexistuje.",
+       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterému se ve skrýši pokoušíte přistoupit, neexistuje.",
        "api-error-timeout": "Server neodpověděl v očekávaném čase.",
        "api-error-unclassified": "Došlo k neznámé chybě.",
        "api-error-unknown-code": "Neznámá chyba: „$1“.",
index 4c992a8..469959d 100644 (file)
@@ -39,7 +39,7 @@
        "tog-shownumberswatching": "Dangos y nifer o ddefnyddwyr sy'n gwylio",
        "tog-oldsig": "Y llofnod cyfredol:",
        "tog-fancysig": "Trin y llofnod fel testun wici (heb gyswllt wici awtomatig)",
-       "tog-uselivepreview": "Defnyddio rhagolwg byw (arbrofol)",
+       "tog-uselivepreview": "Defnyddio rhagolwg byw",
        "tog-forceeditsummary": "Tynnu fy sylw pan adawaf flwch crynodeb golygu yn wag",
        "tog-watchlisthideown": "Cuddio fy ngolygiadau fy hunan yn fy rhestr wylio",
        "tog-watchlisthidebots": "Cuddio golygiadau bot yn fy rhestr wylio",
        "otherlanguages": "Ieithoedd eraill",
        "redirectedfrom": "(Ailgyfeiriad oddi wrth $1)",
        "redirectpagesub": "Tudalen ailgyfeirio",
+       "redirectto": "Ailgyfeirio i:",
        "lastmodifiedat": "Newidiwyd y dudalen hon ddiwethaf $2, $1.",
        "viewcount": "{{PLURAL:$1|Ni chafwyd dim|Cafwyd $1|Cafwyd $1|Cafwyd $1|Cafwyd $1|Cafwyd $1}} ymweliad â'r dudalen hon.",
        "protectedpage": "Tudalen a ddiogelwyd",
        "jumptonavigation": "llywio",
        "jumptosearch": "chwilio",
        "view-pool-error": "Ymddiheurwn, mae gormod o waith gan y gweinyddion ar hyn o bryd.\nMae gormod o ddefnyddwyr am weld y dudalen hon ar unwaith.\nArhoswch ychydig cyn ceisio mynd at y dudalen hon eto.\n\n$1",
+       "generic-pool-error": "Drapia, mae'r gweinyddion dan gryn bwysau ar hyn o bryd.\nMae gormod o ddefnyddwyr yn ceisio gwneud yr un peth!\nDaliwch eich gafael am chydig funudau cyn mynd ati i geisio eto.",
        "pool-timeout": "Cafwyd goroedi wrth aros am y clo",
        "pool-queuefull": "Mae cwt y gronfa brosesu yn llawn",
        "pool-errorunknown": "Gwall anhysbys",
+       "poolcounter-usage-error": "Gwall defnydd: $1",
        "aboutsite": "Ynglŷn â {{SITENAME}}",
        "aboutpage": "Project:Amdanom",
        "copyright": "Rhoddir y cynnwys ar gael ar delerau'r drwydded $1, heblaw ei fod wedi nodi'n wahanol.",
        "hidetoc": "cuddio",
        "collapsible-collapse": "Crebacher",
        "collapsible-expand": "Ehanger",
+       "confirmable-confirm": "Wyt ti'n siwr?",
+       "confirmable-yes": "Ydw",
+       "confirmable-no": "Nac ydw",
        "thisisdeleted": "Ydych chi am ddangos, neu ddad-ddileu $1?",
        "viewdeleted": "Gweld $1?",
        "restorelink": "$1 {{PLURAL:$1|golygiad sydd wedi'i ddileu|golygiad sydd wedi'i ddileu|olygiad sydd wedi'u dileu|golygiad sydd wedi'u dileu|golygiad sydd wedi'u dileu|golygiad sydd wedi'u dileu}}",
        "viewsourcetext": "Cewch weld a chopïo côd y dudalen:",
        "viewyourtext": "Cewch weld a copïo ffynhonnell ''eich golygiadau'' i'r dudalen hon:",
        "protectedinterface": "Testun ar gyfer rhyngwyneb y wici yw cynnwys y dudalen hon. Clowyd y dudalen er mwyn ei diogeli. Os am gyfieithu'r neges neu ei newid ym mhob wici yn hytrach nag yn hwn yn unig, defnyddiwch [//translatewiki.net/ translatewiki.net], y prosiect MediaWiki sy'n hyrwyddo'r gwaith cyfieithu.",
-       "editinginterface": "'''Dalier sylw:''' Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir ar y wici hwn yn unig. Os am gyfieithu'r neges rhagosodedig a ddefnyddir ar bob wici, ystyriwch ddefnyddio [//translatewiki.net/ translatewiki.net], sef y prosiect MediaWiki sy'n hyrwyddo creu rhyngwyneb amlieithog ar wicïau.",
+       "editinginterface": "<strong>Dalier sylw:</strong> Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir ar y wici hwn yn unig.",
+       "translateinterface": "I ychwanegu neu newid y cyfieithiad ar gyfer pob wici, defnyddiwch [//translatewiki.net/ translatewiki.net], sef prosiect lleol MediaWiki.",
        "cascadeprotected": "Diogelwyd y dudalen hon rhag ei newid, oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}}, a {{PLURAL:$1|honno yn ei thro wedi ei|honno yn ei thro wedi ei|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu}} diogelu, a'r dewisiad 'sgydol' ynghynn:\n$2",
        "namespaceprotected": "Nid oes caniatâd gennych i olygu tudalennau yn y parth '''$1'''.",
        "customcssprotected": "Nid oes caniatâd ganddoch i olygu'r dudalen CSS hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
        "invalidtitle-knownnamespace": "Teitl annilys o'r enw \"$3\" yn y parth \"$2\"",
        "invalidtitle-unknownnamespace": "Teitl annilys ag iddi'r rhif parth anhysbys $1 a'r enw \"$2\"",
        "exception-nologin": "Nid ydych wedi mewngofnodi",
-       "exception-nologin-text": "[[Special:Userlogin|Mewngofnodwch]] er mwyn gweld y dudalen neu gyflawni'r weithred.",
+       "exception-nologin-text": "Mewngofnodwch er mwyn gweld y dudalen neu gyflawni'r weithred.",
        "exception-nologin-text-manual": "Mae angen $1 er mwyn gweld y dudalen neu gyflawni'r weithred.",
        "virus-badscanner": "Cyfluniad gwael: sganiwr firysau anhysbys: ''$1''",
        "virus-scanfailed": "methodd y sgan (côd $1)",
        "createaccount-text": "Creodd rhywun gyfrif o'r enw $2 ar {{SITENAME}} ($4) ar gyfer y cyfeiriad e-bost hwn. \"$3\" yw'r cyfrinair ar gyfer \"$2\". Dylech fewngofnodi a newid eich cyfrinair yn syth.\n\nRhydd ichi anwybyddu'r neges hon os mai camgymeriad oedd creu'r cyfrif.",
        "login-throttled": "Rydych wedi ceisio mewngofnodi gormod o weithiau ar ben ei gilydd.\nOedwch $1 cyn mentro eto.",
        "login-abort-generic": "Ni lwyddodd y mewngofnodi - Rhoddwyd y gorau iddo",
+       "login-migrated-generic": "Trosglwyddwyd eich cyfrif ac nid yw eich enw defnyddiwr bellach yn bodoli ar y wici hwn.",
        "loginlanguagelabel": "Iaith: $1",
        "suspicious-userlogout": "Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.",
        "createacct-another-realname-tip": "Gallwch ddewis roi eich enw go iawn.\nOs y gwnewch, fe gaiff yr enw go iawn ei defnyddio wrth dadogi'ch gwaith.",
        "resetpass-abort-generic": "Mae estyniad wedi atal newid y cyfrinair.",
        "resetpass-expired": "Mae oes eich cyfrinair wedi dod i ben. Gosodwch gyfrinair newydd i fewngofnodi.",
        "resetpass-expired-soft": "Mae eich cyfrinair wedi dod i ben ac mae'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu cliciwch \"{{int:resetpass-submit-cancel}}\" a'i ailosod rywdro eto.",
+       "resetpass-validity-soft": "Nid yw eich cyfrinair $1 yn dal ddilys.\n\nDewisiwch gyfrinair newydd nawr, neu gliciwch \"{{int:resetpass-submit-cancel}}\" i'w ailosod yn nes ymlaen.",
        "passwordreset": "Ailosod cyfrinair",
        "passwordreset-text-one": "Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.",
        "passwordreset-text-many": "{{PLURAL:$1|Llanwch un o'r blychau er mwyn derbyn cyfrinair dros dro mewn ebost.}}",
        "preview": "Rhagolwg",
        "showpreview": "Dangos rhagolwg",
        "showdiff": "Dangos newidiadau",
-       "anoneditwarning": "'''Dalier sylw''': Nid ydych wedi mewngofnodi. Fe fydd eich cyfeiriad IP yn ymddangos ar hanes golygu'r dudalen hon. Gallwch ddewis cuddio'ch cyfeiriad IP drwy greu cyfrif (a mewngofnodi) cyn golygu.",
+       "blankarticle": "<strong>Gan bwyll:</strong> Mae'r dudalen rydych yn ei chreu'n wag. Os cliciwch \"{{int:savearticle}}\" eto, yna caiff y dudalen ei chreu heb unrhyw gynnwys ynddi.",
+       "anoneditwarning": "<strong>Dalier sylw</strong>: Nid ydych wedi mewngofnodi. Fe fydd eich cyfeiriad IP yn ymddangos ar hanes golygu'r dudalen hon. Gallwch ddewis cuddio'ch cyfeiriad IP drwy greu cyfrif (a mewngofnodi) cyn golygu.",
        "anonpreviewwarning": "''Nid ydych wedi mewngofnodi. Os y cadwch eich newidiadau caiff eich cyfeiriad IP ei gofnodi yn hanes golygu'r dudalen hon.''",
        "missingsummary": "'''Sylwer:''' Nid ydych wedi gosod nodyn yn y blwch 'Crynodeb'.\nOs y pwyswch eto ar 'Cadw'r dudalen' caiff y golygiad ei gadw heb nodyn.",
+       "selfredirect": "<strong>Gofal:</strong> Rydych yn ailgyfeirio'r dudalen hon ati hi ei hun!  Gwirwch yr hyn rydych yn ceisio'i wneud. Os cliciwch \"{{int:savearticle}}\" eto yna caiff y dudalen ailgyfeirio (wallus!) ei chreu beth bynnag.",
        "missingcommenttext": "Rhowch eich sylwadau isod.",
        "missingcommentheader": "'''Nodyn:''' Nid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc/Pennawd:'. Os y cliciwch \"{{int:savearticle}}\" eto fe gedwir y golygiad heb bennawd.",
        "summary-preview": "Rhagolwg o'r crynodeb:",
        "edit-gone-missing": "Ni ellid diweddaru'r dudalen.\nYmddengys iddi gael ei dileu.",
        "edit-conflict": "Cyd-ddigwyddiad golygu.",
        "edit-no-change": "Anwybyddwyd eich golygiad, gan na newidiwyd y testun.",
+       "postedit-confirmation-created": "Crewyd y dudalen.",
+       "postedit-confirmation-restored": "Adferwyd y dudalen.",
        "postedit-confirmation-saved": "Rhoddwyd eich golygiad ar gadw.",
        "edit-already-exists": "Ni ellid creu tudalen newydd.\nMae ar gael yn barod.",
        "defaultmessagetext": "Y testun rhagosodedig",
        "content-model-text": "testun plaen",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Dim gwrthrych",
+       "content-json-empty-array": "Rhesi gwag",
+       "duplicate-args-category": "Tudalennau gyda meysydd deublyg yn y Nodion",
+       "duplicate-args-category-desc": "Mae'r dudalen hon yn cynnwys meysydd yn y Nodion, ddwy waith e.e.  <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> neu <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Rhybudd:''' Mae gormod o alwadau ar ffwythiannau dosrannu sy'n dreth ar adnoddau yn y dudalen hon.\n\nDylai fod llai na $2 {{PLURAL:$2|galwad|alwad|alwad|galwad}} yn y dudalen, ond ar hyn o bryd mae $1 {{PLURAL:$1|galwad|alwad|alwad|galwad}} ynddi.",
        "expensive-parserfunction-category": "Tudalennau a gormod o alwadau ar ffwythiannau dosrannu sy'n dreth ar adnoddau",
        "post-expand-template-inclusion-warning": "'''Rhybudd:''' Mae maint y nodiadau ar ôl eu chwyddo yn rhy fawr.\nNi chaiff rhai nodiadau eu cynnwys.",
        "parser-template-recursion-depth-warning": "Wedi mynd dros ben y terfyn ar ddyfnder dychweliad nodiadau ($1)",
        "language-converter-depth-warning": "Wedi mynd tu hwnt i'r terfyn dyfnder ($1) ar y cyfnewidydd iaith.",
        "node-count-exceeded-category": "Tudalennau lle mae nifer y nodau yn ormod",
+       "node-count-exceeded-category-desc": "Rydych wedi mynd dros y mwyafswm a ganiateir.",
        "node-count-exceeded-warning": "Mae nifer y nodau yn y dudalen yn ormod",
        "expansion-depth-exceeded-category": "Tudalennau â dyfnder ehangu tu hwnt i'r terfyn",
+       "expansion-depth-exceeded-category-desc": "Mae'r dudalen yn rhy fawr!",
        "expansion-depth-exceeded-warning": "Mae dyfnder ehangu'r dudalen y tu hwnt i'r terfyn",
        "parser-unstrip-loop-warning": "Wedi darganfod dolen dad-blicio (unstrip loop)",
        "parser-unstrip-recursion-limit": "Wedi mynd dros ben y terfyn ar ddychweliad dad-blicio (unstrip recursion) ($1)",
        "currentrev": "Diwygiad cyfoes",
        "currentrev-asof": "Y diwygiad cyfredol, am $1",
        "revisionasof": "Diwygiad $1",
-       "revision-info": "Y fersiwn a roddwyd ar gadw am $1 gan $2",
+       "revision-info": "Fersiwn a roddwyd ar gadw am $1 gan $2",
        "previousrevision": "← At y diwygiad blaenorol",
        "nextrevision": "At y diwygiad dilynol →",
        "currentrevisionlink": "Y diwygiad cyfoes",
        "history-feed-empty": "Nid yw'r dudalen a ofynwyd amdani'n bod.\nGall fod iddi gael ei dileu neu ei hailenwi.\nGallwch [[Special:Search|chwilio'r]] wici am dudalennau eraill perthnasol.",
        "rev-deleted-comment": "(dilëwyd crynodeb y golygiad)",
        "rev-deleted-user": "(enw defnyddiwr wedi ei ddiddymu)",
-       "rev-deleted-event": "(tynnwyd gweithred y lòg)",
+       "rev-deleted-event": "(tynnwyd manylion y lòg)",
        "rev-deleted-user-contribs": "[tynnwyd enw defnyddiwr neu gyfeiriad IP i ffwrdd - ni ddangosir y golygiad ar y rhestr gyfraniadau]",
        "rev-deleted-text-permission": "'''Dilëwyd''' y diwygiad hwn o'r dudalen.\nMae manylion ar gael yn y [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lòg dileuon].",
+       "rev-suppressed-text-permission": "Mae'r drafft yma wedi'i <strong>atal</strong>.\nCeir rhagor o fanylion yn y [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log atal].",
        "rev-deleted-text-unhide": "Cafodd y diwygiad hwn o'r dudalen ei '''ddileu'''.\nGweler cofnod y dileu ar y [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lòg dileu].\nOnd gallwch chi [$1 weld y diwygiad] o hyd os y mynnwch.",
        "rev-suppressed-text-unhide": "Mae’r diwygiad hwn o’r dudalen wedi cael ei '''guddio'''.\nCewch weld y manylion ar y [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lòg cuddio].\nCewch dal [$1 weld y golygiad] os y mynwch.",
        "rev-deleted-text-view": "'''Dilëwyd''' y diwygiad hwn o'r dudalen.\nGallwch ei weld; mae manylion ar gael yn y [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lòg dileuon].",
        "revdelete-selected-text": "Dewisiwyd y {{PLURAL:$1|diwygiad|diwygiad|diwygiadau}} canlynol o [[:$2]]:",
        "revdelete-selected-file": "Dewiswyd y {{PLURAL:$1|diwygiad|diwygiad|diwygiadau}} canlynol o'r ffeil [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Digwyddiad|Digwyddiad|Digwyddiadau}} a ddewiswyd o'r lòg:",
+       "revdelete-text-text": "Bydd y golygiadau a ddilewyd yn dal i ymddangos yn hanes y dudalen, ond ni fydd y cyhoedd yn medru gweld rhannau ohonynt.",
+       "revdelete-text-file": "Bydd fersiynau gwahanol o'r ffeiliau'n dal i ymddangos yn hanes y dudalen, ond ni fydd y cyhoedd yn medru gweld rhannau ohonynt.",
+       "logdelete-text": "Bydd y log o weithrdoedd a ddilewyd yn dal i ymddangos yn y logs, ond ni fydd y cyhoedd yn medru gweld rhannau ohonynt.",
+       "revdelete-text-others": "Bydd gweinyddwyr eraill yn parhau i weld y manylion a guddiwyd a'u hailalw, oni bai eich bod yn gosod cyfyngiadau ychwanegol.",
        "revdelete-confirm": "Byddwch gystal â chadarnhau eich bod yn bwriadu gwneud hyn, eich bod yn deall yr effaith a gaiff, a'ch bod yn ei wneud yn ôl y [[{{MediaWiki:Policy-url}}|y polisi]].",
        "revdelete-suppress-text": "'''Dim ond''' yn yr achosion sy'n dilyn y dylech fentro cuddio gwybodaeth:\n* Gwybodaeth a all fod yn enllib\n* Gwybodaeth bersonol anaddas\n*: ''cyfeiriad cartref, rhif ffôn, rhif yswiriant cenedlaethol, ayb.''",
        "revdelete-legend": "Gosod cyfyngiadau ar y gallu i weld",
        "revdelete-hide-text": "Testun y diwygiad",
        "revdelete-hide-image": "Cuddio cynnwys y ffeil",
-       "revdelete-hide-name": "Cuddio'r weithred a'r targed",
+       "revdelete-hide-name": "Cuddio'r targed a'r paramedr",
        "revdelete-hide-comment": "Sylw golygu",
        "revdelete-hide-user": "Enw defnyddiwr/IP y golygydd",
        "revdelete-hide-restricted": "Gosod y cyfyngiadau gweld data ar weinyddwyr yn ogystal ag eraill",
        "search-result-category-size": "{{PLURAL:$1|$1 aelod}} ({{PLURAL:$2|$2 is-gategori}}, {{PLURAL:$3|$3 ffeil}})",
        "search-redirect": "(ailgyfeiriad $1)",
        "search-section": "(adran $1)",
+       "search-category": "(categori $1)",
        "search-file-match": "(yn cyfateb i gynnwys y ffeil)",
        "search-suggest": "Ai am hyn y chwiliwch: $1",
        "search-interwiki-caption": "Chwaer-brosiectau",
        "searchall": "oll",
        "showingresults": "Yn dangos $1 {{PLURAL:$1|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
        "showingresultsinrange": "Yn dangos hyd at {{PLURAL:$1||<strong>1</strong> canlyniad|<strong>$1</strong> ganlyniad|$1 o ganlyniadau}} isod yn yr ystod #<strong>$2</strong> i #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Canlyniadau: <strong>$1 - $2</strong> o <strong>$3</strong>}}",
        "search-nonefound": "Ni chafwyd dim canlyniadau i'r ymholiad.",
        "powersearch-legend": "Chwiliad uwch",
        "powersearch-ns": "Chwilio yn y parthau:",
        "powersearch-togglelabel": "Dewis:",
        "powersearch-toggleall": "Oll",
        "powersearch-togglenone": "Dim un",
+       "powersearch-remember": "Cofio'r dewis ar gyfer archwiliadau'r dyfodol",
        "search-external": "Chwiliad allanol",
        "searchdisabled": "Mae'r teclyn chwilio ar {{SITENAME}} wedi'i analluogi dros dro.\nYn y cyfamser gallwch chwilio drwy Google.\nCofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
        "search-error": "Cafwyd gwall wrth chwilio: $1",
        "preferences": "Dewisiadau",
        "mypreferences": "Dewisiadau",
        "prefs-edits": "Nifer y golygiadau:",
-       "prefsnologintext2": "Mae angen $1 er mwyn gosod eich dewisiadau personol.",
+       "prefsnologintext2": "Mewngofnodwch er mwyn newid eich dewisiadau.",
        "prefs-skin": "Gwedd",
        "skin-preview": "Rhagolwg",
        "datedefault": "Dim dewisiad",
        "gender-female": "Mae hi'n golygu tudalennau wici",
        "prefs-help-gender": "Nid oes rhaid llanw'r dewis yma. \nMae'r meddalwedd yn defnyddio hwn i gyfeirio atoch ac i'ch cyfarch yn ôl eich rhyw.\nMae'r wybodaeth hon ar gael i'r cyhoedd.",
        "email": "E-bost",
-       "prefs-help-realname": "* Enw iawn (dewisol): Os ydych yn dewis ei roi, fe fydd yn cael ei ddefnyddio er mwyn rhoi cydnabyddiaeth i chi am eich gwaith.",
+       "prefs-help-realname": "* Enw iawn yn ddewisol.\nOs ydych yn dewis ei roi, fe fydd yn cael ei ddefnyddio er mwyn rhoi cydnabyddiaeth i chi am eich gwaith.",
        "prefs-help-email": "Os ydych yn dewis gosod eich cyfeiriad e-bost yna gallwn anfon cyfrinair newydd atoch os aiff yr un gwreiddiol yn angof gennych.",
        "prefs-help-email-others": "Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen defnyddiwr neu eich tudalen sgwrs, heb ddatguddio'ch manylion personol.",
        "prefs-help-email-required": "Cyfeiriad e-bost yn angenrheidiol.",
        "prefs-tokenwatchlist": "Tocyn",
        "prefs-diffs": "Cymharu golygiadau ('gwahan')",
        "prefs-help-prefershttps": "Bydd y dewis yma'n cael ei roi ar waith y tro nesaf i chi fewngofnodi.",
+       "prefswarning-warning": "Rydych wedi newid eich Dewisiadau, ac nid ydynt eto wedi'u cadw.\nOs gadewch y dudalen hon heb glicio \"$1\" yna fe gollwch y newidiadau hyn.",
        "prefs-tabs-navigation-hint": "Awgrym: Gallwch ddefnyddio'r allweddellau sy'n saethau i'r chwith neu i'r dde i lywio rhwng y tabiau ar restr y tabiau.",
        "email-address-validity-valid": "Y cyfeiriad e-bost yn ymddangos yn un dilys",
        "email-address-validity-invalid": "Rhowch gyfeiriad e-bost dilys",
        "right-move": "Symud tudalennau",
        "right-move-subpages": "Symud tudalennau gyda'u his-dudalennau",
        "right-move-rootuserpages": "Symud prif dudalennau defnyddwyr",
+       "right-move-categorypages": "Symud tudalennau categori",
        "right-movefile": "Symud ffeiliau",
        "right-suppressredirect": "Peidio â chreu ailgyfeiriad o'r hen enw wrth symud tudalen",
        "right-upload": "Uwchlwytho ffeiliau",
        "right-deletedtext": "Gweld ysgrifen sydd wedi ei ddileu a newidiadau rhwng fersiynau ar ôl eu dileu",
        "right-browsearchive": "Chwilio drwy tudalennau dilëedig",
        "right-undelete": "Adfer tudalen dilëedig",
-       "right-suppressrevision": "Adolygu ac adfer diwygiadau sydd wedi eu cuddio rhag gweinyddwyr",
+       "right-suppressrevision": "Gweld, cuddio a datguddio adolygiadau arbennig o dudalennau, o olwg pob defnyddiwr.",
+       "right-viewsuppressed": "Gweld adolygiadau sydd wedi eu cuddio",
        "right-suppressionlog": "Gweld logiau preifat",
        "right-block": "Atal defnyddwyr eraill rhag golygu",
        "right-blockemail": "Atal defnyddiwr rhag anfon e-bost",
        "action-move": "symud y dudalen",
        "action-move-subpages": "symud y dudalen a'i is-dudalennau",
        "action-move-rootuserpages": "symud prif dudalennau defnyddwyr",
+       "action-move-categorypages": "symud y tudalennau categori",
        "action-movefile": "symud y ffeil hon",
        "action-upload": "uwchlwytho'r ffeil",
        "action-reupload": "trosysgrifo ffeil sydd eisoes ar gael",
        "recentchanges-legend-heading": "'''Allwedd:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Isod rhestrir pob newid er <strong>'''$2'''</strong> (ymddengys hyd at <strong>'''$1'''</strong> ohonynt).",
+       "rcnotefrom": "Isod rhestrir pob newid er <strong>$3, $4</strong> (ymddengys <strong>$1</strong> ohonynt).",
        "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $3 $2",
        "rcshowhideminor": "$1 golygiadau bychain",
        "rcshowhideminor-show": "Dangoser",
        "windows-nonascii-filename": "Nid yw'r wici hwn yn cynnal enwau ffeiliau sy'n cynnwys nodau arbennig.",
        "fileexists": "Mae ffeil gyda'r enw hwn eisoes yn bodoli; gwiriwch <strong>[[:$1]]</strong> os nad ydych yn sicr bod angen ei newid.\n[[$1|thumb]]",
        "filepageexists": "Mae tudalen ddisgrifiad ar gyfer y ffeil hon eisoes ar gael ar <strong>[[:$1]]</strong>, ond nid oes ffeil o'r enw hwn ar gael ar hyn o bryd.\nNi fydd crynodeb a osodir wrth uwchlwytho yn ymddangos ar y dudalen ddisgrifiad.\nEr mwyn gwneud i'r crynodeb ymddangos yno, bydd raid i chi olygu'r dudalen ddisgrifiad yn unswydd.\n[[$1|thumb]]",
-       "fileexists-extension": "Mae ffeil ag enw tebyg eisoes yn bod: [[$2|thumb]]\n* Enw'r ffeil ar fin ei uwchlwytho: <strong>[[:$1]]</strong>\n* Enw'r ffeil sydd eisoes yn bod: <strong>[[:$2]]</strong>\nDewiswch enw arall os gwelwch yn dda.",
+       "fileexists-extension": "Mae ffeil ag enw tebyg eisoes yn bod: [[$2|thumb]]\n* Enw'r ffeil ar fin ei uwchlwytho: <strong>[[:$1]]</strong>\n* Enw'r ffeil sydd eisoes yn bod: <strong>[[:$2]]</strong>\nYdych chi am ddewis enw mwy manwl?",
        "fileexists-thumbnail-yes": "Ymddengys bod delwedd wedi ei leihau ''(bawd)'' ar y ffeil. [[$1|thumb]]\nCymharwch gyda'r ffeil <strong>[[:$1]]</strong>.\nOs mai'r un un llun ar ei lawn faint sydd ar yr ail ffeil yna does dim angen uwchlwytho llun ychwanegol o faint bawd.",
        "file-thumbnail-no": "Mae <strong>$1</strong> ar ddechrau enw'r ffeil.\nMae'n ymddangos felly bod y ddelwedd wedi ei leihau ''(maint bawd)''.\nOs yw'r ddelwedd ar ei lawn faint gallwch barhau i'w uwchlwytho. Os na, newidiwch enw'r ffeil, os gwelwch yn dda.",
        "fileexists-forbidden": "Mae ffeil gyda'r enw hwn eisoes ar gael, ac ni ellir ei throsysgrifo.\nOs ydych am uwchlwytho'ch ffeil, ewch nôl ac uwchlwythwch hi ac enw newydd arni.\n[[File:$1|thumb|center|$1]]",
        "license": "Trwyddedu:",
        "license-header": "Trwyddedu",
        "nolicense": "Heb ddewis trwydded",
+       "licenses-edit": "Golygu deisiadau twryddedu",
        "license-nopreview": "(Dim rhagolwg ar gael)",
-       "upload_source_url": " (URL dilys, ar gael i'r cyhoedd)",
-       "upload_source_file": " (ffeil ar eich cyfrifiadur)",
+       "upload_source_url": "(y ffeil rydych wedi'i dewis o URL cyhoeddus)",
+       "upload_source_file": "(y ffeil rydych wedi'i dewis o'ch cyfrifiadur)",
+       "listfiles-delete": "dileu",
        "listfiles-summary": "Rhestr yr holl ffeiliau sydd wedi eu huwchlwytho sydd ar y dudalen hon.",
        "listfiles_search_for": "Chwilio am enw'r ddelwedd:",
        "imgfile": "ffeil",
        "filedelete-maintenance": "Mae'r gallu i ddileu ffeiliau a'u hadfer wedi ei anallogi tra bod gwaith cynnal wrthi.",
        "filedelete-maintenance-title": "Ni ellir dileu'r ffeil",
        "mimesearch": "Chwiliad MIME",
-       "mimesearch-summary": "Fe allwch ddefnyddio'r dudalen hon i hidlo'r ffeiliau yn ôl eu math MIME.\nMewnbwn: contenttype/subtype, e.e. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Fe allwch ddefnyddio'r dudalen hon i hidlo'r ffeiliau yn ôl eu math MIME.\nMewnbwn: contenttype/subtype neu contenttype/*, e.e. <code>image/jpeg</code>.",
        "mimetype": "Ffurf MIME:",
        "download": "islwytho",
        "unwatchedpages": "Tudalennau sydd â neb yn eu gwylio",
        "listredirects": "Rhestru'r ail-gyfeiriadau",
        "listduplicatedfiles": "Rhestr y ffeiliau sydd wedi eu dyblygu",
+       "listduplicatedfiles-summary": "Dim ond ffeiliau lleol a gaiff eu hystyried.",
+       "listduplicatedfiles-entry": "Mae [[:File:$1|$1]] yn ddeublyg.",
        "unusedtemplates": "Nodiadau heb eu defnyddio",
        "unusedtemplatestext": "Dyma restr o'r holl dudalennau yn y parth {{ns:template}} nad ydynt wedi eu cynnwys yn unrhyw dudalen arall.\nCofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
        "unusedtemplateswlh": "cysylltiadau eraill",
        "randomincategory": "Tudalen ar hap o blith tudalennau'r categori",
        "randomincategory-invalidcategory": "Nid yw \"$1\" yn enw dilys i gategori.",
        "randomincategory-nopages": "Nid oes unrhyw dudalennau yn y categori [[:Category:$1]].",
+       "randomincategory-category": "Categori:",
+       "randomincategory-legend": "Tudalen ar hap o blith tudalennau'r categori",
        "randomredirect": "Tudalen ailgyfeirio ar hap",
        "randomredirect-nopages": "Does dim tudalennau ailgyfeirio yn y parth \"$1\".",
        "statistics": "Ystadegau",
        "wantedpages-badtitle": "Mae teitl annilys ymhlith y canlyniadau, sef: $1",
        "wantedfiles": "Ffeiliau sydd eu hangen",
        "wantedfiletext-cat": "Mae'r ffeiliau canlynol yn cael eu defnyddio er nad ydynt ar gael. Hwyrach bod ffeiliau o storfeydd allanol hefyd ar y rhestr, serch eu bod ar gael. Bydd y rhain, sydd wedi eu cynnwys yma yn anghywir, yn ymddangos a <del>llinell drwyddynt</del>. Hefyd, mae rhestr o dudalennau sydd a ffeiliau nad ydynt ar gael arnynt draw ar [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Mae'r ffeiliau canlynol yn cael eu defnyddio ond nid ydynt yn bodoli. Yn ychwanegol i hyn, mae tudalen sy'n embedio ffeiliau nad ydynt yn bodoli yn cael eu rhestru yn [[:$1]].",
        "wantedfiletext-nocat": "Mae'r ffeiliau canlynol yn cael eu defnyddio er nad ydynt ar gael. Hwyrach bod ffeiliau o storfeydd allanol hefyd ar y rhestr, serch eu bod ar gael. Bydd y rhain, sydd wedi eu cynnwys yma yn anghywir, yn ymddangos a <del>llinell drwyddynt</del>.",
+       "wantedfiletext-nocat-noforeign": "Mae'r ffeiliau canlynol yn cael eu defnyddio ond nid ydynt yn bodoli.",
        "wantedtemplates": "Nodiadau sydd eu hangen",
        "mostlinked": "Tudalennau yn nhrefn nifer y cysylltiadau iddynt",
        "mostlinkedcategories": "Categorïau yn nhrefn nifer eu haelodau",
        "deadendpagestext": "Nid oes cysylltiad yn arwain at dudalen arall oddi wrth yr un o'r tudalennau isod.",
        "protectedpages": "Tudalennau wedi eu diogelu",
        "protectedpages-indef": "A ddiogelwyd yn ddi-derfyn yn unig",
+       "protectedpages-summary": "Mae'r dudalen hon yn rhestru tudalennau sydd wedi'u gwarchod. Am restr o'r teitlau sydd wedi'u gwarchod ers eu creu, gweler see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "A sgydol-ddiogelwyd yn unig",
        "protectedpages-noredirect": "Cuddio ailgyfeiriadau",
        "protectedpagesempty": "Does dim tudalennau wedi eu diogelu gyda'r paramedrau hyn.",
        "pager-older-n": "{{PLURAL:$1|y $1 cynharach|yr $1 cynharach|y $1 cynharach|y $1 cynharach|y $1 cynharach|y $1 cynharach}}",
        "suppress": "Goruchwylio",
        "querypage-disabled": "Analluogwyd y dudalen arbennig hon er mwyn osgoi iddi andwyo perfformiad y wefan.",
+       "apihelp": "Cymorth API",
+       "apihelp-no-such-module": "Ni chafwyd hyd i fodiwl \"$1\".",
        "booksources": "Ffynonellau llyfrau",
        "booksources-search-legend": "Chwilier am lyfrau",
+       "booksources-search": "Chwilio",
        "booksources-text": "Mae'r rhestr isod yn cynnwys cysylltiadau i wefannau sy'n gwerthu llyfrau newydd a rhai ail-law. Mae rhai o'r gwefannau hefyd yn cynnig gwybodaeth pellach am y llyfrau hyn:",
        "booksources-invalid-isbn": "Ymddengys nad yw'r rhif ISBN hwn yn ddilys; efallai y cafwyd gwall wrth drosglwyddo'r rhif.",
        "specialloguserlabel": "Gwneuthurwr:",
        "listgrouprights-removegroup-self": "Yn gallu tynnu {{PLURAL:$2|grŵp}} oddi ar eich cyfrif eich hunan: $1",
        "listgrouprights-addgroup-self-all": "Yn gallu ychwanegu'r holl grwpiau at eich cyfrif eich hunan",
        "listgrouprights-removegroup-self-all": "Yn gallu tynnu'r holl grwpiau oddi ar eich cyfrif eich hunan",
+       "listgrouprights-namespaceprotection-header": "Cyfyngiadau parth",
        "listgrouprights-namespaceprotection-namespace": "Parth",
        "listgrouprights-namespaceprotection-restrictedto": "Gallu(oedd) yn caniatau i'r defnyddiwr olygu",
+       "trackingcategories": "Categoriau tracio",
+       "trackingcategories-summary": "Mae'r dudalen hon yn rhestru categoriau tracio sy'n cael eu creu'n otomatig gan feddalwedd MediaWiki. Gellir newid eu henwau drwy addasu'r negeseuon ym mharthenw {{ns:8}}.",
+       "trackingcategories-msg": "Categori tracio",
        "trackingcategories-name": "Enw'r neges",
+       "trackingcategories-desc": "Meincnodau derbyn categori",
+       "noindex-category-desc": "ni chaiff y dudalen ymweliad gan robot gan ei bod yn cynnwys y gair lledrith <code><nowiki>__NOINDEX__</nowiki></code> ynddi.",
+       "post-expand-template-inclusion-category-desc": "Mae maint y dudalen yn fwy na <code>$wgMaxArticleSize</code> wedi cynnyddu'r Nodion, felly ni chynyddwyd rhai Nodion.",
+       "broken-file-category-desc": "Mae'r dudalen yn cynnwys cyswllt sydd wedi'i dorri (dolen i ffeil nad yw'n bod).",
        "trackingcategories-nodesc": "Dim disgrifiad ar gael.",
        "trackingcategories-disabled": "Categorïau yr analluogwyd",
        "mailnologin": "Does dim cyfeiriad i'w anfon iddo",
        "mywatchlist": "Rhestr wylio",
        "watchlistfor2": "Yn ôl gofyn $1 $2",
        "nowatchlist": "Mae eich rhestr wylio'n wag.",
-       "watchlistanontext": "Rhaid $1 er mwyn gweld neu ddiwygio'ch rhestr wylio.",
+       "watchlistanontext": "Rhaid mewngofnodi er mwyn gweld neu olygu'r rhestr wylio.",
        "watchnologin": "Nid ydych wedi mewngofnodi",
        "addwatch": "Ychwanegu at y rhestr wylio",
        "addedwatchtext": "Mae'r dudalen \"[[:$1|$1]]\" wedi cael ei hychwanegu at eich [[Special:Watchlist|rhestr wylio]].\nPan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos ar y rhestr honno.",
+       "addedwatchtext-short": "Mae'r dudalen \"$1\"  wedi'i hychwanegu i'ch rhestr wylio.",
        "removewatch": "Tynnu oddi ar eich rhestr wylio",
        "removedwatchtext": "Mae'r dudalen \"[[:$1]]\" wedi'i thynnu oddi ar [[Special:Watchlist|eich rhestr wylio]].",
+       "removedwatchtext-short": "Mae'r dudalen \"$1\" wedi'i thynnu o'ch tudalen wylio.",
        "watch": "Gwylio",
        "watchthispage": "Gwylier y dudalen hon",
        "unwatch": "Stopio gwylio",
        "watchlist-details": "{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs ar wahan.",
        "wlheader-enotif": "Galluogwyd hysbysiadau trwy e-bost.",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
-       "wlnote": "{{PLURAL:$1|Ni fu unrhyw newid|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf}} yn ystod {{PLURAL:$2||yr awr|y ddwyawr|y teirawr|y \"$2\" awr|y(r) \"$2\" awr}} ddiwethaf, fel ag yr oedd am $4, $3.",
-       "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r  newidiadau.",
+       "wlnote": "Isod, {{PLURAL:$1|yw'r golygiad diweddaraf |yw'r golygiadau diweddaraf <strong>$1</strong> changes}} yn y {{PLURAL:$2|hour|<strong>$2</strong> awr}}, fel ag y mae ar $3, $4.",
+       "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r newidiadau.",
        "watchlist-options": "Dewisiadau ar gyfer y rhestr wylio",
        "watching": "Wrthi'n ychwanegu...",
        "unwatching": "Wrthi'n tynnu...",
        "exbeforeblank": "y cynnwys cyn blancio oedd: '$1'",
        "delete-confirm": "Dileu \"$1\"",
        "delete-legend": "Dileu",
-       "historywarning": "'''Rhybudd:''' bu tua $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}} yn hanes y dudalen rydych ar fin ei dileu:",
+       "historywarning": "<strong>Rhybudd:</strong> bu tua $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}} yn hanes y dudalen rydych ar fin ei dileu:",
        "confirmdeletetext": "Rydych chi ar fin dileu tudalen neu ddelwedd, ynghŷd â'i hanes, o'r data-bas, a hynny'n barhaol.\nOs gwelwch yn dda, cadarnhewch eich bod chi wir yn bwriadu gwneud hyn, eich bod yn deall y canlyniadau, ac yn ei wneud yn ôl [[{{MediaWiki:Policy-url}}|polisïau {{SITENAME}}]].",
        "actioncomplete": "Wedi cwblhau'r weithred",
        "actionfailed": "Methodd y weithred",
        "delete-edit-reasonlist": "Golygu rhestr y rhesymau dros ddileu",
        "delete-toobig": "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon.\nCyfyngwyd ar y gallu i ddileu tudalennau sydd wedi eu golygu cymaint â hyn, er mwyn osgoi amharu ar weithrediad databas {{SITENAME}} yn ddamweiniol.",
        "delete-warning-toobig": "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon.\nGallai dileu tudalen, gyda hanes golygu cymaint â hyn iddi, beri dryswch i weithrediadau'r databas ar {{SITENAME}}; ewch ati'n ofalus.",
+       "deleteprotected": "Ni allwch ddileu'r dudalen hon gan ei bod wedi'i chloi.",
        "deleting-backlinks-warning": "'''Rhybudd:''' Mae [[Special:WhatLinksHere/{{FULLPAGENAME}}|tudalennau eraill]] yn cysylltu i'r dudalen yr ydych ar fin ei dileu, neu'n trawsgynnwys y dudalen hon.",
        "rollback": "Gwrthdroi golygiadau",
-       "rollback_short": "Gwrthdroi",
        "rollbacklink": "gwrthdröer",
        "rollbacklinkcount": "gwrthdröer $1 {{PLURAL:$1||golygiad|olygiad|golygiad}}",
        "rollbacklinkcount-morethan": "gwrthdröer mwy na $1 {{PLURAL:$1||golygiad|olygiad|golygiad}}",
        "protect-othertime": "Cyfnod arall:",
        "protect-othertime-op": "cyfnod arall",
        "protect-existing-expiry": "Ar hyn o bryd daw'r gwarchod i ben am: $3, $2",
+       "protect-existing-expiry-infinity": "Diwedd amser: tragwyddoldeb",
        "protect-otherreason": "Rheswm arall:",
        "protect-otherreason-op": "Rheswm arall",
        "protect-dropdown": "*Rhesymau cyffredin dros ddiogelu\n** Fandaliaeth yn rhemp\n** Sbam yn rhemp\n** Ymrafael golygu gwrthgynhyrchiol\n** Tudalen aml ei defnydd",
        "sp-contributions-newbies-sub": "Ar gyfer cyfrifon newydd",
        "sp-contributions-newbies-title": "Cyfraniadau defnyddwyr ar gyfer cyfrifon newydd",
        "sp-contributions-blocklog": "lòg blocio",
+       "sp-contributions-suppresslog": "atal cyfraniadau'r defnyddiwr",
        "sp-contributions-deleted": "cyfraniadau defnyddiwr dileedig",
        "sp-contributions-uploads": "uwchlwythiadau",
        "sp-contributions-logs": "logiau",
        "autoblockid": "Awtoflocio #$1",
        "block": "Rhwystro defnyddiwr",
        "unblock": "Dad-rwystro defnyddiwr",
-       "blockip": "Rhwystro'r defnyddiwr",
+       "blockip": "Rhwystro'r {{GENDER:$1|defnyddiwr}}",
        "blockip-legend": "Rhwystro'r defnyddiwr",
        "blockiptext": "Defnyddiwch y ffurflen hon i rwystro cyfeiriad IP neu ddefnyddiwr rhag ysgrifennu i'r gronfa ddata. \nDylech chi ddim ond gwneud hyn er mwyn rhwystro fandaliaeth, a chan ddilyn [[{{MediaWiki:Policy-url}}|polisi'r wici]]. \nRhowch reswm dros rwystro'r defnyddiwr (er enghraifft, dywedwch pa dudalen(au) a fandaleiddiwyd).",
        "ipaddressorusername": "Cyfeiriad IP neu enw defnyddiwr:",
        "ipb-unblock-addr": "Dadflocio $1",
        "ipb-unblock": "Dadflocio enw defnyddiwr neu gyfeiriad IP",
        "ipb-blocklist": "Dangos y blociau cyfredol",
-       "ipb-blocklist-contribs": "Cyfraniadau $1",
+       "ipb-blocklist-contribs": "Cyfraniadau {{GENDER:$1|$1}}",
        "unblockip": "Dadflocio defnyddiwr",
        "unblockiptext": "Defnyddiwch y ffurflen isod i ail-alluogi golygiadau gan ddefnyddiwr neu o gyfeiriad IP a fu gynt wedi'i flocio.",
        "ipusubmit": "Tynnu'r rhwystr hwn",
        "unblocked": "Mae [[User:$1|$1]] wedi cael ei ddad-flocio",
        "unblocked-range": "Dadrwystrir $1",
        "unblocked-id": "Tynnwyd rhwystr $1",
+       "unblocked-ip": "Mae [[Special:Contributions/$1|$1]] wedi ei atal.",
        "blocklist": "Defnyddwyr a rwystrwyd",
        "ipblocklist": "Defnyddwyr a rwystrwyd",
        "ipblocklist-legend": "Dod o hyd i ddefnyddiwr a rwystrwyd",
        "movepagetalktext": "Bydd y dudalen sgwrs yn symud gyda'r dudalen hon '''onibai:'''\n*bod tudalen sgwrs wrth yr enw newydd yn bodoli'n barod\n*bod y blwch isod heb ei farcio.\n\nOs felly, gallwch symud y dudalen sgwrs neu ei gyfuno ar ôl symud y dudalen ei hun.",
        "movearticle": "Symud y dudalen:",
        "moveuserpage-warning": "'''Sylwer:''' Yr ydych ar fin symud tudalen defnyddiwr. Sylwch mai'r dudalen yn unig a gaiff ei symud ac ''na fydd'' y defnyddiwr yn cael ei ail-enwi.",
+       "movecategorypage-warning": "<strong>Rhybudd:</strong> Rydych ar fin dileu categori. Sylwch mai dim ond y dudalen a gaiff ei symud, a bydd y tudalennau o fewn yr hen gategori yn aros fel ag yr oeddent.",
        "movenologintext": "Mae'n rhaid bod yn ddefnyddiwr cofrestredig a'ch bod wedi [[Special:UserLogin|mewngofnodi]] cyn medru symud tudalen.",
        "movenotallowed": "Nid oes caniatâd gennych i symud tudalennau.",
        "movenotallowedfile": "Nid yw'r gallu ganddoch i symud ffeiliau.",
        "cant-move-user-page": "Nid yw'r gallu ganddoch i symud tudalennau defnyddwyr (heblaw am isdudalennau).",
        "cant-move-to-user-page": "Nid yw'r gallu ganddoch i symud tudalen i dudalen defnyddiwr (heblaw am i isdudalen defnyddiwr).",
+       "cant-move-category-page": "Nid oes gennych yr hawl i symud categoriau.",
+       "cant-move-to-category-page": "Nid oes gennych yr hawl i droi tudalen yn gategori.",
        "newtitle": "I'r teitl newydd:",
        "move-watch": "Gwylier y dudalen hon",
        "movepagebtn": "Symud y dudalen",
        "thumbnail-temp-create": "Wedi methu gwneud ffeil mân-lun dros dro",
        "thumbnail-dest-create": "Wedi methu rhoi'r mân-lun ar gadw yn y man y gofynwyd iddo fod",
        "thumbnail_invalid_params": "Paramedrau maint mân-lun annilys",
+       "thumbnail_toobigimagearea": "Ffeil a'i mhaint yn fwy na $1",
        "thumbnail_dest_directory": "Methwyd â chreu'r cyfeiriadur cyrchfan",
        "thumbnail_image-type": "Nid yw'r math hwn o ddelwedd yn cael ei gynnal",
        "thumbnail_gd-library": "Mae ffurfwedd y llyfrgell GD yn anghyflawn: y ffwythiant $1 yn eisiau",
        "import": "Mewnforio tudalennau",
        "importinterwiki": "Mewnforiad traws-wici",
        "import-interwiki-text": "Dewiswch wici a thudalen i'w mewnforio.\nFe gedwir dyddiadau ac enwau'r golygwyr ar gyfer y diwygiadau i'r dudalen.\nMae cofnod o bob weithred o fewnforio i'w gweld ar y [[Special:Log/import|lòg mewnforio]].",
+       "import-interwiki-sourcewiki": "Ffynhonnell y wici:",
+       "import-interwiki-sourcepage": "Ffynhonnell (tud.)",
        "import-interwiki-history": "Copïer yr holl fersiynau yn hanes y dudalen hon",
        "import-interwiki-templates": "Cynhwyser pob nodyn",
        "import-interwiki-submit": "Mewnforio",
        "import-token-mismatch": "Collwyd data'r sesiwn. Ceisiwch eto.",
        "import-invalid-interwiki": "Ni ellir uwchlwytho o'r wici dewisedig.",
        "import-error-edit": "Ni fewnforiwyd y dudalen \"$1\" oherwydd nad yw'r gallu i'w golygu gennych.",
-       "import-error-create": "Ni fewnforiwyd y dudalen \"$1\" oherwydd nad yw'r gallu i'w chreu gennych.",
+       "import-error-create": "Ni fewnforiwyd y dudalen \"$1\" oherwydd nad yw'r hawl i'w chreu gennych.",
        "import-error-interwiki": "Ni fewnforwyd y dudalen \"$1\" oherwydd bod yr enw arni wedi ei neilltuo at ddiben cysylltu'n allanol (rhyngwici).",
        "import-error-special": "Ni fewnforiwyd y dudalen \"$1\" oherwydd ei bod yn perthyn i barth arbennig lle nad oes tudalennau i'w cael.",
        "import-error-invalid": "Ni fewnforwyd y dudalen \"$1\" oherwydd bod yr enw arni yn annilys.",
        "import-error-unserialize": "Ni allwyd ddad-gyfresu'r diwygiad $2 o'r dudalen '$1'. Adroddwyd bod y diwygiad yn defnyddio'r model cynnwys $3, wedi ei gyfresu fel $4.",
+       "import-error-bad-location": "Ni ellir storio golygiad $2 ar y wici hwn, gan nad yw'r model hwnnw ($3) yn cael ei gynnal ar y dudalen.",
        "import-options-wrong": "{{PLURAL:$2|Dewis|Dewis|Dewisiadau}} annilys: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Mae teitl y dudalen wraidd a roddir yn annilys.",
        "import-rootpage-nosubpage": "Nid yw'r parth \"$1\", sef parth y brif dudalen y mewnforir iddi, yn caniatau is-dudalennau.",
        "importlogpage": "Lòg mewnforio",
        "importlogpagetext": "Cofnodion mewnforio tudalennau ynghyd â'u hanes golygu oddi ar wicïau eraill, gan weinyddwyr.",
        "import-logentry-upload": "wedi mewnforio [[$1]] trwy uwchlwytho ffeil",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} wedi'i fewnforio",
        "import-logentry-interwiki": "wedi symud $1 (traws-wici)",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} wedi'i fewnforio o $2",
        "javascripttest": "Profi JavaScript",
-       "javascripttest-title": "Yn cynnal profion $1",
        "javascripttest-pagetext-noframework": "Neilltuwyd y dudalen hon at gynnal profion JavaScript.",
        "javascripttest-pagetext-unknownframework": "Ni nabyddwyd y fframwaith profi \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Gweithred dienw \"$1\"",
        "javascripttest-pagetext-frameworks": "Dewiswch un o'r fframweithiau profi canlynol: $1",
        "javascripttest-pagetext-skins": "Dewiswch wedd i gynnal profion arni:",
        "javascripttest-qunit-intro": "Gweler y [$1 wybodaeth am y profion] ar mediawiki.org.",
-       "javascripttest-qunit-heading": "Cyfres brofi MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Eich tudalen defnyddiwr",
        "tooltip-pt-anonuserpage": "Y tudalen defnyddiwr ar gyfer y cyfeiriad IP yr ydych yn ei ddefnyddio wrth olygu",
        "tooltip-pt-mytalk": "Eich tudalen sgwrs",
        "tooltip-pt-mycontris": "Rhestr eich cyfraniadau yn nhrefn amser",
        "tooltip-pt-login": "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
        "tooltip-pt-logout": "Allgofnodi",
+       "tooltip-pt-createaccount": "Rydym yn argymell eich bod yn creu cyfri ac yn menwgofnodi. Fodd bynnag, dydy hyn ddim yn orfodol",
        "tooltip-ca-talk": "Sgwrsio am y dudalen",
        "tooltip-ca-edit": "Gallwch olygu'r dudalen hon. Da o beth fyddai defnyddio'r botwm 'Dangos rhagolwg' cyn rhoi ar gadw.",
        "tooltip-ca-addsection": "Ychwanegu adran newydd",
        "newimages-summary": "Mae'r dudalen arbennig hon yn dangos y ffeiliau a uwchlwythwyd yn ddiweddar.",
        "newimages-legend": "Hidlo",
        "newimages-label": "Enw'r ffeil (neu ran ohono):",
+       "newimages-showbots": "Dangoswch uwchlwythiadau'r botiaid",
        "noimages": "Does dim byd i'w weld.",
        "ilsubmit": "Chwilio",
        "bydate": "yn ôl dyddiad",
        "autosumm-replace": "Gwacawyd y dudalen a gosod y canlynol yn ei le: '$1'",
        "autoredircomment": "Yn ailgyfeirio at [[$1]]",
        "autosumm-new": "Crëwyd tudalen newydd yn dechrau gyda '$1'",
+       "autosumm-newblank": "Rydych wedi creu tudalen wag",
        "lag-warn-normal": "Hwyrach na ddangosir isod y newidiadau a ddigwyddodd o fewn y $1 {{PLURAL:$1|eiliad|eiliad|eiliad|eiliad|eiliad|eiliad}} ddiwethaf.",
        "lag-warn-high": "Mae gweinydd y data-bas ar ei hôl hi: efallai nad ymddengys newidiadau o fewn y $1 {{PLURAL:$1|eiliad|eiliad|eiliad|eiliad|eiliad|eiliad}} ddiwethaf ar y rhestr.",
        "watchlistedit-normal-title": "Golygu'r rhestr wylio",
        "watchlistedit-raw-done": "Diweddarwyd eich rhestr wylio.",
        "watchlistedit-raw-added": "Ychwanegwyd {{PLURAL:$1|1 teitl|$1 teitl|$1 deitl|$1 theitl|$1 theitl|$1 o deitlau}}:",
        "watchlistedit-raw-removed": "Tynnwyd {{PLURAL:$1|1 teitl|$1 teitl|$1 deitl|$1 theitl|$1 theitl|$1 o deitlau}}:",
+       "watchlistedit-clear-title": "Cliriwyd y rhestr wylio",
+       "watchlistedit-clear-legend": "Clirier y rhestr wylio",
+       "watchlistedit-clear-explain": "Bydd holl deitlau eich rhestr wylio'n cael eu tynnu oddi yno",
+       "watchlistedit-clear-titles": "Teitlau:",
+       "watchlistedit-clear-submit": "Clrio'r rhestr wylio (Mae hyn yn barhaol!)",
+       "watchlistedit-clear-done": "Cliriwyd eich rhestr wylio.",
+       "watchlistedit-clear-removed": "Cliriwyd {{PLURAL:$1|1 title was|$1 teitl}}:",
+       "watchlistedit-too-many": "Mae na ormod o dudalennau i'w harddangos yma.",
+       "watchlisttools-clear": "Clirier y rhestr wylio",
        "watchlisttools-view": "Gweld newidiadau perthnasol",
        "watchlisttools-edit": "Gweld a golygu'r rhestr wylio",
        "watchlisttools-raw": "Golygu'r rhestr wylio syml",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|sgwrs]])",
-       "unknown_extension_tag": "Tag estyniad anhysbys \"$1\"",
        "duplicate-defaultsort": "Rhybudd: Mae'r allwedd trefnu diofyn \"$2\" yn gwrthwneud yr allwedd trefnu diofyn blaenorol \"$1\".",
+       "duplicate-displaytitle": "<strong>Gofal:</strong> Mae arddangos \"$2\" yn clirio'r arddangosiadau cynharach \"$1\".",
+       "invalid-indicator-name": "<strong>Gan bwyll:</strong> Ni ddylid gadael y man nodi statws  <code>name</code> yn wag.",
        "version": "Fersiwn",
        "version-extensions": "Estyniadau gosodedig",
-       "version-skins": "Gweddau",
+       "version-skins": "Gweddau a osodwyd",
        "version-specialpages": "Tudalennau arbennig",
        "version-parserhooks": "Bachau dosrannydd",
        "version-variables": "Newidynnau",
        "version-hook-name": "Enw'r bachyn",
        "version-hook-subscribedby": "Tanysgrifwyd gan",
        "version-version": "(Fersiwn $1)",
+       "version-no-ext-name": "[dim enw]",
        "version-license": "Trwydded MediaWiki",
        "version-ext-license": "Trwydded",
        "version-ext-colheader-name": "Estyniad",
+       "version-skin-colheader-name": "Croen",
        "version-ext-colheader-version": "Fersiwn",
        "version-ext-colheader-license": "Trwydded",
        "version-ext-colheader-description": "Disgrifiad",
        "version-entrypoints": "URLs y mannau cyflwyno",
        "version-entrypoints-header-entrypoint": "Man cyflwyno",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "llyfrgelloedd a osodwyd ar eich cyfer",
+       "version-libraries-library": "Llyfrgell",
+       "version-libraries-version": "Fersiwn",
        "redirect": "Ailgyfeirio yn ôl enw ffeil, defnyddiwr, tudalen neu ID y diwygiad",
        "redirect-legend": "Ailgyfeirio i ffeil neu dudalen",
        "redirect-summary": "Mae'r dudalen arbennig hon yn ailgyfeirio at ffeil (o roi enw'r ffeil), at dudalen (o roi ID rhyw ddiwygiad o'r dudalen neu ID y dudalen), neu at dudalen defnyddiwr (o roi rhif ID y defnyddiwr).\nDefnydd: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], neu [[{{#Special:Redirect}}/user/101]].",
        "specialpages-group-wiki": "Data ac offer",
        "specialpages-group-redirects": "Tudalennau arbennig ailgyfeirio",
        "specialpages-group-spam": "Offer sbam",
+       "specialpages-group-developer": "Arfau ar gyfer y Datblygwr",
        "blankpage": "Tudalen wag",
        "intentionallyblankpage": "Gadawyd y dudalen hon yn wag o fwriad",
        "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Gosodwch ddarnau o ymadroddion rheolaidd (y rhan sy'n cael ei osod rhwng y //) isod\n#Caiff y rhain eu cysefeillio gyda URL y delweddau allanol (a chyswllt poeth atynt)\n#Dangosir y rhai sy'n cysefeillio fel delweddau; dangosir cyswllt at y ddelwedd yn unig ar gyfer y lleill\n#Caiff y llinellau sy'n dechrau gyda # eu trin fel sylwadau\n#Nid yw'n gwahaniaethu rhwng llythrennau mawr a bach\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
        "compare-revision-not-exists": "Nid yw'r diwygiad a enwyd ar gael.",
        "dberr-problems": "Mae'n ddrwg gennym! Mae'r wefan hon yn dioddef anawsterau technegol.",
        "dberr-again": "Oedwch am ychydig funudau cyn ceisio ail-lwytho.",
-       "dberr-info": "(Ni ellir cysylltu â gweinydd y bas data: $1)",
-       "dberr-info-hidden": "(Ni ellir cysylltu â gweinydd y gronfa ddata)",
+       "dberr-info": "(Ni ellir cysylltu â chronfa ddata: $1)",
+       "dberr-info-hidden": "(Ni ellir cysylltu â'r gronfa ddata)",
        "dberr-usegoogle": "Yn y cyfamser gallwch geisio chwilio gyda Google.",
        "dberr-outofdate": "Sylwch y gall eu mynegeion o'n cynnwys fod ar ei hôl hi.",
        "dberr-cachederror": "Dyma gopi o'r dudalen a ofynnwyd amdani, a dynnwyd o'r celc. Mae'n bosib nad y fersiwn diweddaraf yw'r copi hwn.",
        "htmlform-chosen-placeholder": "Dewiswch opsiwn",
        "htmlform-cloner-create": "Ychwaneger rhes",
        "htmlform-cloner-delete": "Tynner i ffwrdd",
+       "htmlform-cloner-required": "Mae angen o leiaf un peth!",
        "sqlite-has-fts": "$1 gyda chymorth chwilio yr holl destun",
        "sqlite-no-fts": "$1 heb gymorth chwiliad yr holl destun",
        "logentry-delete-delete": "Dileodd $1 y dudalen $3",
        "revdelete-uname-unhid": "datguddiwyd yr enw defnyddiwr",
        "revdelete-restricted": "cyfyngwyd ar allu gweinyddwyr i weld",
        "revdelete-unrestricted": "tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld",
+       "logentry-merge-merge": "Mae $1 {{GENDER:$2|wedi cyfuno}} $3 i fewn i $4 (golygiadau hyd at $5)",
        "logentry-move-move": "Symudodd $1 y dudalen $3 i $4",
        "logentry-move-move-noredirect": "Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio",
        "logentry-move-move_redir": "{{GENDER:$2|Symudwyd}} y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio",
        "logentry-rights-rights": "{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt",
        "logentry-rights-autopromote": "{{GENDER:$2|Dyrchafwyd}} $1 yn awtomatig o $4 i $5",
+       "logentry-upload-upload": "Mae $1 {{GENDER:$2|wedi uwchlwytho}} $3",
+       "logentry-upload-overwrite": "Mae $1 {{GENDER:$2|wedi uwchlwytho}} fersiwn newydd o $3",
+       "logentry-upload-revert": "Mae $1 {{GENDER:$2|wedi uwchlwytho}} $3",
        "rightsnone": "(dim)",
        "revdelete-summary": "crynodeb golygu",
        "feedback-bugornote": "Os ydych yn barod i ddisgrifio problem technegol yn fanwl gallwch [$1 gyflwyno adroddiad am y bỳg]. Fel arall, gallwch ddefnyddio'r ffurflen syml isod. Fe roddir eich sylwadau ar y dudalen \"[$3 $2]\", ynghyd â'ch enw defnyddiwr ac enw'r gweinydd sydd ar waith gennych.",
        "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\"",
        "expand_templates_remove_nowiki": "Cuddio'r tagiau <nowiki> wrth ehangu",
        "expand_templates_generate_xml": "Dangos y goeden dosrannu XML",
        "expand_templates_generate_rawhtml": "Dangos HTML crai",
-       "expand_templates_preview": "Rhagolwg"
+       "expand_templates_preview": "Rhagolwg",
+       "pagelanguage": "Dewis iaith y dudalen",
+       "pagelang-name": "Tudalen",
+       "pagelang-language": "Iaith",
+       "pagelang-use-default": "Defnyddier yr iaith arferol",
+       "pagelang-select-lang": "Dewis iaith",
+       "right-pagelang": "Newidiwch iaith y dudalen",
+       "action-pagelang": "newidiwch iaith y dudalen",
+       "log-name-pagelang": "Newidiwch iaith y log",
+       "log-description-pagelang": "Dyma log o newidiadau yn nhudalen yr ieithoedd",
+       "logentry-pagelang-pagelang": "Newidiodd $1 {{GENDER:$2}} iaith ydudalen am $3 o $4 i $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (galluogi)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''diffoddwyd''')",
+       "mediastatistics": "Ystadegau cyfryngau",
+       "mediastatistics-summary": "Ystadegau am fathau o ffeiliau a uwchlwythwyd. Mae hyn yn cynnwys y fersiynau diweddaraf o'r ffeil yn unig.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 beit|$1 beit}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Math o MIME",
+       "mediastatistics-table-extensions": "Estyniadau posibl",
+       "mediastatistics-table-count": "Nifer o ffeiliau",
+       "mediastatistics-table-totalbytes": "Cyfanswm eu maint",
+       "mediastatistics-header-unknown": "Anhysbys",
+       "mediastatistics-header-bitmap": "Delweddau Bitmap",
+       "mediastatistics-header-drawing": "Lluniau fector",
+       "mediastatistics-header-audio": "Sain",
+       "mediastatistics-header-video": "Fideos",
+       "mediastatistics-header-multimedia": "Cyfryngau cyfoethog",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Testun",
+       "mediastatistics-header-executable": "Gweithredadwy",
+       "mediastatistics-header-archive": "Fformat wedi'i gywasgu",
+       "json-warn-trailing-comma": "Tynnwyd $1 {{PLURAL:$1|coma}} o JSON",
+       "json-error-unknown": "Roedd gwall gyda JSON. Gwall: $1",
+       "json-error-depth": "Aethpwyd dros y dyfnder mwyaf a ganiateir",
+       "json-error-state-mismatch": "JSON gwallus neu annilys",
+       "json-error-syntax": "Gwall mewn cystrawen",
+       "json-error-utf8": "Llythrennau UTF-8 gwallus, o boib gan godio anghywir"
 }
index ec6594d..8604ac9 100644 (file)
@@ -74,7 +74,7 @@
        "tog-shownumberswatching": "Vis antal brugere, der overvåger",
        "tog-oldsig": "Nuværende signatur:",
        "tog-fancysig": "Behandl signatur som wikitekst uden automatisk henvisning",
-       "tog-uselivepreview": "Brug automatisk forhåndsvisning (er på forsøgsstadiet)",
+       "tog-uselivepreview": "Benyt løbende forhåndsvisning",
        "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
        "tog-watchlisthideown": "Skjul egne ændringer i overvågningslisten",
        "tog-watchlisthidebots": "Skjul ændringer fra bots i overvågningslisten",
        "otherlanguages": "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}}.",
        "protectedpage": "Beskyttet side",
        "download": "DownloadHerunterladen",
        "unwatchedpages": "Ikke overvågede sider",
        "listredirects": "Henvisningsliste",
-       "unusedtemplates": "Ikke brugte skabeloner",
+       "unusedtemplates": "Ubrugte skabeloner",
        "unusedtemplatestext": "Her opremses alle sider i {{ns:template}}-navnerummet, der ikke er inkluderet på andre sider.\nHusk at kontrollere for andre henvisninger til skabelonerne før de slettes.",
        "unusedtemplateswlh": "andre henvisninger",
        "randompage": "Tilfældig side",
        "specialpage-empty": "Der er ingen resultater at vise.",
        "lonelypages": "Forældreløse sider",
        "lonelypagestext": "Følgende sider er ikke henvist til eller inkluderet på andre sider på {{SITENAME}}:",
-       "uncategorizedpages": "Ukategoriserede sider",
-       "uncategorizedcategories": "Ukategoriserede kategorier",
+       "uncategorizedpages": "Ikke kategoriserede sider",
+       "uncategorizedcategories": "Ikke kategoriserede kategorier",
        "uncategorizedimages": "Ikke kategoriserede filer",
        "uncategorizedtemplates": "Ikke kategoriserede skabeloner",
        "unusedcategories": "Ubrugte kategorier",
        "querypage-disabled": "Denne specialside er deaktiveret af hensyn til ydeevnen.",
        "booksources": "Bogkilder",
        "booksources-search-legend": "Søgning efter bøger",
+       "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.",
        "specialloguserlabel": "Udført af:",
        "trackingcategories-desc": "Optagelseskriterier for kategori",
        "noindex-category-desc": "Siden indekseres ikke af robotter, fordi den indeholder det magiske ord <code><nowiki>__NOINDEX__</nowiki></code> og er i et navnerum, hvor dette flag er tilladt.",
        "index-category-desc": "Siden indeholder <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerum, hvor dette flag er tilladt), og bliver derfor indekseret af robotter, hvor den normalt ikke ville blive det.",
+       "trackingcategories-nodesc": "Ingen beskrivelse tilgængelig.",
+       "trackingcategories-disabled": "Kategorien er deaktiveret",
        "mailnologin": "Du er ikke logget på",
        "mailnologintext": "Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.",
        "emailuser": "E-mail til denne bruger",
        "deleteprotected": "Du kan ikke slette denne side, fordi den er beskyttet.",
        "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] linker til eller inkluderer den side, du er ved at slette.",
        "rollback": "Fjern redigeringer",
-       "rollback_short": "Fjern redigering",
        "rollbacklink": "rul tilbage",
        "rollbacklinkcount": "tilbagefør $1 {{PLURAL:$1|redigering|redigeringer}}",
        "rollbacklinkcount-morethan": "tilbagefør mere end $1 {{PLURAL:$1|redigering|redigeringer}}",
        "import-logentry-interwiki": "$1 blev importeret (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importeret fra $2",
        "javascripttest": "Test af JavaScript",
-       "javascripttest-title": "Kører $1 test",
        "javascripttest-pagetext-noframework": "Denne side er reserveret til at teste JavaScript.",
        "javascripttest-pagetext-unknownframework": "Ukendt testmiljø \"$1\".",
        "javascripttest-pagetext-frameworks": "Vælg venligst en af de følgende testmiljøer: $1",
        "javascripttest-pagetext-skins": "Vælg et udseende, som testene skal køres med:",
        "javascripttest-qunit-intro": "Se [$1 testdokumentationen] på mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit testsuite",
        "tooltip-pt-userpage": "Din brugerside",
        "tooltip-pt-anonuserpage": "Brugersiden for den ip-adresse du redigerer som",
        "tooltip-pt-mytalk": "Din diskussionsside",
        "watchlisttools-edit": "Rediger overvågningsliste",
        "watchlisttools-raw": "Rediger rå overvågningsliste",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])",
-       "unknown_extension_tag": "Ukendt tag \"$1\"",
        "duplicate-defaultsort": "Advarsel: Standardsorteringsnøglen \"$2\" tilsidesætter den tidligere sorteringsnøgle \"$1\".",
        "version": "Information om MediaWiki",
        "version-extensions": "Installerede udvidelser",
        "version-license": "MediaWiki Licens",
        "version-ext-license": "Licens",
        "version-ext-colheader-name": "Udvidelse",
+       "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Licens",
        "version-ext-colheader-description": "Beskrivelse",
        "version-ext-colheader-credits": "Forfattere",
        "specialpages-group-wiki": "Data og værktøjer",
        "specialpages-group-redirects": "Specialsider der viderestiller",
        "specialpages-group-spam": "Spamværktøjer",
+       "specialpages-group-developer": "Udviklerværktøjer",
        "blankpage": "Blank side",
        "intentionallyblankpage": "Denne side er bevidst uden indhold.",
        "external_image_whitelist": " #Lad denne linje være som den er<pre>\n#Skriv dele af regulære uttryk (delen som er mellem //) nedenfor\n#Disse vil tjekkes mod URL'er for eksterne billeder\n#De som matcher, vil blive vist som billeder. Øvrige vil kun blive vist som henvisninger til billedet\n#Linjer som begynder med # behandles som kommentarer\n#Der skelnes ikke mellem store og små bogstaver\n\n#Skriv alle delene af regulære udtryk over denne linje. Lad denne linje være som den er</pre>",
        "htmlform-no": "Nej",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Vælg en mulighed",
+       "htmlform-cloner-create": "Tilføj flere",
+       "htmlform-cloner-delete": "Fjern",
+       "htmlform-cloner-required": "Der kræves mindst en værdi.",
        "sqlite-has-fts": "$1 med fuld-tekst søgnings support",
        "sqlite-no-fts": "$1 uden fuld-tekst søgnings support",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
index b0200ec..b528f1e 100644 (file)
        "pool-queuefull": "Poolwarteschlange ist voll",
        "pool-errorunknown": "Unbekannter Fehler",
        "pool-servererror": "Der Poolzählerdienst ist nicht verfügbar ($1).",
+       "poolcounter-usage-error": "Verwendungsfehler: $1",
        "aboutsite": "Über {{SITENAME}}",
        "aboutpage": "Project:Über_{{SITENAME}}",
        "copyright": "Der Inhalt ist verfügbar unter der Lizenz $1, sofern nicht anders angegeben.",
        "mycustomcssprotected": "Du hast keine Berechtigung, diese CSS-Seite zu bearbeiten.",
        "mycustomjsprotected": "Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten.",
        "myprivateinfoprotected": "Du hast keine Berechtigung, deine privaten Informationen zu bearbeiten.",
-       "mypreferencesprotected": "Du hast keine Berechtigung, deine Einstellungen zu bearbeiten.",
+       "mypreferencesprotected": "Du bist nicht berechtigt, deine Einstellungen zu ändern.",
        "ns-specialprotected": "Spezialseiten können nicht bearbeitet werden.",
        "titleprotected": "Eine Seite mit diesem Namen kann nicht angelegt werden.\nDie Sperre wurde durch [[User:$1|$1]] mit der Begründung „<em>$2</em>“ eingerichtet.",
        "filereadonlyerror": "Die Datei „$1“ kann nicht verändert werden, da auf das Dateirepositorium „$2“ nur Lesezugriff möglich ist.\n\nDer Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.",
        "anoneditwarning": "<strong>Warnung:</strong> Du bist nicht angemeldet. Deine IP-Adresse wird öffentlich sichtbar, falls du Bearbeitungen durchführst. Wenn du dich <strong>[$1 anmeldest]</strong> oder <strong>[$2 ein Benutzerkonto erstellst]</strong>, werden deine Bearbeitungen zusammen mit anderen Beiträgen deinem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
-       "selfredirect": "<strong>Warnung:</strong> Du erstellst eine Weiterleitung auf den gleichen Artikel.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung erstellt.",
+       "selfredirect": "<strong>Warnung:</strong> Du leitest auf diese Seite selbst weiter.\nDu hast vermutlich das falsche Weiterleitungsziel angegeben oder du bearbeitest die falsche Seite.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung dennoch erstellt.",
        "missingcommenttext": "Dein Abschnitt enthält keinen Text.",
        "missingcommentheader": "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
        "summary-preview": "Vorschau der Zusammenfassungszeile:",
        "content-model-text": "Klartext",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leeres Objekt",
+       "content-json-empty-array": "Leeres Array",
        "duplicate-args-category": "Seiten, die doppelte Argumente in Vorlagenaufrufen verwenden",
        "duplicate-args-category-desc": "Die Seite enthält Vorlagenaufrufe, die Duplikate von Argumenten verwenden, wie <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> oder <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Achtung:''' Diese Seite enthält zu viele Aufrufe aufwändiger Parserfunktionen.\n\nSie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|ist aktuell $1 Aufruf|sind aktuell $1 Aufrufe}}.",
        "history-feed-empty": "Die angeforderte Seite existiert nicht. Vielleicht wurde sie gelöscht oder verschoben. [[Special:Search|Durchsuche]] {{SITENAME}} nach passenden neuen Seiten.",
        "rev-deleted-comment": "(Zusammenfassung entfernt)",
        "rev-deleted-user": "(Benutzername entfernt)",
-       "rev-deleted-event": "(Logbuchaktion entfernt)",
+       "rev-deleted-event": "(Logbucheinzelheiten entfernt)",
        "rev-deleted-user-contribs": "[Benutzername oder IP-Adresse entfernt – Bearbeitung aus Beiträgen versteckt]",
        "rev-deleted-text-permission": "Diese Version wurde '''gelöscht'''.\nNähere Angaben zum Löschvorgang sowie eine Begründung stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
        "rev-suppressed-text-permission": "Diese Seitenversion wurde <strong>unterdrückt</strong>.\nEinzelheiten können im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Oversight-Logbuch] gefunden werden.",
        "revdelete-legend": "Setzen der Sichtbarkeitseinschränkungen",
        "revdelete-hide-text": "Text der Version",
        "revdelete-hide-image": "Dateiinhalt verstecken",
-       "revdelete-hide-name": "Logbuchaktion und Ziel verstecken",
+       "revdelete-hide-name": "Ziel und Parameter verstecken",
        "revdelete-hide-comment": "Bearbeitungszusammenfassung",
        "revdelete-hide-user": "Benutzername/IP-Adresse des Bearbeiters",
        "revdelete-hide-restricted": "Daten sowohl vor Administratoren als auch anderen Benutzern unterdrücken",
        "uploaderror": "Fehler beim Hochladen",
        "upload-recreate-warning": "'''Achtung: Eine Datei dieses Namens wurde bereits gelöscht oder verschoben.'''\n\nEs folgt ein Auszug aus dem Lösch- und Verschiebungs-Logbuch dieser Datei.",
        "uploadtext": "Benutze dieses Formular, um neue Dateien hochzuladen.\n\nGehe zu der [[Special:FileList|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen. Siehe auch das [[Special:Log/upload|Datei-]] und [[Special:Log/delete|Lösch-Logbuch]].\n\nUm ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden Form:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></code>''' – für ein Vollbild\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|Alternativer Text]]</nowiki></code>''' – für ein 200px breites Bild innerhalb einer Box, mit „Alternativer Text“ als Bildbeschreibung\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></code>''' – für einen direkten Link auf die Datei, ohne Darstellung der Datei",
-       "upload-permitted": "Erlaubte Dateitypen: $1.",
-       "upload-preferred": "Bevorzugte Dateitypen: $1.",
-       "upload-prohibited": "Nicht erlaubte Dateitypen: $1.",
+       "upload-permitted": "{{PLURAL:$2|Erlaubter Dateityp|Erlaubte Dateitypen}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Bevorzugter Dateityp|Bevorzugte Dateitypen}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Nicht erlaubter Dateityp|Nicht erlaubte Dateitypen}}: $1.",
        "uploadlogpage": "Datei-Logbuch",
        "uploadlogpagetext": "Dies ist das Logbuch der hochgeladenen Dateien, siehe auch die [[Special:NewFiles|Galerie neuer Dateien]] für einen visuellen Überblick.",
        "filename": "Dateiname",
        "deleteprotected": "Du kannst diese Seite nicht löschen, da sie geschützt wurde.",
        "deleting-backlinks-warning": "'''Warnung:''' Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
        "rollback": "Zurücksetzen der Änderungen",
-       "rollback_short": "Zurücksetzen",
        "rollbacklink": "Zurücksetzen",
        "rollbacklinkcount": "{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen",
        "rollbacklinkcount-morethan": "Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen",
        "namespace": "Namensraum:",
        "invert": "Auswahl umkehren",
        "tooltip-invert": "Dieses Auswahlfeld anklicken, um Änderungen im gewählten Namensraum und, sofern ausgewählt, dem entsprechenden zugehörigen Namensraum auszublenden",
+       "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)",
        "thumbnail-temp-create": "Die Datei für die temporäre Miniaturansicht konnte nicht erstellt werden",
        "thumbnail-dest-create": "Die Miniaturansicht konnte nicht am vorgesehenen Ort gespeichert werden",
        "thumbnail_invalid_params": "Ungültige Thumbnail-Parameter",
+       "thumbnail_toobigimagearea": "Datei mit Abmessungen größer als $1",
        "thumbnail_dest_directory": "Zielverzeichnis kann nicht erstellt werden.",
        "thumbnail_image-type": "Bildtyp nicht unterstützt",
        "thumbnail_gd-library": "Unvollständige Konfiguration der GD-Bibliothek: Fehlende Funktion $1",
        "import-logentry-interwiki": "importierte „$1“ (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versionen}} von $2 importiert",
        "javascripttest": "JavaScript-Test",
-       "javascripttest-title": "$1-Tests werden durchgeführt",
        "javascripttest-pagetext-noframework": "Diese Seite ist JavaSkript-Tests vorbehalten.",
        "javascripttest-pagetext-unknownframework": "Unbekanntes Framework „$1“.",
+       "javascripttest-pagetext-unknownaction": "Unbekannte Aktion „$1“.",
        "javascripttest-pagetext-frameworks": "Bitte wähle eine der folgenden Prüfumgebungen aus: $1",
        "javascripttest-pagetext-skins": "Wähle eine Benutzeroberfläche zur Durchführung der Tests aus:",
        "javascripttest-qunit-intro": "Siehe die [$1 Dokumentation zu Tests] auf mediawiki.org",
-       "javascripttest-qunit-heading": "MediaWiki-JavaSkript-QUnit-Tester",
        "tooltip-pt-userpage": "Deine Benutzerseite",
        "tooltip-pt-anonuserpage": "Benutzerseite der IP-Adresse von der aus du Änderungen durchführst",
        "tooltip-pt-mytalk": "Deine Diskussionsseite",
        "pageinfo-robot-policy": "Indizierung durch Suchmaschinen",
        "pageinfo-robot-index": "Erlaubt",
        "pageinfo-robot-noindex": "Nicht erlaubt",
-       "pageinfo-watchers": "Anzahl der Beobachter der Seite",
+       "pageinfo-watchers": "Anzahl der Beobachter dieser Seite",
        "pageinfo-few-watchers": "Weniger als {{PLURAL:$1|ein|$1}} Beobachter",
        "pageinfo-redirects-name": "Anzahl der Weiterleitungen zu dieser Seite",
        "pageinfo-redirects-value": "$1",
        "hijri-calendar-m11": "Dhu l-qaʿda",
        "hijri-calendar-m12": "Dhu l-hiddscha",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])",
-       "unknown_extension_tag": "Unbekanntes Parsertag „$1“",
        "duplicate-defaultsort": "Achtung: Der Sortierungsschlüssel „$2“ überschreibt den vorher verwendeten Schlüssel „$1“.",
        "duplicate-displaytitle": "<strong>Warnung:</strong> Der Anzeigetitel „$2“ überschreibt den früheren Anzeigetitel „$1“.",
        "invalid-indicator-name": "<strong>Fehler:</strong> Das Attribut <code>name</code> des Seitenstatusindikators darf nicht leer sein.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikelpfad]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skriptpfad]",
+       "version-libraries": "Installierte Bibliotheken",
+       "version-libraries-library": "Bibliothek",
+       "version-libraries-version": "Version",
        "redirect": "Weiterleitung auf Benutzerseite, Seite, Seitenversion oder Datei",
        "redirect-legend": "Weiterleitung auf eine Benutzerseite, Seite, Seitenversion oder Datei",
        "redirect-summary": "Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seite (Seitenkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter. Benutzung: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].",
        "compare-revision-not-exists": "Die angegebene Version ist nicht vorhanden.",
        "dberr-problems": "Entschuldigung. Diese Seite hat momentan technische Schwierigkeiten.",
        "dberr-again": "Warte einige Minuten und versuche dann neu zu laden.",
-       "dberr-info": "(Kann keine Verbindung zum Datenbank-Server herstellen: $1)",
-       "dberr-info-hidden": "(Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden)",
+       "dberr-info": "(Auf die Datenbank konnte nicht zugegriffen werden: $1)",
+       "dberr-info-hidden": "(Auf die Datenbank konnte nicht zugegriffen werden)",
        "dberr-usegoogle": "Du könntest in der Zwischenzeit mit Google suchen.",
        "dberr-outofdate": "Beachte, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.",
        "dberr-cachederror": "Folgendes ist eine Kopie des Caches der angeforderten Seite und kann veraltet sein.",
        "log-name-pagelang": "Sprachenänderungs-Logbuch",
        "log-description-pagelang": "Dies ist ein Logbuch mit Änderungen an Seitensprachen.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|änderte}} die Seitensprache für $3 von $4 nach $5.",
-       "default-skin-not-found": "Hoppla! Die in <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDeine Installation scheint die folgenden Benutzeroberflächen zu enthalten. Siehe [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de das Benutzerhandbuch] zur Aktivierung und Auswahl des Standards.\n\n$2\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. Versuche einige Benutzeroberflächen aus dem  [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das Verzeichnis <code>skins/</code> kopieren und einfügen.\n:* Einzelne Benutzeroberflächen-Tarballs von [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist.\n\n; Falls du gerade MediaWiki aktualisiert hast:\n: MediaWiki 1.24 und neuere Versionen aktivieren nicht mehr automatisch installierte Benutzeroberflächen (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade <code>LocalSettings.php</code> geändert hast:\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
-       "default-skin-not-found-no-skins": "Hoppla! Die in <code>$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDu hast keine installierten Benutzeroberflächen.\n\n; Falls du gerade MediaWiki installiert oder aktualisiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. MediaWiki 1.24 und neuere Versionen enthalten keine Benutzeroberflächen im Haupt-Repositorium. Versuche einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das  <code>skins/</code>-Verzeichnis kopieren und einfügen.\n:* Einzelne Benutzeroberflächen-Tarballs von [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] zur Aktivierung von Benutzeroberflächen und Auswahl des Standards.",
+       "default-skin-not-found": "Hoppla! Die mit <code>$wgDefaultSkin</code> als <code>$1</code>&nbsp;für dein Wiki definierte Standardbenutzeroberfläche ist nicht verfügbar.\n\nDie folgende(n) Benutzeroberfläche(n) scheinen vorhanden zu sein:\n\n$2\n\nSiehe hierzu das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch zur Konfiguration von Benutzeroberflächen].\n\n; Sofern du MediaWiki gerade installiert hast\n: Du hast MediaWiki vermutlich mit Hilfe von Git oder den Quellcode direkt anhand einer anderen Methode installiert. Das aktuelle Problem war deshalb zu erwarten. Installiere zumindest eine im [https://www.mediawiki.org/wiki/Category:All_skins Verzeichnis der Benutzeroberflächen] enthaltene Benutzeroberfläche indem du:\n:* eines der Repositorien aus <code>mediawiki/skins/*</code> mit Hilfe von Git in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation klonst,\n:* die Dateiveröffentlichungen einzelner Benutzeroberflächen aus [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopierst,\n:* die [https://www.mediawiki.org/wiki/Download/de Dateiveröffentlichung von MediaWiki] herunterlädst, die verschiedene Benutzeroberflächen sowie Erweiterungen enthält. Du kannst das dort enthaltene Verzeichnis <code>skins/</code> Verzeichnis nutzen und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopieren.\n\n; Sofern du MediaWiki gerade aktualisiert hast\n: Bei MediaWiki 1.24 und neuere Versionen werden die installierten Benutzeroberflächen nicht mehr automatisch aktiviert (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade die Datei <code>LocalSettings.php</code> geändert hast\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
+       "default-skin-not-found-no-skins": "Hoppla! Die mit <code>$wgDefaultSkin</code> als <code>$1</code>&nbsp;für dein Wiki definierte Standardbenutzeroberfläche ist nicht verfügbar.\n\nDu hast keine Benutzeroberfläche installiert.\n\n; Sofern du MediaWiki gerade installiert oder aktualisiert hast\n: Du hast MediaWiki vermutlich mit Hilfe von Git oder den Quellcode direkt anhand einer anderen Methode installiert. Das aktuelle Problem war deshalb zu erwarten, da MediaWiki 1.24 und neuere Versionen keine Benutzeroberflächen im Hauptrepositorium enthalten. Installiere zumindest eine im [https://www.mediawiki.org/wiki/Category:All_skins Verzeichnis der Benutzeroberflächen] enthaltene Benutzeroberfläche indem du:\n:* eines der Repositorien aus <code>mediawiki/skins/*</code> mit Hilfe von Git in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation klonst,\n:* die Dateiveröffentlichungen einzelner Benutzeroberflächen aus [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopierst,\n:* die [https://www.mediawiki.org/wiki/Download/de Dateiveröffentlichung von MediaWiki] herunterlädst, die verschiedene Benutzeroberflächen sowie Erweiterungen enthält. Du kannst das dort enthaltene Verzeichnis <code>skins/</code> Verzeichnis nutzen und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopieren.\n: Siehe hierzu das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch zur Konfiguration von Benutzeroberflächen].",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiviert)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''deaktiviert''')",
        "mediastatistics": "Medienstatistiken",
index c455a76..21e88a8 100644 (file)
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "mypreferencesprotected": "Terciha timar kerdışire icazeta şıam çıniya.",
-       "ns-specialprotected": "Pelê xısusiy nênê vurnayış.",
+       "ns-specialprotected": "Pelê xısusiyi nênê vurnayış.",
        "titleprotected": "Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.\nSebeb: \"''$2''\".",
        "filereadonlyerror": "Dosyay vurnayışê \"$1\" nê abê no lakin depoy dosya da \"$2\" mod dê  salt wendi deyo.\n\nXızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: \"$3\".",
        "invalidtitle-knownnamespace": "Canemey \"$2\" u metnê \"$3\" xırabo",
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "yourname": "Nameyê karberi:",
        "userlogin-yourname": "Nameyê karberi",
-       "userlogin-yourname-ph": "Namey ğoyé karberi cı kewe",
-       "createacct-another-username-ph": "Namey karberi de fi",
+       "userlogin-yourname-ph": "Nameyê xoyê karberi cı kewe",
+       "createacct-another-username-ph": "Nameyê karberi cı kewe",
        "yourpassword": "Parola",
        "userlogin-yourpassword": "Parola",
        "userlogin-yourpassword-ph": "Parolaya xo cıkewe",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
-       "passwordreset-emailelement": "Namey karberi: $1\nParola vêrdiye: $2",
+       "passwordreset-emailelement": "Nameyê karberi: $1\nParolaya vêrdiye: $2",
        "passwordreset-emailsent": "Yew e-posteyê esterıtışê parola rışiya.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
        "history-feed-item-nocomment": "$1 miyanê $2i de",
        "history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
        "rev-deleted-comment": "(Timarkerdışe enay hewadeyayo)",
-       "rev-deleted-user": "(namey karberi esteriyo)",
+       "rev-deleted-user": "(nameyê karberi esteriyo)",
        "rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
        "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.",
        "prefs-help-email": "Dayışê adresa e-postey keyfiyo, labelê seba eyarê parola lazıma, wexto ke şıma naye xo vira kerê.",
        "prefs-help-email-others": "Pera ğoya kerderi de zew link vırazése karberé bini şımaré şenê mesac bırşé. Lakin e-posta adresa şıma héç cayé de niasena.",
        "prefs-help-email-required": "E-mail adrese mecburiya.",
-       "prefs-info": "Melumata şıma",
+       "prefs-info": "Melumato bıngehên",
        "prefs-i18n": "Şar şélıg kerdış",
        "prefs-signature": "İmza",
        "prefs-dateformat": "Formatê tarixi",
        "right-writeapi": "İstıfadey APIyê nuştey",
        "right-delete": "Pele bestere",
        "right-bigdelete": "Pelanê be tarixanê dergan bestere",
-       "right-deletelogentry": "besternayış u mebesternayışa re qeyde definayışê xısusi",
-       "right-deleterevision": "Vurnayışê xısusiyê ke ê pelanê, inan bestere ya zi peyser bia",
+       "right-deletelogentry": "Qeydanê cıkewtışanê xısusiyan bestere û peyser biya",
+       "right-deleterevision": "Vurnayışanê xısusiyanê pele bestere ya zi peyser biya",
        "right-deletedhistory": "Qeydanê tarixanê esterıteyan de qayt ke, bê nuştey inan",
        "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": "Jû pela esterıtiye peyser bia",
-       "right-suppressrevision": "İdarekeran ra dızdeni/miyanki, newede vurnayışan de qayt ke u newede vıraze",
+       "right-suppressrevision": "İdarekeran ra miyanki, newede vurnayışan de qayt ke u newede vıraze",
+       "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",
        "right-blockemail": "Yew karberê erşawıtışê/rıştena e-maili ra bloke bıke",
-       "right-hideuser": "Yew namey karberi  şari ra dızdeni/miyanki bloke bıke",
+       "right-hideuser": "Yew nameyê karberi şari ra miyanki bloke bıke",
        "right-ipblock-exempt": "Blokanê IPi, oto-blokan u blokanê menzıli ra ravêre",
        "right-proxyunbannable": "Blokanê otomatikiê proksiyan ra ravêre",
        "right-unblockself": "Blokeyınan ake",
        "filehist-user": "Karber",
        "filehist-dimensions": "Ebati",
        "filehist-filesize": "Ebata dosya",
-       "filehist-comment": "Vacayış",
+       "filehist-comment": "Mışewre",
        "imagelinks": "Gurenayışê dosya",
        "linkstoimage": "Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:",
        "linkstoimage-more": "$1 ra ziyed {{PLURAL:$1|pel|pel}} re gırey dano.\nlisteya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocnena.\n[[Special:WhatLinksHere/$2|pêroyê liste]] mevcud o.",
        "filedelete-maintenance": "Esterayîş u resterasyonê dosyayî wextê texmirî de nibenê.",
        "filedelete-maintenance-title": "Dosyaya nêbesterneyêna",
        "mimesearch": "MIME bigêre",
-       "mimesearch-summary": "no pel, no tewır dosyayan MIME kontrol kena. kewteye: tipa zerreyi/tipa bıni, e.g. <code>resim/jpeg</code>.",
+       "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>.",
        "mimetype": "Babetê NIME",
        "download": "bar ke",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "noemailtext": "no/na karber yew e-postayo meqbul nêdawa/o",
        "nowikiemailtext": "no/na karber/e, karberanê binani ra gırewtışê e-postayi tercih nêkerd.",
        "emailnotarget": "Qandê Gêreninamey karberiyo wuna çınyo yana xırabo.",
-       "emailtarget": "Namey Karberi defiyê de.",
+       "emailtarget": "Nameyê karberiyê gırewtoği cıkewên.",
        "emailusername": "Nameyê karberi:",
        "emailusernamesubmit": "İtaet",
        "email-legend": "karberê {{SITENAME}} binan re e-posta bıerşaw",
        "actioncomplete": "Kar bi temam",
        "actionfailed": "kar nêbı",
        "deletedtext": "\"$1\" biya wedariya.\nQe qeydê wedarnayışi, $2 bevinin.",
-       "dellogpage": "Qeydê esterniye",
+       "dellogpage": "Qeydê esterıtışi",
        "dellogpagetext": "listeya cêrıni heme qaydê hewn a kerdeyan o.",
-       "deletionlog": "qaydê hewnakerdışani",
+       "deletionlog": "qeydê esterıtışi",
        "reverted": "revizyono verin tepiya anciyayo",
        "deletecomment": "Sebeb:",
        "deleteotherreason": "Sebebo bin:",
        "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ê.",
        "rollback": "vurnayişan tepiya bıger",
-       "rollback_short": "Peyser bia",
        "rollbacklink": "peyser bia",
        "rollbacklinkcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot",
        "emailblock": "e-mail blok biyo",
        "blocklist-nousertalk": "ti nieşken pele minaqaşe xo bivurne",
        "ipblocklist-empty": "Lista kılitkerdışi venga.",
-       "ipblocklist-no-results": "Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.",
+       "ipblocklist-no-results": "Adresa IPya waştiye ya zi nameyê karberi kılit nêbiyo.",
        "blocklink": "kılit ke",
        "unblocklink": "bloki wedare",
        "change-blocklink": "kılitkerdışi bıvurne",
        "reblock-logentry": "qey [[$1]]i tarixê qediyayişi $2 $3 pa ninan a eyarê ver-grewtışan vurna.",
        "blocklogtext": "No kuliyatê kılitkerdış u rakerdışê fealiyetê karberano.\nAdresê IP'ya ke otomatikmen kılit biyê lista de çıniya.\nSeba lista karberanê ke heta nıka kılit biyê [[Special:BlockList|lista kılitkerdışê IPy]] bıvinê.",
        "unblocklogentry": "$1 ake",
-       "block-log-flags-anononly": "karberê anomini tenya",
+       "block-log-flags-anononly": "tenya karberê anonimi",
        "block-log-flags-nocreate": "akerdışê hesabi racneyayo",
        "block-log-flags-noautoblock": "Oto-wedariye terkneyayo",
        "block-log-flags-noemail": "e-posta biya bloqe",
        "import": "Peleyi import bik",
        "importinterwiki": "Împortê transwîkî",
        "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-history": "Qe eno pel, revizyonê tarixê hemî kopya bike",
-       "import-interwiki-templates": "Şablonê hemî dehil bike",
-       "import-interwiki-submit": "Azare de",
-       "import-interwiki-namespace": "Destinasyonê canameyî:",
+       "import-interwiki-history": "Qeydanê pele pêrune kopya ke",
+       "import-interwiki-templates": "Şablonan pêro zerre ke",
+       "import-interwiki-submit": "Zerre ke",
+       "import-interwiki-namespace": "Hedefê cayê nameyi:",
        "import-interwiki-rootpage": "Hedef pelaya reçi (opsiyonel):",
        "import-upload-filename": "Nameyê dosyayi:",
-       "import-comment": "Vatış:",
+       "import-comment": "Mışewre:",
        "importtext": "Kerem ke dosyay, çımeyê wiki ra pê [[Special:Export|kırıştışê teberdayişi]] bıdê teber, Komputerê xo de qeyd kerê u bar kerê tiya.",
        "importstart": "Pelan împort kenî",
        "import-revision-count": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "import-logentry-interwiki": "$1 transwiki biyo",
        "import-logentry-interwiki-detail": "$2 ra $1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "javascripttest": "Cerebnayışê JavaScripti",
-       "javascripttest-title": "Testê $1 gurweyênê",
        "javascripttest-pagetext-noframework": "Na pela testanê JavaScripta gurweynayışi re abıryaya.",
        "javascripttest-pagetext-unknownframework": "Çerçeweyê \"$1\" cerbnayışi xırabo.",
        "javascripttest-pagetext-frameworks": "Şıma ra reca xorê cêr ra test weçinê:$1",
        "javascripttest-pagetext-skins": "Testa akarfinayışi rê verqayt:",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
        "tooltip-pt-userpage": "Pela şımaya karberi",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
        "tooltip-pt-mytalk": "Pela toya werênayışi",
        "exif-ycbcrpositioning": "pozisyonê Y u C",
        "exif-xresolution": "Rezulasyanê veriniye",
        "exif-yresolution": "Rezulasyanê derganiye",
-       "exif-stripoffsets": "cayê data yê resim",
+       "exif-stripoffsets": "Cayê melumatê resımi",
        "exif-rowsperstrip": "Yew reze de teneyê dizeyi",
        "exif-stripbytecounts": "Yew compresyon de dizeyi",
        "exif-jpeginterchangeformat": "JPEG SOI rê ayar bike",
        "exif-compressedbitsperpixel": "Modê komprasyonê resimi",
        "exif-pixelydimension": "Herayeya resimi",
        "exif-pixelxdimension": "Berzeya resimi",
-       "exif-usercomment": "Hulasayê karberi",
+       "exif-usercomment": "Mışewreyê karberi",
        "exif-relatedsoundfile": "Derhekê dosya yê vengi",
        "exif-datetimeoriginal": "Zeman u tarixê data varaziyayişi",
        "exif-datetimedigitized": "Zeman u tarixê dicital kerdişi",
        "exif-coordinate-format": "$1° $2′ $3″ $4",
        "exif-jpegfilecomment": "Vatışê dosyada JPEG'i",
        "exif-keywords": "Qesa kelimey",
-       "exif-worldregioncreated": "Resim dınya dı qanci mıntıqara gêriyayo",
-       "exif-countrycreated": "Resim qanci dewlet ra gêriyayo",
-       "exif-countrycodecreated": "Cayo ke resim ancıyayo kodê dewlet da cı",
-       "exif-provinceorstatecreated": "Cayê resim antışi dewlet yana wılayet",
-       "exif-citycreated": "Suka ke resim gêriyayao",
+       "exif-worldregioncreated": "Mıntıqaya dınyaya ke tede resım gêriyayayo",
+       "exif-countrycreated": "Dewleta ke tede resım gêriyayayo",
+       "exif-countrycodecreated": "Kodê dewleta ke tede resım anciyayo",
+       "exif-provinceorstatecreated": "Wılayet ya zi dewleta ke tede resım anciyayo",
+       "exif-citycreated": "Sûka ke tede resım gêriyayayo",
        "exif-sublocationcreated": "Bın lokasyonê resimê suker da cı grot",
        "exif-worldregiondest": "Wareyo ke mocneyêno",
        "exif-countrydest": "Dewleta ke mocneyêna",
        "exif-event": "Weqaya ke nameycıyo ravreno",
        "exif-organisationinimage": "Organizasyono ke ravêreno",
        "exif-personinimage": "Merdumo ke nameycıyo ravêreno",
-       "exif-originalimageheight": "Veror de resim nêkırpnayışi dergeya cı",
-       "exif-originalimagewidth": "Veror de resim nêkırpnayışi herayeya cı",
+       "exif-originalimageheight": "Nêbırniyane ra ver derganiya resımi",
+       "exif-originalimagewidth": "Nêbırniyane ra ver verındiya resımi",
        "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
        "exif-subjectnewscode-value": "$2 ($1)",
        "exif-compression-1": "Nêdegusneyayo",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesac]])",
        "timezone-utc": "[[UTC]]",
-       "unknown_extension_tag": "Etiketê ilaweyo nêzanayey \"$1\"",
        "duplicate-defaultsort": "'''Tembe:''' Hesıbyaye sırmey ratnayış de \"$2\" sırmey ratnayış de \"$1\"i nêhesıbneno.",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Pelê xısusiy",
+       "specialpages": "Pelê xısusiyi",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê tepıştışi",
        "searchsuggest-search": "Cı geyre",
        "searchsuggest-containing": "Estên...",
        "api-error-badaccess-groups": "Ena wiki de dosya barkerdışi rê mısade nêdeyêno.",
-       "api-error-badtoken": "Xirabiya zerrek:Xırab resim.",
+       "api-error-badtoken": "Xetaya zerreki: Antışo xırabın.",
        "api-error-copyuploaddisabled": "URL barkerdış ena waster dı qefılyayo.",
        "api-error-duplicate": "Ena {{PLURAL:$1|ze ke [zey $2]|biya [zey dosya da $2]}} zeq wesiqa biya wendeyê.",
        "api-error-duplicate-archive": "Ena {{PLURAL:$1|vurneyaya [$2 zey na dosya]| [zerrey cı zey $2 dosya]}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.",
        "duration-decades": "$1 {{PLURAL:$1|dades|dadesi}}",
        "duration-centuries": "$1 {{PLURAL:$1|seserre|seserri}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenyum|milenyumi}}",
-       "rotate-comment": "Resim heta sehata $1 {{PLURAL:$1|derece|derecey}} bi cerx",
+       "rotate-comment": "Resım hetê saete de $1 {{PLURAL:$1|derece|dereceyi}} çerexniya",
        "limitreport-title": "Agoznaye malumata profili:",
        "limitreport-cputime": "CPU dem karnayış",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|saniye|saniyeyan}}",
index 82e3fdf..72636c4 100644 (file)
        "category-subcat-count-limited": "In cla categoréia ché a gh'é{{PLURAL:$1|'na sòt-categoréia, nutêda|$1 sòt-categoréi, nutêdi}}ché 'd sègvit.",
        "category-article-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl 'na pàgina, sgnêda ché.|Cla categoréia ché la gh'à {{PLURAL:$1|la pàgina sgnêda| al pàgini $1 sgnêdi}} ed sègvit, in un totêl ed $2.}}",
        "category-article-count-limited": "In cla categoréia ché a gh'é {{PLURAL:$1|la pàgina nutêda|al  $1 pàgini nutêdi ch'é 'd sègvit.}}",
-       "category-file-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl un file, sgnê ché.|In cla categoréia ché gh'é{{PLURAL:$1|un file sgnê ché| i file $1, sgnê}} ed sègvit, in un totêl ed $2.}}",
+       "category-file-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl un file, sgnê ché.|In cla categoréia ché gh'é{{PLURAL:$1|un file sgnê ché|$1 file , sgnê}} ed sègvit, in un totêl ed $2.}}",
        "category-file-count-limited": "In cla categoréia ché a gh'é {{PLURAL:$1|al file nutê|i $1 file nutê}} ché 'd sègvit.",
        "listingcontinuesabbrev": "cunt.",
        "index-category": "Pàgini gancêdi",
        "pool-queuefull": "A ghé la fîla, trôpa gînta a vōl vèder la pàgina, prōva tra soquânt minût",
        "pool-errorunknown": "Erōr mìa cgnusû",
        "pool-servererror": "Al servési cuntadōr di pool an n'é mìa léber per èser druvê",
+       "poolcounter-usage-error": "Erōr 'd ûş:$1",
        "aboutsite": "Infurmasiòun só {{SITENAME}}",
        "aboutpage": "Project:Infurmasiòun",
        "copyright": "Còl che gh' é che dèinter a 's pōl druvêr sòta licèinsa $1, s' an gh'é mia scrét diversamèint.",
        "anoneditwarning": "<strong>Atèinti:</strong> An n'é mìa stê fât l'ingrès. S' ét farê dal mudéfichi al tó indirés IP al srà vést da tót. Se <strong>[$1 và dèinter]</strong> o <strong>[$2 fà 'n' utèinsa]</strong>, al tô mudéfichi a srân sgnêdi al tó nòm utèint, insèm a êter benefési.",
        "anonpreviewwarning": "\"An n'é mìa stê fât l'ingrès. Mèinter es sêlva la pàgina, l'indirés IP al srà sgnê int la stòria 'd la pàgina.\"",
        "missingsummary": "'''Atensiòun:''' an n'é mìa stê precişê al mutîv de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda cun al mutîv vōd.",
-       "selfredirect": "<strong>Ateinti:</strong>t'é drē fêr un rinvéi a l'istèsa vōş. S'ét fê cléch incòra in sém a \"{{int:savearticle}}\", al rinvéi al gnirà fât",
+       "selfredirect": "<strong>Ateinti:</strong>t'é drē fêr un rinvéi a l'istèsa pàgina. Ét prés avèir şbaliê sgnêr al pôst dal rinvéi o t'é drē mudifichêr la pàgina şbaliêda. S'ét fê cléch incòra in sém a \"{{int:savearticle}}\", al rinvéi al gnirà fât in tót' al manēri.",
        "missingcommenttext": "Scréver un cumèint ché sòta.",
        "missingcommentheader": "'''Atensiòun:''' an n'é mìa stê precişê al mutîv/al tétol de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda sèinsa tétol.",
        "summary-preview": "Guêrda préma sûnt:",
        "content-model-text": "tèst normêl",
        "content-model-javascript": "linguâg JavaScript",
        "content-model-css": "fòj de stîl CSS",
+       "content-json-empty-object": "L'é vōd",
+       "content-json-empty-array": "Array vōd",
        "duplicate-args-category": "Pàgini che drōven argumèint dópiê in ciamêdi a i mudē",
        "duplicate-args-category-desc": "La pàgina la gh'à dèinter ciamêdi a mudē che drōven argumèint dupiê,cme per eşèimpi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Atensiòun:''' cla pàgina ché la gh'à trôpi ciamêdi ala funsiòun parse. A n' in duvré avèir mēno 'd $2, adèsa a {{PLURAL:$1|'gh n'é $1}}.",
        "history-feed-empty": "La pàgina serchêda l'an gh'é mìa; la pré èser stēda scanşlêda dal sît o gh'é stê cambiê nòm. Verifichêr cun [[Special:Search|pàgina 'd sèirca]] se gh'é dal pàgini nōvi.",
        "rev-deleted-comment": "(argumèint ed la mudéfica armôs)",
        "rev-deleted-user": "(nòm utèint armôs)",
-       "rev-deleted-event": "(asiòun dal log armôsa)",
+       "rev-deleted-event": "(particulêr dal log armôs)",
        "rev-deleted-user-contribs": "(nòm utèint o indirés IP armôs - mudéfica lughêda da la stòria)",
        "rev-deleted-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. \nConsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
        "rev-suppressed-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/ suppress |page={{ FULLPAGENAMEE }}}} log dal canşladûri] per nōv particulêr.",
        "revdelete-legend": "Impôsta i lémit seguèint al versiòun scanşlêdi:",
        "revdelete-hide-text": "Tèst ed la versiòun",
        "revdelete-hide-image": "Lōga j argumèint dal file",
-       "revdelete-hide-name": "Lōga l'asiòun e l'elemèint ed la 'stèsa",
+       "revdelete-hide-name": "Lōga l'intensiòun e i critèri",
        "revdelete-hide-comment": "Elemèint ed la mudéfica o spiegasiòun ed l'asiòun",
        "revdelete-hide-user": "Nòm o indirés IP ed l'avtōr",
        "revdelete-hide-restricted": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
        "right-viewmyprivateinfo": "Guêrda al tō infurmasiòun personêli (per eşèimpi: indirés ed pôsta eletrônica, nòm vèira)",
        "right-editmyprivateinfo": "Câmbia 'l tō infurmasiòun personêli (per eşèimpi: indirés ed pôsta eletrônica, nòm vèira)",
        "right-editmyoptions": "Câmbia al tō preferèinsi",
-       "right-rollback": "Scanşèla a la şvêlta al mudéfichi ed l'ûltèint ch'l'à mudifichê 'na pàgina pariculêra",
+       "right-rollback": "Scanşèla a la şvêlta al mudéfichi ed l'ûltem utèint ch'l'à mudifichê 'na pàgina particulêra",
        "right-markbotedits": "Sègna al mudéfichi da turnêr a mèter cme préma cme fâti da 'na mâchina in avtomâtich",
        "right-noratelimit": "An n'é mìa ublighê al lémit 'd asiòun",
        "right-import": "Côpia dal pàgini da 'd j êter wiki",
+       "right-importupload": "Zuntêr dal pàgini da un file carghê.",
+       "right-patrol": "Sègna al mudéfichi 'd j êter utèint cme verifichêdi",
+       "right-autopatrol": "Sègna in avtomâtich al mudéfichi che t'é fât cme verifichêdi",
+       "right-patrolmarks": "Drōva la funsiòun ed veréfica dal j ûltmi mudéfichi",
+       "right-unwatchedpages": "Fa vèder un elèinch ed pàgini mìa guardêdi",
+       "right-mergehistory": "Al mèt insèm la stôria dal pàgini",
+       "right-userrights": "Mudéfica i dirét ed l'utèint",
+       "right-userrights-interwiki": "Mudéfica i dirét ed j êter utèint 'd êtri wiki",
+       "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",
        "newuserlogpage": "Utèint nōv",
+       "newuserlogpagetext": "Ché sòt a gh' é la lésta di nōv utèint.",
+       "rightslog": "Diré ed j utèint",
+       "rightslogtext": "Ché sòt a gh' é la lésta dal mudéfichi a i dirét dê a j utèint.",
        "action-read": "lēzer cla pàgina ché",
        "action-edit": "Mudifichêr cla pàgina ché",
        "action-createpage": "inventêr pàgini",
+       "action-createtalk": "fêr 'l pàgini 'd discusiòun.",
+       "action-createaccount": "fêr cla registrasiòun ché",
+       "action-history": "vèder la stôria 'd cla pàgina ché",
+       "action-minoredit": "sgnêr cla mudéfica che cme céca",
        "action-move": "spustêr cla pàgina ché",
+       "action-move-subpages": "spustêr cla pàgina ché e al relatîvi sòt pàgini",
+       "action-move-rootuserpages": "Spustêr 'l pàgini principêli 'd j utèint",
+       "action-move-categorypages": "spustêr 'l categoréi",
        "action-movefile": "spustêr cól file ché",
        "action-upload": "carghêr cól file ché",
+       "action-reupload": "scréver in sém a cól file ché ch' al gh'é bèle",
+       "action-reupload-shared": "scréver insém a cól file ché preşèint int l'archévi spartî",
+       "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-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-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é",
+       "action-rollback": "scanşèla a la şvêlta al mudéfichi ed l'ûltem utèint ch'l'à mudifichê 'na pàgina particulêra",
+       "action-import": "côpia dal pàgini da 'n' êtra wiki",
+       "action-importupload": "zuntêr dal pàgini da un file carghê",
+       "action-patrol": "sgnêr al mudéfichi 'd j êter utèint cme verifichêdi",
+       "action-autopatrol": "sgnêr al tō mudéfichi cme verifichêdi",
+       "action-unwatchedpages": "vèder un elèinch ed pàgini mìa guardêdi",
+       "action-mergehistory": "unîr la stôria 'd cla pàgina ché",
+       "action-userrights": "mudefichêr tót i dirét ed j utèint",
+       "action-userrights-interwiki": "mudefichêr i dirét ed j utèint insém a êtri wiki",
+       "action-siteadmin": "bluchêr e şbluchêr al databêş",
+       "action-sendemail": "spidîr pôsta eletrônica",
+       "action-editmywatchlist": "mudéfica i tō tgnû sòt ôc",
+       "action-viewmywatchlist": "Guêrda i tō tgnû 'd ôc specêl",
+       "action-viewmyprivateinfo": "guêrda al tō infurmasiòun personêli",
+       "action-editmyprivateinfo": "mudéfica al tō infurmasiòun personêli",
+       "action-editcontentmodel": "câmbia al mudèl dèinter a 'na pàgina",
        "nchanges": "$1\n{{PLURAL:$1|mudéfica|mudéfichi}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'ûltma vîşita}}",
+       "enhancedrc-history": "stòria",
        "recentchanges": "Ûltmi mudéfichi",
        "recentchanges-legend": "Siēlti ûltmi mudéfichi.",
+       "recentchanges-summary": "Cla pàgina ché la preşèinta al mudéfichi piô nōvi a còl che gh'é dèinter al sît.",
+       "recentchanges-noresult": "Nisóna mudéfica dèinter al peréiod scrét ch'la sudésfa chi critèri ché.",
        "recentchanges-feed-description": "Cól feed ché 'l arpôrta al mudéfichi piô frèschi a còl che gh'é dèinter al sît.",
        "recentchanges-label-newpage": "Cun cla mudéfica ché t'é fât 'na pàgina nōva.",
        "recentchanges-label-minor": "Còsta l'é 'na mudéfica céca",
        "actioncomplete": "Asiòun cumpîda",
        "actionfailed": "Asiòun falîda",
        "dellogpage": "Scanşladûri",
-       "rollback_short": "Tōrna préma dal mudéfichi",
        "rollbacklink": "tōrna préma dal mudéfichi",
        "rollbackfailed": "An t'é mia turnê indrē",
        "protectlogpage": "Al prutesiòun",
        "compare-page2": "Pàgina 2",
        "compare-rev1": "Revişiòn 1",
        "compare-rev2": "Revişiòn 2",
-       "htmlform-reset": "Scanşèla la mudéfica",
+       "htmlform-reset": "Scanşèla 'l mudéfichi",
        "htmlform-selectorother-other": "Êter",
        "rightsnone": "(nisûn)",
        "feedback-subject": "Argomèint:",
index 9b60639..56936bb 100644 (file)
@@ -39,7 +39,8 @@
                        "아라",
                        "Calak",
                        "Auslaender",
-                       "Milicevic01"
+                       "Milicevic01",
+                       "Ah3kal"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
@@ -67,7 +68,7 @@
        "tog-shownumberswatching": "Εμφάνιση του αριθμού των συνδεδεμένων χρηστών",
        "tog-oldsig": "Υπάρχουσα υπογραφή:",
        "tog-fancysig": "Μεταχείριση υπογραφής ως κώδικα wiki (χωρίς αυτόματο σύνδεσμο)",
-       "tog-uselivepreview": "Χρήση ζωντανής προεπισκόπησης (πειραματικό)",
+       "tog-uselivepreview": "Χρήση προεπισκόπησης σε ζωντανό χρόνο",
        "tog-forceeditsummary": "Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας",
        "tog-watchlisthideown": "Απόκρυψη των επεξεργασιών μου από τη λίστα παρακολούθησης",
        "tog-watchlisthidebots": "Απόκρυψη των επεξεργασιών των bot από τη λίστα παρακολούθησης",
        "pool-queuefull": "Η ουρά της δεξαμενής διεργασιών είναι πλήρης",
        "pool-errorunknown": "Άγνωστο σφάλμα",
        "pool-servererror": "Η υπηρεσία καταμετρητή ομαδοποίησης δεν είναι διαθέσιμη ($1).",
+       "poolcounter-usage-error": "Σφάλμα χρήσης:$1",
        "aboutsite": "Σχετικά με {{SITENAME}}",
        "aboutpage": "Project:Σχετικά",
        "copyright": "Το περιεχόμενο είναι διαθέσιμο σύμφωνα με την $1 εκτός αν αναφέρεται διαφορετικά.",
        "anoneditwarning": "<strong>Προειδοποίηση:</strong> Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα είναι ορατή δημόσια αν κάνετε κάποια επεξεργασία. Αν <strong>[$1 συνδεθείτε]</strong> ή <strong>[$2 δημιουργήσετε λογαριασμό]</strong>, οι επεξεργασίες σας θα αποδοθούν στο όνομά χρήστη σας, μαζί με άλλα οφέλη.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
+       "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
        "missingcommenttext": "Παρακαλώ εισάγετε ένα σχόλιο παρακάτω.",
        "missingcommentheader": "'''Υπενθύμιση:''' Δεν έχετε γράψει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο.\nΑν κάνετε πάλι κλικ στο κουμπί \"{{int:savearticle}}\", η επεξεργασία σας θα αποθηκευτεί χωρίς θέμα ή επικεφαλίδα.",
        "summary-preview": "Προεπισκόπηση σύνοψης:",
        "content-model-text": "απλό κείμενο",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Κενό αντικείμενο",
        "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 κλήσεις}}.",
        "history-feed-empty": "Η ζητούμενη σελίδα δεν υπάρχει.\nΜπορεί να έχει διαγραφεί από το wiki, ή να μετονομάστηκε.\nΔοκιμάστε [[Special:Search|να αναζητήσετε στο wiki]] για σχετικές νέες σελίδες.",
        "rev-deleted-comment": "(σχόλιο αφαιρέθηκε)",
        "rev-deleted-user": "(όνομα χρήστη αφαιρέθηκε)",
-       "rev-deleted-event": "(η ÎºÎ±Ï\84αγÏ\81αÏ\86ή Ï\83Ï\84ο Î±Ï\81Ï\87είο Î±Ï\86αιÏ\81έθηκε)",
+       "rev-deleted-event": "(οι Î»ÎµÏ\80Ï\84ομέÏ\81ειεÏ\82 ÎºÎ±Ï\84αγÏ\81αÏ\86ήÏ\82 Î±Ï\86αιÏ\81έθηκαν)",
        "rev-deleted-user-contribs": "[όνομα χρήστη ή διεύθυνση ΙΡ έχουν αφαιρεθεί - η επεξεργασία έχει αποκρυφθεί από τις συνεισφορές]",
        "rev-deleted-text-permission": "Αυτή η αναθεώρηση της σελίδας έχει '''διαγραφεί'''.\nΜπορεί να υπάρχουν λεπτομέρειες στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} αρχείο καταγραφής διαγραφών].",
        "rev-suppressed-text-permission": "Αυτή η έκδοση της σελίδας έχει '''κατασταλεί'''.\nΛεπτομέρειες μπορούν να βρεθούν στο [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} αρχείο καταστολής].",
        "revdelete-legend": "Θέστε περιορισμούς ορατότητας",
        "revdelete-hide-text": "Κείμενο αναθεώρησης",
        "revdelete-hide-image": "Κρύψε περιεχόμενο αρχείου",
-       "revdelete-hide-name": "Î\9aÏ\81Ï\8dÏ\88ε ÎµÎ½Î­Ï\81γεια ÎºÎ±Î¹ Ï\83Ï\84Ï\8cÏ\87ο",
+       "revdelete-hide-name": "Î\91Ï\80Ï\8cκÏ\81Ï\85Ï\88η Ï\83Ï\84Ï\8cÏ\87οÏ\85 ÎºÎ±Î¹ Ï\80αÏ\81αμέÏ\84Ï\81Ï\89ν",
        "revdelete-hide-comment": "Σύνοψη επεξεργασίας",
        "revdelete-hide-user": "Όνομα χρήστη/IP συντάκτη",
        "revdelete-hide-restricted": "Απόκρυψη δεδομένων από διαχειριστές καθώς και από άλλους",
        "import-logentry-interwiki": "η σελίδα $1 εισάχθηκε μεταξύ wiki",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Εισήχθη $1 αναθεώρηση|Εισήχθησαν $1 αναθεωρήσεις}} από $2",
        "javascripttest": "Δοκιμή JavaScript",
-       "javascripttest-title": "Εκτελούνται  $1  δοκιμές",
        "javascripttest-pagetext-noframework": "Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.",
        "javascripttest-pagetext-unknownframework": "Άγνωστο πλαίσιο δοκιμών \" $1 \".",
        "javascripttest-pagetext-frameworks": "Παρακαλώ επιλέξτε ένα από τα ακόλουθα πλαίσια δοκιμών: $1",
        "javascripttest-pagetext-skins": "Επιλέξτε ένα skin για να εκτελέσετε δοκιμές με αυτό:",
        "javascripttest-qunit-intro": "Ανατρέξτε στην ενότητα [ $1 τεκμηρίωση δοκιμών] στο mediawiki.org.",
-       "javascripttest-qunit-heading": "Σουίτα δοκιμών JavaScript QUnit του MediaWiki",
        "tooltip-pt-userpage": "Η σελίδα χρήστη σας",
        "tooltip-pt-anonuserpage": "Η σελίδα χρήστη στον οποίο αντιστοιχεί η διεύθυνση IP που έχετε",
        "tooltip-pt-mytalk": "Η σελίδα συζήτησής σας",
        "watchlisttools-edit": "Προβολή και επεξεργασία λίστας παρακολούθησης",
        "watchlisttools-raw": "Επεξεργασία πρωτογενούς λίστας παρακολούθησης",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|συζήτηση]])",
-       "unknown_extension_tag": "Άγνωστη ετικέτα επέκτασης \"$1\"",
        "duplicate-defaultsort": "'''Προειδοποίηση:''' Το προεπιλεγμένο κλειδί ταξινόμησης «$2» υπερισχύει του προηγούμενου προεπιλεγμένου κλειδιού «$1».",
        "version": "Έκδοση",
        "version-extensions": "Εγκαταστημένες επεκτάσεις",
index 52e3a78..56a2ee4 100644 (file)
        "pool-queuefull": "Pool queue is full",
        "pool-errorunknown": "Unknown error",
        "pool-servererror": "The pool counter service is not available ($1).",
+       "poolcounter-usage-error": "Usage error: $1",
        "aboutsite": "About {{SITENAME}}",
        "aboutpage": "Project:About",
        "copyright": "Content is available under $1 unless otherwise noted.",
        "anoneditwarning": "<strong>Warning:</strong> You are not logged in. Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
        "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-       "selfredirect": "<strong>Warning:</strong> You are creating redirect to the same article.\nIf you click \"{{int:savearticle}}\" again, the redirect will be created.",
+       "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/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "summary-preview": "Summary preview:",
        "content-model-text": "plain text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
+       "content-json-empty-object": "Empty object",
+       "content-json-empty-array": "Empty array",
        "duplicate-args-category": "Pages using duplicate arguments in template calls",
        "duplicate-args-category-desc": "The page contains template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
        "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
        "rev-deleted-comment": "(edit summary removed)",
        "rev-deleted-user": "(username removed)",
-       "rev-deleted-event": "(log action removed)",
+       "rev-deleted-event": "(log details removed)",
        "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
        "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "rev-suppressed-text-permission": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
        "revdelete-legend": "Set visibility restrictions",
        "revdelete-hide-text": "Revision text",
        "revdelete-hide-image": "Hide file content",
-       "revdelete-hide-name": "Hide action and target",
+       "revdelete-hide-name": "Hide target and parameters",
        "revdelete-hide-comment": "Edit summary",
        "revdelete-hide-user": "Editor's username/IP address",
        "revdelete-hide-restricted": "Suppress data from administrators as well as others",
        "upload-summary": "",
        "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
        "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
-       "upload-permitted": "Permitted file types: $1.",
-       "upload-preferred": "Preferred file types: $1.",
-       "upload-prohibited": "Prohibited file types: $1.",
+       "upload-permitted": "Permitted file {{PLURAL:$2|type|types}}: $1.",
+       "upload-preferred": "Preferred file {{PLURAL:$2|type|types}}: $1.",
+       "upload-prohibited": "Prohibited file {{PLURAL:$2|type|types}}: $1.",
        "uploadfooter": "-",
        "upload-default-description": "-",
        "uploadlogpage": "Upload log",
        "deleteprotected": "You cannot delete this page because it has been protected.",
        "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
        "rollback": "Roll back edits",
-       "rollback_short": "Rollback",
        "rollbacklink": "rollback",
        "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
        "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
        "namespace": "Namespace:",
        "invert": "Invert selection",
        "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "tooltip-whatlinkshere-invert": "Check this box to hide links from pages within the selected namespace.",
        "namespace_association": "Associated namespace",
        "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
        "blanknamespace": "(Main)",
        "thumbnail-temp-create": "Unable to create temporary thumbnail file",
        "thumbnail-dest-create": "Unable to save thumbnail to destination",
        "thumbnail_invalid_params": "Invalid thumbnail parameters",
+       "thumbnail_toobigimagearea": "File with dimensions greater than $1",
        "thumbnail_dest_directory": "Unable to create destination directory",
        "thumbnail_image-type": "Image type not supported",
        "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} imported from $2",
        "javascripttest": "JavaScript testing",
        "javascripttest-backlink": "< $1",
-       "javascripttest-title": "Running $1 tests",
+       "javascripttest-title": "$1",
        "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
        "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Unknown action \"$1\".",
        "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
        "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
        "javascripttest-qunit-name": "QUnit",
        "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
        "accesskey-pt-userpage": ".",
        "accesskey-pt-anonuserpage": ".",
        "accesskey-pt-mytalk": "n",
        "size-exabytes": "$1 EB",
        "size-zetabytes": "$1 ZB",
        "size-yottabytes": "$1 YB",
+       "size-pixel": "$1 P",
+       "size-kilopixel": "$1 KP",
+       "size-megapixel": "$1 MP",
+       "size-gigapixel": "$1 GP",
+       "size-terapixel": "$1 TP",
+       "size-petapixel": "$1 PP",
+       "size-exapixel": "$1 EP",
+       "size-zetapixel": "$1 ZP",
+       "size-yottapixel": "$1 YP",
        "bitrate-bits": "$1 bps",
        "bitrate-kilobits": "$1 kbps",
        "bitrate-megabits": "$1 Mbps",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Unknown extension tag \"$1\"",
        "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
        "duplicate-displaytitle": "<strong>Warning:</strong> Display title \"$2\" overrides earlier display title \"$1\".",
        "invalid-indicator-name": "<strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.",
        "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
        "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
        "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
+       "version-libraries": "Installed libraries",
+       "version-libraries-library": "Library",
+       "version-libraries-version": "Version",
        "redirect": "Redirect by file, user, page or revision ID",
        "redirect-legend": "Redirect to a file or page",
        "redirect-text": "",
-       "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "This special page redirects to a file (given the filename), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Go",
        "redirect-lookup": "Lookup:",
        "redirect-value": "Value:",
        "redirect-user": "User ID",
        "redirect-page": "Page ID",
        "redirect-revision": "Page revision",
-       "redirect-file": "File name",
+       "redirect-file": "Filename",
        "redirect-not-exists": "Value not found",
        "fileduplicatesearch": "Search for duplicate files",
        "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
        "compare-revision-not-exists": "The revision you specified does not exist.",
        "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
        "dberr-again": "Try waiting a few minutes and reloading.",
-       "dberr-info": "(Cannot contact the database server: $1)",
-       "dberr-info-hidden": "(Cannot contact the database server)",
+       "dberr-info": "(Cannot access the database: $1)",
+       "dberr-info-hidden": "(Cannot access the database)",
        "dberr-usegoogle": "You can try searching via Google in the meantime.",
        "dberr-outofdate": "Note that their indexes of our content may be out of date.",
        "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
index 42e3488..be3ad8e 100644 (file)
        "content-model-text": "ordinara teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "duplicate-args-category": "Paĝoj kun pluroblaj argumentoj en ŝanblonvokoj",
+       "duplicate-args-category": "Paĝoj kun pluroblaj argumentoj en ŝablonvokoj",
        "duplicate-args-category-desc": "La paĝo enhavas uzon de ŝablono kun pluroble uzitaj argumentoj, kiel ekzemple <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> aŭ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Averto: Ĉi tiu paĝo enhavas tro da multekostaj sintaksaj funkcio-vokoj.\n\nĜi havu malpli ol $2 {{PLURAL:$2|vokon|vokojn}}, sed nun estas $1 {{PLURAL:$1|voko|vokoj}}.",
        "expensive-parserfunction-category": "Paĝoj kun tro da multekostaj sintaksaj funkcio-vokoj",
        "deleteprotected": "Vi ne povas forigi ĉi tiun paĝon ĉar ĝi estis protektita.",
        "deleting-backlinks-warning": "'''Atentigo:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Aliaj paĝoj]] ligas al aŭ transkludas tiun ĉi forigotan paĝon.",
        "rollback": "Restarigi antaŭan redakton",
-       "rollback_short": "Malfari",
        "rollbacklink": "malfari",
        "rollbacklinkcount": "nuligi $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbacklinkcount-morethan": "nuligi pli ol $1 {{PLURAL:$1|redakton|redaktojn}}",
        "import-logentry-interwiki": "transvikiigita $1",
        "import-logentry-interwiki-detail": "Importis $1 {{PLURAL:$1|revizion|reviziojn}} de $2",
        "javascripttest": "Ĝavoskripta testado",
-       "javascripttest-title": "Irigante $1 testoj",
        "javascripttest-pagetext-noframework": "Ĉi tiu paĝo estas konservita por funkciigi testojn de JavaScript.",
        "javascripttest-pagetext-unknownframework": "Nekonta test-framo \"$1\".",
        "javascripttest-pagetext-frameworks": "Bonvolu elekti unu el la jenaj test-framoj: $1",
        "javascripttest-pagetext-skins": "Elektu kun kio etoso irigi la testojn:",
        "javascripttest-qunit-intro": "Vidu [$1 testa dokumentaro] en mediawiki.org.",
-       "javascripttest-qunit-heading": "Testaro QUnit por JavaScript de MediaWiki",
        "tooltip-pt-userpage": "Via uzantopaĝo",
        "tooltip-pt-anonuserpage": "La uzantopaĝo por la IP adreso sub kiu vi estas redaktanta",
        "tooltip-pt-mytalk": "Via diskutpaĝo",
        "hebrew-calendar-m11-gen": "abo",
        "hebrew-calendar-m12-gen": "elulo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuto]])",
-       "unknown_extension_tag": "Nekonata etend-etikedo \"$1\"",
        "duplicate-defaultsort": "'''Averto:''' Defaŭlta ordiga ŝlosilo \"$2\" anstataŭigas pli fruan defaŭltan ordigan ŝlosilon \"$1\".",
        "version": "Versio",
        "version-extensions": "Instalitaj kromprogramoj",
index 4564aac..a203647 100644 (file)
        "pool-queuefull": "La cola de trabajo está llena",
        "pool-errorunknown": "Error desconocido",
        "pool-servererror": "El servicio de gestión de procesos agrupados no está disponible ($1).",
+       "poolcounter-usage-error": "Error de uso: $1",
        "aboutsite": "Acerca de {{SITENAME}}",
        "aboutpage": "Project:Acerca de",
        "copyright": "El contenido está disponible bajo la licencia $1 a menos que se indique lo contrario.",
        "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión. Tu dirección IP será visible públicamente si haces cualquier edición. Si <strong>[$1 inicias sesión]</strong> o <strong>[$2 creas una cuenta]</strong>, tus ediciones se atribuirán a tu nombre de usuario, junto con otros beneficios.",
        "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
        "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
+       "selfredirect": "<strong>Advertencia:</strong> estás redirigiendo esta página a sí misma.\nPuedes haber especificado erróneamente el destino de la redirección o puedes estar editando la página equivocada.\nSi haces clic de nuevo en \"{{int:savearticle}}\", la redirección se creará de todas maneras.",
        "missingcommenttext": "Escribe un comentario a continuación.",
        "missingcommentheader": "<strong>Recordatorio:</strong> No has escrito un asunto/encabezado para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
        "summary-preview": "Previsualización del resumen:",
        "content-model-text": "Texto sin formato",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objeto vacío",
+       "content-json-empty-array": "Matriz vacía",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Aviso: Esta página contiene demasiadas llamadas a funciones sintácticas costosas (#ifexist: y similares)\n\nTiene {{PLURAL:$1|una llamada|$1 llamadas}}, pero debería tener menos de $2.",
        "history-feed-empty": "La página solicitada no existe.\nPuede haber sido borrada del wiki o renombrada.\nPrueba a [[Special:Search|buscar en el wiki]] nuevas páginas relevantes.",
        "rev-deleted-comment": "(resumen de edición eliminado)",
        "rev-deleted-user": "(nombre de usuario eliminado)",
-       "rev-deleted-event": "(entrada borrada)",
+       "rev-deleted-event": "(detalles del registro eliminados)",
        "rev-deleted-user-contribs": "[nombre de usuario o dirección IP eliminada - edición ocultada de la lista de contribuciones]",
        "rev-deleted-text-permission": "Esta revisión de la página ha sido '''borrada'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "rev-suppressed-text-permission": "Esta revisión de la página se <strong>suprimió</strong>.\nLos detalles se pueden ver en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresión].",
        "revdelete-legend": "Establecer restricciones de revisión:",
        "revdelete-hide-text": "Texto de la revisión",
        "revdelete-hide-image": "Ocultar el contenido del archivo",
-       "revdelete-hide-name": "Ocultar acción y objetivo",
+       "revdelete-hide-name": "Ocultar objetivo y parámetros.",
        "revdelete-hide-comment": "Resumen de edición",
        "revdelete-hide-user": "Nombre/IP del editor",
        "revdelete-hide-restricted": "Suprimir datos a los administradores así como al resto",
        "deleteprotected": "No puedes eliminar esta página porque ha sido protegida.",
        "deleting-backlinks-warning": "'''Advertencia:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otras páginas]] enlazan o transcluyen la página que vas a eliminar.",
        "rollback": "Revertir ediciones",
-       "rollback_short": "Revertir",
        "rollbacklink": "revertir",
        "rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}",
        "rollbacklinkcount-morethan": "revertir más de $1 {{PLURAL:$1|edición|ediciones}}",
        "movedarticleprotection": "cambiadas protecciones de «[[$2]]» a «[[$1]]»",
        "protect-title": "Cambiando el nivel de protección de «$1»",
        "protect-title-notallowed": "Ver el nivel de protección de «$1»",
-       "prot_1movedto2": "heredando la protección al trasladar [[$1]] a [[$2]]",
+       "prot_1movedto2": "[[$1]] se trasladó a [[$2]]",
        "protect-badnamespace-title": "Espacio de nombres no protegible",
        "protect-badnamespace-text": "Las páginas de este espacio de nombres no pueden ser protegidas",
        "protect-norestrictiontypes-text": "Esta página no se puede proteger ya que no hay ningún tipo de restricción disponible.",
        "namespace": "Espacio de nombres:",
        "invert": "Invertir selección",
        "tooltip-invert": "Marca esta casilla para ocultar los cambios a las páginas dentro del espacio de nombres seleccionado (y el espacio de nombres asociado si está activada)",
+       "tooltip-whatlinkshere-invert": "Activa esta casilla para ocultar los enlaces dentro del espacio de nombres seleccionado.",
        "namespace_association": "Espacio de nombres asociado",
        "tooltip-namespace_association": "Marca esta casilla para incluir también el espacio de nombres de discusión asociado con el espacio de nombres seleccionado",
        "blanknamespace": "(Principal)",
        "sp-contributions-newbies-sub": "Para cuentas nuevas",
        "sp-contributions-newbies-title": "Contribuciones de usuarios nuevos",
        "sp-contributions-blocklog": "registro de bloqueos",
-       "sp-contributions-suppresslog": "Contribuciones borradas de usuario",
+       "sp-contributions-suppresslog": "contribuciones de usuario suprimidas",
        "sp-contributions-deleted": "contribuciones de usuario borradas",
        "sp-contributions-uploads": "subidas",
        "sp-contributions-logs": "registros",
        "thumbnail-temp-create": "No se ha podido crear el archivo temporal de la miniatura",
        "thumbnail-dest-create": "No se ha podido guardar la miniatura",
        "thumbnail_invalid_params": "Parámetros del thumbnail no válidos",
+       "thumbnail_toobigimagearea": "Archivo más grande que $1",
        "thumbnail_dest_directory": "Incapaz de crear el directorio de destino",
        "thumbnail_image-type": "Tipo de imagen no contemplado",
        "thumbnail_gd-library": "Configuración de la librería GD incompleta: falta la función $1",
        "import-logentry-interwiki": "transwikificada $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importadas}} desde $2",
        "javascripttest": "Pruebas de JavaScript",
-       "javascripttest-title": "Pruebas de $1 en ejecución",
        "javascripttest-pagetext-noframework": "Esta página está reservada para ejecutar pruebas de JavaScript.",
        "javascripttest-pagetext-unknownframework": "Marco de pruebas desconocido \"$1\".",
+       "javascripttest-pagetext-unknownaction": "La acción «$1» es desconocida.",
        "javascripttest-pagetext-frameworks": "Por favor, seleccione uno de los marcos de pruebas siguientes: $1",
        "javascripttest-pagetext-skins": "Elija un aspecto (skin) para ejecutar las pruebas:",
        "javascripttest-qunit-intro": "Consulte la [$1 documentación sobre las pruebas] en mediawiki.org.",
-       "javascripttest-qunit-heading": "Conjunto de pruebas MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Tu página de {{gender:|usuario|usuaria}}",
        "tooltip-pt-anonuserpage": "La página de usuario de la IP desde la que editas",
        "tooltip-pt-mytalk": "Tu página de discusión",
        "watchlisttools-edit": "Ver y editar tu lista de seguimiento",
        "watchlisttools-raw": "Editar lista de seguimiento en crudo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discusión]])",
-       "unknown_extension_tag": "Etiqueta desconocida «$1»",
        "duplicate-defaultsort": "'''Atención:''' La clave de ordenamiento predeterminada «$2» anula la clave de ordenamiento anterior «$1».",
        "duplicate-displaytitle": "<strong>Advertencia:</strong> El título visualizado \"$2\" sobreescribe al anterior \"$1\".",
        "invalid-indicator-name": "<strong>Error:</strong> el atributo <code>name</code> de los indicadores de estado de página no debe estar vacío.",
        "version-entrypoints-header-url": "Dirección URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta del artículo]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]",
+       "version-libraries": "Bibliotecas instaladas",
+       "version-libraries-library": "Biblioteca",
+       "version-libraries-version": "Versión",
        "redirect": "Redirigir por archivo, usuario, página o ID de revisión",
        "redirect-legend": "Redirigir a un archivo o página",
        "redirect-summary": "Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión o de página) o a una página de usuario (dado un identificador numérico de usuario). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "La revisión especificada no existe.",
        "dberr-problems": "Lo sentimos. Este sitio está experimentando dificultades técnicas.",
        "dberr-again": "Prueba a recargar dentro de unos minutos.",
-       "dberr-info": "(No se puede contactar con la base de datos del servidor: $1)",
-       "dberr-info-hidden": "(No se puede contactar con la base de datos del servidor)",
+       "dberr-info": "(No se puede acceder a la base de datos: $1)",
+       "dberr-info-hidden": "(No se puede acceder a la base de datos)",
        "dberr-usegoogle": "Mientras tanto puedes probar buscando a través de Google.",
        "dberr-outofdate": "Ten en cuenta que su índice de nuestro contenido puede estar desactualizado.",
        "dberr-cachederror": "La siguiente es una página guardada de la página solicitada, y puede no estar actualizada.",
        "revdelete-uname-unhid": "nombre de usuario mostrado",
        "revdelete-restricted": "restricciones para administradores aplicadas",
        "revdelete-unrestricted": "restricciones para administradores eliminadas",
+       "logentry-merge-merge": "$1 {{GENDER:$2|combinó}} $3 en $4 (revisiones hasta el $5)",
        "logentry-move-move": "$1 movió la página $3 a $4",
        "logentry-move-move-noredirect": "$1 movió la página $3 a $4 sin dejar una redirección",
        "logentry-move-move_redir": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección",
        "api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
        "api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.",
        "api-error-stasherror": "Ha ocurrido un error al subir el archivo al depósito.",
+       "api-error-stashedfilenotfound": "No se encontró el archivo del espacio temporal al intentar cargarlo.",
+       "api-error-stashpathinvalid": "La ruta donde debería encontrarse el archivo del espacio temporal no es válida.",
+       "api-error-stashfilestorage": "Ocurrió un error al almacenar el archivo en el espacio temporal.",
+       "api-error-stashzerolength": "El servidor no pudo almacenar el archivo en el espacio temporal porque este no contiene datos.",
+       "api-error-stashnotloggedin": "Debes acceder para guardar archivos en el espacio temporal de carga.",
+       "api-error-stashwrongowner": "El archivo del espacio temporal al que quieres acceder no te pertenece.",
+       "api-error-stashnosuchfilekey": "La clave de archivo del espacio temporal al que quieres acceder no existe.",
        "api-error-timeout": "El servidor no respondió en el plazo previsto.",
        "api-error-unclassified": "Ocurrió un error desconocido.",
        "api-error-unknown-code": "Error desconocido: «$1»",
        "mediastatistics-header-text": "Textual",
        "mediastatistics-header-executable": "Ejecutables",
        "mediastatistics-header-archive": "Formatos comprimidos",
+       "json-warn-trailing-comma": "Se {{PLURAL:$1|eliminó una coma|eliminaron $1 comas}} al final en el archivo JSON",
        "json-error-unknown": "Ocurrió un problema con el código JSON. Error: $1",
+       "json-error-depth": "Se ha superado la profundidad máxima de la pila",
        "json-error-state-mismatch": "JSON no válido o con formato incorrecto",
        "json-error-ctrl-char": "Error de carácter de control, posiblemente codificada incorrectamente",
        "json-error-syntax": "Error de sintaxis",
        "json-error-utf8": "Los caracteres UTF-8 tienen errores de formato; probablemente la codificación es incorrecta.",
+       "json-error-recursion": "Una o más referencias recursivas en el valor por codificar",
        "json-error-inf-or-nan": "Hay uno o más valores «NAN» o «INF» en el valor que se codificará",
        "json-error-unsupported-type": "Se proporcionó un valor en un tipo que no se puede codificar"
 }
index 7adc540..e40f314 100644 (file)
@@ -50,7 +50,7 @@
        "tog-shownumberswatching": "Näita jälgivate kasutajate hulka",
        "tog-oldsig": "Praegune allkiri:",
        "tog-fancysig": "Kasuta vikiteksti vormingus allkirja (ilma automaatse lingita kasutajalehele)",
-       "tog-uselivepreview": "Kasuta elavat eelvaadet (katseline)",
+       "tog-uselivepreview": "Kasuta elavat eelvaadet",
        "tog-forceeditsummary": "Nõua redigeerimisel resümee välja täitmist",
        "tog-watchlisthideown": "Peida minu redaktsioonid jälgimisloendist",
        "tog-watchlisthidebots": "Peida robotid jälgimisloendist",
        "pool-queuefull": "Protsessikogumi järjekord on täis.",
        "pool-errorunknown": "Teadmata tõrge",
        "pool-servererror": "Protsessikogumi loendurteenus pole saadaval ($1).",
+       "poolcounter-usage-error": "Kasutustõrge: $1",
        "aboutsite": "{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed",
        "aboutpage": "Project:Tiitelandmed",
        "copyright": "Sisu on kasutatav litsentsi $1 tingimustel, kui pole öeldud teisiti.",
        "anoneditwarning": "<strong>Hoiatus:</strong> Sa pole sisse logitud. Sinu IP-aadress on kõigile nähtav, kui muudatusi teed. Kui <strong>[$1 logid sisse]</strong> või <strong>[$2 lood konto]</strong>, siis teiste eeliste seas omistatakse sinu muudatused sulle kasutajanime järgi.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
+       "selfredirect": "<strong>Hoiatus:</strong> Suunad selle lehekülje iseeneda juurde.\nVõimalik, et oled määranud ümbersuunamise jaoks vale sihtleheküljeks või redigeerid vale lehekülge.\nÜmbersuunamine luuakse sellest hoolimata, kui klõpsad uuesti \"{{int:savearticle}}\".",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
        "missingcommentheader": "'''Meeldetuletus:''' Sa pole kirjutanud kommentaarile teemat ega pealkirja.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar kummatagi.",
        "summary-preview": "Resümee eelvaade:",
        "defaultmessagetext": "Sõnumi vaiketekst",
        "content-failed-to-parse": "Ebaõnnestus $1i mudeli $2-tüüpi sisu liigendamine: $3",
        "invalid-content-data": "Vigased sisuandmed",
-       "content-not-allowed-here": "Lehekülg [[$2]] ei i sisaldada $1i.",
+       "content-not-allowed-here": "Lehekülg [[$2]] ei tohi sisaldada $1i.",
        "editwarning-warning": "Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.\nKui oled sisse loginud, saad selle hoiatuse eelistuste alaosas \"{{int:prefs-editing}}\" keelata.",
        "editpage-notsupportedcontentformat-title": "Sisuvormingu tugi puudub",
        "editpage-notsupportedcontentformat-text": "Sisumudelil $2 puudub sisuvormingu $1 tugi.",
        "content-model-text": "lihttekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tühi objekt",
+       "content-json-empty-array": "Tühi massiiv",
        "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>.",
        "expensive-parserfunction-warning": "'''Hoiatus:''' See lehekülg kasutab liialt palju aeglustavaid laiendusfunktsioone. Neid võiks kasutada vähem kui {{PLURAL:$2|ühel|$2}} korral, praegu on kasutatud {{PLURAL:$1|ühel|$1}} korral.",
        "history-feed-empty": "Soovitud lehekülge ei ole olemas.\nSee võib olla vikist kustutatud või ümber nimetatud.\nÜrita [[Special:Search|vikist otsida]] teemakohaseid lehekülgi.",
        "rev-deleted-comment": "(muudatuse resümee eemaldatud)",
        "rev-deleted-user": "(kasutajanimi eemaldatud)",
-       "rev-deleted-event": "(logitoiming eemaldatud)",
+       "rev-deleted-event": "(logi üksikasjad eemaldatud)",
        "rev-deleted-user-contribs": "[kasutajanimi või IP-aadress eemaldatud – muudatust ei näidata]",
        "rev-deleted-text-permission": "See lehekülje redaktsioon on '''kustutatud'''.\nÜksikasju võib olla [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamise logis].",
        "rev-suppressed-text-permission": "Lehekülje see redaktsioon on <strong>varjatud</strong>.\nÜksikasju leiad [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} varjamislogist].",
        "revdelete-legend": "Nähtavuse piirangute seadmine",
        "revdelete-hide-text": "Redaktsiooni tekst",
        "revdelete-hide-image": "Peida faili sisu",
-       "revdelete-hide-name": "Peida toiming ja selle objekt",
+       "revdelete-hide-name": "Peida toimingu objekt ja parameetrid",
        "revdelete-hide-comment": "Resümee",
        "revdelete-hide-user": "Toimetaja kasutajanimi või IP-aadress",
        "revdelete-hide-restricted": "Varja andmeid nii administraatorite kui ka teiste eest.",
        "uploaderror": "Faili laadimine ebaõnnestus",
        "upload-recreate-warning": "'''Hoiatus: Sellise nimega fail on kustutatud või teisaldatud.'''\n\nSelle lehe kustutamis- ja teisaldamislogi on kuvatud siin:",
        "uploadtext": "Kasuta allpool olevat vormi, et faile üles laadida.\nEt näha või leida varem üles laaditud faile, vaata [[Special:FileList|failide loendit]].\nÜleslaadimiste ajalugu saab uurida [[Special:Log/upload|üleslaadimislogist]], kustutamiste ajalugu [[Special:Log/delete|kustutamislogist]].\n\nEt lisada fail artiklile, kasuta üht järgmistest süntaksitest:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></code>''', et lisada täissuuruses pilt\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|kirjeldus]]</nowiki></code>''', et lisada lehekülje vasakusse serva raamiga 200 piksli laiune pisipilt koos pildiallkirjaga (''kirjeldus'')\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></code>''', et linkida otse failile ilma seda kuvamata",
-       "upload-permitted": "Lubatud failitüübid: $1.",
-       "upload-preferred": "Eelistatud failitüübid: $1.",
-       "upload-prohibited": "Keelatud failitüübid: $1.",
+       "upload-permitted": "Lubatud {{PLURAL:$2|failitüüp|failitüübid}}: $1.",
+       "upload-preferred": "Eelistatud {{PLURAL:$2|failitüüp|failitüübid}}: $1.",
+       "upload-prohibited": "Keelatud {{PLURAL:$2|failitüüp|failitüübid}}: $1.",
        "uploadlogpage": "Üleslaadimislogi",
        "uploadlogpagetext": "Allpool on loend viimastest failide üleslaadimistest. Visuaalsema esituse nägemiseks vaata [[Special:NewFiles|uute failide galeriid]].",
        "filename": "Faili nimi",
        "deleteprotected": "Seda lehekülge ei saa kustutada, sest see on kaitstud.",
        "deleting-backlinks-warning": "'''Hoiatus:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
        "rollback": "Tühista muudatused",
-       "rollback_short": "Tühista",
        "rollbacklink": "tühista",
        "rollbacklinkcount": "tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}",
        "rollbacklinkcount-morethan": "tühista üle {{PLURAL:$1|ühe muudatuse|10 muudatuse}}",
        "namespace": "Nimeruum:",
        "invert": "Näita kõiki peale valitud nimeruumi",
        "tooltip-invert": "Tee kasti linnuke, kui soovid peita muudatused valitud nimeruumi lehekülgedel (ja valiku korral ka sellega seotud nimeruumis)",
+       "tooltip-whatlinkshere-invert": "Tee sellesse kasti linnuke, et peita lingid valitud nimeruumi lehekülgedelt.",
        "namespace_association": "Seonduv nimeruum",
        "tooltip-namespace_association": "Tee kasti linnuke, kui soovid valida ka valitud nimeruumiga seotud arutelu- või sisulehekülgede nimeruumi",
        "blanknamespace": "(Artiklid)",
        "thumbnail-temp-create": "Ajutist pisipildifaili ei õnnestu luua.",
        "thumbnail-dest-create": "Pisipilti ei õnnestu sihtkohas salvestada",
        "thumbnail_invalid_params": "Vigased pisipildi parameetrid",
+       "thumbnail_toobigimagearea": "Faili mõõtmed on suuremad kui $1",
        "thumbnail_dest_directory": "Sihtkataloogi loomine ebaõnnestus.",
        "thumbnail_image-type": "Selline pildi tüüp ei ole toetatav",
        "thumbnail_gd-library": "GD teegi häälestus on poolik: funktsioon $1 puudub",
        "import-logentry-interwiki": "importis teisest vikist lehekülje $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} imporditud asukohast $2",
        "javascripttest": "JavaScripti katsetamine",
-       "javascripttest-title": "$1-katse käitus",
        "javascripttest-pagetext-noframework": "Seda lehekülge hoitakse JavaScripti katsete jaoks.",
        "javascripttest-pagetext-unknownframework": "Tundmatu katseraamistik \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Tundmatu toiming \"$1\".",
        "javascripttest-pagetext-frameworks": "Palun vali üks järgmistest katseraamistikest: $1",
        "javascripttest-pagetext-skins": "Vali kujundus, millega katsetada:",
        "javascripttest-qunit-intro": "Vaata [$1 katsetamise dokumentatsiooni] asukohas mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScripti QUnit-katsekomplekt",
        "tooltip-pt-userpage": "Sinu kasutajaleht",
        "tooltip-pt-anonuserpage": "Sinu IP-aadressi kasutajalehekülg",
        "tooltip-pt-mytalk": "Sinu arutelulehekülg",
        "exif-focallength": "Fookuskaugus",
        "exif-subjectarea": "Põhimotiivi ala",
        "exif-flashenergy": "Välgu võimsus",
-       "exif-focalplanexresolution": "Fokaaltasandi laius",
-       "exif-focalplaneyresolution": "Fokaaltasandi kõrgus",
+       "exif-focalplanexresolution": "Fokaaltasandi rõhteraldus",
+       "exif-focalplaneyresolution": "Fokaaltasandi püsteraldus",
        "exif-focalplaneresolutionunit": "Fokaaltasandi eraldusühik",
        "exif-subjectlocation": "Põhimotiivi asukoht",
        "exif-exposureindex": "Särituse number",
        "watchlisttools-edit": "Vaata ja redigeeri jälgimisloendit",
        "watchlisttools-raw": "Muuda lähteteksti",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])",
-       "unknown_extension_tag": "Tundmatu lisa silt \"$1\".",
        "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\".",
        "invalid-indicator-name": "<strong>Tõrge:</strong> Lehekülje olekunäidu juures ei tohi atribuudi <code>name</code> väärtus puududa.",
        "version-entrypoints": "Sisendpunktide internetiaadressid",
        "version-entrypoints-header-entrypoint": "Sisendpunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Paigaldatud teegid",
+       "version-libraries-library": "Teek",
+       "version-libraries-version": "Versioon",
        "redirect": "Ümbersuunamine faili, kasutaja, lehekülje või redaktsiooni identifikaatori järgi",
        "redirect-legend": "Ümbersuunamine faili juurde või leheküljele",
        "redirect-summary": "See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni või lehekülje identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] või [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Valitud redaktsiooni ei ole.",
        "dberr-problems": "Kahjuks on sellel saidil tehnilisi probleeme",
        "dberr-again": "Oota mõni hetk ja laadi lehekülg uuesti.",
-       "dberr-info": "(Ei saa ühendust andmebaasi serveriga: $1)",
-       "dberr-info-hidden": "(Andmebaasiserveriga ei saa ühendust.)",
+       "dberr-info": "(Juurdepääs andmebaasile puudub: $1)",
+       "dberr-info-hidden": "(Juurdepääs andmebaasile puudub.)",
        "dberr-usegoogle": "Proovi vahepeal otsida Google'ist.",
        "dberr-outofdate": "Pane tähele, et Google'is talletatud meie sisu võib olla iganenud.",
        "dberr-cachederror": "See koopia taotletud leheküljest on vahemälus ja ei pruugi olla ajakohane.",
index 72e65e1..7828673 100644 (file)
@@ -47,7 +47,7 @@
        "tog-shownumberswatching": "Jarraitzen duen erabiltzaile kopurua erakutsi",
        "tog-oldsig": "Egungo sinadura:",
        "tog-fancysig": "Sinadura wikitestu gisa tratatu (lotura automatikorik gabe)",
-       "tog-uselivepreview": "Zuzeneko aurrebista erakutsi (Proba fasean)",
+       "tog-uselivepreview": "Zuzeneko aurrebista erabili",
        "tog-forceeditsummary": "Aldaketaren laburpena zuri uzterakoan ohartarazi",
        "tog-watchlisthideown": "Segimendu zerrendan nire aldaketak ezkutatu",
        "tog-watchlisthidebots": "Segimendu zerrendan bot-en aldaketak ezkutatu",
        "hidetoc": "ezkutatu",
        "collapsible-collapse": "Itxi",
        "collapsible-expand": "Zabaldu",
+       "confirmable-confirm": "Ziur zaude?",
        "confirmable-yes": "Bai",
        "confirmable-no": "Ez",
        "thisisdeleted": "$1 ikusi edo leheneratu?",
        "loginlanguagelabel": "Hizkuntza: $1",
        "suspicious-userlogout": "Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.",
        "createacct-another-realname-tip": "Benetako izena hautazkoa da.\nEmatea erabakitzen baduzu hori erabiliko da lanaren atribuzioa egiterako garaian.",
+       "pt-login": "Saioa hasi",
        "pt-createaccount": "Sortu kontua",
        "pt-userlogout": "Saioa itxi",
        "php-mail-error-unknown": "PHPren mail() funtzioan arazo ezezagun bat egon da.",
        "search-result-category-size": "{{PLURAL:$1|kide 1|$1 kide}} ({{PLURAL:$2|azpikategoria 1|$2 azpikategoria}}, {{PLURAL:$3|fitxategi 1|$3 fitxategi}})",
        "search-redirect": "(«$1» orritik birbideratua)",
        "search-section": "($1 atala)",
+       "search-category": "($1 kategoria)",
        "search-suggest": "$1 esan nahi zenuen",
        "search-interwiki-caption": "Beste proiektuak",
        "search-interwiki-default": "$1(r)en emaitzak:",
        "delete-toobig": "Orrialde honek aldaketa historia luzea du, {{PLURAL:$1|berrikuspen batetik|$1 berrikuspenetik}} gorakoa.\nOrrialde horien ezabaketa mugatua dago {{SITENAME}}n ezbeharrak saihesteko.",
        "delete-warning-toobig": "Orrialde honek aldaketa historia luzea du, {{PLURAL:$1|berrikuspen batetik|$1 berrikuspenetik}} gorakoa.\nEzabatzeak ezbeharrak eragin ditzake {{SITENAME}}ren datu-basean;\nkontu izan.",
        "rollback": "Desegin aldaketak",
-       "rollback_short": "Desegin",
        "rollbacklink": "desegin",
        "rollbacklinkcount": "desegin {{PLURAL:$1|edizio bat|$1 edizio}}",
        "rollbacklinkcount-morethan": "desegin {{PLURAL:$1|edizio bat|$1 edizio}} baino gehiago",
        "protectedarticle": "\"[[$1]]\" babestu da\"",
        "modifiedarticleprotection": "\"[[$1]]\"(r)en babes maila aldatu da",
        "unprotectedarticle": "\"[[$1]]\"-(r)i babesa kendu zaio",
-       "movedarticleprotection": "babes hobespenak \"[[$2]]\"tik \"[[$1]]\"(e)ra mugitu dira",
+       "movedarticleprotection": "babes hobespenak «[[$2]]» orritik «[[$1]]» orrira aldatu dira",
        "protect-title": "«$1» babesten",
        "protect-title-notallowed": "\"$1\"en babes maila ikusi",
        "prot_1movedto2": "«[[$1]]» orria «[[$2]]» izenera aldatu da",
        "movenotallowedfile": "Ez duzu fitxategiak mugitzeko eskumenik.",
        "cant-move-user-page": "Ez duzu lankide orrialdeak mugitzeko eskumenik (azpiorrialdeetatik at).",
        "cant-move-to-user-page": "Ez duzu orrialde bat lankide orrialde batera mugitzeko eskumenik (lankide azpiorrialde batera izan ezik).",
+       "cant-move-to-category-page": "Ez duzu baimenik orrialde bat kategoria-orrialde batera mugitzeko.",
        "newtitle": "Izenburu berria",
        "move-watch": "Orrialde hau jarraitu",
        "movepagebtn": "Mugitu orria",
        "thumbnail-temp-create": "Ezin izan da behin-behineko iruditxoa sortu",
        "thumbnail-dest-create": "Ezin izan da iruditxoa gorde helburuan",
        "thumbnail_invalid_params": "Irudi txikiaren ezarpenak ez dira baliagarriak",
+       "thumbnail_toobigimagearea": "$1 baino gehiagoko fitxategia",
        "thumbnail_dest_directory": "Ezinezkoa izan da helburu direktorioa sortu",
        "thumbnail_image-type": "Irudi mota ez babestua",
        "thumbnail_gd-library": "GD liburutegiaren konfigurazio osagabea: $1 funtzioa falta da",
        "import-logentry-interwiki": "$1 wiki artean mugitu da",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|berrikuspen|berrikuspen}} $2-(e)tik",
        "javascripttest": "JavaScript frogatzen",
-       "javascripttest-title": "$1 frogak egiten",
        "javascripttest-pagetext-noframework": "Orrialde hau JavaScript frogak egiteko gordeta dago.",
        "javascripttest-pagetext-unknownframework": "Froga eremu ez-ezaguna \"$1\".",
        "javascripttest-pagetext-frameworks": "Mesedez, aukera ezazu froga eremu hauetako bat: $1",
        "javascripttest-pagetext-skins": "Aukeratu frogak egiteko itxura bat:",
        "javascripttest-qunit-intro": "Ikusi [$1 frogen dokumentazioa] mediawiki.org orrialdean.",
-       "javascripttest-qunit-heading": "MediWiki JavaScript QUnit froga taldea",
        "tooltip-pt-userpage": "Nire lankide orria",
        "tooltip-pt-anonuserpage": "Zure IParen lankide orrialdea",
        "tooltip-pt-mytalk": "Nire eztabaida orria",
        "watchlistedit-raw-done": "Zure jarraipen zerrenda berritu da.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Titulu 1 gehitu da|$1 gehitu dira}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Izenburu 1|$1 izenburu}} ezabatu dira:",
+       "watchlistedit-clear-titles": "Izenburuak:",
        "watchlisttools-view": "Aldaketa garrantzitsuak ikusi",
        "watchlisttools-edit": "Zerrenda ikusi eta aldatu",
        "watchlisttools-raw": "Zerrenda idatziz aldatu",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|eztabaida]])",
-       "unknown_extension_tag": "\"$1\" luzapen etiketa ezezaguna",
        "duplicate-defaultsort": "Adi: Berezko \"$2\" antolatzeak aurreko berezko \"$1\" antolatzea gainditzen du.",
        "version": "Bertsioa",
        "version-extensions": "Instalatutako luzapenak",
        "version-entrypoints": "Sarrera puntuko URLa",
        "version-entrypoints-header-entrypoint": "Sarrera puntua",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-version": "Bertsioa",
        "redirect": "Birzuzendu fitxategi, lankide edo berrikuspen IDaren arabera",
        "redirect-legend": "Orrialde edo fitxategi batera birzuzendu",
        "redirect-submit": "Joan",
        "specialpages-group-wiki": "Datuak eta tresnak",
        "specialpages-group-redirects": "Berbideraketa-orri bereziak",
        "specialpages-group-spam": "Spam tresnak",
+       "specialpages-group-developer": "Garatzaileen tresnak",
        "blankpage": "Orrialde txuria",
        "intentionallyblankpage": "Orri hau nahita utzi da hutsik",
        "external_image_whitelist": " #Lerro hau utzi dagoen bezala<pre>\n#Jarri espresio zati erregularrak (bakarrik // artean doan zatia) azpian\n#Hauek kanpo irudien URLekin lotuko dira\n#Lotutako horiek irudi bezala agertuko dira, bestela lotura besterik ez da agertuko\n# #-arekin hasten diren lerroak iruzkin bezala hartuko dira\n# Hau case-insensitive da\n\n#Jarri regex zatiak lerro honen gainetik. Lerro hau utzi dagoen bezala</pre>",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
        "expand_templates_preview": "Aurreikusi",
        "pagelang-language": "Hizkuntza",
+       "pagelang-select-lang": "Hizkuntza aukeratu",
+       "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; %$3)",
        "mediastatistics-table-count": "Fitxategi kopurua",
        "mediastatistics-header-video": "Bideoak",
index eaea3f6..d4465ee 100644 (file)
@@ -70,7 +70,7 @@
        "tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
        "tog-oldsig": "امضای کنونی:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
-       "tog-uselivepreview": "استفاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)",
+       "tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
        "tog-forceeditsummary": "هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود",
        "tog-watchlisthideown": "ویرایش‌های خودم در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlisthidebots": "ویرایش‌های ربات‌ها در فهرست پی‌گیری‌ها پنهان شود",
        "february-gen": "فوریهٔ",
        "march-gen": "مارس",
        "april-gen": "آوریل",
-       "may-gen": "مهٔ",
+       "may-gen": "مه",
        "june-gen": "ژوئن",
        "july-gen": "ژوئیهٔ",
        "august-gen": "اوت",
        "pool-queuefull": "صف مخزن پر است",
        "pool-errorunknown": "خطای ناشناخته",
        "pool-servererror": "پول سنتر سرویس در دسترس نیست ( $1 ).",
+       "poolcounter-usage-error": "خطای استفاده: $1",
        "aboutsite": "دربارهٔ {{SITENAME}}",
        "aboutpage": "Project:درباره",
        "copyright": "محتوایات تحت اجازه‌نامهٔ $1 هستند مگر اینکه خلافش ذکر شده باشد.",
        "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
        "missingcommentheader": "'''یادآوری:''' شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
        "content-model-text": "متنی ساده",
        "content-model-javascript": "جاوااسکریپت",
        "content-model-css": "سی‌اس‌اس",
+       "content-json-empty-object": "ابجکت خالی",
+       "content-json-empty-array": "آرایهٔ خالی",
        "duplicate-args-category": "صفحه‌های دارای آرگومان تکراری در فراخوانی الگو",
        "duplicate-args-category-desc": "صفحاتی که دارای آرگومان تکراری هستند مانند، <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> یا <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیه‌گر است.\n\nتعداد آن‌ها باید کمتر از $2 {{PLURAL:$2|فراخوانی|فراخوانی}} باشد، و اینک {{PLURAL:$1|$1 فراخوانی|$1 فراخوانی}} است.",
        "history-feed-empty": "صفحهٔ درخواست شده وجود ندارد.\nممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.\nصفحات تازه را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].",
        "rev-deleted-comment": "(خلاصه ویرایش حذف شد)",
        "rev-deleted-user": "(نام کاربری حذف شد)",
-       "rev-deleted-event": "(مورد از سیاهه پاک شده)",
+       "rev-deleted-event": "(جزئیات سیاهه پاک شده)",
        "rev-deleted-user-contribs": "[نام کاربری یا نشانی آی‌پی حذف شده - ویرایش مخفی شده در مشارکت‌ها]",
        "rev-deleted-text-permission": "این ویرایش از این صفحه '''حذف شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
        "rev-suppressed-text-permission": "این ویرایش از این صفحه '''حذف شده‌است'''.\nشما می‌توانید آن را ببینید؛ ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
        "revdelete-selected-text": "{{PLURAL:$1|نسخهٔ انتخاب‌شده|نسخه‌های انتخابی}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|نسخهٔ انتخاب‌شدهٔ|نسخه‌های انتخابی}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|مورد|موارد}} انتخاب شده از سیاهه:",
-       "revdelete-text-text": "Ù\86سخÙ\87â\80\8cÙ\87اÛ\8c Ø­Ø°Ù\81â\80\8cشدÙ\87 Ù\87Ù\85Ú\86Ù\86اÙ\86 Ø¯Ø± ØªØ§Ø±Û\8cÛ\8cØ®Ú\86Ù\87 Ù\86Ù\85اÛ\8cاÙ\86 Ø®Ù\88اÙ\86د Ø¨Ù\88د Ù\88Ù\84Û\8c Ù\82سÙ\85تâ\80\8cÙ\87اÛ\8cÛ\8c Ø§Ø² Ù\85حتÙ\88Û\8cات ØºØ¨Ø±Ù\82ابÙ\84 Ø¯Ø³ØªØ±Ø³ Ø¨Ø±Ø§Û\8c Ø¹Ù\85Ù\88Ù\85 خواهد بود.",
+       "revdelete-text-text": "Ù\85شخصات Ù\86سخÙ\87â\80\8cÙ\87اÛ\8c Ø­Ø°Ù\81 Ø´Ø¯Ù\87 Ù\87Ù\85Ú\86Ù\86اÙ\86 Ø¯Ø± ØªØ§Ø±Û\8cØ®Ú\86Ù\87 ØµÙ\81Ø­Ù\87 Ù\86Ù\85اÛ\8cاÙ\86 Ø®Ù\88اÙ\87د Ø¨Ù\88د Ù\88Ù\84Û\8c Ø¯Ø³ØªØ±Ø³Û\8c Ø¨Ù\87 Ù\82سÙ\85تâ\80\8cÙ\87اÛ\8cÛ\8c Ø§Ø² Ù\85حتÙ\88Û\8cات Ø§Û\8cÙ\86 Ù\86سخÙ\87â\80\8cÙ\87ا Ø¨Ø±Ø§Û\8c Ø¹Ù\85Ù\88Ù\85 Ù\85Ù\85Ú©Ù\86 Ù\86خواهد بود.",
        "revdelete-text-file": "نسخه‌های حذف‌شده همچنان در تاریخچهٔ پرونده نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها برای عموم غیرقابل دسترس خواهد بود.",
        "logdelete-text": "نسخه‌های حذف‌شده همچنان در سیاهه‌های نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها غیرقابل دسترس برای عموم خواهد بود.",
        "revdelete-text-others": "سایر مدیران هنوز می‌توانند این محتوای پنهان را ببینند و از همین طریق موارد حذف شده را احیا کنند، مگر آن که محدودیت‌های دیگری اعمال گردد.",
        "revdelete-legend": "تنظیم محدودیت‌های پیدایی",
        "revdelete-hide-text": "متن نسخه",
        "revdelete-hide-image": "نهفتن محتویات پرونده",
-       "revdelete-hide-name": "نهفتن عمل و هدف",
+       "revdelete-hide-name": "نهفتن متغییرها و هدف",
        "revdelete-hide-comment": "خلاصهٔ ویرایش",
        "revdelete-hide-user": "نام کاربری/نشانی آی‌پی",
        "revdelete-hide-restricted": "فرونشانی اطلاعات برای مدیران به همراه دیگران",
        "revdel-restore": "تغییر پیدایی",
        "pagehist": "تاریخچهٔ صفحه",
        "deletedhist": "تاریخچهٔ حذف‌شده",
-       "revdelete-hide-current": "خطا در پنهان‌کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر است و قابل پنهان‌کردن نیست.",
-       "revdelete-show-no-access": "خطا در پنهانکردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
-       "revdelete-modify-no-access": "خطا در پنهانکردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
-       "revdelete-modify-missing": "خطا در پنهانکردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!",
+       "revdelete-hide-current": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر است و قابل پنهان کردن نیست.",
+       "revdelete-show-no-access": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
+       "revdelete-modify-no-access": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
+       "revdelete-modify-missing": "خطا در پنهان کردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!",
        "revdelete-no-change": "'''هشدار:''' مورد مورخ $2 ساعت $1 از قبل تنظیمات پیدایی درخواست شده را دارا بود.",
-       "revdelete-concurrent-change": "خطا در پنهانکردن مورد مورخ $2 ساعت $1: به نظر می‌رسد که در مدتی که شما برای تغییر وضعیت آن تلاش می‌کردید وضعیت آن توسط فرد دیگری تغییر یافته است.\nلطفاً سیاهه‌ها را بررسی کنید.",
+       "revdelete-concurrent-change": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: به نظر می‌رسد که در مدتی که شما برای تغییر وضعیت آن تلاش می‌کردید وضعیت آن توسط فرد دیگری تغییر یافته است.\nلطفاً سیاهه‌ها را بررسی کنید.",
        "revdelete-only-restricted": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: شما نمی‌توانید موارد را از دید مدیران پنهان کنید مگر آن که یکی دیگر از گزینه‌های پنهان‌سازی را نیز انتخاب کنید.",
        "revdelete-reason-dropdown": "*دلایل متداول حذف\n** نقض حق تکثیر\n** اظهار نظر یا اطلاعات فردی نامناسب\n** نام کاربری نامناسب\n** اطلاعات به طور بالقوه افتراآمیز",
        "revdelete-otherreason": "دلیل دیگر/اضافی:",
        "right-suppressionlog": "مشاهدهٔ سیاهه‌های خصوصی",
        "right-block": "قطع دسترسی ویرایشی دیگر کاربران",
        "right-blockemail": "قطع دسترسی دیگر کاربران برای ارسال رایانامه",
-       "right-hideuser": "قطع دسترسی کاربر و پنهانکردن آن از دید عموم",
+       "right-hideuser": "قطع دسترسی کاربر و پنهان کردن آن از دید عموم",
        "right-ipblock-exempt": "تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای",
        "right-proxyunbannable": "تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها",
        "right-unblockself": "بازکردن دسترسی خود",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
-       "rcshowhideminor-hide": "پنهانکردن",
+       "rcshowhideminor-hide": "پنهان کردن",
        "rcshowhidebots": "$1 ربات‌ها",
        "rcshowhidebots-show": "نمایش",
-       "rcshowhidebots-hide": "پنهانکردن",
+       "rcshowhidebots-hide": "پنهان کردن",
        "rcshowhideliu": "$1 کاربران ثبت‌نام‌کردە",
        "rcshowhideliu-show": "نمایش",
-       "rcshowhideliu-hide": "پنهانکردن",
+       "rcshowhideliu-hide": "پنهان کردن",
        "rcshowhideanons": "$1 کاربران ناشناس",
        "rcshowhideanons-show": "نمایش",
-       "rcshowhideanons-hide": "پنهانکردن",
+       "rcshowhideanons-hide": "پنهان کردن",
        "rcshowhidepatr": "$1 ویرایش‌های گشت‌خورده",
        "rcshowhidepatr-show": "نمایش",
-       "rcshowhidepatr-hide": "پنهانکردن",
+       "rcshowhidepatr-hide": "پنهان کردن",
        "rcshowhidemine": "$1 ویرایش‌های من",
        "rcshowhidemine-show": "نمایش",
-       "rcshowhidemine-hide": "پنهانکردن",
+       "rcshowhidemine-hide": "پنهان کردن",
        "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "uploaderror": "خطای بارگذاری",
        "upload-recreate-warning": "'''هشدار: پرونده‌ای با این نام حذف یا منتقل شده است.'''\n\nبرای راحتی، سیاههٔ حذف و انتقال برای این صفحه در زیر آمده است:",
        "uploadtext": "از فرم زیر برای بارگذاری کردن پرونده‌های جدید استفاده کنید.\nبرای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.\n\nبعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحات استفاده کنید:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
-       "upload-permitted": "انواع مجاز پرونده‌ها: $1.",
-       "upload-preferred": "انواع ترجیح‌داده شده پرونده‌ها: $1.",
-       "upload-prohibited": "انواع نامجاز پرونده‌ها: $1.",
+       "upload-permitted": "{{PLURAL:$2|نوع|انواع}} پرونده مجاز: $1.",
+       "upload-preferred": "{{PLURAL:$2|نوع|انواع}} پرونده ترجیح‌داده شده: $1.",
+       "upload-prohibited": "{{PLURAL:$2|نوع|انواع}} پرونده نامجاز: $1.",
        "uploadlogpage": "سیاههٔ بارگذاری‌ها",
        "uploadlogpagetext": "فهرست زیر فهرستی از آخرین بارگذاری پرونده‌ها است.\nبرای مرور دیداری [[Special:NewFiles|نگارخانهٔ پرونده‌های جدید]] را ببینید.",
        "filename": "نام پرونده",
        "wantedtemplates": "الگوهای مورد نیاز",
        "mostlinked": "صفحه‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostlinkedcategories": "رده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
-       "mostlinkedtemplates": "ببشترین صفحات تراگنجانده‌شده",
+       "mostlinkedtemplates": "بیشترین صفحات تراگنجانده‌شده",
        "mostcategories": "صفحه‌های دارای بیشترین رده",
        "mostimages": "پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostinterwikis": "صفحه‌های دارای بیشترین میان‌ویکی",
        "protectedpages-indef": "فقط محافظت‌های بی‌پایان",
        "protectedpages-summary": "در این صفحه فهرست صفحات موجود است که در حال حاضر محافظت شده اند. برای فهرست عنوان‌هایی که از ایجاد محافظت شده‌اند، به [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] مراجعه کنید.",
        "protectedpages-cascade": "فقط محافظت‌های آبشاری",
-       "protectedpages-noredirect": "پنهانکردن تغییر مسیرها",
+       "protectedpages-noredirect": "پنهان کردن تغییر مسیرها",
        "protectedpagesempty": "در حال حاضر هیچ‌صفحه‌ای محافظت نشده‌است.",
        "protectedpages-timestamp": "برچسب زمان",
        "protectedpages-page": "صفحه",
        "deleteprotected": "شما نمی‌توانید این صفحه را پاک کنید چون که از آن محافظت شده‌است.",
        "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحه‌های دیگری]] هستند که به صفحه‌ای که شما در حال حذف آن هستید پیوند دارند یا آن را تراگنجانیده‌اند.",
        "rollback": "واگردانی ویرایش‌ها",
-       "rollback_short": "واگردانی",
        "rollbacklink": "واگردانی",
        "rollbacklinkcount": "واگردانی $1 ویرایش",
        "rollbacklinkcount-morethan": "واگردانی بیش از $1 ویرایش",
        "namespace": "فضای نام:",
        "invert": "انتخاب برعکس شود",
        "tooltip-invert": "این جعبه را علامت بزنید تا تغییرات صفحه‌های داخل فضای نام انتخاب شده (و دیگر فضاهای نام علامت زده شده) پنهان شوند",
+       "tooltip-whatlinkshere-invert": "این جعبه را برای پنهان کردن پیوند صفحاتی که فضای نامشان انتخاب شده‌است، انتخاب کنید.",
        "namespace_association": "فضای نام مرتبط",
        "tooltip-namespace_association": "این جعبه را علامت بزنید تا فضای نام بحث یا موضوع مرتبط با فضای نام انتخاب شده هم شامل شود",
        "blanknamespace": "(اصلی)",
        "blocklist": "کاربران بسته‌شده",
        "ipblocklist": "کاربران بسته‌شده",
        "ipblocklist-legend": "جستجوی کاربر بسته شده",
-       "blocklist-userblocks": "پنهانکردن بسته‌شدن‌های حساب",
-       "blocklist-tempblocks": "پنهانکردن بستن‌های موقت",
-       "blocklist-addressblocks": "پنهانکردن تک آی‌پی‌های بسته شده",
+       "blocklist-userblocks": "پنهان کردن بسته‌شدن‌های حساب",
+       "blocklist-tempblocks": "پنهان کردن بستن‌های موقت",
+       "blocklist-addressblocks": "پنهان کردن تک آی‌پی‌های بسته شده",
        "blocklist-rangeblocks": "پنهان کردنی قطع دسترسی بازه‌ها",
        "blocklist-timestamp": "برچسب زمان",
        "blocklist-target": "هدف",
        "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.",
        "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
        "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1",
-       "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده‌است. چون شما دسترسی پنهان‌کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
+       "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
        "ipbblocked": "شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.",
        "ipbnounblockself": "شما مجاز به باز کردن دسترسی خود نیستید.",
        "lockdb": "قفل کردن پایگاه داده",
        "thumbnail-temp-create": "نمی‌توان پروندهٔ بندانگشتی موقت را ساخت",
        "thumbnail-dest-create": "نمی‌توان تصویر بندانگشتی را در مقصد ذخیره کرد",
        "thumbnail_invalid_params": "پارامترهای نامجاز در تصویر بندانگشتی (thumbnail)",
+       "thumbnail_toobigimagearea": "پرونده‌ای با اندازهٔ بیشتر از $1",
        "thumbnail_dest_directory": "اشکال در ایجاد پوشهٔ مقصد",
        "thumbnail_image-type": "تصویر از نوع پشتیبانی نشده",
        "thumbnail_gd-library": "تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد",
        "import-logentry-interwiki": "$1 را تراویکی کرد",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده از $2",
        "javascripttest": "آزمایش جاوا اسکریپت",
-       "javascripttest-title": "در حال اجرای آزمایش‌های $1",
        "javascripttest-pagetext-noframework": "این صفحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.",
        "javascripttest-pagetext-unknownframework": "چارچوب آزمایشی ناشناخته «$1».",
+       "javascripttest-pagetext-unknownaction": "تابع ناشناختهٔ \"$1\".",
        "javascripttest-pagetext-frameworks": "لطفاً یکی از چارچوب‌های آزمایش زیر را انتخاب کنید: $1",
        "javascripttest-pagetext-skins": "پوسته‌ای را برای اجرای آزمایش‌ها انتخاب کنید:",
        "javascripttest-qunit-intro": "[$1 مستندات آزمایش] را در mediawiki.org ببینید.",
-       "javascripttest-qunit-heading": "مجموعه آزمایش QUnit جاوااسکریپت برای مدیاویکی",
        "tooltip-pt-userpage": "صفحهٔ کاربری شما",
        "tooltip-pt-anonuserpage": "صفحهٔ کاربری نشانی آی‌پی‌ای که با آن ویرایش می‌کنید",
        "tooltip-pt-mytalk": "صفحهٔ بحث شما",
        "hebrew-calendar-m11-gen": "آب",
        "hebrew-calendar-m12-gen": "ایلول",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|بحث]])",
-       "unknown_extension_tag": "برچسب ناشناختهٔ افزونه «$1»",
        "duplicate-defaultsort": "هشدار: ترتیب پیش‌فرض «$2» ترتیب پیش‌فرض قبلی «$1» را باطل می‌کند.",
        "duplicate-displaytitle": "<strong>هشدار:</strong> نمایش عنوان \" $2 \"باعث ابطال پیش نمایش عنوان\" $1 \" می‌شود.",
        "invalid-indicator-name": "<strong>خطا:</strong>ویژگی های شاخص‌های وضعیت صفحهٔ <code>name</code> نباید خالی باشند.",
        "version-entrypoints-header-url": "نشانی اینترنتی",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath مسیر مقاله]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath مسیر اسکریپت]",
+       "version-libraries": "کتابخانهٔ نصب شده",
+       "version-libraries-library": "کتابخانه",
+       "version-libraries-version": "نسخه",
        "redirect": "تغییرمسیر توسط پرونده، کاربر، صفحه یا شناسهٔ نسخه",
        "redirect-legend": "تغییرمسیر به یک پرونده یا صفحه",
        "redirect-summary": "این صفحهٔ ویژه به پرونده (نام پرونده داده‌شده)، صفحه (شماره شناسهٔ صفحه یا شماره نسخهٔ داده‌شده) یا صفحهٔ کاربری (شناسهٔ عددی کاربری داده‌شده) تغییرمسیر می‌یابد. طرز استفاده: [[{{#Special:Redirect}}/file/Example.jpg]]، \n[[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یا [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "پالایهٔ مشخص شده وجود ندارد.",
        "dberr-problems": "شرمنده! این تارنما از مشکلات فنی رنج می‌برد.",
        "dberr-again": "چند دقیقه صبر کنید و دوباره صفحه را بارگیری کنید.",
-       "dberr-info": "(امکان برقراری ارتباط با کارساز پایگاه داده وجود ندارد: $1)",
-       "dberr-info-hidden": "(امکان تماس با پایگاه‌داده‌ها کارساز امکان‌پذیر نیست)",
+       "dberr-info": "(امکان برقراری ارتباط با پایگاه داده وجود ندارد: $1)",
+       "dberr-info-hidden": "(امکان تماس با پایگاه‌داده نیست)",
        "dberr-usegoogle": "شما در این مدت می‌توانید با استفاده از گوگل جستجو کنید.",
        "dberr-outofdate": "توجه کنید که نمایه‌های آن‌ها از محتوای ما ممکن است به روز نباشد.",
        "dberr-cachederror": "آن‌چه در ادامه می‌آید یک کپی از صفحهٔ درخواست شده است که در کاشه قرار دارد، و ممکن است به روز نباشد.",
index 79a45ea..9301295 100644 (file)
        "pool-queuefull": "Prosessijoukon jono on täynnä",
        "pool-errorunknown": "Tuntematon virhe.",
        "pool-servererror": "Pool counter -palvelu ei ole käytettävissä ($1).",
+       "poolcounter-usage-error": "Käyttövirhe: $1",
        "aboutsite": "Tietoja {{GRAMMAR:elative|{{SITENAME}}}}",
        "aboutpage": "Project:Tietoja",
        "copyright": "Sisältö on käytettävissä lisenssillä $1, ellei toisin ole mainittu.",
        "summary": "Yhteenveto",
        "subject": "Aihe tai otsikko",
        "minoredit": "Tämä on pieni muutos",
-       "watchthis": "Lisää tarkkailulistaan",
+       "watchthis": "Tarkkaile tätä sivua",
        "savearticle": "Tallenna sivu",
        "preview": "Esikatselu",
        "showpreview": "Esikatsele",
        "anoneditwarning": "<strong>Varoitus:</strong> Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos <strong>[$1 kirjaudut sisään]</strong> tai <strong>[$2 luot tunnuksen]</strong>, muokkauksesi kirjataan käyttäjätunnuksesi tekemiksi ja samalla saat käyttöösi hyödyllisiä välineitä.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
-       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta samaan artikkeliin. Jos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan.",
+       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
        "missingcommenttext": "Kirjoita viesti alle.",
        "missingcommentheader": "Et ole antanut otsikkoa kommentillesi. Napsauta ”{{int:savearticle}}”, jos et halua antaa otsikkoa.",
        "summary-preview": "Yhteenvedon esikatselu:",
        "content-model-text": "pelkkä teksti",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tyhjä objekti",
+       "content-json-empty-array": "Tyhjä array",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "duplicate-args-category-desc": "Tämä sivu sisältää sellaisia mallinekutsuja, jotka käyttävät kaksi kertaa samaa argumenttia kuten <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> taikka <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.\nKutsuja pitäisi olla alle $2 {{PLURAL:$2|kappale|kappaletta}}, mutta nyt niitä on $1 {{PLURAL:$1|kappale|kappaletta}}.",
        "history-feed-empty": "Pyydettyä sivua ei ole olemassa.\nSe on saatettu poistaa wikistä tai nimetä uudelleen.\nKokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.",
        "rev-deleted-comment": "(muokkausyhteenveto poistettu)",
        "rev-deleted-user": "(käyttäjänimi poistettu)",
-       "rev-deleted-event": "(lokitapahtuma poistettu)",
+       "rev-deleted-event": "(lokitiedot poistettu)",
        "rev-deleted-user-contribs": "[käyttäjätunnus tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]",
        "rev-deleted-text-permission": "Tämä versio sivusta on '''poistettu'''.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "rev-suppressed-text-permission": "Tämä versio sivusta on <strong>häivytetty</strong>.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  häivytyslokista].",
        "revdelete-legend": "Aseta version näkyvyyden rajoitukset",
        "revdelete-hide-text": "Piilota version tekstisisältö",
        "revdelete-hide-image": "Piilota tiedoston sisältö",
-       "revdelete-hide-name": "Piilota toiminto ja kohde",
+       "revdelete-hide-name": "Piilota kohde ja parametrit",
        "revdelete-hide-comment": "Piilota yhteenveto",
        "revdelete-hide-user": "Piilota tekijän tunnus tai IP-osoite",
        "revdelete-hide-restricted": "Häivytä tiedot sekä ylläpitäjien että muiden käyttäjien näkyviltä",
        "uploaderror": "Tallennusvirhe",
        "upload-recreate-warning": "<strong>Varoitus: Tiedosto tällä nimellä on poistettu tai siirretty.</strong>\n\nPoisto- ja siirtoloki tälle sivulle näkyy alla:",
        "uploadtext": "Käytä tätä alla olevaa lomaketta tiedostojen tallentamiseen.\nVoit katsella luetteloa aiemmin tallennetuista tiedostoista sivulla [[Special:FileList|tiedostoluettelo]]. Kaikki tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]] ja tiedostojen poistot [[Special:Log/delete|poistolokiin]].\n\nJotta saat tiedoston näkymään sivulla, käytä jotakin seuraavista muotoiluista linkkinä siihen:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code></strong> käyttääksesi tiedoston kokonaista versiota.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|teksti tähän]]</nowiki></code></strong> käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvatekstillä \"teksti tähän\".\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code></strong>, jos haluat suoran linkin tiedostoon ilman että tiedostoa näytetään.",
-       "upload-permitted": "Sallitut tiedostomuodot: $1.",
-       "upload-preferred": "Suositellut tiedostomuodot: $1.",
-       "upload-prohibited": "Kielletyt tiedostomuodot: $1.",
+       "upload-permitted": "{{PLURAL:$2|Sallittu tiedostomuoto|Sallitut tiedostomuodot}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Suositeltu tiedostomuoto|Suositellut tiedostomuodot}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Kielletty tiedostomuoto|Kielletyt tiedostomuodot}}: $1.",
        "uploadlogpage": "Tiedostoloki",
        "uploadlogpagetext": "Alla on luettelo uusimmista tiedostonlisäyksistä. Kaikki ajat näytetään palvelimen aikavyöhykkeessä.",
        "filename": "Tiedoston nimi:",
        "deleteprotected": "Et voi poistaa tätä sivua, koska se on suojattu.",
        "deleting-backlinks-warning": "'''Varoitus:''' Sivulle, jota olet poistamassa, johtaa [[Special:WhatLinksHere/{{FULLPAGENAME}}|linkkejä muilta sivuilta]], tai sivu on sisällytetty muuhun sivuun.",
        "rollback": "palauta aiempaan versioon",
-       "rollback_short": "Palautus",
        "rollbacklink": "palauta",
        "rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutos|muutosta}}",
        "rollbacklinkcount-morethan": "palauta yli $1 {{PLURAL:$1|muutos|muutosta}}",
        "namespace": "Nimiavaruus:",
        "invert": "Käänteinen valinta",
        "tooltip-invert": "Valitse tämä kohta, jos haluat piilottaa muutokset sivuihin valitussa nimiavaruudessa (ja liittyviin nimiavaruuksiin, jos valittu)",
+       "tooltip-whatlinkshere-invert": "Laita rasti tähän ruutuun, kun haluat piilottaa linkit niistä sivuista, jotka kuuluvat valittuun nimiavaruuteen.",
        "namespace_association": "Liittyvä nimiavaruus",
        "tooltip-namespace_association": "Valitse tämä kohta, jos haluat haun sisältävän myös valittuun nimiavaruuteen liittyvän keskustelu- tai aihenimiavaruuden.",
        "blanknamespace": "(sivut)",
        "thumbnail-temp-create": "Väliaikaisen esikatselukuvan luonti epäonnistui",
        "thumbnail-dest-create": "Esikatselukuvaa ei voitu tallentaa kohteeseen",
        "thumbnail_invalid_params": "Virheelliset parametrit pienoiskuvalle",
+       "thumbnail_toobigimagearea": "Tiedosto, jonka mitat ovat suuremmat kuin $1",
        "thumbnail_dest_directory": "Kohdehakemiston luominen ei onnistunut",
        "thumbnail_image-type": "Kuvamuoto ei ole tuettu",
        "thumbnail_gd-library": "GD-kirjastoa ei ole asennettu oikein. Funktio $1 puuttuu.",
        "import-logentry-interwiki": "toi toisesta wikistä sivun $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin wikistä $2",
        "javascripttest": "JavaScriptin testaus",
-       "javascripttest-title": "Suoritetaan $1-testejä.",
        "javascripttest-pagetext-noframework": "Tämä sivu on varattu JavaScript-testien suorittamiseen.",
        "javascripttest-pagetext-unknownframework": "Tuntematon testausalusta $1.",
+       "javascripttest-pagetext-unknownaction": "Tuntematon toiminto \"$1\".",
        "javascripttest-pagetext-frameworks": "Valitse yksi seuraavista testausalustoista: $1",
        "javascripttest-pagetext-skins": "Valitse testauksessa käytettävä ulkoasu",
        "javascripttest-qunit-intro": "Katso [$1 testausohjeet] mediawiki.orgissa.",
-       "javascripttest-qunit-heading": "MediaWikin JavaScriptin QUnit-testikokoelma",
        "tooltip-pt-userpage": "Oma käyttäjäsivu",
        "tooltip-pt-anonuserpage": "IP-osoitteesi käyttäjäsivu",
        "tooltip-pt-mytalk": "Oma keskustelusivu",
        "tooltip-preview": "Esikatsele muokkausta ennen tallennusta",
        "tooltip-diff": "Näytä tehdyt muutokset",
        "tooltip-compareselectedversions": "Vertaile valittuja versioita",
-       "tooltip-watch": "Lisää tämä sivu tarkkailulistaan",
+       "tooltip-watch": "Lisää tämä sivu omalle tarkkailulistallesi",
        "tooltip-watchlistedit-normal-submit": "Poista sivut",
        "tooltip-watchlistedit-raw-submit": "Päivitä tarkkailulista",
        "tooltip-recreate": "Luo sivu uudelleen",
        "watchlisttools-edit": "Katso ja muokkaa tarkkailulistaa",
        "watchlisttools-raw": "Muokkaa listaa raakamuodossa",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|keskustelu]])",
-       "unknown_extension_tag": "Tuntematon laajennuskoodi ”$1”.",
        "duplicate-defaultsort": "'''Varoitus:''' Oletuslajitteluavain ”$2” korvaa aiemman oletuslajitteluavaimen ”$1”.",
        "duplicate-displaytitle": "<strong>Varoitus:</strong> Näytettävä otsikko \"$2\" päällekirjoittaa edellisen otsikon \"$1\".",
        "invalid-indicator-name": "<strong>Virhe:</strong> Sivun tilan osoittimien attribuutti <code>name</code> ei saa olla tyhjä.",
        "version-entrypoints": "Aloituskohtien URL-osoitteet",
        "version-entrypoints-header-entrypoint": "Aloituskohta",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Asennetut kirjastot",
+       "version-libraries-library": "Kirjasto",
+       "version-libraries-version": "Versio",
        "redirect": "Ohjaus tiedoston, käyttäjän, sivun tai version tunnisteen mukaan",
        "redirect-legend": "Ohjaus tiedostoon tai sivulle",
        "redirect-summary": "Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (version numeron tai sivun tunnisteen mukaan) tai käyttäjäsivulle (käyttäjän numeron mukaan). Käyttö: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] tai [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Määrittämääsi versiota ei ole.",
        "dberr-problems": "Tällä sivustolla on teknisiä ongelmia.",
        "dberr-again": "Odota hetki ja lataa sivu uudelleen.",
-       "dberr-info": "(Tietokantapalvelimeen yhdistäminen epäonnistui: $1)",
-       "dberr-info-hidden": "(Tietokantapalvelimeen ei saada yhteyttä)",
+       "dberr-info": "(Tietokantaan ei saada yhteyttä: $1)",
+       "dberr-info-hidden": "(Tietokantaan ei saada yhteyttä)",
        "dberr-usegoogle": "Voit koettaa hakea Googlesta, kunnes virhe korjataan.",
        "dberr-outofdate": "Googlen indeksi ei välttämättä ole ajan tasalla.",
        "dberr-cachederror": "Alla on välimuistissa oleva sivun versio, joka ei välttämättä ole ajan tasalla.",
index cf58229..d98b255 100644 (file)
                        "Orikrin1998",
                        "Automatik",
                        "Elodark",
-                       "Macofe"
+                       "Macofe",
+                       "Sam",
+                       "JackPotte"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "redirectedfrom": "(Redirigé depuis $1)",
        "redirectpagesub": "Page de redirection",
        "redirectto": "Rediriger vers :",
-       "lastmodifiedat": "Dernière modification de cette page le $1 à $2.<br />",
+       "lastmodifiedat": "Dernière modification de cette page le $1 à $2.",
        "viewcount": "Cette page a été consultée {{PLURAL:$1|une fois|$1 fois}}.",
        "protectedpage": "Page protégée",
        "jumpto": "Aller à :",
        "pool-queuefull": "La file d'attente est pleine",
        "pool-errorunknown": "Erreur inconnue",
        "pool-servererror": "Le service de comptage de la réserve n’est pas disponible ($1).",
+       "poolcounter-usage-error": "Erreur d’utilisation : $1",
        "aboutsite": "À propos de {{SITENAME}}",
        "aboutpage": "Project:À propos",
        "copyright": "Le contenu est disponible sous licence $1 sauf mention contraire.",
        "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, entre autres avantages.",
        "anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
-       "selfredirect": "<strong>Attention :</strong> Vous êtes en train de créer une redirection vers le même article.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera créée.",
+       "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 créée tout de même.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "missingcommentheader": "'''Rappel :''' vous n'avez pas fourni de sujet ou de titre à ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
        "summary-preview": "Aperçu du résumé :",
        "content-model-text": "texte brut",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objet vide",
+       "content-json-empty-array": "Tableau vide",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l'analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a maintenant $1.",
        "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.",
        "rev-deleted-comment": "(résumé de modification retiré)",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
-       "rev-deleted-event": "(entrée retirée)",
+       "rev-deleted-event": "(détails de l’entrée retirée)",
        "rev-deleted-user-contribs": "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
        "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
        "rev-suppressed-text-permission": "Cette version de la page a été <strong>supprimée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "revdelete-legend": "Mettre en place des restrictions de visibilité :",
        "revdelete-hide-text": "Texte de la révision",
        "revdelete-hide-image": "Masquer le contenu du fichier",
-       "revdelete-hide-name": "Masquer l'action et la cible",
+       "revdelete-hide-name": "Masquer la cible et les paramètres",
        "revdelete-hide-comment": "Modifier le résumé",
        "revdelete-hide-user": "Nom d’utilisateur/Adresse IP de l’éditeur",
        "revdelete-hide-restricted": "Supprimer ces données aux administrateurs ainsi qu'aux autres",
        "deleteprotected": "Vous ne pouvez pas supprimer cette page car elle a été protégée.",
        "deleting-backlinks-warning": "'''Attention :''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.",
        "rollback": "Révoquer les modifications",
-       "rollback_short": "Révoquer",
        "rollbacklink": "révoquer",
        "rollbacklinkcount": "révoquer $1 {{PLURAL:$1|modification|modifications}}",
        "rollbacklinkcount-morethan": "révoquer plus de $1 {{PLURAL:$1|modification|modifications}}",
        "namespace": "Espace de noms :",
        "invert": "Inverser la sélection",
        "tooltip-invert": "Cochez cette case pour cacher les modifications des pages dans l'espace de noms sélectionné (et l'espace de noms associé si coché)",
+       "tooltip-whatlinkshere-invert": "Cochez cette case pour cacher les liens des pages dans l'espace de nom sélectionné.",
        "namespace_association": "Espace de noms associé",
        "tooltip-namespace_association": "Cochez cette case pour inclure également l'espace de noms de discussion associé à l'espace de noms sélectionné",
        "blanknamespace": "(Principal)",
        "thumbnail-temp-create": "Impossible de créer le fichier de vignette temporaire",
        "thumbnail-dest-create": "Impossible d'enregistrer la vignette sur la destination",
        "thumbnail_invalid_params": "Paramètres de la miniature incorrects",
+       "thumbnail_toobigimagearea": "Fichier avec des dimensions supérieures à $1",
        "thumbnail_dest_directory": "Impossible de créer le répertoire de destination",
        "thumbnail_image-type": "Type d'image non supporté",
        "thumbnail_gd-library": "Configuration incomplète de la bibliothèque GD : fonction $1 introuvable",
        "import-logentry-interwiki": "a importé $1 d'un wiki à l'autre",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révision importée|révisions importées}} depuis $2",
        "javascripttest": "Test de JavaScript",
-       "javascripttest-title": "Exécution des tests $1",
        "javascripttest-pagetext-noframework": "Cette page est réservée pour l'exécution des tests JavaScript.",
        "javascripttest-pagetext-unknownframework": "Structure « $1 » inconnue.",
+       "javascripttest-pagetext-unknownaction": "Action « $1 » inconnue.",
        "javascripttest-pagetext-frameworks": "Veuillez choisir l'une des structures de test suivantes : $1",
        "javascripttest-pagetext-skins": "Choisissez un habillage avec lequel lancer les tests :",
        "javascripttest-qunit-intro": "Voir [$1 la documentation de test] sur mediawiki.org.",
-       "javascripttest-qunit-heading": "Suite de test QUnit de JavaScript sur MediaWiki",
        "tooltip-pt-userpage": "Votre page utilisateur",
        "tooltip-pt-anonuserpage": "La page utilisateur de l'IP avec laquelle vous contribuez",
        "tooltip-pt-mytalk": "Votre page de discussion",
        "hebrew-calendar-m11-gen": "Av",
        "hebrew-calendar-m12-gen": "Éloul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
-       "unknown_extension_tag": "Balise d’extension « $1 » inconnue",
        "duplicate-defaultsort": "Attention : la clé de tri par défaut « $2 » écrase la précédente clé « $1 ».",
        "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage «$2» remplace l'ancien titre d'affichage «$1».",
        "invalid-indicator-name": "<strong>Erreur :</strong> L’attribut <code>name</code> des indicateurs d’état de la page ne doit pas être vide.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Chemin d’article]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Chemin de script]",
+       "version-libraries": "Bibliothèques installées",
+       "version-libraries-library": "Bibliothèque",
+       "version-libraries-version": "Version",
        "redirect": "Redirigé par fichier, utilisateur, page ou ID de révision",
        "redirect-legend": "Rediriger vers une page ou un fichier",
        "redirect-summary": "Cette page spéciale redirige vers un fichier (nom de fichier fourni), une page (ID de révision ou de page fourni) ou une page d’utilisateur (identifiant numérique de l’utilisateur fourni). Utilisation : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ou [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "La révision que vous avez spécifiée n’existe pas.",
        "dberr-problems": "Désolé ! Ce site rencontre des difficultés techniques.",
        "dberr-again": "Essayez d'attendre quelques minutes et rechargez.",
-       "dberr-info": "(Connexion au serveur de base de données impossible : $1)",
-       "dberr-info-hidden": "(Connexion au serveur de base de données impossible)",
+       "dberr-info": "(Accès à la base de données impossible : $1)",
+       "dberr-info-hidden": "(Accès à la base de données impossible)",
        "dberr-usegoogle": "Vous pouvez essayer de chercher avec Google pendant ce temps.",
        "dberr-outofdate": "Notez que leurs index de notre contenu peuvent être dépassés.",
        "dberr-cachederror": "Ceci est une copie cachée de la page demandée et peut être dépassée.",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a téléchargé}} $3",
-       "logentry-upload-overwrite": "$1 {{GENDER:$2|a téléchargé}} une nouvelle version de $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a téléversé}} une nouvelle version de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|a téléchargé}} $3",
        "rightsnone": "(aucun)",
        "revdelete-summary": "résumé de modification",
index 6bee7ed..8052343 100644 (file)
@@ -7,18 +7,19 @@
                        "PieRRoMaN",
                        "RoyAlcatraz",
                        "Urhixidur",
-                       "Zetud"
+                       "Zetud",
+                       "Hangmanwa7id"
                ]
        },
        "tog-underline": "Souligner les liens:",
-       "tog-hideminor": "Cachez les petits changements dans la liste des derniers changements",
-       "tog-hidepatrolled": "↓ Cachez les petits changements dans la liste des derniers changements",
-       "tog-newpageshidepatrolled": "↓Cache pages patrollés de la list des pages nouveau",
+       "tog-hideminor": "Cacher les petits changements dans la liste des derniers changements",
+       "tog-hidepatrolled": "↓ Cacher les petits changements dans la liste des derniers changements",
+       "tog-newpageshidepatrolled": "↓Cacher pages patrollés de la list des pages nouveau",
        "tog-extendwatchlist": "Agrandir la liste des pages guettées pour montrer tous les changements",
        "tog-usenewrc": "User les derniers changements improuvés (JavaScript)",
        "tog-numberheadings": "Mettre les numéros sus les en-têtes",
-       "tog-showtoolbar": "Montrer la barre d'outils des changements (JavaScript)",
-       "tog-editondblclick": "Faire un clic-double pour changer la page (JavaScript)",
+       "tog-showtoolbar": "Montrer la barre d'outils des changements (nécessite JavaScript)",
+       "tog-editondblclick": "Faire un clic-double pour changer la page (nécessite JavaScript)",
        "tog-editsectiononrightclick": "Changer une section en faisant un clic droit sus son nom (JavaScript)",
        "tog-watchcreations": "Additionner les pages que je crée à ma liste des pages guettées",
        "tog-watchdefault": "Additionner les pages que je change à ma liste des pages guettées",
@@ -32,7 +33,7 @@
        "tog-enotifminoredits": "Envoyer un e-mail même pour les petits changements",
        "tog-enotifrevealaddr": "Montrer mon adresse e-mail dans les e-mails d'avertissement",
        "tog-shownumberswatching": "Montrer le montant de guetteurs",
-       "tog-oldsig": "↓ Preview du signature existant:",
+       "tog-oldsig": "Signature existant:",
        "tog-fancysig": "Signature brute (sans liens préparés)",
        "tog-uselivepreview": "User la vue d'avance vite (JavaScript) (En assai)",
        "tog-forceeditsummary": "M'avertir quand j'ai laissé la boëte de commentaires vide",
@@ -47,6 +48,8 @@
        "underline-always": "Tout le temps",
        "underline-never": "Jamais",
        "underline-default": "D'après le réglage du navigateur",
+       "editfont-sansserif": "Font sans-serif",
+       "editfont-serif": "Font serif",
        "sunday": "dimanche",
        "monday": "lundi",
        "tuesday": "mardi",
@@ -67,7 +70,7 @@
        "april": "d'avril",
        "may_long": "de mai",
        "june": "de juin",
-       "july": "de juliette",
+       "july": "de julliette",
        "august": "d'août",
        "september": "de septembre",
        "october": "d'octobre",
@@ -79,7 +82,7 @@
        "april-gen": "avril",
        "may-gen": "mai",
        "june-gen": "juin",
-       "july-gen": "juliette",
+       "july-gen": "julliette",
        "august-gen": "août",
        "september-gen": "septembre",
        "october-gen": "octobre",
        "oct": "oct",
        "nov": "nov",
        "dec": "déc",
+       "january-date": "$1 janvier",
+       "february-date": "$1 février",
+       "march-date": "$1 mars",
+       "april-date": "$1 avril",
+       "may-date": "$1 mai",
+       "june-date": "$1 juin",
+       "july-date": "$1 julliette",
+       "august-date": "$1 août",
+       "september-date": "$1 septembre",
+       "october-date": "$1 octobre",
+       "november-date": "$1 novembre",
+       "december-date": "$1 décembre",
        "pagecategories": "{{PLURAL:$1|Classe|Classes}}",
        "category_header": "Articles dans classe \"$1\"",
        "subcategories": "Sous-classes",
        "category-media-header": "Média dans classe \"$1\"",
        "category-empty": "''À présent, cette classe a ni articles ni média.''",
+       "hidden-categories": "{{PLURAL:$1|Classe cachée|Classes cachées}}",
+       "hidden-category-category": "Classes cachées",
+       "listingcontinuesabbrev": "cont.",
+       "index-category": "Pages indexées",
+       "noindex-category": "Pages non indexées",
+       "broken-file-category": "Pages avec des liens de fichiers cassées",
        "about": "Info",
        "article": "Page des matières",
        "newwindow": "(va ouverre une nouvelle fenêtre)",
-       "cancel": "Arrêter",
+       "cancel": "Annuler",
        "moredotdotdot": "Plus...",
+       "morenotlisted": "Cette liste est pas complète.",
        "mypage": "Ma page",
        "mytalk": "Ma page de discussion",
        "anontalk": "Discussion avec cette adresse IP",
        "navigation": "Navigation",
+       "and": "&#32;et",
        "qbfind": "Charcher",
        "qbbrowse": "Regarder",
        "qbedit": "Changer",
        "qbmyoptions": "Mes options",
        "faq": "Questions Communes",
        "faqpage": "Project:Questions Communes",
+       "actions": "Actions",
+       "namespaces": "Espaces des noms",
+       "variants": "Variantes",
+       "navigation-heading": "Menu de navigation",
        "errorpagetitle": "Erreur",
-       "returnto": "Retourner back à la page $1.",
+       "returnto": "Retourner à la page $1.",
        "tagline": "Un article de {{SITENAME}}",
        "help": "Aide",
        "search": "Charcher",
        "searchbutton": "Charcher",
        "go": "Aller",
        "searcharticle": "Aller",
-       "history": "Changements",
+       "history": "Changements du page",
        "history_short": "Changements",
        "updatedmarker": "changé depuis ma dernière visite",
        "printableversion": "Version imprimable",
        "permalink": "Lien permanent",
        "print": "Imprimer",
+       "view": "Regarde",
+       "view-foreign": "Regarde sur $1",
        "edit": "Changer",
+       "create": "Créer",
        "editthispage": "Faire un changement",
+       "create-this-page": "Créer cette page",
        "delete": "Supprimer",
        "deletethispage": "Supprimer cette page",
-       "undelete_short": "Rétablir {{PLURAL:$1|un changement|$1 changements}}",
+       "undeletethispage": "Restaurer cette page",
+       "undelete_short": "Restaurer {{PLURAL:$1|un changement|$1 changements}}",
+       "viewdeleted_short": "Regarder {{PLURAL:$1|un changement effacée|$1 changements effacées}}",
        "protect": "Protéger",
        "protect_change": "Changer le niveau de protection",
        "protectthispage": "Protéger cette page",
-       "unprotect": "déprotéger",
-       "unprotectthispage": "Déprotéger cette page",
+       "unprotect": "Changer la protection",
+       "unprotectthispage": "Changer la protection de cette page",
        "newpage": "Nouvelle page",
        "talkpage": "Discuter cette page",
        "talkpagelinktext": "Discuter",
        "articlepage": "Voir l'article",
        "talk": "Discussion",
        "views": "Vues",
-       "toolbox": "Boëte d'outils",
+       "toolbox": "Outils",
        "userpage": "Page d'useur",
        "projectpage": "Page des projets",
-       "imagepage": "Page des images",
+       "imagepage": "Regarder la page du fichier",
        "mediawikipage": "Page des messages",
        "templatepage": "Page de patron",
        "viewhelppage": "Page d'aide",
        "otherlanguages": "Autres langues",
        "redirectedfrom": "(Envoyé ici de la page $1)",
        "redirectpagesub": "Page de redirection",
+       "redirectto": "Rediriger vers:",
        "lastmodifiedat": "Cette page a été changée le $1 à $2.",
-       "viewcount": "Cette page a été visitée {{PLURAL:$1|$1 fois|$1 fois}}.",
+       "viewcount": "Cette page a été visitée {{PLURAL:$1|une fois|$1 fois}}.",
        "protectedpage": "Page protégée",
        "jumpto": "Aller à:",
+       "jumptonavigation": "navigation",
        "jumptosearch": "charcher",
+       "poolcounter-usage-error": "Erreur d’utilisation: $1",
        "aboutsite": "Qui c'est {{SITENAME}}?",
        "aboutpage": "Project:Info",
        "copyright": "Les matières sont avalable en accord avec $1",
        "privacy": "Régulations des affaires privées",
        "privacypage": "Project:Régulations des affaires privées",
        "badaccess": "Erreur de permission",
-       "badaccess-group0": "Vous avez pas assez de permission de faire ça que vous demandez.",
+       "badaccess-group0": "Tu as pas asses de permission de faire ça que tu demandes.",
        "badaccess-groups": "L'action que vous avez demandé est juste pour les useurs dans une des groupes $1.",
        "versionrequired": "Vous avez besoin de la version $1 de MediaWiki.",
        "versionrequiredtext": "Vous avez besoin de la version $1 de MediaWiki pour utiliser cette page. Voir [[Special:Version]].",
+       "ok": "OK",
        "retrievedfrom": "Pris de \"$1\"",
        "youhavenewmessages": "Vous avez $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Tu as}} $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
+       "youhavenewmessagesmanyusers": "Tu as $1 de nombreux utilisateurs ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|un nouveau message|des nouveaux messages}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|dernière modification|dernières modifications}}",
        "youhavenewmessagesmulti": "Vous avez des nouveaux messages sus $1.",
        "editsection": "changer",
        "editold": "changer",
+       "viewsourceold": "Regarde la source",
+       "editlink": "changer",
        "viewsourcelink": "Voir la source",
        "editsectionhint": "Changer la section: $1",
        "toc": "Matières",
        "showtoc": "montrer",
        "hidetoc": "cacher",
-       "thisisdeleted": "Vous aimerait mieux voir ou rétablir $1?",
-       "viewdeleted": "Voir $1?",
+       "confirmable-yes": "Oui",
+       "confirmable-no": "Non",
+       "thisisdeleted": "Tu aimerais mieux regarde ou rétablir $1?",
+       "viewdeleted": "Regarder $1?",
        "restorelink": "{{PLURAL:$1|1 changement ôté|$1 changements ôtés}}",
        "feedlinks": "Distribution RSS:",
        "feed-invalid": "Mauvaise qualité de distribution RSS.",
+       "site-rss-feed": "Flux RSS de $1",
+       "site-atom-feed": "Flux Atom de $1",
+       "page-rss-feed": "Flux RSS de \"$1\"",
+       "page-atom-feed": "Flux Atom de \"$1\"",
        "red-link-title": "$1 (page n'existe pas)",
+       "sort-descending": "Tri dégruchant",
+       "sort-ascending": "Tri engruchant",
        "nstab-main": "Page",
        "nstab-user": "Useur",
        "nstab-media": "Média",
        "nstab-special": "Page espécial",
        "nstab-project": "Info",
        "nstab-image": "Dossier",
+       "nstab-mediawiki": "Message",
        "nstab-template": "Patron",
        "nstab-help": "Aide",
        "nstab-category": "Classe",
        "nosuchaction": "Action inconnue",
-       "nosuchactiontext": "L'action demandée dans l'adresse URL est pas reconnue par le wiki.",
+       "nosuchactiontext": "L'action spécifiée dans l'adresse URL est invalide.\nTu as peut-être mal entré l'URL ou suivi un lien erroné.\nIl peut aussi s'indiquer d'un bug dans le logiciel utilisé par {{SITENAME}}.",
        "nosuchspecialpage": "Page espéciale inconnue",
        "nospecialpagetext": "La page que vous avez demandée est pas une bonne page espéciale.  Vous pouvez trouver une liste des bonnes pages espéciales dans la [[Special:SpecialPages|liste des pages espéciales]].",
        "error": "Erreur",
        "databaseerror": "Erreur de la base d'information",
+       "databaseerror-error": "Erreur: $1",
        "laggedslavemode": "Avertissement: La page est peut-être pas renouvelée.",
        "readonly": "La base d'information est barrée.",
        "enterlockreason": "Écrire une raison pour le barrage avec un temps estimé\nd'équand le barrage va être ôté.",
        "readonlytext": "À présent, la base d'information est barrée aux nouveaux changements, peut-être pour le soutien habituel de la base d'information, et ça va retourner à normal t'à l'heure.\n\nL'administrateur qui l'a barrée a donné cette explication: $1",
+       "missingarticle-diff": "(diff: $1, $2)",
        "readonly_lag": "La base d'information s'a barré pendant que les serveurs de la base d'information rapprochont le maître.",
        "internalerror": "Erreur internelle",
        "internalerror_info": "Erreur intérieur: $1",
        "namespaceprotected": "Vous avez pas la permission de changer les pages dans l'espace de noms \"$1\".",
        "ns-specialprotected": "Vous pouvez pas changer les pages dans l'espace de noms {{ns:special}}.",
        "logouttext": "'''Vous êtes déconnecté asteur.'''\n\nVous pouvez continuer à user {{SITENAME}} sans nom ou vous pouvez connecter encore une fois avec le même nom ou un autre nom.\nNotez: certaines pages pourriont être vues comme si vous êtes connecté, jusqu'à vous videz l'information de votre navigateur.",
+       "welcomeuser": "Bienvenue, $1!",
        "yourname": "Nom d'useur:",
+       "userlogin-yourname": "Nom d'useur:",
+       "userlogin-yourname-ph": "Entres ton nom d'utilisateur",
+       "createacct-another-username-ph": "Entres le nom d'utilisateur",
        "yourpassword": "Mot de passe:",
+       "userlogin-yourpassword": "Mot de passe",
+       "userlogin-yourpassword-ph": "Entres ton mot de passe",
+       "createacct-yourpassword-ph": "Entres un mot de passe",
        "yourpasswordagain": "Mot de passe encore:",
+       "createacct-yourpasswordagain": "Confirmes le mot de passe",
+       "createacct-yourpasswordagain-ph": "Entres à nouveau le mot de passe",
        "remembermypassword": "Garder mon mot de passe dans cette browser (pour un maximum of $1 {{PLURAL:$1|jour|jours}})",
        "yourdomainname": "Votre domaine:",
        "externaldberror": "Soit y avait une erreur avec la base d'information de certification extérieur, soit vous avez pas la permission de renouveler votre compte extérieur.",
        "gotaccount": "Vous avez un compte déjà? '''$1'''.",
        "gotaccountlink": "Connectez",
        "userlogin-resetlink": "Oublié vôtre détailes de log in?",
+       "createacct-emailrequired": "Adresse d'email",
+       "createacct-emailoptional": "Adresse d'email (optional)",
+       "createacct-email-ph": "Entres t'adresse d'email",
+       "createacct-another-email-ph": "Entres adresse d'email",
        "createaccountmail": "par e-mail",
+       "createaccountreason": "Raison:",
+       "createacct-reason": "Raison",
+       "createacct-reason-ph": "Pourquoi crées-tu un autre compte",
        "badretype": "Les mots de passe que vous avez mis sont pas pareils.",
        "userexists": "Le nom d'useur choisi est déjà usé.  Choissez donc un autre nom.",
        "loginerror": "Erreur d'identification",
-       "nocookiesnew": "Votre compte a été créé, mais vous êtes pas connecté.  {{SITENAME}} use les cookies pour connecter les useurs.  Partez les cookies et connectez avec votre nouveau nom d'useur et votre mot de passe, s'il vous plaît.",
+       "createacct-error": "Erreur lors de la création du compte",
+       "createaccounterror": "Impossible de créer le compte: $1",
+       "nocookiesnew": "Ton compte a été créé, mais tu es pas connecté{{GENDER:||e|(e)}}.  {{SITENAME}} use les cookies pour connecter les useurs.  Partes les cookies et connectes avec ton nouveau nom d'useur et ton mot de passe.",
        "nocookieslogin": "{{SITENAME}} use les cookies pour connecter les useurs.  Partez donc les cookies et assayez encore.",
        "nocookiesfornew": "Le conte d'useur n'était pas fait, à cause qu'on pouvait pas confirmer la source.  Ensurer que tu as des cookies, reload ce page et essayer encore.",
        "noname": "Vous avez pas mis un bon nom d'useur.",
        "accountcreated": "Compte créé",
        "accountcreatedtext": "Le compte d'useur pour $1 a été créé.",
        "loginlanguagelabel": "Langue: $1",
+       "pt-login": "Te connecter",
+       "pt-login-button": "Te connecter",
+       "pt-createaccount": "Créer un compte",
+       "pt-userlogout": "Te déconnecter",
        "resetpass_announce": "Pour le moment, vous êtes connecté avec un mot de passe qu'a été envoyé par e-mail.  Pour finir de vous connecter, il faut créer un nouveau mot de passe ici:",
        "resetpass_text": "<!-- Mettez du texte ici -->",
        "resetpass_header": "Rétablir le mot de passe",
+       "oldpassword": "Dépassé mot de passe:",
        "resetpass_submit": "Créer le mot de passe et connecter",
        "changepassword-success": "Vous avez bien changé votre mot de passe!  On est après vous connecter...",
        "resetpass_forbidden": "Vous pouvez pas changer votre mot de passe sus ce wiki ici.",
+       "resetpass-submit-loggedin": "Changer de mot de passe",
+       "resetpass-submit-cancel": "Annuler",
+       "resetpass-wrong-oldpass": "Mot de passe actuel ou temporaire invalide.\nTu as peut-être déjà changé ton mot de passe ou demandé un nouveau mot de passe temporaire.",
+       "resetpass-recycled": "Veuilles réinitialiser ton mot de passe à quelque chose d’autre que l’actuel.",
+       "resetpass-temp-password": "Mot de passe temporaire:",
+       "passwordreset-username": "Nom d'useur:",
+       "passwordreset-domain": "Domaine:",
+       "passwordreset-capture": "Regarder l'email résultant?",
+       "passwordreset-email": "Adresse d'email:",
+       "changeemail-none": "(aucun)",
+       "changeemail-password": "Ton mot de passe sur {{SITENAME}}:",
+       "changeemail-submit": "Changer l’adresse d'email",
        "bold_sample": "Gras",
        "bold_tip": "Gras",
        "italic_sample": "Italique",
        "permissionserrorstext": "Vous avez pas la permission de faire ça pour {{PLURAL:$1|cette raison|ces raisons}}:",
        "permissionserrorstext-withaction": "Vous avez pas la permission de faire ça pour {{PLURAL:$1|cette raison|ces raisons}}:",
        "recreate-moveddeleted-warn": "'''Attention: Vous êtes après recréer une page qu'a déjà été ôtée.'''\n\nVous devrait considérer si c'est à propos de continuer à changer cette page.\nLes notes d'ôtage pour cette page sont données ici pour vous aider:",
+       "postedit-confirmation-restored": "La page a été restaurée.",
+       "postedit-confirmation-saved": "Ton changement a été cachée.",
+       "edit-already-exists": "La nouvelle page a pas pu être créée.\nAlle existe déjà.",
+       "defaultmessagetext": "Message par défaut",
+       "content-model-text": "texte brut",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Objet vide",
+       "content-json-empty-array": "Tableau vide",
        "undo-success": "Le changement peut être renversé.  Regardez donc la comparaison en bas pour être sûr que c'est comme vous voulez, et puis sauvez les changements en bas pour finir le renversage du changement.",
        "undo-failure": "Le changement pouvait pas être renversé à cause d'une dispute de changements.",
        "undo-summary": "Défaire la révision $1 par [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]])",
        "revdelete-submit": "Appliquer à la version choisie",
        "revdelete-success": "'''Vous avez bien changé la visibilité des versions.'''",
        "logdelete-success": "'''Vous avez bien changé la visibilité des événements.'''",
+       "mergehistory-reason": "Raison:",
+       "mergelog": "Journal des fusions",
        "lineno": "Ligne $1:",
        "compareselectedversions": "Comparer les versions choisies",
        "editundo": "renverser",
        "searchresults": "Résultats de la charche",
        "searchresults-title": "Résultats de charche pour « $1 »",
+       "nextn": "{{PLURAL:$1|suivante|$1 suivantes}}",
+       "prevn-title": "$1 {{PLURAL:$1|résultat dernier|résultats derniers}}",
+       "nextn-title": "$1 {{PLURAL:$1|résultat suivant|résultats suivants}}",
+       "viewprevnext": "Regarder ($1 {{int:pipe-separator}} $2) ($3).",
        "searchprofile-everything": "Tout",
+       "searchprofile-advanced": "Charche avancée",
+       "searchprofile-articles-tooltip": "Charcher dans $1",
+       "searchprofile-images-tooltip": "Charcher des fichiers multimédias",
+       "searchprofile-everything-tooltip": "Charcher dans tout le site (y compris dans les pages de discussion)",
+       "searchprofile-advanced-tooltip": "Choisir les espaces de noms pour la charche",
        "search-result-size": "$1 ({{PLURAL:$2|1 mot|$2 mots}})",
+       "search-result-category-size": "$1 membre{{PLURAL:$1||s}} ($2 sous-classe{{PLURAL:$2||s}}, $3 fichier{{PLURAL:$3||s}})",
+       "searchall": "tout",
+       "powersearch-toggleall": "Tout",
+       "powersearch-togglenone": "Aucun",
        "preferences": "Réglage",
        "mypreferences": "Mon réglage",
        "skin-preview": "Vue d'avance",
+       "prefs-user-pages": "Pages d'useur",
+       "prefs-personal": "Profil d'useur",
+       "prefs-rc": "Changements récents",
+       "prefs-watchlist": "Liste de suivi",
+       "prefs-email": "Option des emails",
+       "prefs-rendering": "Apparence",
+       "searchresultshead": "Charcher",
+       "localtime": "Heure locale:",
+       "timezoneregion-asia": "Asie",
+       "timezoneregion-atlantic": "Océan atlantique",
+       "timezoneregion-australia": "Australie",
+       "timezoneregion-europe": "Europe",
+       "timezoneregion-indian": "Océan indien",
+       "timezoneregion-pacific": "Océan pacifique",
+       "prefs-searchoptions": "Charche",
+       "prefs-namespaces": "Espaces des noms",
+       "default": "défaut",
+       "prefs-files": "Fichiers",
        "prefs-custom-css": "Custom CSS",
        "prefs-custom-js": "Custom JavaScript",
-       "youremail": "E-mail:",
+       "youremail": "Email:",
        "username": "Nom d'useur:",
        "yourrealname": "Vrai nom:",
        "yourlanguage": "Langue:",
        "yournick": "'Tit nom:",
        "badsig": "Votre signature brute est pas bonne.  Regardez-voir les tags HTML.",
        "badsiglength": "Votre 'tit nom est trop long.  Il faut que ça soye moins que $1 caractères.",
-       "gender-male": "Male",
-       "gender-female": "Female",
+       "gender-unknown": "Je préfère pas l’indiquer",
+       "gender-male": "Il change des pages du wiki",
+       "gender-female": "Alle change des pages du wiki",
+       "email": "Email",
        "prefs-help-realname": "Votre vrai nom est pas nécessaire.  Si vous choisirait de le mettre, ça serait usé pour vous donner du crédit pour votre ouvrage.",
        "prefs-help-email": "Votre adresse e-mail est pas nécessaire, mais ça quitte le monde vous contacter par votre page d'useur ou votre page de discussion sans montrer votre identité.",
+       "prefs-dateformat": "Format des dates",
+       "prefs-advancedrc": "Options avancées",
+       "prefs-advancedrendering": "Options avancées",
+       "prefs-advancedsearchoptions": "Options avancées",
+       "prefs-advancedwatchlist": "Options avancées",
        "editinguser": "Changement de '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+       "userrights-reason": "Raison:",
+       "group": "Groupe:",
+       "group-user": "Useurs",
+       "group-all": "(tous)",
+       "group-bot-member": "{{GENDER:$1|robot}}",
+       "group-sysop-member": "{{GENDER:$1|administrateur|administratrice}}",
+       "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}",
+       "grouppage-bot": "{{ns:project}}:Robots",
+       "grouppage-sysop": "{{ns:project}}:Administrateurs",
+       "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
+       "right-read": "Lire les pages",
+       "right-edit": "Changer les pages",
+       "right-createpage": "Créer des pages (qui sont pas des pages de discussion)",
+       "right-createtalk": "Créer des pages de discussion",
+       "right-createaccount": "Créer des comptes useur",
+       "right-minoredit": "Marquer ses changements comme mineures",
+       "right-move": "Renommer des pages",
+       "right-move-subpages": "Renommer des pages avec leurs sous-pages",
+       "right-move-rootuserpages": "Renommer la page principale d'un useur",
+       "right-move-categorypages": "Renommer des pages de classe",
+       "right-movefile": "Renommer des fichiers",
+       "right-delete": "Effacer des pages",
+       "right-unblockself": "Te débloquer toi-même",
+       "right-editinterface": "Changer l'interface useur",
+       "action-read": "lire cette page",
        "action-edit": "Faire un changement",
+       "action-createpage": "créer des pages",
+       "action-createtalk": "créer des pages de discussion",
+       "action-createaccount": "créer ce compte useur",
+       "action-minoredit": "marquer cette changement comme mineure",
+       "action-move": "renommer cette page",
+       "action-move-subpages": "renommer cette page et ses sous-pages",
+       "action-move-rootuserpages": "renommer la page principale d'un useur",
+       "action-move-categorypages": "renommer des pages de classe",
+       "action-movefile": "renommer ce fichier",
+       "action-delete": "effacer cette page",
+       "action-deleterevision": "effacer cette version",
+       "action-browsearchive": "charcher des pages effacées",
+       "action-undelete": "restaurer cette page",
+       "action-sendemail": "envoyer des emails",
+       "nchanges": "$1 changement{{PLURAL:$1||s}}",
        "recentchanges": "Changements récent",
+       "rcshowhidebots": "$1 les robots",
        "rcshowhidepatr": "$1 les modifications patrouillés",
+       "minoreditletter": "m",
+       "newpageletter": "N",
+       "boteditletter": "b",
+       "recentchangeslinked-page": "Nom de la page:",
+       "filename": "Nom du fichier",
+       "filedesc": "Sommaire",
+       "fileuploadsummary": "Sommaire:",
+       "filereuploadsummary": "Changements du fichier:",
+       "filestatus": "Statut du droit d'auteur:",
+       "filesource": "Source:",
+       "ignorewarning": "Ignorer l'avertissement et sauvegarder le fichier quand même",
+       "ignorewarnings": "Ignorer les avertissements",
+       "backend-fail-notexists": "Le fichier $1 existe pas.",
+       "imgfile": "fichier",
+       "listfiles": "Liste de fichiers",
+       "listfiles_thumb": "Miniature",
+       "listfiles_date": "Date",
+       "listfiles_name": "Nom",
+       "listfiles_user": "Useur",
+       "listfiles_description": "Description",
+       "listfiles_count": "Versions",
+       "listfiles-latestversion-yes": "Oui",
+       "listfiles-latestversion-no": "Non",
        "file-anchor-link": "Dossier",
+       "filehist-deleteall": "effacer tout",
+       "filehist-deleteone": "effacer",
+       "filehist-user": "Useur",
+       "shared-repo-from": "de: $1",
+       "filerevert-comment": "Raison:",
+       "filedelete": "Effacer $1",
+       "filedelete-legend": "Effacer le fichier",
+       "filedelete-comment": "Raison:",
+       "filedelete-submit": "Effacer",
+       "filedelete-success": "'''$1''' a été effacé.",
+       "filedelete-nofile": "'''$1''' existe pas.",
        "randompage": "Page au hasard",
+       "randomincategory-category": "Classe:",
+       "statistics-pages": "Pages",
+       "pageswithprop-submit": "Aller",
+       "brokenredirects-edit": "changer",
+       "brokenredirects-delete": "effacer",
+       "withoutinterwiki": "Pages sans liens inter-langues",
        "nbytes": "$1 octet{{PLURAL:$1||s}}",
+       "ncategories": "$1 classe{{PLURAL:$1||s}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "nlinks": "$1 {{PLURAL:$1|page liée|pages liées}}",
+       "nmembers": "$1 membre{{PLURAL:$1||s}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|membre|membres}}",
+       "unusedcategories": "Classes inutilisées",
+       "unusedimages": "Fichiers orphelins",
+       "protectedpages-page": "Page",
+       "protectedpages-reason": "Raison",
+       "newpages-username": "Nom d'useur:",
+       "ancientpages": "Pages les plus anciennement changées",
        "move": "Renommer",
        "movethispage": "Renommer cette page",
+       "allpagessubmit": "Aller",
        "categories": "Classes",
-       "emailuser": "E-mail cet useur",
+       "special-categories-sort-count": "tri par nombre d'éléments",
+       "special-categories-sort-abc": "tri alphabétique",
+       "deletedcontributions": "Contributions effacées des useurs",
+       "deletedcontributions-title": "Contributions effacées des useurs",
+       "sp-deletedcontributions-contribs": "contributions",
+       "linksearch": "Charche de liens externes",
+       "linksearch-ns": "Espace de noms:",
+       "linksearch-ok": "Charcher",
+       "listusers-noresult": "Aucun useur trouvé.",
+       "listusers-blocked": "(bloqué{{GENDER:$1||e|(e)}})",
+       "listgrouprights-namespaceprotection-namespace": "Espace de noms",
+       "trackingcategories-name": "Nom du message",
+       "emailuser": "Emailer cet useur",
+       "emailuser-title-target": "Emailer {{GENDER:$1|cet useur|cette useuse}}",
+       "emailuser-title-notarget": "Emailer useur",
+       "emailpage": "Emailer useur",
+       "noemailtitle": "Aucune adresse d'email",
+       "emailusername": "Nom d'useur:",
+       "emailfrom": "De:",
+       "emailto": "À:",
+       "emailmessage": "Message:",
+       "emailsend": "Envoyer",
        "watchlist": "Mes pages guettées",
        "mywatchlist": "Mes pages guettées",
+       "watchlistfor2": "Pour $1 $2",
        "watch": "Guetter",
+       "watchthispage": "Guetter cette page",
        "unwatch": "guettez p'us",
+       "unwatchthispage": "Ne plus guetter",
+       "enotif_subject_deleted": "La page $1 sur {{SITENAME}} a été effacée par {{GENDER:$2|$2}}",
+       "enotif_subject_created": "La page $1 sur {{SITENAME}} a été créée par {{GENDER:$2|$2}}",
+       "enotif_subject_moved": "La page $1 sur {{SITENAME}} a été renommée par {{GENDER:$2|$2}}",
+       "enotif_subject_restored": "La page $1 sur {{SITENAME}} a été restaurée par {{GENDER:$2|$2}}",
+       "enotif_subject_changed": "La page $1 sur {{SITENAME}} a été changée par {{GENDER:$2|$2}}",
+       "enotif_body_intro_deleted": "La page $1 sur {{SITENAME}} a été effacée le $PAGEEDITDATE par {{gender:$2|$2}}, regarder $3 pour la révision actuelle.",
+       "enotif_body_intro_created": "La page $1 sur {{SITENAME}} a été créée le $PAGEEDITDATE par {{GENDER:$2|$2}}, regarder $3 pour la révision actuelle.",
+       "deletepage": "Effacer la page",
+       "delete-confirm": "Effacer \"$1\"",
+       "delete-legend": "Effacer",
+       "deletecomment": "Raison:",
+       "deleteotherreason": "Raison autre ou supplémentaire:",
+       "deletereasonotherlist": "Autre raison",
+       "protectcomment": "Raison:",
+       "restriction-edit": "Changer",
+       "restriction-move": "Renommer",
+       "restriction-create": "Créer",
+       "undelete": "Regarder les pages effacées",
+       "undeletepage": "Regarder et restaurer des pages effacées",
+       "viewdeletedpage": "Regarder les pages effacées",
+       "undeletebtn": "Restaurer",
+       "undeleteviewlink": "regarder",
+       "undeletecomment": "Raison:",
+       "undelete-search-submit": "Charcher",
+       "undelete-show-file-submit": "Oui",
+       "namespace": "Espace de noms:",
        "blanknamespace": "(Principal)",
        "contributions": "Changements de l'useur",
        "mycontris": "Mes changements",
+       "uctop": "(actuel)",
        "sp-contributions-talk": "Discuter",
+       "sp-contributions-submit": "Charcher",
+       "whatlinkshere-page": "Page:",
+       "whatlinkshere-links": "← liens",
+       "whatlinkshere-hidelinks": "$1 les liens",
+       "block": "Bloquer l’useur",
+       "unblock": "Débloquer l’useur",
+       "blockip": "Bloquer l’{{GENDER:$1|useur|useuse}}",
+       "blockip-legend": "Bloquer l’useur",
+       "ipbreason": "Raison:",
+       "ipb-unblock-addr": "Débloquer $1",
+       "ipb-unblock": "Débloquer un compte useur ou une adresse IP",
+       "unblockip": "Débloquer l’useur",
        "ipblocklist": "Useurs bloqués",
        "blocklink": "bloquer",
        "contribslink": "changes",
        "tooltip-n-randompage": "Afficher un page au hasard",
        "tooltip-n-help": "La place pour savoir",
        "tooltip-t-specialpages": "Liste de tout les pages speciales",
-       "bad_image_list": "Le format est le suivant :\n\nSeules les listes d’énumération (commençant par *) sont prises en compte. Le premier lien d’une ligne doit être celui d’une mauvaise image.\nLes autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l’image peut apparaître."
+       "bad_image_list": "Le format est le suivant :\n\nSeules les listes d’énumération (commençant par *) sont prises en compte. Le premier lien d’une ligne doit être celui d’une mauvaise image.\nLes autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l’image peut apparaître.",
+       "redirect-file": "Nom du fichier"
 }
index 62cfc72..86d0d12 100644 (file)
        "watchlisttools-edit": "Normool bewerke",
        "watchlisttools-raw": "Uun't listenformoot bewerke",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskuschuun]])",
-       "unknown_extension_tag": "Ünbekäänd ''tag'' „$1“",
        "duplicate-defaultsort": "'''Paase üüb:''' Di sortiarkai \"$2\" auerskraft di ual sortiarkai \"$1\"",
        "duplicate-displaytitle": "<strong>Paase üüb:</strong> Di uunwiset tiitel \"$2\" auerskraft di ual tiitel \"$1\".",
        "invalid-indicator-name": "<strong>Feeler:</strong> Det atribut <code>name</code> faan di sidjenstaatusindikaator mut ei leesag wees.",
index 0cf81e9..377d3ac 100644 (file)
        "version-software": "Ynsteld software",
        "version-software-product": "Produkt",
        "version-software-version": "Ferzje",
+       "version-libraries-library": "Bibleteek",
+       "version-libraries-version": "Ferzje",
        "redirect-value": "Wearde:",
        "redirect-user": "Meidogger-ID",
        "redirect-file": "Triemnamme",
index 329f902..e4dcacc 100644 (file)
        "watchlisttools-raw": "Deasaich còd a' chlàir-fhaire",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|an deasbaireachd]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Taga leudachain \"$1\" neo-aithnichte",
        "duplicate-defaultsort": "<strong>Rabhadh:</strong> Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
        "duplicate-displaytitle": "<strong>Rabhadh:</strong> Tha an tiotal taisbeanaidh \"$2\" a' dol thairis air seann tiotal taisbeanaidh eile, \"$1\".",
        "version": "Tionndadh",
index 4754b14..b912499 100644 (file)
@@ -15,7 +15,8 @@
                        "Xosé",
                        "לערי ריינהארט",
                        "Fitoschido",
-                       "McDutchie"
+                       "McDutchie",
+                       "Josep Maria 15."
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "pool-queuefull": "A cola está chea",
        "pool-errorunknown": "Erro descoñecido",
        "pool-servererror": "O servidor de contador de recursos comúns non está dispoñible ($1).",
+       "poolcounter-usage-error": "Erro de uso: $1",
        "aboutsite": "Acerca de {{SITENAME}}",
        "aboutpage": "Project:Acerca de",
        "copyright": "Todo o contido está dispoñible baixo a licenza $1, agás que se indique o contrario.",
        "anoneditwarning": "<strong>Aviso:</strong> Non accedeu ao sistema. O seu enderezo IP será rexistado no histórico de edicións desta páxina. Se <strong>[$1 accede ao sistema]</strong> ou <strong>[$2 crea unha conta]</strong>, as súas edicións serán rexistadas co seu nome de usuario, ademais doutros beneficios.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
-       "selfredirect": "<strong>Atención:</strong> Está a crear unha redireción cara o mesmo artigo. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción.",
+       "selfredirect": "<strong>Atención:</strong> Está redirecionando esta páxina a ela mesma. Vostede pode ter especificado a páxina incorrecta para a redireción, ou pode que estea a editar a páxina incorrecta. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción de tódolos xeitos.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
        "missingcommentheader": "'''Aviso:''' Non escribiu ningún texto no asunto/título deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo:",
        "content-model-text": "texto simple",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Obxecto baleiro",
+       "content-json-empty-array": "Matriz baleira",
        "duplicate-args-category": "Páxinas con argumentos duplicados nas chamadas aos modelos",
        "duplicate-args-category-desc": "Esta páxina contén as chamadas aos modelos que utilizan argumentos duplicados, como <code><nowiki>{{exemplo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{exemplo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Aviso:''' Esta páxina contén demasiadas chamadas a funcións analíticas custosas.\n\nDebe ter menos {{PLURAL:$2|dunha chamada|de $2 chamadas}}, e agora hai $1.",
        "history-feed-empty": "A páxina solicitada non existe.\nPuido borrarse ou moverse a outro nome.\nProbe a [[Special:Search|buscar no wiki]] para atopar as páxinas relacionadas.",
        "rev-deleted-comment": "(resumo de edición eliminado)",
        "rev-deleted-user": "(nome de usuario eliminado)",
-       "rev-deleted-event": "(entrada eliminada)",
+       "rev-deleted-event": "(detalles do rexistro eliminados)",
        "rev-deleted-user-contribs": "[nome de usuario ou enderezo IP eliminado; edición agochada das contribucións]",
        "rev-deleted-text-permission": "Esta revisión da páxina foi '''borrada'''.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados].",
        "rev-suppressed-text-permission": "Esta revisión da páxina foi <strong>suprimida</strong>.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rexistro de supresións].",
        "revdelete-legend": "Aplicar restricións de visibilidade",
        "revdelete-hide-text": "Texto da revisión",
        "revdelete-hide-image": "Agochar o contido do ficheiro",
-       "revdelete-hide-name": "Agochar a acción e o destino",
+       "revdelete-hide-name": "Agochar destino e parámetros",
        "revdelete-hide-comment": "Resumo de edición",
        "revdelete-hide-user": "Nome de usuario ou enderezo IP do editor",
        "revdelete-hide-restricted": "Eliminar os datos da vista dos administradores así coma da doutros",
        "deleteprotected": "Non pode borrar esta páxina porque está protexida.",
        "deleting-backlinks-warning": "'''Atención:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páxinas]] conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
        "rollback": "Reverter as edicións",
-       "rollback_short": "Reverter",
        "rollbacklink": "reverter",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edición|edicións}}",
        "rollbacklinkcount-morethan": "reverter máis de $1 {{PLURAL:$1|edición|edicións}}",
        "thumbnail-temp-create": "Non se puido crear o ficheiro de miniatura temporal",
        "thumbnail-dest-create": "Non se puido gardar a miniatura no destino",
        "thumbnail_invalid_params": "Parámetros de miniatura non válidos",
+       "thumbnail_toobigimagearea": "Ficheiro con dimensións maiores que $1",
        "thumbnail_dest_directory": "Non se puido crear o directorio de destino",
        "thumbnail_image-type": "Tipo de imaxe non soportado",
        "thumbnail_gd-library": "Configuración da libraría GD incompleta: Falta a función $1",
        "import-logentry-interwiki": "importou \"$1\"",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}} desde $2",
        "javascripttest": "Proba de JavaScript",
-       "javascripttest-title": "Executando probas de $1",
        "javascripttest-pagetext-noframework": "Esta páxina está reservada para executar probas do JavaScript.",
        "javascripttest-pagetext-unknownframework": "Descoñécese a infraestrutura dixital \"$1\" de probas.",
+       "javascripttest-pagetext-unknownaction": "Acción descoñecida \"$1\".",
        "javascripttest-pagetext-frameworks": "Seleccione unha das seguintes infraestruturas dixitais de probas: $1",
        "javascripttest-pagetext-skins": "Escolla a aparencia na que executar as probas:",
        "javascripttest-qunit-intro": "Bótelle unha ollada á [$1 documentación das probas] en mediawiki.org.",
-       "javascripttest-qunit-heading": "Conxunto de probas QUnit para o JavaScript de MediaWiki",
        "tooltip-pt-userpage": "A súa páxina de {{GENDER:|usuario|usuaria}}",
        "tooltip-pt-anonuserpage": "A páxina de usuario do enderezo IP desde o que está a editar",
        "tooltip-pt-mytalk": "A súa páxina de conversa",
        "watchlisttools-edit": "Ver e editar a lista de vixilancia",
        "watchlisttools-raw": "Editar a lista de vixilancia simple",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|conversa]])",
-       "unknown_extension_tag": "Etiqueta de extensión descoñecida \"$1\"",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A clave de ordenación por defecto \"$2\" anula a clave de ordenación anterior por defecto \"$1\".",
        "duplicate-displaytitle": "'''Aviso:''' O título mostrado \"$2\" anula o título anterior \"$1\".",
        "invalid-indicator-name": "<strong>Erro:</strong> O atributo <code>name</code> dos indicadores do estado da páxina non pode estar baleiro.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta dos artigos]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Ruta das escrituras]",
+       "version-libraries": "Librerías instaladas",
+       "version-libraries-library": "Librería",
+       "version-libraries-version": "Versión",
        "redirect": "Redirixir por nome de ficheiro, ID de usuario, ID de páxina ou ID de revisión",
        "redirect-legend": "Redirixir a un ficheiro ou unha páxina",
        "redirect-summary": "Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID da páxina ou o dunha revisión) ou unha páxina de usuario (dado o ID dun usuario). Utilización: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "A revisión que especificou non existe.",
        "dberr-problems": "Sentímolo! Este sitio está experimentando dificultades técnicas.",
        "dberr-again": "Por favor, agarde uns minutos e logo probe a cargar de novo a páxina.",
-       "dberr-info": "(Non se pode conectar co servidor da base de datos: $1)",
-       "dberr-info-hidden": "(Non se pode conectar co servidor da base de datos)",
+       "dberr-info": "(Non se pode acceder ó servidor da base de datos: $1)",
+       "dberr-info-hidden": "(Non se pode acceder ó servidor da base de datos)",
        "dberr-usegoogle": "Mentres tanto, pode probar a buscar co Google.",
        "dberr-outofdate": "Teña en conta que os índices de Google do noso contido poden non estar actualizados.",
        "dberr-cachederror": "O seguinte contido é unha copia da memoria caché da páxina solicitada, polo que pode non estar actualizada.",
index 57c018c..f06d070 100644 (file)
        "redirectedfrom": "(Witergleitet vun $1)",
        "redirectpagesub": "Umgleiteti Syte",
        "redirectto": "Wyterleitig uf:",
-       "lastmodifiedat": "Letschti Änderig vo dere Syte: $2, $1<br />",
+       "lastmodifiedat": "Letschti Änderig vo dere Syte: $2, $1",
        "viewcount": "Die Syte isch {{PLURAL:$1|eimol|$1 Mol}} bsuecht wore.",
        "protectedpage": "Gschützti Syte",
        "jumpto": "Gump zue:",
        "delete-toobig": "Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche vu sonige Syte isch yygschränkt wore go verhindere, ass dr Server vu {{SITENAME}} us Versäh zytwys iberlaschtet wird.",
        "delete-warning-toobig": "Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche cha dr Datebankbetriib vu {{SITENAME}} stere.",
        "rollback": "Zrucksetze vu dr Änderige",
-       "rollback_short": "Zrucksetze",
        "rollbacklink": "Zrüggsetze",
        "rollbacklinkcount": "{{PLURAL:$1|Ei Version|$1 Versione}} zrucksetze",
        "rollbacklinkcount-morethan": "Meh wie {{PLURAL:$1|ei Version|$1 Versione}} zrucksetze",
        "import-logentry-interwiki": "„$1“ isch importiert worde (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versione}} vo $2",
        "javascripttest": "JavaScript-Tescht",
-       "javascripttest-title": "$1-Tescht wäre durgfiert",
        "javascripttest-pagetext-noframework": "Die Syte isch reserviert fir JavaSkript-Tescht.",
        "javascripttest-pagetext-unknownframework": "Nit bekannt Framework „$1“.",
        "javascripttest-pagetext-frameworks": "Bitte eis vu däne Framework uuswehle: $1",
        "javascripttest-pagetext-skins": "Wehl e Benutzeroberflechi uus fir d Durfierig vu dr Tescht:",
        "javascripttest-qunit-intro": "Lueg d [$1 Dokumentation zue Tescht] uf mediawiki.org",
-       "javascripttest-qunit-heading": "MediaWiki-JavaSkript-QUnit-Teschter",
        "tooltip-pt-userpage": "Dyyni Benutzersyte",
        "tooltip-pt-anonuserpage": "D Benutzersyte vo der IP-Adress wo du mit schaffsch",
        "tooltip-pt-mytalk": "Dyyni Diskussionssyte",
        "watchlisttools-edit": "normal bearbeite",
        "watchlisttools-raw": "imene große Textfäld bearbeite",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])",
-       "unknown_extension_tag": "Nit bekannte Extension-Tag „$1“",
        "duplicate-defaultsort": "Obacht: Dr Sortierigsschlüssel „$2“ iberschrybt dr vorig brucht Schlüssel „$1“.",
        "version": "Version",
        "version-extensions": "Installierti Erwyterige",
        "specialpages-group-wiki": "Date un Wärchzyyg",
        "specialpages-group-redirects": "Spezialsyte wo wyterleite",
        "specialpages-group-spam": "Spam-Wärchzüüg",
+       "specialpages-group-developer": "Entwicklerwärchzyyg",
        "blankpage": "E leeri Syte",
        "intentionallyblankpage": "Die Syte isch absichtlich leer. Si wird für Benchmarks bruucht.",
        "external_image_whitelist": "  #Die Zyylete nit verändere<pre>\n#Unte chenne Fragmänt vu reguläre Usdrick (dr Teil zwische dr //) yygee wäre\n#Die wäre mit dr URL vu Bilder us externe Quälle vergliche\n#E positive Verglyych fiert zue dr Aazeig vum Bild, suscht wird s Bild nume as Link aazeigt\n#Zyylete, wu mit eme # aafange, wäre as Kommentar behandlet\n#Des isch nit abhängig vum Einzelfall\n\n#Fragmänt vu reguläre Usdrick noch däre Zyylete yytrage. Die Zyylete nit verändere</pre>",
index 5f1686b..1444e99 100644 (file)
        "move-over-sharedrepo": "== ફાઇલ અસ્તિત્વ ધારાવે છે ==\nસર્વસામાન્ય ફાઇલ સંગ્રહમાં [[:$1]] પહેલેથી મોજૂદ છે.  આ સ્થળે કોઇ અન્ય ફાઇલ હટાવતા વિહરમાન ફાઇલની માહિતી પર આ ફાઇલ લખાશે.",
        "file-exists-sharedrepo": "પસંદ કરેલ ફાઇલ ના નામે અન્ય ફાઇલ પહેલેથી સર્વ સામાન્ય ફાઇલ સંગ્રહમાં મોજૂદ છે/\nકૃપયા અન્ય નામ પસંદ કરો.",
        "export": "પાનાઓની નિકાસ કરો/પાના અન્યત્ર મોકલો",
-       "exporttext": "તમે કોઇ એક  પાનાનું લેખન અને ઇતિહાસ નિકાસ કરી શકો અથવા કોઇ XML પાનામાં વેંટાળી શકો.\nમિડીયા વિકિ ના [[Special:Import|import page]]  નો ઉપયોગ કરી  આ પાનાને અન્ય વિકિમાં ખસેડી શકો.\n\nપાનાની નિકાસ કરવા, નીચેના ચોકઠામાં તેના શીર્ષકો લખો, એક લિટીમાં એક શીર્ષક, અનેપસંદ કરો કે તમારે પ્રાચીન ફેરફારો સાથે ઇતિહાસના પાના સાથે નવા ફેરફારો અને હાલના ફેરફારની માહિતી લઇ જવી છે.\n\nપાછળના વિકલ્પ પસંદ કરવા તમે આ કડી વાપરી શકો [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] આ પાના માટે   \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "તમે કોઇ એક પાનાનું લેખન અને ઇતિહાસ નિકાસ કરી શકો અથવા કોઇ XML પાનામાં વિંટાળી શકો છો.\nમિડીયાવિકિના [[Special:Import|import page]] નો ઉપયોગ કરી આ પાનાને અન્ય વિકિમાં ખસેડી શકો છો.\n\nપાનાની નિકાસ કરવા, નીચેના ચોકઠામાં તેના શીર્ષકો લખો, એક લિટીમાં એક શીર્ષક, અનેપસંદ કરો કે તમારે પ્રાચીન ફેરફારો સાથે ઇતિહાસના પાના સાથે નવા ફેરફારો અને હાલના ફેરફારની માહિતી લઇ જવી છે.\n\nપાછળના વિકલ્પ પસંદ કરવા તમે આ કડી વાપરી શકો [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] આ પાના માટે \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "બધાં પાનાઓ નિકાસ કરો/પાના અન્યત્ર મોકલો",
        "exportcuronly": "માત્ર હાલના ફેરફારો જુઓ , પૂર્ણ ઇતિહાસ નહી.",
        "exportnohistory": "----\n'''નોંધ:''' કાર્યક્ષમતાને લાગતા કારણોને લીધે આ રૂપમાં ઇતિહાસ પાનાની નિકાસ ને નિષ્ક્રીય કરાઇ છે.",
        "import-logentry-interwiki": "આંતરવિકિ  $1",
        "import-logentry-interwiki-detail": "$2 માંથી આયાત કરેલ $1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}",
        "javascripttest": "જાવા સ્ક્રીપ્ટ પરીક્ષણ",
-       "javascripttest-title": "$1 પરીક્ષણ જારી",
        "javascripttest-pagetext-noframework": "આ પાનું જાવા સ્ક્રીપ્ટ ચલાવવા આરક્ષિત છે.",
        "javascripttest-pagetext-unknownframework": "અજાણ ચકાસણી ફ્રેમવર્ક \"$1\".",
        "javascripttest-pagetext-frameworks": "નીચેનામાંથી કોઈ એક ચકાસણી ફ્રેમવર્ક પસંદ કરો : $1",
        "javascripttest-pagetext-skins": "ચકાસણી કરવા માટેની સ્કીન પસંદ કરો",
        "javascripttest-qunit-intro": "mediawiki.org પર  [$1 testing documentation] તપાસ માહિતી જુઓ",
-       "javascripttest-qunit-heading": "મિડિયા વિકી જાવા સ્ક્રીપ્ટ QUnit test suite",
        "tooltip-pt-userpage": "તમારૂં પાનું (તમારૂં 'મારા વિષે')",
        "tooltip-pt-anonuserpage": "IP સરનામું માટેના સભ્ય પાનામાં તમે ફેરફાર કરી રહ્યાં છો.",
        "tooltip-pt-mytalk": "તમારૂં ચર્ચાનું પાનું",
        "watchlisttools-edit": "ધ્યાનસૂચી જુઓ અને બદલો",
        "watchlisttools-raw": "કાચી ધ્યાનસૂચિમાં ફેરફાર કરો",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-       "unknown_extension_tag": "અજ્ઞાત વિસ્તારક શબ્દ \"$1\"",
        "duplicate-defaultsort": "'''ચેતવણી:'''  કી \"$2\" આગળનામૂળે પ્રસ્થાપિત ક્રમિકાવર્ગીકરણ કી \"$1\"નું સ્થાન લઈ લેશે..",
        "version": "આવૃત્તિ",
        "version-extensions": "પ્રસ્થાપિત વિસ્તારકો",
index 0fc292d..0f08d99 100644 (file)
        "pool-queuefull": "התור מלא",
        "pool-errorunknown": "שגיאה בלתי ידועה",
        "pool-servererror": "שירות המנייה אינו זמין ($1).",
+       "poolcounter-usage-error": "שגיאת שימוש: $1",
        "aboutsite": "אודות {{SITENAME}}",
        "aboutpage": "Project:אודות",
        "copyright": "התוכן זמין לפי תנאי $1 אלא אם נאמר אחרת.",
        "anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
        "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
        "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
-       "selfredirect": "<strong>×\90×\96×\94ר×\94:</strong> × ×\99ס×\99ת ×\9c×\99צ×\95ר ×\94פנ×\99×\94 ×\9e×\93×£ ×\96×\94 ×\9cעצ×\9e×\95.\n×\9c×\97×\99צ×\94 ×\97×\95×\96רת ×¢×\9c ×\94×\9bפת×\95ר \"{{int:savearticle}}\" ×ª×\92ר×\95×\9d ×\9c×\94פנ×\99×\94 ×\9c×\94×\99×\95×\95צר.",
+       "selfredirect": "<strong>×\90×\96×\94ר×\94:</strong> × ×\99ס×\99ת ×\9c×\99צ×\95ר ×\94פנ×\99×\94 ×\9e×\93×£ ×\96×\94 ×\9cעצ×\9e×\95.\n×\90×\95×\9c×\99 ×\9bת×\91ת ×\99×¢×\93 ×©×\92×\95×\99 ×\9c×\94פנ×\99×\94, ×\95×\90×\95×\9c×\99 ×¢×¨×\9bת ×\90ת ×\94×\93×£ ×\94×\9c×\90Ö¾× ×\9b×\95×\9f.\n×\9c×\97×\99צ×\94 ×\97×\95×\96רת ×¢×\9c ×\94×\9bפת×\95ר \"{{int:savearticle}}\" ×ª×\92ר×\95×\9d ×\9c×\94פנ×\99×\94 ×\9c×\94×\99×\95×\95צר ×\91×\9b×\9c ×\96×\90ת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
        "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא/כותרת להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא/כותרת.",
        "summary-preview": "תצוגה מקדימה של התקציר:",
        "content-model-text": "טקסט פשוט",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "אוביקט ריק",
+       "content-json-empty-array": "מערך ריק",
        "duplicate-args-category": "דפים שמשתמשים בפרמטרים כפולים בקריאות לתבניות",
        "duplicate-args-category-desc": "הדף מכיל קריאות לתבניות שמשתמשות בפרמטרים כפולים, כגון <code><nowiki>{{תאריך|יום=1|יום=2}}</nowiki></code> או <code><nowiki>{{שעה|חמש|1=שש}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''אזהרה:''' דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.\n\nנדרש {{PLURAL:$2|שתהיה בו לכל היותר קריאה אחת|שתהיינה בו לכל היותר $2 קריאות}} לפונקציות כאלה, אך כרגע יש בו {{PLURAL:$1|קריאה אחת|$1 קריאות}}.",
        "history-feed-empty": "הדף המבוקש לא נמצא.\nייתכן שהוא נמחק, או ששמו שונה.\nבאפשרותך לנסות [[Special:Search|לחפש]] דפים רלוונטיים חדשים.",
        "rev-deleted-comment": "(תקציר העריכה הוסר)",
        "rev-deleted-user": "(שם המשתמש הוסר)",
-       "rev-deleted-event": "(פע×\95×\9cת ×\94×\99×\95×\9e×\9f ×\94×\95סר×\94)",
+       "rev-deleted-event": "(פר×\98×\99×\9d ×\9e×\94×\99×\95×\9e×\9f ×\94×\95סר×\95)",
        "rev-deleted-user-contribs": "[שם המשתמש או כתובת ה־IP הוסרו – העריכה הוסתרה מדף התרומות]",
        "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}}}} יומן ההעלמות].",
        "revdelete-legend": "הגדרת הגבלות התצוגה",
        "revdelete-hide-text": "תוכן הגרסה",
        "revdelete-hide-image": "הסתרת תוכן הקובץ",
-       "revdelete-hide-name": "×\94סתרת ×\94פע×\95×\9c×\94 ×\95×\93×£ ×\94×\99×¢×\93",
+       "revdelete-hide-name": "×\94סתרת ×\93×£ ×\94×\99×¢×\93 ×\95×\94פר×\9e×\98ר×\99×\9d",
        "revdelete-hide-comment": "תקציר העריכה",
        "revdelete-hide-user": "שם המשתמש או כתובת ה־IP של העורך",
        "revdelete-hide-restricted": "העלמת המידע גם ממפעילי המערכת",
        "uploaderror": "שגיאה בהעלאת הקובץ",
        "upload-recreate-warning": "'''אזהרה: קובץ בשם זה נמחק או הועבר.'''\n\nיומני המחיקות וההעברות של הדף מוצגים להלן:",
        "uploadtext": "השתמשו בטופס להלן כדי להעלות קבצים.\nכדי לראות או לחפש קבצים שהועלו בעבר אנא פנו ל[[Special:FileList|רשימת הקבצים שהועלו]], וכמו כן, העלאות (כולל העלאות של גרסה חדשה) מוצגות ב[[Special:Log/upload|יומן ההעלאות]], ומחיקות ב[[Special:Log/delete|יומן המחיקות]].\n\nכדי לכלול קובץ בדף, השתמשו בקישור באחת הצורות הבאות:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' לשימוש בגרסה המלאה של הקובץ\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|טקסט תיאור]]</nowiki></code>''' לשימוש בגרסה מוקטנת ברוחב 200 פיקסלים בתיבה בצד שמאל של הדף, עם 'טקסט תיאור' כתיאור\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' לקישור ישיר לקובץ בלי להציגו",
-       "upload-permitted": "סוגי קבצים מותרים: $1.",
-       "upload-preferred": "סוגי קבצים מומלצים: $1.",
-       "upload-prohibited": "סוגי קבצים אסורים: $1.",
+       "upload-permitted": "{{PLURAL:$2|סוג קובץ מותר|סוגי קבצים מותרים}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|סוג קובץ מומלץ|סוגי קבצים מומלצים}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|סוג קובץ אסור|סוגי קבצים אסורים}}: $1.",
        "uploadlogpage": "יומן העלאות",
        "uploadlogpagetext": "להלן רשימה של העלאות הקבצים האחרונות שבוצעו.\nראו את [[Special:NewFiles|גלריית הקבצים החדשים]] להצגה ויזואלית שלהם.",
        "filename": "שם הקובץ",
        "allarticles": "כל הדפים",
        "allinnamespace": "כל הדפים (מרחב שם $1)",
        "allpagessubmit": "הצגה",
-       "allpagesprefix": "הדפים ששמם מתחיל ב:",
+       "allpagesprefix": "הדפים ששמם מתחיל ב־:",
        "allpagesbadtitle": "כותרת הדף שניתנה הייתה בלתי־תקינה או שהייתה בה קידומת של קישור לשפה אחרת או לוויקי אחר.\nייתכן שהיא מכילה תו אחד או יותר האסורים לשימוש בכותרות.",
        "allpages-bad-ns": "מרחב השם \"$1\" לא קיים ב{{grammar:תחילית|{{SITENAME}}}}.",
        "allpages-hide-redirects": "הסתרת הפניות",
        "deleteprotected": "אין באפשרותך למחוק את הדף כי הוא מוגן.",
        "deleting-backlinks-warning": "'''אזהרה:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
        "rollback": "שחזור עריכות",
-       "rollback_short": "שחזור",
        "rollbacklink": "שחזור",
        "rollbacklinkcount": "שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "namespace": "מרחב שם:",
        "invert": "ללא מרחב זה",
        "tooltip-invert": "יש לסמן תיבה זו כדי להסתיר שינויים בדפים בתוך מרחב השם שנבחר (ובתוך מרחב השם הצמוד, אם הוא סומן)",
+       "tooltip-whatlinkshere-invert": "יש לסמן תיבה זו כדי להסתיר קישורים מדפים בתוך מרחב השם שנבחר",
        "namespace_association": "מרחב שם צמוד",
        "tooltip-namespace_association": "יש לסמן תיבה זו כדי לכלול גם את מרחב דפי השיחה או דפי הנושא המשויכים למרחב השם הנבחר",
        "blanknamespace": "(ראשי)",
        "thumbnail-temp-create": "לא הצליחה יצירת קובץ תמונה ממוזערת זמני",
        "thumbnail-dest-create": "לא הייתה אפשרות לשמור את התמונה הממוזערת אל יעדה",
        "thumbnail_invalid_params": "פרמטרים שגויים לתמונה הממוזערת",
+       "thumbnail_toobigimagearea": "קובץ בגודל של יותר מ־$1",
        "thumbnail_dest_directory": "לא ניתן היה ליצור את תיקיית היעד",
        "thumbnail_image-type": "סוג התמונה אינו נתמך",
        "thumbnail_gd-library": "הגדרת הספריה GD אינה שלמה: חסרה הפונקציה $1",
        "import-logentry-interwiki": "ייבא את $1 בייבוא בין־אתרי",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|גרסה אחת של הדף $2 יובאה|$1 גרסאות של הדף $2 יובאו}}",
        "javascripttest": "בדיקת JavaScript",
-       "javascripttest-title": "הרצת בדיקות $1",
        "javascripttest-pagetext-noframework": "דף זה שמור להרצת בדיקות JavaScript.",
        "javascripttest-pagetext-unknownframework": "סביבת הבדיקות \"$1\" אינה ידועה.",
+       "javascripttest-pagetext-unknownaction": "הפעולה \"$1\" אינה ידועה.",
        "javascripttest-pagetext-frameworks": "נא לבחור אחת מסביבות הבדיקות הבאות: $1",
        "javascripttest-pagetext-skins": "בחירת עיצוב שאיתו יורצו הבדיקות:",
        "javascripttest-qunit-intro": "ראו את [$1 תיעוד הבדיקות] באתר mediawiki.org.",
-       "javascripttest-qunit-heading": "מערך בדיקות QUnit ל־JavaScript של מדיה־ויקי",
        "tooltip-pt-userpage": "דף המשתמש שלך",
        "tooltip-pt-anonuserpage": "דף המשתמש של משתמש אנונימי זה",
        "tooltip-pt-mytalk": "דף השיחה שלך",
        "hebrew-calendar-m11-gen": "באב",
        "hebrew-calendar-m12-gen": "באלול",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|שיחה]])",
-       "unknown_extension_tag": "תגית בלתי ידועה: \"$1\"",
        "duplicate-defaultsort": "'''אזהרה:''' המיון הרגיל \"$2\" דורס את המיון הרגיל המוקדם ממנו \"$1\".",
        "duplicate-displaytitle": "<strong>אזהרה:</strong> כותרת התצוגה \"$2\" דורסת את כותרת התצוגה הקודמת \"$1\".",
        "invalid-indicator-name": "<strong>שגיאה:</strong> התכונה <code>name</code> של מצייני מצב הדף אינה יכולה להיות ריקה.",
        "version-entrypoints": "כתובות של נקודות כניסה",
        "version-entrypoints-header-entrypoint": "נקודת כניסה",
        "version-entrypoints-header-url": "כתובת",
+       "version-libraries": "ספריות מותקנות",
+       "version-libraries-library": "ספריה",
+       "version-libraries-version": "גרסה",
        "redirect": "הפניה לפי שם קובץ, מספר משתמש, מספר דף או מספר גרסה",
        "redirect-legend": "הפניה לקובץ או לדף",
        "redirect-summary": "דף מיוחד זה מפנה לקובץ (בהינתן שם הקובץ), לדף (בהינתן מספר גרסה או מספר דף), או לדף משתמש (בהינתן מספר משתמש). דוגמאות לשימוש: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], או [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "הגרסה שציינת אינה קיימת.",
        "dberr-problems": "מצטערים! קיימת בעיה טכנית באתר זה.",
        "dberr-again": "נסו להמתין מספר שניות ולהעלות מחדש את הדף.",
-       "dberr-info": "(×\9c×\90 × ×\99ת×\9f ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d ×©×¨×ª הנתונים: $1)",
-       "dberr-info-hidden": "(×\9c×\90 × ×\99ת×\9f ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d ×©×¨×ª הנתונים)",
+       "dberr-info": "(×\9c×\90 × ×\99ת×\9f ×\9c×\92שת ×\9c×\91ס×\99ס הנתונים: $1)",
+       "dberr-info-hidden": "(×\9c×\90 × ×\99ת×\9f ×\9c×\92שת ×\9c×\91ס×\99ס הנתונים)",
        "dberr-usegoogle": "באפשרותך לנסות לחפש באמצעות גוגל בינתיים.",
        "dberr-outofdate": "שימו לב שהתוכן שלנו כפי שנשמר במאגר שם עשוי שלא להיות מעודכן.",
        "dberr-cachederror": "זהו עותק שמור של המידע, והוא עשוי שלא להיות מעודכן.",
index 2eb335a..f9b6f59 100644 (file)
@@ -84,7 +84,7 @@
        "tog-shownumberswatching": "ध्यान रखने वाले सदस्यों की संख्या दिखाएँ",
        "tog-oldsig": "वर्तमान हस्ताक्षर:",
        "tog-fancysig": "हस्ताक्षर का विकिपाठ के समान मानें (बिना स्वचालित कड़ी के)",
-       "tog-uselivepreview": "सजीवन झलक का उपयोग करें (प्रयोगात्मक)",
+       "tog-uselivepreview": "सजीवन झलक का उपयोग करें",
        "tog-forceeditsummary": "यदि सम्पादन सारांश ना दिया गया हो तो मुझे सूचित करें",
        "tog-watchlisthideown": "मेरी ध्यानसूची से मेरे किए परिवर्तन छिपाएँ",
        "tog-watchlisthidebots": "मेरी ध्यानसूची से बॉटों द्वारा किए परिवर्तन छिपाएँ",
        "otherlanguages": "अन्य भाषाएँ",
        "redirectedfrom": "($1 से पुनर्निर्देशित)",
        "redirectpagesub": "पुनर्निर्देश पृष्ठ",
+       "redirectto": "को अनुप्रेषित:",
        "lastmodifiedat": "इस पृष्ठ का पिछला बदलाव $1 को $2 बजे हुआ था।",
        "viewcount": "यह पृष्ठ {{PLURAL:$1|एक|$1}} बार देखा गया है।",
        "protectedpage": "सुरक्षित पृष्ठ",
        "pool-queuefull": "पूल पंक्ति भरी हुई है",
        "pool-errorunknown": "अज्ञात त्रुटि",
        "pool-servererror": "पूल काउंटर सेवा उपलब्ध नहीं है ($1)।",
+       "poolcounter-usage-error": "उपयोग त्रुटि: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
        "aboutpage": "Project:परिचय",
        "copyright": "उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।",
        "filerenameerror": "\"$1\" फ़ाइल का नाम बदलकर \"$2\" नहीं रखा जा सका।",
        "filedeleteerror": "\"$1\" फ़ाइल को हटाया नहीं जा सका।",
        "directorycreateerror": "\"$1\" डाइरेक्टरी नहीं बनाई जा सकी।",
+       "directoryreadonlyerror": "निर्देशिका \"$1\" केवल पठनीय है।",
+       "directorynotreadableerror": "निर्देशिका \"$1\" पठनीय नहीं है।",
        "filenotfound": "\"$1\" फ़ाइल नहीं मिली।",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\".",
        "formerror": "त्रुटि: फ़ॉर्म सबमिट नहीं किया जा सका",
        "viewsourcetext": "आप इस पृष्ठ का स्रोत देख सकते हैं और उसकी नकल उतार सकते हैं:",
        "viewyourtext": "आप इस पृष्ठ में ''अपने सम्पादन'' का स्रोत देख सकते हैं और उसकी नकल उतार सकते हैं:",
        "protectedinterface": "यह पृष्ठ इस विकी के सॉफ़्टवेयर का इंटरफ़ेस पाठ देता है, और इसे गलत प्रयोग से बचाने के लिये सुरक्षित कर दिया गया है।\nसभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] का प्रयोग करें।",
-       "editinginterface": "'''चेतावनी:''' आप एक ऐसे पृष्ठ को बदल रहे हैं जो सॉफ़्टवेयर का इंटरफ़ेस पाठ प्रदान करता है।\nइस पृष्ठ को बदलने से अन्य सदस्यों को प्रदर्शित इंटरफ़ेस की शक्लोसूरत में बदलाव आएगा।\nसभी विकियों के लिए अनुवाद बदलने या जोड़ने के लिए कृपया मीडियाविकि की क्षेत्रीयकरण परियोजना [//translatewiki.net/wiki/Main_Page?setlang=hi translatewiki.net] का प्रयोग करें।",
+       "editinginterface": "<strong>चेतावनी:</strong> आप एक ऐसे पृष्ठ को बदल रहे हैं जो सॉफ़्टवेयर का इंटरफ़ेस पाठ प्रदान करता है।\nइस पृष्ठ को बदलने से अन्य सदस्यों को प्रदर्शित इंटरफ़ेस की शक्लोसूरत में बदलाव आएगा।",
        "cascadeprotected": "यह पृष्ठ सुरक्षित हैं, क्योंकी यह निम्नलिखित {{PLURAL:$1|पृष्ठ|पृष्ठों}} की सुरक्षा-सीढ़ी में समाविष्ट है:\n$2",
        "namespaceprotected": "आपको '''$1''' नामस्थान में समाविष्ट पृष्ठों को बदलने की अनुमति नहीं है।",
        "customcssprotected": "आपको इस CSS पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
        "delete-warning-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\nइसे हटाने से {{SITENAME}} के डाटाबेस की गतिविधियों में व्यवधान आ सकता है;\nकृपया सोच समझ कर आगे बढ़ें।",
        "deleting-backlinks-warning": "'''चेतावनी:''' जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।",
        "rollback": "संपादन वापिस लें",
-       "rollback_short": "वापिस लें",
        "rollbacklink": "वापिस लें",
        "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbacklinkcount-morethan": "$1 से अधिक {{PLURAL:$1|सम्पादन}} वापिस लें",
        "import-logentry-interwiki": "ट्रान्सविकि कर दिया $1",
        "import-logentry-interwiki-detail": "$2 से $1 {{PLURAL:$1|अवतरण|अवतरण}}",
        "javascripttest": "जावास्क्रिप्ट परीक्षण",
-       "javascripttest-title": "$1 परीक्षण चल रहे हैं",
        "javascripttest-pagetext-noframework": "यह पृष्ठ जावास्क्रिप्ट परीक्षण चलाने के लिए है।",
        "javascripttest-pagetext-unknownframework": "अज्ञात परीक्षण ढाँचा \"$1\"",
        "javascripttest-pagetext-frameworks": "कृपया निम्न परीक्षण ढाँचों में से एक चुनें: $1",
        "javascripttest-pagetext-skins": "परीक्षण करने के लिए त्वचा चुनें:",
        "javascripttest-qunit-intro": "mediawiki.org पर [$1 परीक्षण के प्रलेखन] देखें।",
-       "javascripttest-qunit-heading": "मीडियाविकि जावास्क्रिप्ट क्यू-युनिट परीक्षण ढाँचा",
        "tooltip-pt-userpage": "आपका प्रयोक्ता पृष्ठ",
        "tooltip-pt-anonuserpage": "आप जिस आईपी से बदलाव कर रहें हैं उसका सदस्य पान",
        "tooltip-pt-mytalk": "आपका वार्ता पृष्ठ",
        "hebrew-calendar-m11-gen": "एवी (Av)",
        "hebrew-calendar-m12-gen": "एलुल (Elul)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
-       "unknown_extension_tag": "गलत एक्स्टेंशन टैग \"$1\"",
        "duplicate-defaultsort": "'''Warning:''' पुरानी मूल क्रमांकन कुंजी \"$1\" के बजाय अब मूल क्रमांकन कुंजी \"$2\" होगी।",
        "version": "रूपान्तर",
        "version-extensions": "इन्स्टॉल की हुई एक्स्टेंशन",
        "specialpages-group-wiki": "डाटा और औज़ार",
        "specialpages-group-redirects": "विशेष पृष्ठ अनुप्रेषित कर रहें हैं",
        "specialpages-group-spam": "स्पैम औज़ार",
+       "specialpages-group-developer": "डेवलपर उपकरण",
        "blankpage": "खाली पृष्ठ",
        "intentionallyblankpage": "यह पृष्ठ जानबूझ कर खाली छोड़ा गया है।",
        "external_image_whitelist": " #यह लाइन जैसी है वैसी ही छोड़ दें<pre>\n #नीचे रेगुलर एक्सप्रेशन के टुकड़े लिखें(बस वही हिस्सा जो // के बीच में आता है)\n #इन एक्सप्रेशन का बाहरी (hotlinked) छवियों के यू॰आर॰एल के साथ मिलान किया जाएगा\n #जो छवियाँ मिलान करेंगी, उन्हें प्रदर्शित किया जाएगा, अन्यथा केवल छवि की कड़ी दिखायी जाएगी\n # # से शुरू होने वाली लाइनें टिप्पणी मानी जाती हैं\n # इस केस-असंवेदी है\n\n #सब रेगुलर एक्सप्रेशन टुकड़े इस लाइन से ऊपर रखें। यह लाइन जैसी है वैसी ही छोड़ दें</pre>",
index 6b6bdd1..7a874fc 100644 (file)
@@ -28,6 +28,7 @@
        "tog-watchdefault": "Ham se badla gais panna aur file ke hamaar dhyaan suchi me jorro",
        "tog-watchmoves": "Uu panna aur file jiske naam ham badla hai ke hamaar dhyaan suchi me jorro",
        "tog-watchdeletion": "Uu panna, aur file jiske ham mitaya hai ke hamaar dhyaan suchi me jorro",
+       "tog-watchrollback": "Uu panna ke jorro jisme ham aapan watchlist me rollback karaa hae",
        "tog-minordefault": "Mamuli badlao ke apne se nishaan lagao",
        "tog-previewontop": "Badlao waala dabba se pahile ek jhalak dekhao",
        "tog-previewonfirst": "Hamaar pahila badlao pe jhalak dekhao",
        "permalink": "Pakka jorr",
        "print": "Print karo",
        "view": "Dekho",
+       "view-foreign": "$1 pe dekho",
        "edit": "Badlo",
+       "edit-local": "Local description ke badlo",
        "create": "Banao",
+       "create-local": "Local description ke jorro",
        "editthispage": "Ii panna ke badlo",
        "create-this-page": "Ii panna ke banao",
        "delete": "Mitao",
        "otherlanguages": "Duusra bhasa me",
        "redirectedfrom": "($1 se bheja gais)",
        "redirectpagesub": "Panna ke redirect karo",
+       "redirectto": "Hian redirect karo:",
        "lastmodifiedat": "Ii panna ke $1, ke $2 pichhla time badla gais rahaa.",
        "viewcount": "Ii panna ke {{PLURAL:$1|ek dafe|$1 dafe}} dekha gais hai.",
        "protectedpage": "Bachawal panna",
        "jumptonavigation": "navigation",
        "jumptosearch": "khojo",
        "view-pool-error": "Maaf karna, abhi sab server busy hae.\nBahut dher sadasya ii panna ke dekhe maange hae.\nMeharbani kar ke, thora deri sabur kar ke ii panna ke fir se kholo.\n\n$1",
+       "generic-pool-error": "Maaf karna, abhi sab server busy hae.\nBahut dher sadasya ii panna ke dekhe maange hae.\nMeharbani kar ke, thora deri sabur kar ke ii panna ke fir se kholo.",
        "pool-timeout": "Lock ke wait kare waala time khalaas hoe gais hae",
        "pool-queuefull": "Pool ke line bhar gais hae",
        "pool-errorunknown": "Pata nahi kaisan galti hae",
+       "pool-servererror": "Pool counter sewa abhi ready nai hae ($1).",
+       "poolcounter-usage-error": "Kaam me lae pe karrbarr: $1",
        "aboutsite": "{{SITENAME}} ke baare me",
        "aboutpage": "Project:Ke baare me",
        "copyright": "Agar duusra kaaran nai dewa gais hae, tab aap ii panna me likha gae chij ke aap $1 ke niche kaam me lae sakta hai.",
        "youhavenewmessages": "Aapke pass hai $1 ($2).",
        "youhavenewmessagesfromusers": "Aap ke lage {{PLURAL:$3|duusra sadasya|$3 sadasya}} ke lage se $1 hae ($2).",
        "youhavenewmessagesmanyusers": "Aap ke lage dher sadasya se $1 hae ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|ek nawaa sandes|nawaa sandes}}",
-       "newmessagesdifflinkplural": "pichhla {{PLURAL:$1|badlao}}",
+       "newmessageslinkplural": "{{PLURAL:$1|ek nawaa sandes|999=nawaa sandes}}",
+       "newmessagesdifflinkplural": "pichhla{{PLURAL:$1|badlao|999=badlao}}",
        "youhavenewmessagesmulti": "Aap ke khatir $1 pe sandes hai",
        "editsection": "badlo",
        "editold": "badlao",
        "hidetoc": "chupao",
        "collapsible-collapse": "Chhota karo",
        "collapsible-expand": "Barraa karo",
+       "confirmable-confirm": "Kon{{GENDER:$1|aap}} sure hae?",
+       "confirmable-yes": "Haan",
+       "confirmable-no": "Nai",
        "thisisdeleted": "Dekho ki $1 ke pahile jaise karo?",
        "viewdeleted": "$1 ke dekho?",
        "restorelink": "{{PLURAL:$1|ek mitawal badlao|$1 mitawal badlao}}",
        "filerenameerror": "File \"$1\" ke naam badal ke \"$2\" nai kare sakaa.",
        "filedeleteerror": "File \"$1\" ke nai mitae sakaa.",
        "directorycreateerror": "Directory \"$1\" ke nai banae sakaa.",
+       "directoryreadonlyerror": "Directory \"$1\" khaali parrhe ke khatir hae.",
+       "directorynotreadableerror": "Directory \"$1\" ke parrha nai jaae sake hae.",
        "filenotfound": "File \"$1\" ke nai pae sakaa.",
        "unexpected": "Aasa karaa gais jaankari nai hai: \"$1\"=\"$2\".",
        "formerror": "Galti: form ke submit nai kare sakaa",
        "viewsourcetext": "Aap ii panna ke source ke dekhe aur nakal utare kare sakta hai:",
        "viewyourtext": "Aap '''aapan badlao''' ke source ke dekhe aur copy kare saktaa hae",
        "protectedinterface": "Ii panna, ii wiki ke khatir, software ke interface text dewe hai, aur iske barbaadi se roke ke khatir band kar dewa gais hai.\nSab wiki me anuwaad ke jorre nai to badle ke khatir, meharbaani kar ke [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project ke kaam me laao.",
-       "editinginterface": "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.\nIi panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.\nTranslation khatir [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
+       "editinginterface": "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.\nIi panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.",
+       "translateinterface": "Sab wiki me translate kare ke khatir [//translatewiki.net/translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
        "cascadeprotected": "Ii panna ke badlao se bachawa gais hai, kahe ki iske {{PLURAL:$1|panna, jon ki|panna, jon ki}} surakchhit hae \"cascading\" option turned on ke saathe me rakkhaa gais hai:\n$2",
        "namespaceprotected": "Aap ke paas '''$1''' namespace me panna ke badle ke adhikar nai hai.",
        "customcssprotected": "Aap ke ii CSS panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.",
        "invalidtitle-unknownnamespace": "Title gaer kaanuni hae aur iske namespace number \"$1\" aur text \"$2\" ke nai jaana jaawe hae",
        "exception-nologin": "Logged in nai hae",
        "exception-nologin-text": "Ii panna nai to aap ke action ke khatir ii wiki me login hoe ke jarurui hae",
+       "exception-nologin-text-manual": "Ii panna ke khole, nai to ii action ke kare ke khatir $1 karo.",
        "virus-badscanner": "Kharaab ruup dewa gais hae: virus khoje waala software nawaa hae: ''$1''",
        "virus-scanfailed": "scan fail hoe gais (code $1)",
        "virus-unknownscanner": "jaana waala antivirus nai hai:",
        "gotaccount": "Aap ke pas pahile se account hai ki nai? '''$1'''.",
        "gotaccountlink": "Log in",
        "userlogin-resetlink": "Ka aap aapan login kare waala jaankari ke bhulae gaya hae?",
-       "userlogin-resetpassword-link": "Aapan password ke reset karo",
+       "userlogin-resetpassword-link": "Aapan password ke bhool gayaa?",
+       "userlogin-helplink2": "Log in kare ke khatir madat.",
+       "userlogin-loggedin": "Aap {{GENDER:$1|$1}} ke naam ke niche login bhayaa hae.\nNiche ke form ke kaam me laae ke duusra naam ke niche login ho.",
+       "userlogin-createanother": "Duusra account banao",
        "createacct-emailrequired": "Email address",
        "createacct-emailoptional": "Email address (jaruri nai hae)",
        "createacct-email-ph": "Aapan mail address ke likho",
        "passwordtooshort": "Password me kamti se kamti {{PLURAL:$1|1 character|$1 characters}} hoe ke chahi.",
        "password-name-match": "Aap ke password ke aap ke username se different rahe ke chaahi.",
        "password-login-forbidden": "Ii sadasya ke naam aur password ke kaam me laae ke ijaajat nai hae.",
-       "mailmypassword": "Nawaa password ke E-mail karo",
+       "mailmypassword": "Password ke badlo",
        "passwordremindertitle": "{{SITENAME}} ke khatir nawaa temporary password",
        "passwordremindertext": "Koi (hoe sake hai aap, IP address $1 se)\n{{SITENAME}} ($4) ke khatir nawaa password mangis hai.\n\"$2\" ke banae ke \"$3\" se set kar dewa gais hai. Agar aap ii chij mangta rahaa,\ntab aap ke abhi login kar ke password badle ke chaahi.\nAap ke temporary password {{PLURAL:$5|ek din|$5 din}} me expire hoi.\n\nAgar jo aur koi ii request karis hai, nai to aap aapan password yaad kar liya hai aur nai badle mangta hai, tab ii sandes ke ignore kar do aur aapan purana password use karte raho.",
        "noemail": "Sadasya \"$1\" ke koi e-mail address recorded nai hai.",
        "noemailcreate": "Aap ke thiik e-mail address de ke parrii",
        "passwordsent": "Ek nawaa password ke \"$1\" ke registered e-mail pe bheja gais hai. Meharbaani kar ke aap password mile ke baad login karna.",
        "blocked-mailpassword": "Aap ke IP address ke block kar dewa gais hai, aur iske kaaran aap ke password recovery function kaam me lae ke ijajat nai hai,",
-       "eauthentsent": "Ek confirmation e-mail aap ke dewa gae e-mail address be bhej dewa gais hai. Aur mail ii account pe bheje se pahile e-mail me likha instructions ke follow karo, ii confirm kare ke khatir ki account aap ke hai.",
+       "eauthentsent": "Ek confirmation e-mail aap ke dewa gae e-mail address pe bhej dewa gais hai. Aur mail ii account pe bheje se pahile e-mail me likha instructions ke follow karo, ii confirm kare ke khatir ki account aap ke hai.",
        "throttled-mailpassword": "Ek password reset Email ke pahile bheja gais hae, pichhle  {{PLURAL:$1|ghanta|$1 ghanta}} me bhej me.\nAbuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|ghanta|$1 ghanta}} me bheja jaai.",
        "mailerror": "Mail bheje me galti hoe gais hai: $1",
        "acct_creation_throttle_hit": "Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle kuch din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.\nIi kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.",
-       "emailauthenticated": "Aap ke e-mail address ke $2 ke roj aur $3 baje authenticate karaa gais rahaa.",
-       "emailnotauthenticated": "Aap ke e-mail address ke abi tak authenticate nai gais hai.\nIi sab feature khatir koi e-mail nai bheja jaai.",
+       "emailauthenticated": "Aap ke e-mail address ke $2 ke roj aur $3 baje confirm karaa gais rahaa.",
+       "emailnotauthenticated": "Aap ke e-mail address ke abi tak authenticate nai karaagais hai.\nIi sab feature khatir koi e-mail nai bheja jaai.",
        "noemailprefs": "Ii sab feature ke kaam kare khatir e-mail specify karo.",
        "emailconfirmlink": "aapan e-mail address ke confirm karo",
        "invalidemailaddress": "E-mail address ke nai lewa jae sake hai kahe ki iske format kharaab hai.\nMeharbaani kar ke achchha address ke enter karo nai to uu field ke khali kar do.",
        "createaccount-text": "Koi aap ke e-mail katir {{SITENAME}} ($4) named \"$2\" me account banais hai jiske password hai \"$3\".\nAap ke chaahi ki aap login kar ke password ke badal do.\nAgar ii account galti se banaa hai tab ii sandes ke ignore kar do.",
        "login-throttled": "Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hae.\n$1 talak wait kar ke fir se try karo.",
        "login-abort-generic": "Aap ke login nai chalaa - Aborted",
+       "login-migrated-generic": "Aap ke account ke update kare ke kaaran, aap ke username ab nai hae.",
        "loginlanguagelabel": "Bhasa: $1",
        "suspicious-userlogout": "Aap ke log out kare ke maang ke na kar dewa gais hae kaahe ki ii janaawe hae ki ii maang ke ek tuuta browser nai to caching proxy bhejis hae.",
        "createacct-another-realname-tip": "Aslii naam ke jaruri nai hae.\nAgar aap iske diya hae tab iske aapke kaam ke attribute kare ke khatir kaam me lawa jaai.",
+       "pt-login": "Log in karo",
+       "pt-login-button": "Log in karo",
+       "pt-createaccount": "Nawaa account banao",
+       "pt-userlogout": "Log out ho",
        "php-mail-error-unknown": "PHP ke mail() function me koi anjaan kharaabi hae",
        "user-mail-no-addy": "Bina e-mail address rahe pe bhi e-mail bheje ke kosis karaa gais hae.",
        "user-mail-no-body": "Ek khaali, nai to kaafi chhota email bheje ke kosis kara rahaa.",
        "changepassword": "Pasword ke badlo",
-       "resetpass_announce": "Aap ek temporary e-mailed code se login bhaya hai\nLogin khatam kare khatir, aap ke nawaa password set kare ke parri hian:",
+       "resetpass_announce": "Login khatam kare khatir, aap ke nawaa password set kare ke parri.",
        "resetpass_text": "<!-- Hian pe likho -->",
        "resetpass_header": "Account assword ke badlo",
        "oldpassword": "Purana password:",
        "retypenew": "Password fir se type karo:",
        "resetpass_submit": "Password ke set kar ke login karo",
        "changepassword-success": "Aap ke password ke safalta se badal dewa gais hai!",
+       "changepassword-throttled": "Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hae.\n$1 talak wait kar ke fir se try karo.",
        "resetpass_forbidden": "Password nai badlaa jaae sake hai",
        "resetpass-no-info": "Ii panna ke sidha access kare ke khatir aap ke logged in rahe ke parri.",
        "resetpass-submit-loggedin": "Password ke badlo",
        "resetpass-submit-cancel": "Nai karo",
        "resetpass-wrong-oldpass": "Temporary nai to abhi ke password valid nai hai.\nSait aap password ke safalta se badal sia hoga nai to nawaa temporary password ke maang karaa hoga.",
+       "resetpass-recycled": "Meharbaani kar ke aap aapan password ke badal ke duusra password banao.",
+       "resetpass-temp-emailed": "Aap ke temporary code, jiske emai karaa gais rahaa, se login bhayaa hae.\nLogin khatam kare ke khatir aap ke nawaa password banae ke chaahi.",
        "resetpass-temp-password": "Kachcha password:",
        "resetpass-abort-generic": "Ek extension password ke badlao ke rokis hae.",
+       "resetpass-expired": "Aap ke password expire hoe gais hae. Log in kare ke khatir ek nawaa password banao.",
+       "resetpass-expired-soft": "Aap ke password expire hoe gais hae aur iske reset kare ke parri. Meharbani kar ke nawaa pasword choose karo, nai to password ke baad me reset kare ke khatir \"{{int:resetpass-submit-cancel}}\" ke click karo.",
+       "resetpass-validity-soft": "Aap ke password thiik nai hae: $1\n\n\nMeharbani kar ke nawaa pasword choose karo, nai to password ke baad me reset kare ke khatir \"{{int:resetpass-submit-cancel}}\" ke click karo.",
        "passwordreset": "Password ke badlo",
        "passwordreset-text-one": "Aapan password ke reset kare ke khatir ii form ke bharo.",
-       "passwordreset-text-many": "{{PLURAL:$1|Aapan password ke reset kare ke khatir ek field me likho}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Temporary password ke email se le ke khatir ek field me likho}}",
        "passwordreset-legend": "Password ke badlo",
        "passwordreset-disabled": "II wiki me password ke badle ke ijaajat nai hae.",
        "passwordreset-emaildisabled": "Ii wiki me email ke band kar dewa gais hae.",
        "changeemail-none": "(kuchh nai)",
        "changeemail-password": "Aap ke {{SITENAME}} password:",
        "changeemail-submit": "E-mail badlo",
+       "changeemail-throttled": "Aap bahut dher dafe login kare ke kosis karaa hae.\nMeharbaani kar ke $1 talak wait kar ke fir se try karo.",
        "resettokens": "Token ke reset karo",
        "resettokens-text": "Aap aapan private data pe access roke ke khatir token ke reset kare saktaa hae.\n\nAap ke ii kare ke chaahi agar aap galti se ii jaankari ke aur koi ke de diya hae nai to aap ke account ke bare me aur koi ke pataa hae.",
        "resettokens-no-tokens": "Reset kare ke jhatir koi token nai hae.",
        "preview": "Jhalak dekhao",
        "showpreview": "Preview dekhao",
        "showdiff": "Badlao dekhao",
-       "anoneditwarning": "'''Sawadhaan:''' Aap login nai karaa hai\nAap ke IP address ii panna ke edit itihaas me record karaa jaai.",
+       "blankarticle": "<strong>Chetauni:</strong> Jon panna ke aap banata hae, me kuchh likha nai hae. \nAgar aap \"{{int:savearticle}}\" ke fir se click karaa, tab khaali panna ban jaai.",
+       "anoneditwarning": "'''Sawadhaan:''' Aap login nai karaa hai\nAap ke IP address ke sab koi dekhe saki agar aap koi badlao karra. Agar aap <strong>>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, tab aap ke badlao aap ke naam ke niche dekhai, aur duusra benefits ke saathe.",
        "anonpreviewwarning": "\"Aap log in nai bhaya hae. Ii panna ke bachae pe aap ke IP address ke panna ke badlao ke itihass me likha jaai.\"",
        "missingsummary": "'''Suchna:''' Aap badlao ke sanchhit me nai likha hai.\nAgar aap Save ke fir se click karaa tab, aap ke badlao bina summary ke save kar lewa jaai.",
+       "selfredirect": "<strong>Chetauni:</strong> Aap ii panna ke apne me redirect kartaa hae. \nAap saait wrong target ke specify karaa, nai to wrong panna ke badaltaa hae.\nAgar aap  \"{{int:savearticle}}\" ke fir se click karaa tab redirect ban jaai.",
        "missingcommenttext": "Meharbani kar ke niche aapan vichar deo.",
        "missingcommentheader": "'''Chetauni:''' Aap ii vichar ke vishay nai likha hai.\nAgar aap \"{{int:savearticle}}\"  pe click karaa tab bina vishay ke iske bachae lewa jaai.",
        "summary-preview": "Sanchhep jhalak:",
        "edit-gone-missing": "Panna ke badle nai sakaa.\nJanae hai ki iske koi mitae dii hai.",
        "edit-conflict": "Badlao me conflict hai.",
        "edit-no-change": "Aap ke badle ke kosis ke ignore kar dewa gais hai, kahe ki text ke badla nai gais hai.",
+       "postedit-confirmation-created": "Panna ke banae dewa gais hae.",
+       "postedit-confirmation-restored": "Panna ke restore kar dewa gais hae.",
        "postedit-confirmation-saved": "Aap ke badlao ke bachae lewa gais hae.",
        "edit-already-exists": "Nawaa panna nai banae sakaa hai.\nIi naam ke panna abhi hai.",
        "defaultmessagetext": "Default message text",
        "content-failed-to-parse": "$1 model ke khatir $2 ke parse nai kare sakaa hae: $3",
        "invalid-content-data": "Panna me likha gais chij right nai hae",
        "content-not-allowed-here": "Panna [[$2]] me \"$1\" likhe ke ijaajat nai hae",
-       "editwarning-warning": "Ii panna ke chore se jetna changes aap  karaa hae nai save hoi.\nAgar aap logged in hae, tab aap ii chetauni ke \"Editing\" vibhag me disable kare saktaa hae.",
+       "editwarning-warning": "Ii panna ke chhore se jetna changes aap  karaa hae nai save hoi.\nAgar aap logged in hae, tab aap ii chetauni ke \"{{int:prefs-editing}}\"  vibhag me disable kare saktaa hae.",
+       "editpage-notsupportedcontentformat-title": "Content ke format ke support nai karaa jaawe hae.",
+       "editpage-notsupportedcontentformat-text": "Content format $1 ke content model $2 nai support kare hae.",
        "content-model-wikitext": "wikitext",
        "content-model-text": "plain text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Khaali object",
+       "content-json-empty-array": "Khaali array",
+       "duplicate-args-category": "Panna jiske tamplate call me duplicate argument hae",
+       "duplicate-args-category-desc": "Panna me template calls hae jisme duplicate arguments hae, jaise ki <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Chetauni''': Ii panna me bahut jaada expensive parser function calls hai.\n\nIske $2 {{PLURAL:$2|call|calls}} se kamti hoe ke chaahi, {{PLURAL:$1|abhi hai $1 call|abhi hai $1 calls}}.",
        "expensive-parserfunction-category": "Panna jisme bahut jaada expensive parser function calls hai",
        "post-expand-template-inclusion-warning": "'''Chetauni:''' Template include size bahut barraa hai.\nKutch templates ke include nai karaa jaai.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit se jaada hoe gais hae ($1)",
        "language-converter-depth-warning": "Bhasa anuwaad ke gahiraai ijajat se jaada hoe gais hae ($1)",
        "node-count-exceeded-category": "Panna jahaan pe node-count bahut jaada hoe gais hae",
-       "node-count-exceeded-warning": "Panna, node-count se jaada hae",
+       "node-count-exceeded-category-desc": "Panna maximum node count ke exceed kare hae.",
+       "node-count-exceeded-warning": "Panna, node count se jaada hae",
        "expansion-depth-exceeded-category": "Panna jahaan pe expansion depth ke exceed karaa gais hae",
+       "expansion-depth-exceeded-category-desc": "Panna, maximum expansion depth, se jaada hae.",
        "expansion-depth-exceeded-warning": "Panna expansion depth ke exceed karis hae",
        "parser-unstrip-loop-warning": "Unstrip loop ke pawa gai shae",
        "parser-unstrip-recursion-limit": "Unstrip recursion limit ke exceed karaa gais hae ($1)",
        "undo-success": "Ii badlao ke pahile jaise karaa jaae sake hai.\nNiche ke comparison ke check kar ke dekho ki aap yahi kare mangta rahaa, aur fir niche ke badlao ke save kar ke aapan badlao ke pahile jaise karo.",
        "undo-failure": "Ii badalo ke paile jaise nai karaa jaae sake hai kahe ki biich me badlao hai.",
        "undo-norev": "Ii badlao ke pahile jaise nai karaa jaae sake hai kahe ki ii badalo abhi nai hai nai to iske mitae dewa gais hai.",
+       "undo-nochange": "Janae hae ki badlao ke pahile delete kar dewa gais hae.",
        "undo-summary": "$1 badlao [[Special:Contributions/$2|$2]] se, ke pahile jaise karo ([[User talk:$2|Talk]])",
        "undo-summary-username-hidden": "Hidden sadasya ke badalo $1 ke pahile jaise karo",
        "cantcreateaccounttitle": "Account nai banae sakta hai",
        "cantcreateaccount-text": "Ii IP address ('''$1''') se nawaa account banae ke [[User:$3|$3]] block kar diis hai.\n\nIske kaaran, jon ki $3 diis hai, ''$2'' hai",
+       "cantcreateaccount-range-text": "Nawaa account banae ke IP addresses range '''$1''', jisme aap ke IP address ('''$4''') hae, ke[[User:$3|$3]] block kar diis hae.\n\n$3 ke kaaran hae ''$2''",
        "viewpagelogs": "Ii panna ke suchi dekho",
        "nohistory": "Ii panna ke khatir koi badlao ke itihaas nai hai.",
        "currentrev": "Abhi ke sansodhan",
        "currentrev-asof": "Abhi ke badlao ii tarik tak $1",
        "revisionasof": "$1 ke badlao",
-       "revision-info": "$2 ke badlao $1 tak",
+       "revision-info": "Badlao $1 tak {{GENDER:$6|$2}}$7 se",
        "previousrevision": "← Purana badlao",
        "nextrevision": "Nawaa badlao→",
        "currentrevisionlink": "Abhi ke badlao",
        "rev-deleted-event": "(log action ke hatae dewa gais hai)",
        "rev-deleted-user-contribs": "[Sadasya ke naam nai to IP address ke hatae dewa gais hae- yogdaan se badlao ke lukae dewa gais hae]",
        "rev-deleted-text-permission": "Panna ke ii badlao ke '''mitae''' dewa gais hae.\nIske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me saait hoi.",
+       "rev-suppressed-text-permission": "Ii panna ke badlao ke <strong>dabae</strong> dewa gais hai.\nAap iske baare me aur jaankari [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] me paawe saktaa hae.",
        "rev-deleted-text-unhide": "i panna ke badlao ke '''mitae''' dewa gais hai.\nIske baare me aur jaankari saait [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me hoi.\nAap fir bhi [$1 ii badlao ke dekhe sakta hae] agar aap aage barrhe mangtaa hae tab.",
        "rev-suppressed-text-unhide": "Ii panna ke badlao ke '''dabae''' dewa gais hai.\nIske baare me aur jaankari saait [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] me hoi.\nAap fir bhi [$1 ii badlao ke dekhe sakta hae] agar aap aage barrhe mangtaa hae tab.",
        "rev-deleted-text-view": "Panna ke ii badlao ke '''mitae''' dewa gais hae.\nAap iske dekhe sakta hai; iske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me saait hoi.",
        "revdelete-no-file": "Chuna gais file abhi nai banawa gais hai.",
        "revdelete-show-file-confirm": "Ka aap sure hai ki aap file ke mitawa gais revision ke dekhe mangtaa hai \"<nowiki>$1</nowiki>\" $2 se $3 talak?",
        "revdelete-show-file-submit": "Haan",
+       "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Chuna gais log event|Chuna gais log events}}:",
+       "revdelete-text-text": "Delete karaa gais revision panna ke itihaas me dekhai, lekin panna ke kuchh hissa janata ke nai dekhai.",
+       "revdelete-text-file": "Delete karaa gais file version file ke itihaas me dekhai, lekin file ke kuchh hissa janata ke nai dekhai.",
+       "logdelete-text": "Delete karaa gais log events log  me dekhaste rahii, lekin log ke kuchh hissa janata ke nai dekhai.",
+       "revdelete-text-others": "Duusra administrator hidden content ke access kare sake aur undelete kare sake, unless aur restrictions laabu karaa jaae.",
        "revdelete-confirm": "Meharbani kar ke aap ii confirm karo ki aap ii kare mangta hae, aap iske asar ke samajhta hae, aur iske aap [[{{MediaWiki:Policy-url}}|the policy]] ke anusar karta hae.",
-       "revdelete-suppress-text": "Suppression ke '''khaali''' ii chij ke khatir kaam me lawa jaae sake hai:\n* Aapan baare me jaankari thik nai hai\n*: ''ghar ke address aur telephone number, social security number, etc.''",
+       "revdelete-suppress-text": "Suppression ke <strong>khaali</strong> ii chij ke khatir kaam me lawa jaae sake hai:\n* potentially libelious jaankari\n* Aapan baare me jaankari thik nai hai\n*: <em>ghar ke address aur telephone number, social security number, etc.</em>",
        "revdelete-legend": "Dekhe waala rukawat set karo",
-       "revdelete-hide-text": "Badlawa gais text ke lukao",
+       "revdelete-hide-text": "Badlawa gais text",
        "revdelete-hide-image": "File content ke lukao",
-       "revdelete-hide-name": "Kaam aur manjil ke lukao",
-       "revdelete-hide-comment": "Badlao ke baare me comment ke lukao",
-       "revdelete-hide-user": "Editor's username/IP ke lukao",
+       "revdelete-hide-name": "Target aur parameters ke lukao",
+       "revdelete-hide-comment": "Summary ke badlo",
+       "revdelete-hide-user": "Editor ke username/IP address",
        "revdelete-hide-restricted": "Ii rukawat ke administrator aur duusra log se lukao.",
        "revdelete-radio-same": "(badlo nai)",
-       "revdelete-radio-set": "Haan",
-       "revdelete-radio-unset": "Nai",
+       "revdelete-radio-set": "Lukaawal",
+       "revdelete-radio-unset": "Dekhae hae",
        "revdelete-suppress": "Sysops ke saathe saathe aur sab se data ke suppress karo",
        "revdelete-unsuppress": "Pahile jaise karaa gais badlao me se rukawat hatao",
        "revdelete-log": "Kaaran:",
        "mergehistory-empty": "Koi badlao ke jorraa nai jaae sake hai.",
        "mergehistory-success": "[[:$1]]ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
        "mergehistory-fail": "Itihaas ke nai jorre paaya hae, meharbaani kar ke panna aur time parameters ke check karo.",
+       "mergehistory-fail-toobig": "History merge nai hoe sake, kaaheki limit of $1 {{PLURAL:$1|revision|revisions}} se jaada move hoe jaai.",
        "mergehistory-no-source": "Source panna $1 nai hai.",
        "mergehistory-no-destination": "Destination panna $1 nai hai.",
        "mergehistory-invalid-source": "Suruu waala panna ke must sahi naam hoe ke chaahi.",
        "showhideselectedversions": "Chuna gae versions ke dekhao/lukao",
        "editundo": "Pahile jaise kar do",
        "diff-empty": "(ek rakam)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} same sadasya se nai dekhawa gais hae.",
+       "diff-multi-otherusers": "({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} ke  nai dekhawa jae hai)",
        "diff-multi-manyusers": "({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} se jaada log karin hae, ke  nai dekhawa jae hai.)",
        "difference-missing-revision": "Ii badlao ($1) {{PLURAL:$2|was|were}} pe {{PLURAL:$2|One revision|$2 revisions}} nai pawa gais hae\nIske kaaran ii hoe sake hae ki ek mitawa gais panna se link karaa jaawe hae.\nIske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me paawa jaae sake hae.",
        "searchresults": "Khoj ke natija",
        "shown-title": "Ek panna me $1 {{PLURAL:$1|result|results}} dekhao",
        "viewprevnext": "Dekho ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Ii wiki me \"[[$1]]\" naam ke panna hai'''",
-       "searchmenu-new": "'''Ii wiki me \"[[:$1]]\" panna ke banao!'''",
+       "searchmenu-new": "<strong>Ii wiki me \"[[:$1]]\" panna ke banao!</strong>{{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
        "searchprofile-articles": "Content panna",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Sab chij",
        "search-result-category-size": " {{PLURAL:$1|1 sadasya|$1 sadasya}} ({{PLURAL:$2|1 chhota vibhag|$2 chhota vibhag}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(section $1)",
+       "search-category": "(category $1)",
+       "search-file-match": "(file content ke match kare hae)",
        "search-suggest": "Ka aap ke matlab rahaa: $1",
        "search-interwiki-caption": "Saathe ke project",
        "search-interwiki-default": "$1 ke result:",
        "searchrelated": "sambhand rakkhe hai",
        "searchall": "sab",
        "showingresults": "Niche dekhae hai {{PLURAL:$1|'''1''' result|'''$1''' results}} #'''$2''' se suruu hoe ke.",
+       "showingresultsinrange": "Niche dekhae hai {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} #<strong>$2</strong> se suruu hoe ke #<strong>$3</strong> talak.",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "Ii sawaal ke koi jawab nai hae.",
        "powersearch-legend": "Gahira khoj",
        "powersearch-ns": "Namespaces me khojo:",
        "powersearch-togglelabel": "Check karo:",
        "powersearch-toggleall": "Sab",
        "powersearch-togglenone": "Koi bhi nai",
+       "powersearch-remember": "Aage ke khoj ke khatir selection ke yaad karo",
        "search-external": "Bahaari khoj",
        "searchdisabled": "{{SITENAME}} me abhi khoje ke anumati nai hai.\nAap tab tak Google se khoje sakta hai.\nYaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.",
        "search-error": "Khoje ke tim ek error hoe gais hae:$1",
        "preferences": "Pasand",
        "mypreferences": "Pasand",
        "prefs-edits": "Badlao ke number:",
+       "prefsnologintext2": "Aapan preferences ke badle ke khatir login ho.",
        "prefs-skin": "Skin",
        "skin-preview": "Jhalak",
        "datedefault": "Koi pasand nai",
        "gender-unknown": "Ham bole nai mangtaa hae",
        "gender-male": "Uu wiki panna ke badle hae",
        "gender-female": "Uu wiki panna ke badle hae",
-       "prefs-help-gender": "Optional: used for gender-correct addressing by the software. This information will be public.",
+       "prefs-help-gender": "Ii preference ke set karna optional hae.\nSoftware aapan value ke use kar ke aap ke address kare hae aur aap ke ke bare me duusre ke batae hae, right grammar use kar ke\nIi jaankari janata ke dekhai.",
        "email": "E-mail",
        "prefs-help-realname": "Asli naam ke jaruri nai hai lekin agar jo aap aapan naam diya hai to iske aap ke kaam ke pahachane khatir kaam me lawa jai.",
        "prefs-help-email": "E-mail address ke jaruri nai hai, lekin isse nawaa password aap ke lage bheja jaae sake hai agar aap aapan password bhul gaya tab.",
        "prefs-tokenwatchlist": "Chinh (token)",
        "prefs-diffs": "Farka",
        "prefs-help-prefershttps": "Aap ke agla login pe ii preferences effect me aai.",
+       "prefswarning-warning": "Aap aapan preferences ke badla hae, jiske abhi talak save nai karaa gae hae.\nAgar aap ii panna ke bina \"$1\" me click kare chhorra, tab aap ke preferences save nai hoi.",
+       "prefs-tabs-navigation-hint": "Tip: Aap left aur right arrow key use kar ke tab list me navigate kare saktaa hae.",
        "email-address-validity-valid": "E-mail address kanuni hae",
        "email-address-validity-invalid": "Ek kanuni e-mail ke likho",
        "userrights": "Sadasya ke adhikaar ke chalao",
        "userrights-no-interwiki": "Aap ke duusra wiki me user rights ke badle ke adhikaar nai hai.",
        "userrights-nodatabase": "Database $1 abhi hai nai, nai to local nai hai.",
        "userrights-nologin": "Sadasya ke user rights de ke khatir, ap ke chaahi ki aap [[Special:UserLogin|log in]] karo ek administrator ke account se.",
-       "userrights-notallowed": "Aap ke account ke user rights de aur hatae ke adhikar nai hai.",
+       "userrights-notallowed": "Aap ke lage user rights de aur hatae ke adhikar nai hae.",
        "userrights-changeable-col": "Groups jiske aap badle sakta hai",
        "userrights-unchangeable-col": "Groups jiske aap badle nai sakta hai",
-       "userrights-conflict": "User right me conflict hae. Meharbaani kar ke aapan balao ke fir se apply karo.",
+       "userrights-conflict": "User right me conflict hae! Meharbaani kar ke aapan badlao ke fir se review aur confirm karo.",
        "userrights-removed-self": "App appan ijaajat ke hatae dia hae. Iske natija ii hoi ki app ii panna ke ab nai access kare sakegaa",
        "group": "Jhund:",
        "group-user": "Sadasya",
        "right-move": "Panna ke naam badlo",
        "right-move-subpages": "Panna aur uske subpanna ke naam badlo",
        "right-move-rootuserpages": "Root sadasya ke panna ke naam badlo",
+       "right-move-categorypages": "Category panna ke hatao",
        "right-movefile": "File ke naam badlo",
        "right-suppressredirect": "Panna ke naam badalte ke time, purana naam se redirect ke nai banao.",
        "right-upload": "File ke upload karo",
        "right-deletedtext": "Mitawa gais text aur mitawa gais badlao ke biich waala badlao ke dekho",
        "right-browsearchive": "Mitawa gais panna ke khojo",
        "right-undelete": "Ek panna ke undelete karo",
-       "right-suppressrevision": "Review and restore revisions hidden from Sysops",
+       "right-suppressrevision": "Koi bhi sadasya ke koi bhi panna ke khaas badlao ke dekho, lukao aur dekhao",
+       "right-viewsuppressed": "Uu badlao ke dekho jon ki koi sadasya ke nai dekhae hae",
        "right-suppressionlog": "Private logs ke dekho",
        "right-block": "Duusra sadasya ke badle se roko",
        "right-blockemail": "Sadasya ke email bheje se roko",
        "right-protect": "Protection level ke badlo aur cascade-protected panna ke badlo",
        "right-editprotected": "Badla gais panna ke \"{{int:protect-level-sysop}}\" ke rakam bachawa gais hae",
        "right-editsemiprotected": "Badla gais panna ke \"{{int:protect-level-autoconfirmed}}\" ke rakam bachawa gais hae",
+       "right-editcontentmodel": "Panna ke content model ke badlo",
        "right-editinterface": "User interface ke badlo",
        "right-editusercssjs": "Duusra sadsya ke CSS aur JS files ke badlo",
        "right-editusercss": "Duusra sadsya ke CSS files ke badlo",
        "action-createpage": "panna banao",
        "action-createtalk": "salah waala panna banao",
        "action-createaccount": "ii user account ke banao",
+       "action-history": "ii panna ke itihass ke dekho",
        "action-minoredit": "ii badlao ke chhota mark karo",
        "action-move": "ii panna ke naam badlo",
        "action-move-subpages": "ii panna, aur iske subpanna ke naam badal do",
        "action-move-rootuserpages": "root sadasya panna ke naam badlo",
+       "action-move-categorypages": "Category panna ke hatao.",
        "action-movefile": "ii file ke naam badlo",
        "action-upload": "ii file ke upload karo",
        "action-reupload": "ii file ke uppar se likh do",
        "action-block": "ii sadasya ke panna badle se roko",
        "action-protect": "ii panna ke protection levels ke badlo",
        "action-rollback": "jaldi se pichhla sadasya, jon ki koi panna ke badlis rahaa, ke badlao ke pahile jaise kar do",
-       "action-import": "duusra wiki me se ii panna ke import karo",
-       "action-importupload": "ek file upload se ii panna ke import karo",
+       "action-import": "duusra wiki me se panna ke import karo",
+       "action-importupload": "ek file upload se panna ke import karo",
        "action-patrol": "duusra jan ke badlao pe pahraa do",
        "action-autopatrol": "aapan badlao pe pahraa do",
        "action-unwatchedpages": "unwatched panna ke suchi dekho",
        "action-viewmywatchlist": "Aapan dhyan suchi ke dekho",
        "action-viewmyprivateinfo": "Aapan private jaankari ke dekho",
        "action-editmyprivateinfo": "Aapan private jaankari ke badlo",
+       "action-editcontentmodel": "ek panna ke content model ke badlo",
        "nchanges": "$1 {{PLURAL:$1|badlao|badlao}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|last time dekhe ke baad}}",
+       "enhancedrc-history": "itihaas",
        "recentchanges": "Nawaa badlao",
        "recentchanges-legend": "Nawaa badlao options",
        "recentchanges-summary": "Wiki me ii panna ke nawaa badlao pe dhyan rakho.",
        "recentchanges-label-minor": "Ii ek chhota badlao hae",
        "recentchanges-label-bot": "Ii badlao ke ek bot karis hae",
        "recentchanges-label-unpatrolled": "Ii badlao pe abhi pahraa nai dewa gais hae.",
-       "recentchanges-legend-newpage": "$1 - nawaa panna",
-       "rcnotefrom": "Niche '''$2''' se badlao hai ('''$1''' tak )",
+       "recentchanges-label-plusminus": "Panna ke size etna bytes se badla",
+       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (aur dekho [[Special:NewPages|nawaa panna ke suchi]])",
+       "rcnotefrom": "Niche {{PLURAL:$5|badlao hae|badlao hae}} <strong>$3, $4</strong> (<strong>$1</strong> talak dekhawa gais) talak.",
        "rclistfrom": "$3 $2 se suruu kar ke nawaa badlao dekhao",
        "rcshowhideminor": "$1 chhota badlao",
+       "rcshowhideminor-show": "Dekhao",
+       "rcshowhideminor-hide": "Lukao",
        "rcshowhidebots": "$1 bots",
-       "rcshowhideliu": "$1 logged-in sadasya",
+       "rcshowhidebots-show": "Dekhao",
+       "rcshowhidebots-hide": "Lukao",
+       "rcshowhideliu": "$1 registered sadasya",
+       "rcshowhideliu-show": "Dekhao",
+       "rcshowhideliu-hide": "Lukao",
        "rcshowhideanons": "$1 bina naam ke sadasya",
+       "rcshowhideanons-show": "Dekhao",
+       "rcshowhideanons-hide": "Lukao",
        "rcshowhidepatr": "$1 pahra dewa gae sampadan",
+       "rcshowhidepatr-show": "Dekhao",
+       "rcshowhidepatr-hide": "Lukao",
        "rcshowhidemine": "$1 hamaar sampadan",
+       "rcshowhidemine-show": "Dekhao",
+       "rcshowhidemine-hide": "Lukao",
        "rclinks": "Pichhla $1 badlao pichle $2 din me dekhao <br />$3",
        "diff": "farka",
        "hist": "itihaas",
        "rc_categories_any": "Koi bhi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} badlao ke baad",
        "newsectionsummary": "/* $1 */ nawaa vibhag",
-       "rc-enhanced-expand": "Details dekhao (JavaScript jaruri hai)",
+       "rc-enhanced-expand": "Details dekhao",
        "rc-enhanced-hide": "Details ke lukao",
        "rc-old-title": "Sab se pahile \"$1\" ke naam ke niche banawa gais rahaa",
        "recentchangeslinked": "Panna ke jurraa badlao",
        "uploaderror": "Upload nai hoe paais hai",
        "upload-recreate-warning": "\"'Chetauni: Ii naam ke file ke mitae dewa gais rahaa, nai to naam badla gais rahaa.\"'\nHian pe mitae waala suchi aur naam badle waala suchi ke aap ke dekhe ke khatir dewa gais hae:",
        "uploadtext": "Niche waala form ke use kar ke file upload karo.\nPahile upload karaa file ke dekhe khatir [[Special:FileList|list of uploaded files]] jao, (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
-       "upload-permitted": "File types jiske ijajat hai: $1.",
-       "upload-preferred": "Kon rakam ke file ke mangtaa hai: $1.",
-       "upload-prohibited": "Ii rakam ke file ke upload nai karaa jaae sake hai: $1.",
+       "upload-permitted": "Permitted file {{PLURAL:$2|type|types}}: $1.",
+       "upload-preferred": "Preferred file {{PLURAL:$2|type|types}}: $1.",
+       "upload-prohibited": "Prohibited file {{PLURAL:$2|type|types}}: $1.",
        "uploadlogpage": "Suchi ke upload karo",
        "uploadlogpagetext": "Niche ke list me haali ke uplaod karaa gae file ke suchi hai.\nVisual overview ke khatir [[Special:NewFiles|nawaa file ke gallery]] ke dekho.",
        "filename": "Filename",
        "largefileserver": "Ii file, jetna ki server allow kare hai, se barraa hai.",
        "emptyfile": "Jon file aap upload karaa rahaa uu khaali rahaa.\nIi saait file ke naam likhe me typing mistake ke kaaran hoi.\nMeharbaani kar ke ii dekho ki aap such me ii file upload kare mangtaa hai ki nai.",
        "windows-nonascii-filename": "Ii wiki me password jisme special characters hae, ke kaam me nai lawa jaae sake hae.",
-       "fileexists": "Ii naam ke file abhi hai, meharbani kar ke check karo <strong>[[:$1]]</strong> agar jo aap sure nai hai ki aap iske badle mangta hai.\n[[$1|thumb]]",
+       "fileexists": "Ii naam ke file abhi hai, meharbani kar ke check karo <strong>[[:$1]]</strong> agar jo {{GENDER:|aap}} sure nai hai ki aap iske badle mangta hai.\n[[$1|thumb]]",
        "filepageexists": "Ii file ke description ke <strong>[[:$1]]</strong> me banae dewa gais rahaa, lekin ii naam ke koi file abhi nai hai.\nAap jon summary likhtaa hai uu panna ke description me nai dekhai.\nDescription ke dekhae ke khatir, aap ke iske manually badle ke parri.\n[[$1|thumb]]",
-       "fileexists-extension": "Ii rakam ke naam ke ek aur file hai: [[$2|thumb]]\n* Uploading file ke naam: <strong>[[:$1]]</strong>\n* Abhi ke file ke naam: <strong>[[:$2]]</strong>\nMeharbani kar ke duusra naam chuno.",
+       "fileexists-extension": "Ii rakam ke naam ke ek aur file hai: [[$2|thumb]]\n* Uploading file ke naam: <strong>[[:$1]]</strong>\n* Abhi ke file ke naam: <strong>[[:$2]]</strong>\nKa app aur jaada distinctive naam use kare mangtaa hae?",
        "fileexists-thumbnail-yes": "Ii janawe hai ki ii file ek chhota chapa hai ''(thumbnail)''. [[$1|thumb]]\nMeharbani kar ke file ke check karo <strong>[[:$1]]</strong>.\nAgar jo check karaa gais file wahi chhapa ke original size hai tab ek aur thumbnail ke upload kare ke jaruri nai hai.",
        "file-thumbnail-no": "File ke naam <strong>$1</strong> se suruu hoe hai.\nIi janawe hai ki ii chhota size ke chapa hai ''(thumbnail)''.\nAgar jo aap ke lage ii chapa full resolution me hai tab uske upload karna, nai to file ke naam badlo.",
        "fileexists-forbidden": "Ii naam ke file abhi hai, aur iske badlawa nai jaae sake hai.\nAgar jo aap fir bhi aapan file ke upload kare mangta hai, tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ii naam ke file abhi shared file repository me hai.\nAgar jo aap fir bhi aapan file upload kare manta hai tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ii file following file ke duplicate hai {{PLURAL:$1|file|files}}:",
        "file-deleted-duplicate": "Yahii rakam ke ek aur file ([[:$1]]) ke pahile delete karaa gais hai. Aap ke file ke deletion history ke check kare ke chaahi, upload kare se pahile.",
+       "file-deleted-duplicate-notitle": "Ii rakam ke ek file ke pahile delete karaa gais rahaa, aur iske title ke suppress karaa gais hae. Aap ke aisan koi jan, jiske lake suppressed data dekhe ke adhikar har, se situation ke review karae ke baad file ke upload kare ke chaahi.",
        "uploadwarning": "Upload ke baare me chetauni",
        "uploadwarning-text": "Meharbani kar ke file ke baaare me aur jankari ke niche badal ke aur fir se kosis karo.",
        "savefile": "File ke save karo",
        "uploaddisabledtext": "File uploads ke disable kar dewa gais hai.",
        "php-uploaddisabledtext": "File uploads ke PHP me disable kar dewa gais hai. Meharbani kar ke file_uploads setting ke check karo.",
        "uploadscripted": "Ii file me HTML nai to script code hai jiske web browser erroneously interpret kare sake hai.",
+       "uploadscriptednamespace": "Ii SVG file me illegal namespace \"$1\" 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.",
        "upload-source": "Suruu waala file",
        "license": "Licence ke baare me:",
        "license-header": "Licence ke baare me",
        "nolicense": "Koi bhi selct nai karaa gais hai",
+       "licenses-edit": "License options ke badlo",
        "license-nopreview": "(Preview abhi taiyaar nai hai)",
-       "upload_source_url": " (ek valid, publicly accessible URL)",
-       "upload_source_file": " (aap ke computer me ek file)",
-       "listfiles-summary": "Ii khaas panna sab uploaded file ke dekhae hai.\nJab sadasya filter kare hae, tab sadasys ke upload karaa gais sab se nawaa file ke version ke dekhawa jaae hae.",
+       "upload_source_url": "(aap ke choose karaa gais file ek valid, publicly accessible URL se)",
+       "upload_source_file": "(aap ke computer me ke aap ke choose karaa gais file)",
+       "listfiles-delete": "mitao",
+       "listfiles-summary": "Ii khaas panna sab uploaded file ke dekhae hai.",
        "listfiles_search_for": "Media ke naam khojo:",
        "imgfile": "file",
        "listfiles": "Chapa ke suchi",
        "listfiles_size": "Naap",
        "listfiles_description": "Baare me",
        "listfiles_count": "Ketna badlao rahaa",
+       "listfiles-show-all": "Chaapa ke purana version ke include karo",
+       "listfiles-latestversion": "Abhi ke version",
+       "listfiles-latestversion-yes": "Haan",
+       "listfiles-latestversion-no": "Nai",
        "file-anchor-link": "File",
        "filehist": "File ke itihaas",
        "filehist-help": "File ke dekhe khatir, jaise uu time dekhe me lagat rahaa, date/time pe click karo.",
        "filedelete-maintenance": "Files jiske ke thora din khatir, maintenance ke time, band kar dewa gais rahaa ke mitawa aur fir se pahile jaise karaa jaawe hae.",
        "filedelete-maintenance-title": "File ke mitae nai saktaa hae",
        "mimesearch": "MIME khojo",
-       "mimesearch-summary": "Ii panna filtering of files for its MIME-type ke enable kare hai.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ii panna filtering of files for its MIME-type ke enable kare hai.\nInput: contenttype/subtype nai to or contenttype/*, e.g. <code>image/jpeg</code>.",
        "mimetype": "MIME ke rakam:",
        "download": "download karo",
        "unwatchedpages": "Panna jispe dhyan nai rakha gais hai",
        "listredirects": "Redirects list karo",
+       "listduplicatedfiles": "File jiske duplicate hae ke suchi",
+       "listduplicatedfiles-summary": "Ii uu file ke suchi hae jisme file ke most recent version duusra file ke duplicate hae. Isme khaali local file ke dekha gais hae.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]] hae.",
        "unusedtemplates": "Bina use bhae templates",
        "unusedtemplatestext": "Ii panna {{ns:template}} namespace me uu panna ake suchi de hai jon ki koi duusra panna me nai hai.\nTemplates ke delete kare se pahile duusra links ke bhi check kare ke nai bhulna.",
        "unusedtemplateswlh": "duusra jorr",
        "randompage": "Koi bhi panna",
        "randompage-nopages": "Ii {{PLURAL:$2|namespace|namespaces}} me koi panna nai hae:  $1",
+       "randomincategory": "Category me random panna",
+       "randomincategory-invalidcategory": "\"$1\" ek valid category naam nai hae.",
+       "randomincategory-nopages": "[[:Category:$1|$1]] category me koi panna nai hae.",
+       "randomincategory-category": "Vibhag:",
+       "randomincategory-legend": "Category me random panna",
        "randomredirect": "Koi bhi jagha redirect karo",
        "randomredirect-nopages": "Namespace \"$1\" me koi redirects nai hai.",
        "statistics": "Aankrra",
        "pageswithprop-text": "Ii panaa, uu panna ke list kare hae jon ki koi khaas panna ke property ke use kare hae.",
        "pageswithprop-prop": "Property ke naam:",
        "pageswithprop-submit": "Jaao",
-       "pageswithprop-prophidden-long": "lamba text property value hidden ($1 kilobytes)",
-       "pageswithprop-prophidden-binary": "binary property ke hidden value ($1 kilobytes)",
+       "pageswithprop-prophidden-long": "lamba text property value hidden ($1)",
+       "pageswithprop-prophidden-binary": "binary property ke lukawal value ($1)",
        "doubleredirects": "Dugna redirects",
        "doubleredirectstext": "Ii panna uu panna ke suchi de hai jon ki duusra redirect panna pe redirect kare hai.\nSab row me pahila aur duusra redirect ke jorr hae, aur isme duusra redirect ke nisana bhi hae, jon ki jaada kar ke \"aslii\" nisana waala panna, jon ki pahila redirect ke dekhae hae.\n<del>Mitawa gais</del> entires ke solve kar dewa gais hae.",
-       "double-redirect-fixed-move": "[[$1]] ke naam badal dewa gais hai, ab ii [[$2]] pe redirect kare hai",
+       "double-redirect-fixed-move": "[[$1]] ke naam badal dewa gais hai.\nIske automatically update karaa gais hae aur ab ii [[$2]] pe redirect kare hae.",
        "double-redirect-fixed-maintenance": "[[$1]] se [[$2]] ke double redirect ke sudhartaa hae.",
        "double-redirect-fixer": "Redirect ke banae waala",
        "brokenredirects": "Tuuta redirects",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
        "nlinks": "$1 {{PLURAL:$1|jorr|jorr}}",
        "nmembers": "$1 {{PLURAL:$1|sadasya|sadasya}}",
+       "nmemberschanged": "$1 → $2{{PLURAL:$2|sadasya|sadasya}}",
        "nrevisions": "$1 {{PLURAL:$1|badlao|badlao}}",
        "nviews": "$1 {{PLURAL:$1|dafe dekha gais hai|dafe dekha gais hai}}",
        "nimagelinks": "$1 {{PLURAL:$1|panna|panna}} me kaam me lawa gais hae",
        "wantedpages-badtitle": "Result set me kharaa title hai: $1",
        "wantedfiles": "Maange waala files",
        "wantedfiletext-cat": "Niche likha gais file ke kaam me lawa gais hae lekin ii Wikipedia me nai hae. Ii Wikipedia me file rahe par bhi foreign repositories ke file ke list karaa jaae sake hae. Aisan koi galat positives ke <del>mitae dewa jaai</del>. Aur, uu panna jon ki non-existent files ke embed kare hae ke [[:$1]] me list karaa gais hae.",
+       "wantedfiletext-cat-noforeign": "Ii sab file ke use karaa gais hae lekin exist nai hoe hae. Aur, panna jisme waisan file embed karaa gais hae jon ki exist nai hoe hae ke suchi [[:$1]] me hae.",
        "wantedfiletext-nocat": "Niche likha gais file ke kaam me lawa gais hae lekin ii Wikipedia me nai hae. Ii Wikipedia me file rahe par bhi foreign repositories ke file ke list karaa jaae sake hae. Aisan koi galat positives ke <del>mitae dewa jaai</del>.",
+       "wantedfiletext-nocat-noforeign": "Ii sab file ke use karaa gais hae lekin exist nai hae hae.",
        "wantedtemplates": "Maange waala templates",
        "mostlinked": "Jon panna me sab se jaada chij jorra hai",
        "mostlinkedcategories": "Jon vibhag me sab se jaada chij jorra hai",
-       "mostlinkedtemplates": "Jon template me sab se jaada fike jorra hai",
+       "mostlinkedtemplates": "Sab se jaada transcluded panna",
        "mostcategories": "Sab se jaada vibhag waala panna",
        "mostimages": "Jon file me sab se jaada file jorra hai",
        "mostinterwikis": "Panna jisme sab se dher interwikis hae",
        "deadendpagestext": "Niche ke panna {{SITENAME}} ke koi bhi panna se nai jurre hai.",
        "protectedpages": "Surakchhit panna",
        "protectedpages-indef": "Khaali indefinite bachao",
+       "protectedpages-summary": "Ii panna me uu panna ke suchi hae jon ki abhi protected hae. Uu title ke suchi jon ki creation se protected hae ke dekhe ke khatir [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] ke dekho.",
        "protectedpages-cascade": "Khaali cascading bachao",
+       "protectedpages-noredirect": "Redirects lukao",
        "protectedpagesempty": "Ii parameters se koi bhi panna ke nai bachawa gais hai.",
+       "protectedpages-timestamp": "Timestamp",
+       "protectedpages-page": "Panna",
+       "protectedpages-expiry": "Khalaas hoe hae",
+       "protectedpages-performer": "Sadasya ke bachawa jaae hae",
+       "protectedpages-params": "Protection parameters",
+       "protectedpages-reason": "Kaaran",
+       "protectedpages-unknown-timestamp": "Nai maluum",
+       "protectedpages-unknown-performer": "Unknown sadasya",
        "protectedtitles": "Bachawa gais titles",
+       "protectedtitles-summary": "Ii panna uu title ke list kare hae jon ki creation se protected hae. Protected panna ke suchi dekhe ke khatir \n[[{{#special:ProtectedPages}}|{{int:protectedpages}}]] ke dekho.",
        "protectedtitlesempty": "Ii parameters se koi bhi title ke nai bacawa gais hai.",
        "listusers": "Sadasya ke suchi",
        "listusers-editsonly": "Khaali uu sadasya ke dekhao jon ki koi badlao karis hai",
        "listusers-creationsort": "Banawa gais tarik se sort karo",
+       "listusers-desc": "Descending order me sort karo",
        "usereditcount": "$1 {{PLURAL:$1|badlao|badlao}}",
        "usercreated": "{{GENDER:$3|Banawa gais hae}}  $1 pe $2 me",
        "newpages": "Nawaa panna",
        "pager-older-n": "{{PLURAL:$1|purana 1|purana $1}}",
        "suppress": "Oversight",
        "querypage-disabled": "Ii khaas panna ke performance kaaran se disable kar drwa gais hae.",
+       "apihelp": "API madat",
+       "apihelp-no-such-module": "Module \"$1\" ke paawa nai gais hae.",
        "booksources": "Pustak sources",
        "booksources-search-legend": "Book sources ke khojo",
+       "booksources-search": "Khojo",
        "booksources-text": "Niche ke suchi me uu websites ke jorr hai jon ki nawaa aur use karaa gais book ke beche hai aur jon book ke aap khojtaa hai uske baare aur jaankari de sake hai:",
        "booksources-invalid-isbn": "Dewa gais ISBN thiik nai hai; iske purana jagha se copy kare ke time ke error ke check karo.",
        "specialloguserlabel": "Sadasya:",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|group|groups}} ke aapan account se hatae saktaa hai: $1",
        "listgrouprights-addgroup-self-all": "Sab group ke aapan account me jorre saktaa hai",
        "listgrouprights-removegroup-self-all": "Sab group ke aapan account se hatae saktaa hai",
+       "listgrouprights-namespaceprotection-header": "Namespace restrictions",
+       "listgrouprights-namespaceprotection-namespace": "Namespace:",
+       "listgrouprights-namespaceprotection-restrictedto": "Adhikar jon ki sadasya ke badlao kare de hae.",
        "mailnologin": "Koi bheje waala address nai hai",
        "mailnologintext": "Duusra logan ke lage e-mail bheje ke khatir aap ke [[Special:UserLogin|logged in]] aur [[Special:Preferences|preferences]]  me thik e-mail hoew ke chaahi.",
        "emailuser": "Ii user ke E-mail karo",
        "mywatchlist": "Dhyaan suchi",
        "watchlistfor2": "$1 $2 ke khatir",
        "nowatchlist": "Aap ke dhyan suchi me koi chij nai hai.",
-       "watchlistanontext": "Aapan dhyan suchi me ke dekhe nai to badle ke khatir meharbani kar ke $1 karo.",
+       "watchlistanontext": "Aapan dhyan suchi me ke dekhe nai to badle ke khatir meharbani kar ke log in karo.",
        "watchnologin": "Logged in nai hai",
        "addwatch": "Dhyan suchi me jorro",
        "addedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|watchlist]] me jorr dewa gais hae.\nIi panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.",
        "delete-toobig": "Ii panna ke barraa balao ke itihass hai, $1 se jaada {{PLURAL:$1|revision|revisions}}.\nAisan panna ke mitae pe rok lagawa gais hai so that accidental disruption of {{SITENAME}} ke roka jaae sake hai.",
        "delete-warning-toobig": "Ii panna ke lambaa badlao ke itihaas hai, $1 {{PLURAL:$1|revision|revisions}} se jaada.\nIske mitae se {{SITENAME}} me database operations me baadha parri;\nsawadhani se aage barrho.",
        "rollback": "Pahile jaise kare waala badlao",
-       "rollback_short": "Pahile jaise karo",
        "rollbacklink": "pahile jaise karo",
        "rollbacklinkcount": "$1 {{PLURAL:$1|edit|edits}} ke rollback karo",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|edit|edits}} se jaada badlao ke rollback karo",
        "import-logentry-interwiki": "transwikied $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|badlao|badlao}} $2 se",
        "javascripttest": "JavaScript ke testing",
-       "javascripttest-title": "$1 tests ke chaalu karaa jaae hae",
        "javascripttest-pagetext-noframework": "Ii panna ke JavaScript test ke kare ke khatir reserve karaa gais hae.",
        "javascripttest-pagetext-unknownframework": "Anjaan testing framework \"$1\".",
        "javascripttest-pagetext-frameworks": "Meharbaani kar ke ek testing framework ke chuno: $1",
        "javascripttest-pagetext-skins": "Test kare ke khatir ek chamrraa ke chuno:",
        "javascripttest-qunit-intro": "mediawiki.org me [$1 testing documentation] ke dekho.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
        "tooltip-pt-userpage": "Aap ke sadasya panna",
        "tooltip-pt-anonuserpage": "IP jisme se aap edit karta hai ke sadasya panna",
        "tooltip-pt-mytalk": "Aap ke baat waala panna",
index 8564527..0741423 100644 (file)
        "viewsourceold": "vidi izvor",
        "editlink": "uredi",
        "viewsourcelink": "vidi izvornik",
-       "editsectionhint": "Uređivanje odlomka: $1",
+       "editsectionhint": "Uredi odlomak $1",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(odlomak $1)",
+       "search-category": "(kategorija $1)",
        "search-suggest": "Mislili ste: $1",
        "search-interwiki-caption": "Sestrinski projekti",
        "search-interwiki-default": "$1 rezultati:",
        "powersearch-remember": "Zapamti izbor za buduća pretraživanja",
        "search-external": "Vanjski pretraživač",
        "searchdisabled": "<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutačno onemogućena. Možete se poslužiti tražilicom Google.</p>",
+       "search-error": "Greška prilikom pretrage: $1",
        "preferences": "Postavke",
        "mypreferences": "Moje postavke",
        "prefs-edits": "Broj uređivanja:",
        "fileexists-extension": "Već postoji datoteka sa sličnim imenom: [[$2|thumb]]\n* Ime datoteke koju postavljate: <strong>[[:$1]]</strong>\n* Ime postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo da izaberete drugo ime.",
        "fileexists-thumbnail-yes": "Datoteka je najvjerojatnije slika u smanjenoj veličini ''(thumbnail)''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nUkoliko je ta datoteka ista kao i ova koju ste upravo pokušali snimiti, samo u višoj rezoluciji, nije nužno snimanje smanjenje slike ''(thumbnaila)'', prikazivanje smanjene slike iz izvornika radi se softverski.",
        "file-thumbnail-no": "Ime datoteke počinje s <strong>$1</strong>.\nČini se da je to slika smanjene veličine ''(minijatura)''.\nUkoliko imate ovu sliku u punoj razlučljivosti (rezoluciji) postavite tu sliku, u protivnom, molimo promijenite ime datoteke.",
-       "fileexists-forbidden": "Datoteka s ovim imenom već postoji i nemože biti presnimljena.\nAko i dalje želite postaviti svoju datoteku, molimo vratite se i odaberite novo ime. [[File:$1|thumb|center|$1]]",
+       "fileexists-forbidden": "Datoteka s ovim imenom već postoji i ne može biti presnimljena.\nAko i dalje želite postaviti svoju datoteku, molimo vratite se i odaberite novo ime. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Datoteka s ovim imenom već postoji u središnjem poslužitelju datoteka.\nAko još uvijek želite postaviti svoju datoteku, idite nazad i postavite ju pod drugim imenom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ova datoteka je duplikat {{PLURAL:$1|sljedeće datoteke|sljedećih datoteka}}:",
        "file-deleted-duplicate": "Datoteka istovjetna ovoj datoteci ([[:$1]]) prethodno je obrisana. Provjerite evidenciju brisanja za tu datoteke datoteku prije nego što nastavite s ponovnim postavljanjem.",
        "duplicatesoffile": "{{PLURAL:$1|Sljedeća datoteka je kopija|$1 sljedeće datoteke su kopije|$1 sljedećih datoteka su kopije}} ove datoteke ([[Special:FileDuplicateSearch/$2|više detalja]]):",
        "sharedupload": "Ova je datoteka postavljena na $1 i mogu je koristiti ostali projekti.",
        "sharedupload-desc-there": "Ova datoteka je s projekta $1 i mogu je koristiti drugi projekti. Pogledajte [$2 stranicu s opisom datoteke] za dodatne informacije.",
-       "sharedupload-desc-here": "Ova datoteka je sa $1 i mogu je koristiti drugi projekti. Opis s njezine [$2 stranice s opisom datoteke] prikazan je ispod.",
+       "sharedupload-desc-here": "Ova datoteka je s projekta $1 i mogu je koristiti drugi projekti. Opis s njezine [$2 stranice s opisom datoteke] prikazan je ispod.",
        "sharedupload-desc-edit": "Ova datoteka nalazi se na $1 i može se rabiti na drugim projektima.\nNjen opis možete urediti na [$2 stranici opisa datoteke].",
        "sharedupload-desc-create": "Ova datoteka nalazi se na $1 i može se rabiti na drugim projektima.\nMožda želite urediti njen opis na [$2 stranici opisa datoteke].",
        "filepage-nofile": "Ne postoji datoteka s ovim imenom.",
        "listusers": "Popis suradnika",
        "listusers-editsonly": "Pokaži samo suradnike s uređivanjem",
        "listusers-creationsort": "Razvrstaj po datumu stvaranja",
+       "listusers-desc": "Sortiraj obrnutim redoslijedom",
        "usereditcount": "$1 {{PLURAL:$1|uređivanje|uređivanja|uređivanja}}",
        "usercreated": "{{GENDER:$3|Otvorio|Otvorila}} račun $1 u $2",
        "newpages": "Nove stranice",
        "emailccsubject": "Kopija Vaše poruke suradniku $1: $2",
        "emailsent": "E-mail poslan",
        "emailsenttext": "Vaša poruka je poslana.",
-       "emailuserfooter": "Ovaj e-mail je poslan od $1 za $2 korištenjem \"elektroničke pošte\" s projekta {{SITENAME}}.",
+       "emailuserfooter": "Ova je poruka poslana od $1 za $2 uporabom \"elektroničke pošte\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje poruke sustava.",
        "usermessage-editor": "Uređivač sistemskih poruka",
        "watchlist": "Moj popis praćenja",
        "delete-warning-toobig": "Ova stranica ima veliku povijest uređivanja, preko $1 {{PLURAL:$1|promjene|promjena}}. Brisanje može poremetiti bazu podataka {{SITENAME}}; postupajte s oprezom.",
        "deleting-backlinks-warning": "'''Upozorenje:''' brišete stranicu koja je uključena u druge ili druge stranice povezuju na nju.",
        "rollback": "Ukloni posljednju promjenu",
-       "rollback_short": "Ukloni",
        "rollbacklink": "ukloni",
        "rollbacklinkcount": "ukloni $1 {{PLURAL:$1|uređivanje|uređivanja}}",
        "rollbacklinkcount-morethan": "ukloni više od $1 {{PLURAL:$1|uređivanje|uređivanja}}",
        "protect-othertime": "Drugo vrijeme:",
        "protect-othertime-op": "drugo vrijeme",
        "protect-existing-expiry": "Postojeće vrijeme zaštite: $3, $2",
+       "protect-existing-expiry-infinity": "trenutačno vrijeme zaštićivanja: neograničeno",
        "protect-otherreason": "Drugi/dodatni razlog:",
        "protect-otherreason-op": "drugi/dodatni razlog",
-       "protect-dropdown": "*Najčešći razlozi zaštićivanja\n** Učestalo vandaliziranje\n** Učestalo spamiranje\n** Neproduktivni uređivački rat\n** Zatrpavanje nedavnih promjena",
+       "protect-dropdown": "*Najčešći razlozi zaštićivanja:\n** učestalo vandaliziranje\n** učestalo spamiranje\n** neproduktivni uređivački rat\n** zatrpavanje nedavnih promjena\n** često korišten/složen predložak\n** stranica za razgovor blokiranog suradnika",
        "protect-edit-reasonlist": "Uredi razloge zaštićivanja",
        "protect-expiry-options": "1 sat:1 hour,1 dan:1 day,1 tjedan:1 week,2 tjedna:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godina:1 year,neograničeno:infinite",
        "restriction-type": "Dopuštenje:",
        "import-logentry-interwiki": "transwiki uvezeno $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|promjena|promjene|promjena}} od $2",
        "javascripttest": "Testiranje JavaScripta",
-       "javascripttest-title": "Izvršavaju se $1 testovi",
        "javascripttest-pagetext-noframework": "Ova je stranica rezervirana za izvršavanje JavaScript testova.",
        "javascripttest-pagetext-unknownframework": "Nepoznata testna okolina \"$1\".",
        "javascripttest-pagetext-frameworks": "Molimo izaberite jednu od sljedećih testnih okolina: $1",
        "javascripttest-pagetext-skins": "Izaberite temu (''skin'') za testiranje:",
        "javascripttest-qunit-intro": "Pogledajte [$1 testnu dokumentaciju] na mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit testni alati",
        "tooltip-pt-userpage": "Moja suradnička stranica",
        "tooltip-pt-anonuserpage": "Suradnička stranica za IP adresu pod kojom uređujete",
        "tooltip-pt-mytalk": "Moja stranica za razgovor",
        "tooltip-n-recentchanges": "Popis nedavnih promjena u wikiju.",
        "tooltip-n-randompage": "Učitaj slučajnu stranicu",
        "tooltip-n-help": "Mjesto za pomoć suradnicima.",
-       "tooltip-t-whatlinkshere": "Popis svih stranica koje sadrže poveznice ovamo",
+       "tooltip-t-whatlinkshere": "Popis stranica koje sadrže poveznice na ovu stranicu",
        "tooltip-t-recentchangeslinked": "Nedavne promjene na stranicama na koje vode ovdašnje poveznice",
        "tooltip-feed-rss": "RSS feed za ovu stranicu",
        "tooltip-feed-atom": "Atom feed za ovu stranicu",
        "tooltip-t-contributions": "Pogledaj popis suradnikovih doprinosa",
        "tooltip-t-emailuser": "Pošalji suradniku e-mail",
+       "tooltip-t-info": "Više informacija o ovoj stranici",
        "tooltip-t-upload": "Postavi slike i druge medije",
        "tooltip-t-specialpages": "Popis posebnih stranica",
        "tooltip-t-print": "Verzija za ispis ove stranice",
        "hebrew-calendar-m11-gen": "ava",
        "hebrew-calendar-m12-gen": "elula",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
-       "unknown_extension_tag": "Nepoznat ''tag'' ekstenzije \"$1\"",
        "duplicate-defaultsort": "'''Upozorenje:''' Razvrstavanje po \"$2\" poništava ranije razvrstavanje po \"$1\".",
        "version": "Inačica softvera",
        "version-extensions": "Instalirana proširenja",
index ee5c85e..96b3d92 100644 (file)
        "subcategories": "Podkategorije",
        "category-media-header": "Medije w kategoriji „$1”",
        "category-empty": "''Tuta kategorija tuchwilu žane nastawki abo medije njewobsahuje.''",
-       "hidden-categories": "{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowanych kategorijow}}",
+       "hidden-categories": "{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}}",
        "hidden-category-category": "Schowane kategorije",
        "category-subcat-count": "{{PLURAL:$2|Tuta kategorija ma jenož slědowacu podkategoriju.|Tuta kategorija ma {{PLURAL:$1|slědowacu podkategoriju|$1 slědowacej podkategoriji|$1 slědowace podkategorije|$1 slědowacych podkategorijow}} z dohromady $2.}}",
        "category-subcat-count-limited": "Tuta kategorija ma {{PLURAL:$1|slědowacu podkategoriju|slědowacej $1 podkategoriji|slědowace $1 podkategorije|slědowacych $1 podkategorijow}}:",
        "delete-warning-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.",
        "deleting-backlinks-warning": "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
        "rollback": "Změny cofnyć",
-       "rollback_short": "Cofnyć",
        "rollbacklink": "Cofnyć",
        "rollbacklinkcount": "$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć",
        "rollbacklinkcount-morethan": "přez $1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć",
        "import-logentry-interwiki": "je stronu $1 z druheho wikija přenjesł",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} z $2 {{PLURAL:$1|importowana|importowanej|importowane|importowane}}",
        "javascripttest": "JavaScriptowy test",
-       "javascripttest-title": "Testy $1 so přewjedu",
        "javascripttest-pagetext-noframework": "Tuta strona je za přewjedźenje javascriptowych testow přewostajena.",
        "javascripttest-pagetext-unknownframework": "Njeznaty wobłuk \"$1\".",
        "javascripttest-pagetext-frameworks": "Prošu wubjer jedyn ze slědowacych testowanskich wobłukow: $1",
        "javascripttest-pagetext-skins": "Wubjer drastu za přewjedźenje testow:",
        "javascripttest-qunit-intro": "Hlej [$1 testowansku dokumentaciju] na mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit Test Suite",
        "tooltip-pt-userpage": "Twoja wužiwarska strona",
        "tooltip-pt-anonuserpage": "Wužiwarska strona IP-adresy, z kotrejž tuchwilu dźěłaš",
        "tooltip-pt-mytalk": "Twoja diskusijna strona",
        "watchlisttools-raw": "Lisćinowy format wobdźěłać (import/eksport)",
        "iranian-calendar-m2": "Ordibehešt",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusija]])",
-       "unknown_extension_tag": "Njeznata taflička rozšěrjenja \"$1\"",
        "duplicate-defaultsort": "Warnowanje: Standardny sortěrowonski kluč (DEFAULTSORTKEY) \"$2\" přepisa prjedawšu sortěrowanski kluč \"$1\".",
        "version": "Wersija",
        "version-extensions": "Instalowane rozšěrjenja",
        "specialpages-group-wiki": "Daty a nastroje",
        "specialpages-group-redirects": "Daleposrědkowace specialne strony",
        "specialpages-group-spam": "Spamowe nastroje",
+       "specialpages-group-developer": "Nastroje wuwiwarjow",
        "blankpage": "Prózdna strona",
        "intentionallyblankpage": "Tuta strona je z wotpohladom prózdna.",
        "external_image_whitelist": " #Wostaj tutu linku eksaktnje kaž je<pre>\n#Zapodaj deleka fragmenty regularnych wurazow (jenož tón dźěl mjez //)\n#Tute přirunuja so z URL eksternych wobrazow\n#Přihódne zwobraznja so jako wobrazy, hewak so jenož wotkaz k wobrazej pokaza\n#Z linkami, kotrež so z # započinaja, wobchadźeja kaž komentary\n#To na wulkopisanje njedźiwa\n\n#Zapodaj wšě fragmenty regularnych wurazow nad tutej linku. Wostaj tutu linku eksaktnje kaž je</pre>",
index f864fd1..fec73cb 100644 (file)
@@ -64,7 +64,7 @@
        "tog-shownumberswatching": "A lapot figyelő szerkesztők számának megjelenítése",
        "tog-oldsig": "A jelenlegi aláírás:",
        "tog-fancysig": "Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)",
-       "tog-uselivepreview": "Élő előnézet használata (kísérleti)",
+       "tog-uselivepreview": "Élő előnézet használata",
        "tog-forceeditsummary": "Figyelmeztessen, ha nem adok meg szerkesztési összefoglalót",
        "tog-watchlisthideown": "Saját szerkesztések elrejtése",
        "tog-watchlisthidebots": "Robotok szerkesztéseinek elrejtése",
        "content-model-text": "egyszerű szöveg",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Üres objektum",
+       "content-json-empty-array": "Üres tömb",
        "duplicate-args-category": "Dupla paramétermegadást tartalmazó lapok",
        "expensive-parserfunction-warning": "Figyelem: ezen a lapon túl sok erőforrásigényes elemzőfüggvény-hívás található.\n\nKevesebb, mint {{PLURAL:$2|egy|$2}} kellene, jelenleg {{PLURAL:$1|egy|$1}} van.",
        "expensive-parserfunction-category": "Túl sok költséges elemzőfüggvény-hívást tartalmazó lapok",
        "parser-template-loop-warning": "Végtelen ciklus a következő sablonban: [[$1]]",
        "parser-template-recursion-depth-warning": "A sablon rekurzív beillesztésének mélysége átlépte a határérékét ($1)",
        "language-converter-depth-warning": "A nyelvátalakító rekurzióinak száma túllépve ($1)",
-       "node-count-exceeded-category": "Lapok, ahogy a csomópontszám túl nagy",
+       "node-count-exceeded-category": "Túl sok csomópontot tartalmazó lapok",
        "node-count-exceeded-category-desc": "A lap túllépi a maximális csomópontszámot.",
        "node-count-exceeded-warning": "Az oldal meghaladta a csomópontszámot",
        "expansion-depth-exceeded-category": "Lapok, melyeken a sablonok kibontása meghaladja a megengedett szintet",
        "exbeforeblank": "az eltávolítás előtti tartalom: „$1”",
        "delete-confirm": "$1 törlése",
        "delete-legend": "Törlés",
-       "historywarning": "'''Figyelem:''' a lapnak, amit törölni készülsz, körülbelül $1 változattal rendelkező laptörténete van:",
+       "historywarning": "<strong>Figyelem:</strong> a lapnak, amit törölni készülsz, $1 változattal rendelkező laptörténete van:",
        "confirmdeletetext": "Egy lapot vagy fájlt készülsz törölni a teljes laptörténetével együtt.\nKérjük, erősítsd meg, hogy valóban ezt szeretnéd tenni, átlátod a következményeit, és hogy a műveletet a [[{{MediaWiki:Policy-url}}|törlési irányelvekkel]] összhangban végzed.",
        "actioncomplete": "Művelet végrehajtva",
        "actionfailed": "A művelet nem sikerült",
        "delete-toobig": "Ennek a lapnak a laptörténete több mint {{PLURAL:$1|egy|$1}} változatot őriz. A szervert kímélendő az ilyen lapok törlése nem engedélyezett.",
        "delete-warning-toobig": "Ennek a lapnak a laptörténete több mint {{PLURAL:$1|egy|$1}} változatot őriz. Törlése fennakadásokat okozhat a wiki adatbázis-műveleteiben; óvatosan járj el.",
        "rollback": "Szerkesztések visszaállítása",
-       "rollback_short": "Visszaállítás",
        "rollbacklink": "visszaállítás",
        "rollbacklinkcount": "$1 szerkesztés visszaállítása",
        "rollbacklinkcount-morethan": "több mint $1 szerkesztés visszaállítása",
        "import-logentry-interwiki": "$1 más wikiből áthozva",
        "import-logentry-interwiki-detail": "$1 változat innen: $2",
        "javascripttest": "JavaScript tesztelés",
-       "javascripttest-title": "$1 tesztek futtatása",
        "javascripttest-pagetext-noframework": "Ez az oldal JavaStript tesztek futtatására van fenntartva.",
        "javascripttest-pagetext-unknownframework": "Ismeretlen teszt keretrendszer: $1.",
        "javascripttest-pagetext-frameworks": "Kérlek válaszd valamelyik teszt keretrendszert az alábbiak közül: $1",
        "javascripttest-pagetext-skins": "Válassz egy megjelenítő felületet, amin a tesztet futtatod:",
        "javascripttest-qunit-intro": "Lásd a [$1 tesztelési dokumentációt]  a mediawiki.org helyen.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit tesztcsomag",
        "tooltip-pt-userpage": "A szerkesztőlapod",
        "tooltip-pt-anonuserpage": "Az általad használt IP-címhez tartozó felhasználói lap",
        "tooltip-pt-mytalk": "A vitalapod",
        "watchlisttools-edit": "A figyelőlista megtekintése és szerkesztése",
        "watchlisttools-raw": "A nyers figyelőlista szerkesztése",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|vita]])",
-       "unknown_extension_tag": "Ismeretlen tag kiterjesztés: $1",
        "duplicate-defaultsort": "Figyelem: a(z) „$2” rendezőkulcs felülírja a korábbit („$1”).",
        "version": "Névjegy",
        "version-extensions": "Telepített kiterjesztések",
        "version-entrypoints": "Belépési pont URL-címek",
        "version-entrypoints-header-entrypoint": "Belépési pont",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Telepített könyvtárak",
+       "version-libraries-library": "Könyvtár",
+       "version-libraries-version": "Verzió",
        "redirect": "Átirányítás fájl, szerkesztő, oldal vagy oldalváltozat alapján",
        "redirect-legend": "Átirányítás egy fájlra vagy lapra",
        "redirect-submit": "Mehet",
        "blankpage": "Üres lap",
        "intentionallyblankpage": "Ez a lap szándékosan maradt üresen",
        "external_image_whitelist": " #Ezt a sort hagyd pontosan így, ahogy van<pre>\n#Ide reguláris kifejezéseket írhatsz (azon részüket, amik a // közé mennek)\n#Ezek egyeztetve lesznek a külső képek URL-jeivel\n#Egyezés esetén képként fognak megjelenni, egyébként csak link fog rájuk mutatni\n#A #-tel kezdődő sorok megjegyzésnek számítanak\n#A kis- és nagybetűk nincsenek megkülönböztetve\n\n#A reguláris kifejezéseket ezen sor alá írd. Ezt a sort hagyd így, ahogy van.</pre>",
-       "tags": "Érvényes módosítási címkék",
+       "tags": "Lapváltozat-címkék",
        "tag-filter": "[[Special:Tags|Címke]]szűrő:",
        "tag-filter-submit": "Szűrő",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Címke|Címkék}}]]: $2)",
index 26951bc..d6dc939 100644 (file)
@@ -40,7 +40,7 @@
        "tog-shownumberswatching": "Monstrar le numero de usatores que observa le pagina",
        "tog-oldsig": "Signatura existente:",
        "tog-fancysig": "Tractar signatura como wikitexto (sin ligamine automatic)",
-       "tog-uselivepreview": "Usar previsualisation in directo (experimental)",
+       "tog-uselivepreview": "Usar previsualisation dynamic",
        "tog-forceeditsummary": "Avisar me si io non entra un summario de modification",
        "tog-watchlisthideown": "Celar mi proprie modificationes in le observatorio",
        "tog-watchlisthidebots": "Celar le modificationes de robots in le observatorio",
        "pool-queuefull": "Le cauda commun de processos es plen",
        "pool-errorunknown": "Error incognite",
        "pool-servererror": "Le servicio de banco de ressources commun non es disponibile ($1).",
+       "poolcounter-usage-error": "Error de uso: $1",
        "aboutsite": "A proposito de {{SITENAME}}",
        "aboutpage": "Project:A proposito",
        "copyright": "Le contento es disponibile sub $1 si non alteremente specificate.",
        "anoneditwarning": "<strong>Attention:</strong> Tu non ha aperite un session. Le adresse IP tue essera publicamente visibile si tu face modificationes. Si tu <strong>[$1 aperi un session]</strong> o <strong>[$2 crea un conto]</strong>, le modificationes essera attribuite al nomine de usator tue, inter altere avantages.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
+       "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": "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
        "summary-preview": "Previsualisation del summario:",
        "content-model-text": "texto simple",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objecto vacue",
+       "content-json-empty-array": "Array vacue",
        "duplicate-args-category": "Paginas que usa parametros duplicate in appellos de patrono",
        "duplicate-args-category-desc": "Le pagina contine appellos de patrono que usa duplicatos de parametros, como per exemplo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.\n\nIllo debe haber minus de $2 {{PLURAL:$2|appello|appellos}}, sed al momento ha $1 {{PLURAL:$1|appello|appellos}}.",
        "history-feed-empty": "Le pagina que tu requestava non existe.\nEs possibile que illo esseva delite del wiki, o renominate.\nProva [[Special:Search|cercar nove paginas relevante]] in le wiki.",
        "rev-deleted-comment": "(summario del modification removite)",
        "rev-deleted-user": "(nomine de usator eliminate)",
-       "rev-deleted-event": "(entrata eliminate)",
+       "rev-deleted-event": "(detalios de registro removite)",
        "rev-deleted-user-contribs": "[nomine de usator o adresse IP removite - modification celate ab contributiones]",
        "rev-deleted-text-permission": "Iste version del pagina ha essite '''delite'''.\nEs possibile que se trova detalios in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "rev-suppressed-text-permission": "Iste version del pagina ha essite <strong>supprimite</strong>.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de suppressiones].",
        "revdelete-legend": "Definir restrictiones de visibilitate",
        "revdelete-hide-text": "Texto del version",
        "revdelete-hide-image": "Celar le contento del file",
-       "revdelete-hide-name": "Celar action e objectivo",
+       "revdelete-hide-name": "Celar objectivo e parametros",
        "revdelete-hide-comment": "Summario del modification",
        "revdelete-hide-user": "Nomine de usator o adresse IP del modificator",
        "revdelete-hide-restricted": "Supprimer le datos a administratores assi como a alteres",
        "deleteprotected": "Tu non pote deler iste pagina perque illo ha essite protegite.",
        "deleting-backlinks-warning": "'''Attention:''' Il ha [[Special:WhatLinksHere/{{FULLPAGENAME}}|altere paginas]] que liga a o transclude le pagina que tu es sur le puncto de deler.",
        "rollback": "Revocar modificationes",
-       "rollback_short": "Revocar",
        "rollbacklink": "revocar",
        "rollbacklinkcount": "revocar $1 {{PLURAL:$1|modification|modificationes}}",
        "rollbacklinkcount-morethan": "revocar plus de $1 {{PLURAL:$1|modification|modificationes}}",
        "namespace": "Spatio de nomine:",
        "invert": "Inverter selection",
        "tooltip-invert": "Marca iste quadrato pro celar le modificationes in paginas intra le spatio de nomines seligite (e le spatio de nomines associate, si tal option es seligite)",
+       "tooltip-whatlinkshere-invert": "Marca iste quadrato pro celar ligamines de paginas in le spatio de nomines seligite.",
        "namespace_association": "Spatio de nomines associate",
        "tooltip-namespace_association": "Marca iste quadrato pro includer anque le spatio de nomines de discussion o de subjecto associate al spatio de nomines seligite",
        "blanknamespace": "(Principal)",
        "thumbnail-temp-create": "Impossibile crear un file temporari de miniatura",
        "thumbnail-dest-create": "Impossibile salveguardar le miniatura in su destination",
        "thumbnail_invalid_params": "Parametros de miniatura invalide",
+       "thumbnail_toobigimagearea": "File con dimensiones superior a $1",
        "thumbnail_dest_directory": "Impossibile crear directorio de destination",
        "thumbnail_image-type": "typo de imagine non supportate",
        "thumbnail_gd-library": "le configuration del bibliotheca GD es incomplete: manca le function $1",
        "import-logentry-interwiki": "importava $1 transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versiones}} importate desde $2",
        "javascripttest": "Test de JavaScript",
-       "javascripttest-title": "Execution de $1 tests",
        "javascripttest-pagetext-noframework": "Iste pagina es reservate pro le execution de tests de JavaScript.",
        "javascripttest-pagetext-unknownframework": "Structura de test \"$1\" incognite.",
+       "javascripttest-pagetext-unknownaction": "Action \"$1\" incognite.",
        "javascripttest-pagetext-frameworks": "Per favor selige un del sequente structuras de test: $1",
        "javascripttest-pagetext-skins": "Selige un apparentia con le qual executar le tests:",
        "javascripttest-qunit-intro": "Vide [$1 documentation de tests] sur mediawiki.org.",
-       "javascripttest-qunit-heading": "Programmas de test QUnit de JavaScript de MediaWiki",
        "tooltip-pt-userpage": "Tu pagina de usator",
        "tooltip-pt-anonuserpage": "Le pagina de usator pro le adresse IP desde le qual tu face modificationes",
        "tooltip-pt-mytalk": "Tu pagina de discussion",
        "watchlisttools-edit": "Vider e modificar le observatorio",
        "watchlisttools-raw": "Modificar observatorio crude",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
-       "unknown_extension_tag": "Etiquetta de extension incognite \"$1\"",
        "duplicate-defaultsort": "Attention: Le clave de ordination predefinite \"$2\" supplanta le anterior clave de ordination predefinite \"$1\".",
        "duplicate-displaytitle": "<strong>Attention:</strong> Le titulo a monstrar \"$2\" supplanta le ancian titulo a monstrar \"$1\".",
        "invalid-indicator-name": "<strong>Error:</strong> Le attributo <code>name</code> del indicatores del stato del pagina non pote esser vacue.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Cammino al articulo]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Cammino al script]",
+       "version-libraries": "Bibliothecas installate",
+       "version-libraries-library": "Bibliotheca",
+       "version-libraries-version": "Version",
        "redirect": "Rediriger per nomine de file, ID de usator, ID de pagina o ID de version",
        "redirect-legend": "Rediriger a un file o pagina",
        "redirect-summary": "Iste pagina special redirige a un file (si es date le nomine de un file), a un pagina (si es date un ID de version o ID de pagina) o a un pagina de usator (si es date un ID de usator numeric). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] o [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Le version que tu specificava non existe.",
        "dberr-problems": "Pardono! Iste sito ha incontrate difficultates technic.",
        "dberr-again": "Proba attender alcun minutas e recargar.",
-       "dberr-info": "(Non pote contactar le servitor del base de datos: $1)",
-       "dberr-info-hidden": "(Non pote contactar le servitor del base de datos)",
+       "dberr-info": "(Non pote acceder al base de datos: $1)",
+       "dberr-info-hidden": "(Non pote acceder al base de datos)",
        "dberr-usegoogle": "Tu pote probar cercar con Google intertanto.",
        "dberr-outofdate": "Nota que lor indices de nostre contento pote esser obsolete.",
        "dberr-cachederror": "Lo sequente es un copia del cache del pagina requestate, e pote esser obsolete.",
        "log-name-pagelang": "Registro de cambios de lingua",
        "log-description-pagelang": "Isto es un registro de cambios de lingua in paginas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiava}} le lingua del pagina $3 de $4 a $5.",
-       "default-skin-not-found": "Attention! Le apparentia predefinite de tu wiki, definite in <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, non es disponibile.\n\nLe installation pare includer le sequente apparentias. Vide [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pro saper como activar los e seliger le predefinite.\n\n$2\n\n; Si tu ha justo installate MediaWiki:\n: Tu lo ha probabilemente installate a partir de git, o directemente del codice fonte con un altere methodo. Isto es normal. Essaya installar alcun apparentias desde [https://www.mediawiki.org/wiki/Category:All_skins le directorio de apparentias de mediawiki.org], per:\n:* Discargar le [https://www.mediawiki.org/wiki/Download archivo tar del installator], que include plure apparentias e extensiones. Tu pote copiar e collar le directorio <code>skins/</code> de illo.\n:* Clonar un del repositorios <code>mediawiki/skins/*</code> via git in le directorio <code dir=\"ltr\">skins/</code> de tu installation de MediaWiki.\n: Facer isto non deberea interferer con tu repositorio git si tu es un disveloppator de MediaWiki.\n\n; Si tu ha justo actualisate MediaWiki:\n: MediaWiki a partir del version 1.24 non plus activa automaticamente le apparentias installate (vide [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Tu pote collar le sequente lineas in <code>LocalSettings.php</code> pro activar tote le apparentias actualmente installate:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si tu ha justo modificate <code>LocalSettings.php</code>:\n: Verifica meticulosemente que le nomines del apparentias non ha errores.",
-       "default-skin-not-found-no-skins": "Attention! Le apparentia predefinite de tu wiki, definite in <code>$wgDefaultSkin</code> como <code>$1</code>, non es disponibile.\n\nTu non ha apparentias installate.\n\n; Si tu ha justo installate o actualisate MediaWiki:\n: Tu lo ha probabilemente installate a partir de git, o directemente del codice fonte con un altere methodo. Isto es normal. Essaya installar alcun apparentias desde [https://www.mediawiki.org/wiki/Category:All_skins le directorio de apparentias de mediawiki.org], per:\n:* Discargar le [https://www.mediawiki.org/wiki/Download archivo tar del installator], que include plure apparentias e extensiones. Tu pote copiar e collar le directorio <code>skins/</code> de illo.\n:* Clonar un del repositorios <code>mediawiki/skins/*</code> via git in le directorio <code dir=\"ltr\">skins/</code> de tu installation de MediaWiki.\n: Facer isto non deberea interferer con tu repositorio git si tu es un disveloppator de MediaWiki. Vide [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pro saper como activar skins e seliger le predefinite.",
+       "default-skin-not-found": "Attention! Le apparentia predefinite de tu wiki, definite in <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, non es disponibile.\n\nLe installation pare includer le sequente apparentias. Vide [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pro saper como activar los e seliger le predefinite.\n\n$2\n\n; Si tu ha justo installate MediaWiki:\n: Tu lo ha probabilemente installate a partir de git, o directemente del codice fonte con un altere methodo. Isto es normal. Essaya installar alcun apparentias desde [https://www.mediawiki.org/wiki/Category:All_skins le directorio de apparentias de mediawiki.org], per:\n:* Discargar le [https://www.mediawiki.org/wiki/Download archivo tar del installator], que include plure apparentias e extensiones. Tu pote copiar e collar le directorio <code>skins/</code> de illo.\n:* Discargar archivos tar con apparentias indidivual ab [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonar un del repositorios <code>mediawiki/skins/*</code> via git in le directorio <code dir=\"ltr\">skins/</code> de tu installation de MediaWiki.\n: Facer isto non deberea interferer con tu repositorio git si tu es un disveloppator de MediaWiki.\n\n; Si tu ha justo actualisate MediaWiki:\n: MediaWiki a partir del version 1.24 non plus activa automaticamente le apparentias installate (vide [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Tu pote collar le sequente lineas in <code>LocalSettings.php</code> pro activar tote le apparentias actualmente installate:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si tu ha justo modificate <code>LocalSettings.php</code>:\n: Verifica meticulosemente que le nomines del apparentias non ha errores.",
+       "default-skin-not-found-no-skins": "Attention! Le apparentia predefinite de tu wiki, definite in <code>$wgDefaultSkin</code> como <code>$1</code>, non es disponibile.\n\nTu non ha apparentias installate.\n\n; Si tu ha justo installate o actualisate MediaWiki:\n: Tu lo ha probabilemente installate a partir de git, o directemente del codice fonte con un altere methodo. Isto es normal. Essaya installar alcun apparentias desde [https://www.mediawiki.org/wiki/Category:All_skins le directorio de apparentias de mediawiki.org], per:\n:* Discargar le [https://www.mediawiki.org/wiki/Download archivo tar del installator], que include plure apparentias e extensiones. Tu pote copiar e collar le directorio <code>skins/</code> de illo.\n:* Discargar archivos tar con apparentias individual ab [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonar un del repositorios <code>mediawiki/skins/*</code> via git in le directorio <code dir=\"ltr\">skins/</code> de tu installation de MediaWiki.\n: Facer isto non deberea interferer con tu repositorio git si tu es un disveloppator de MediaWiki. Vide [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pro saper como activar skins e seliger le predefinite.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activate)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disactivate''')",
        "mediastatistics": "Statisticas de multimedia",
index e4f9b88..1cae38c 100644 (file)
@@ -63,7 +63,7 @@
        "tog-shownumberswatching": "Tunjukkan jumlah pemantau",
        "tog-oldsig": "Tanda tangan sekarang:",
        "tog-fancysig": "Perlakukan tanda tangan sebagai teks wiki (tanpa suatu pranala otomatis)",
-       "tog-uselivepreview": "Gunakan pratayang langsung (eksperimental)",
+       "tog-uselivepreview": "Gunakan pratayang langsung",
        "tog-forceeditsummary": "Ingatkan saya bila kotak ringkasan suntingan masih kosong",
        "tog-watchlisthideown": "Sembunyikan suntingan saya di daftar pantauan",
        "tog-watchlisthidebots": "Sembunyikan suntingan bot di daftar pantauan",
        "viewsourcetext": "Anda dapat melihat atau menyalin sumber halaman ini:",
        "viewyourtext": "Anda dapat melihat atau menyalin sumber dari '''suntingan Anda''' ke halaman ini:",
        "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 [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
-       "editinginterface": "'''Peringatan:''' Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka untuk perangkat lunak situs ini. Perubahan teks ini akan memengaruhi tampilan pada antarmuka pengguna untuk pengguna lain di wiki ini.\nUntuk menambah atau mengubahterjemahan untuk semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
+       "editinginterface": "<strong>Peringatan:</strong> Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka bagi perangkat lunak.\nPerubahan pada halaman ini akan memengaruhi tampilan pada antarmuka pengguna untuk pengguna lain pada wiki ini.",
        "cascadeprotected": "Halaman ini telah dilindungi dari penyuntingan karena disertakan di {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan opsi \"runtun\":\n$2",
        "namespaceprotected": "Anda tak memiliki hak akses untuk menyunting halaman di ruang nama '''$1'''.",
        "customcssprotected": "Anda tidak memiliki izin untuk menyunting halaman CSS ini, karena berisi pengaturan pribadi pengguna lain.",
        "invalidtitle-knownnamespace": "Judul yang tidak sah dengan ruangnama \"$2\" dan teks \"$3\"",
        "invalidtitle-unknownnamespace": "Judul yang tidak sah dengan nomor ruang nama tidak diketahui $1 dan teks \"$2\"",
        "exception-nologin": "Belum masuk log",
-       "exception-nologin-text": "Harap [[Special:Userlogin|masuk log]] untuk dapat mengakses halaman atau tindakan ini.",
+       "exception-nologin-text": "Silakan masuk log untuk dapat mengakses halaman atau tindakan ini.",
        "exception-nologin-text-manual": "Silakan $1 untuk dapat mengakses halaman atau tindakan ini.",
        "virus-badscanner": "Kesalahan konfigurasi: pemindai virus tidak dikenal: ''$1''",
        "virus-scanfailed": "Pemindaian gagal (kode $1)",
        "preview": "Pratayang",
        "showpreview": "Lihat pratayang",
        "showdiff": "Lihat perubahan",
-       "anoneditwarning": "'''Peringatan:''' Anda tidak terdaftar masuk.\nAlamat IP Anda akan tercatat dalam sejarah (versi terdahulu) halaman ini.",
+       "anoneditwarning": "<strong>Peringatan:</strong> Anda sedang tidak masuk log. Alamat IP Anda akan terlihat oleh publik jika Anda melakukan suatu perubahan. Jika Anda <strong>[$1 masuk log]</strong> atau <strong>[$2 membuat akun]</strong>, suntingan Anda akan diatribusikan kepada nama pengguna Anda, beserta berbagai keuntungan lainnya.",
        "anonpreviewwarning": "''Anda belum masuk log. Menyimpan halaman akan menyebabkan alamat IP Anda tercatat pada riwayat suntingan laman ini.''",
        "missingsummary": "'''Peringatan:''' Anda tidak memasukkan ringkasan penyuntingan. Jika Anda kembali menekan tombol Simpan, suntingan Anda akan disimpan tanpa ringkasan penyuntingan.",
        "missingcommenttext": "Harap masukkan komentar di bawah ini.",
        "parser-template-recursion-depth-warning": "Limit kedalaman hubungan berulang templat terlampaui ($1)",
        "language-converter-depth-warning": "Batas kedalaman pengonversi bahasa terlampaui ($1)",
        "node-count-exceeded-category": "Halaman dimana hitungan-node terlampaui",
-       "node-count-exceeded-category-desc": "Kategori untuk halaman dimana hitungan-node terlampaui.",
-       "node-count-exceeded-warning": "Page exceeded the node-count",
+       "node-count-exceeded-category-desc": "Halaman ini melampaui jumlah node maksimum.",
+       "node-count-exceeded-warning": "Halaman yang melebihi jumlah node",
        "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
-       "expansion-depth-exceeded-category-desc": "Ini adalah kategori untuk halaman dimana kedalaman ekspansi terlampaui.",
+       "expansion-depth-exceeded-category-desc": "Halaman yang melebihi kedalaman luas maksimum.",
        "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
        "history-feed-empty": "Halaman yang diminta tak ditemukan.\nKemungkinan telah dihapus dari wiki, atau diberi nama baru.\nCoba [[Special:Search|lakukan pencarian di wiki]] untuk halaman baru yang relevan.",
        "rev-deleted-comment": "(ringkasan suntingan dihapus)",
        "rev-deleted-user": "(nama pengguna dihapus)",
-       "rev-deleted-event": "(isi dihapus)",
+       "rev-deleted-event": "(rincian log dihapus)",
        "rev-deleted-user-contribs": "[nama pengguna atau alamat IP dihapus - suntingan disembunyikan pada daftar kontribusi]",
        "rev-deleted-text-permission": "Revisi halaman ini telah '''dihapus'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan]",
        "rev-deleted-text-unhide": "Revisi ini telah '''dihapus'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].\nSebagai seorang pengurus Anda masih dapat [$1 melihat revisi ini] jika Anda mau.",
        "revdelete-text-text": "Revisi yang dihapus akan tetap muncul di halaman riwayat, tetapi bagian dari konten mereka akan menjadi tidak dapat diakses untuk umum.",
        "revdelete-text-file": "Versi berkas yang dihapus akan tetap muncul di riwayat berkas, tetapi bagian dari konten mereka akan menjadi tidak dapat diakses untuk umum.",
        "logdelete-text": "Acara log yang dihapus akan tetap muncul di log, tetapi bagian dari konten mereka akan menjadi tidak dapat diakses untuk umum.",
-       "revdelete-text-others": "Pengurus lain pada {{SITENAME}} masih akan dapat mengakses konten tersembunyi dan dapat membatalkan penghapusan itu kembali melalui antarmuka yang sama ini, kecuali ada batasan-batasan tambahan yang ditetapkan.",
+       "revdelete-text-others": "Pengurus lain akan masih dapat mengakses konten tersembunyi dan dapat membatalkan penghapusannya, kecuali jika ada penerapan batasan tambahan.",
        "revdelete-confirm": "Tolong konfirmasi bahwa Anda memang bermaksud melakukan ini, memahami konsekuensinya, dan bahwa Anda melakukannya sesuai dengan [[{{MediaWiki:Policy-url}}|kebijakan]].",
        "revdelete-suppress-text": "Penyembunyian revisi '''hanya''' boleh digunakan untuk kasus-kasus berikut:\n* Informasi yang berpotensi memfitnah\n* Informasi pribadi yang tak sepantasnya\n*: ''alamat rumah dan nomor telepon, nomor kartu identitas, dan lain-lain.''",
        "revdelete-legend": "Atur batasan:",
        "revdelete-hide-text": "Teks revisi",
        "revdelete-hide-image": "Sembunyikan isi berkas",
-       "revdelete-hide-name": "Sembunyikan tindakan dan target",
+       "revdelete-hide-name": "Sembunyikan target dan parameter",
        "revdelete-hide-comment": "Ringkasan suntingan",
        "revdelete-hide-user": "Nama pengguna/alamat IP penyunting",
        "revdelete-hide-restricted": "Sembunyikan data dari opsis juga",
        "preferences": "Preferensi",
        "mypreferences": "Preferensi",
        "prefs-edits": "Jumlah suntingan:",
-       "prefsnologintext2": "Silakan $1 untuk mengubah preferensi Anda.",
+       "prefsnologintext2": "Silakan log masuk untuk mengubah preferensi Anda.",
        "prefs-skin": "Kulit",
        "skin-preview": "Pratayang",
        "datedefault": "Tak ada preferensi",
        "gender-female": "Perempuan",
        "prefs-help-gender": "Opsional: digunakan untuk perbaikan penyebutan jender oleh perangkat lunak. \nInformasi ini akan terbuka untuk umum.",
        "email": "Surel",
-       "prefs-help-realname": "Nama asli bersifat opsional.\nJika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.",
+       "prefs-help-realname": "Nama asli bersifat opsional.\nJika disediakan, nama ini dapat digunakan untuk memberi atribusi atas karya Anda.",
        "prefs-help-email": "Alamat surel bersifat opsional, namun diperlukan untuk menyetel ulang sandi jika Anda lupa.",
        "prefs-help-email-others": "Anda juga dapat memilih untuk mengizinkan orang lain menghubungi Anda melalui halaman pengguna atau pembicaraan tanpa perlu membongkar identitas Anda.",
        "prefs-help-email-required": "Alamat surel wajib diisi.",
        "right-deletedtext": "Melihat teks yang dihapus dan perubahan antara revisi yang dihapus",
        "right-browsearchive": "Mencari halaman yang telah dihapus",
        "right-undelete": "Mengembalikan halaman yang telah dihapus",
-       "right-suppressrevision": "Memeriksa dan mengembalikan revisi-revisi yang disembunyikan dari Opsis",
+       "right-suppressrevision": "Menampilkan, menyembunyikan dan membatalkan penyembunyian revisi tertentu atas suatu halaman dari pengguna",
        "right-suppressionlog": "Melihat log privat",
        "right-block": "Memblokir penyuntingan oleh pengguna lain",
        "right-blockemail": "Memblokir pengiriman surel oleh pengguna",
        "delete-warning-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nMenghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{SITENAME}}.",
        "deleting-backlinks-warning": "'''Peringatan:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Halaman lain]] mengarah atau memiliki transklusi ke halaman yang akan Anda hapus.",
        "rollback": "Kembalikan suntingan",
-       "rollback_short": "Kembalikan",
        "rollbacklink": "kembalikan",
        "rollbacklinkcount": "kembalikan $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbacklinkcount-morethan": "kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}",
        "import-logentry-interwiki": "men-transwiki $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisi}} dari $2",
        "javascripttest": "Pengujian JavaScript",
-       "javascripttest-title": "$1 pengujian sedang berjalan",
        "javascripttest-pagetext-noframework": "Halaman ini disediakan untuk pengujian JavaScript yang sedang berjalan.",
        "javascripttest-pagetext-unknownframework": "Pengujian kerangka kerja \"$1\" tidak diketahui",
        "javascripttest-pagetext-frameworks": "Silakan pilih satu di antara kerangka kerja pengujian berikut: $1",
        "javascripttest-pagetext-skins": "Pilih kulit yang ingin Anda uji:",
        "javascripttest-qunit-intro": "Lihat [$1 dokumentasi pengujian] di mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
        "tooltip-pt-userpage": "Halaman pengguna Anda",
        "tooltip-pt-anonuserpage": "Halaman pengguna IP Anda",
        "tooltip-pt-mytalk": "Halaman pembicaraan Anda",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bicara]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Tag ekstensi tidak dikenal \"$1\"",
        "duplicate-defaultsort": "Peringatan: Kunci pengurutan baku \"$2\" mengabaikan kunci pengurutan baku \"$1\" sebelumnya.",
        "duplicate-displaytitle": "<strong>Peringatan:</strong> Menampilkan judul \"$2\" menimpa judul tampilan \"$1\" sebelumnya.",
        "version": "Versi",
index 7aed2ff..0c2b29e 100644 (file)
        "watchlisttools-edit": "Kitaen ken urnosen ti listaan ti bambantayan",
        "watchlisttools-raw": "Urnosen ti naata a listaan ti bambantayan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tungtungan]])",
-       "unknown_extension_tag": "Di ammo a pagpaatiddog nga etiketa ti \"$1\"",
        "duplicate-defaultsort": "<strong>Ballag:</strong> Kasisigud a panagilasin ti \"$2\" ket tuonana ti immuna a kasisigud a panagilasin ti \"$1\".",
        "duplicate-displaytitle": "<strong>Ballaag:</strong> Ti maiparang a titulo ti \"$2\" ket tuonanna ti immmuna a maiparang a titulo ti \"$1\".",
        "invalid-indicator-name": "<strong>Biddut:</strong> Ti gupit ti <code>name</code> a panangipakita ti kasasaad ti panid ket nasken nga adda linaon.",
index e764962..afe883f 100644 (file)
        "watchlisttools-edit": "Skoða og breyta vaktlistanum",
        "watchlisttools-raw": "Breyta opnum vaktlistanum",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|spjall]])",
-       "unknown_extension_tag": "Óþekkt tákn \"$1\"",
        "duplicate-defaultsort": "'''Viðvörun:''' Sjálfgildur flýtihnappur \"$2\" tekur yfir fyrri flýtihnapp \"$1\".",
        "version": "Útgáfa",
        "version-extensions": "Uppsettar viðbætur",
index 00faf9d..0696ba7 100644 (file)
@@ -77,7 +77,8 @@
                        "C.R.",
                        "Elitre",
                        "Laurentius",
-                       "Macofe"
+                       "Macofe",
+                       "Ricordisamoa"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "pool-queuefull": "La coda del pool è piena",
        "pool-errorunknown": "Errore sconosciuto",
        "pool-servererror": "Il servizio contatore dei pool non è disponibile ($1).",
+       "poolcounter-usage-error": "Errore di utilizzo: $1",
        "aboutsite": "Informazioni su {{SITENAME}}",
        "aboutpage": "Project:Informazioni",
        "copyright": "Il contenuto è disponibile in base alla licenza $1, se non diversamente specificato.",
        "anoneditwarning": "<strong>Attenzione:</strong> Accesso non effettuato. Se effettuerai delle modifiche il tuo indirizzo IP sarà visibile pubblicamente. Se <strong>[$1 accedi]</strong> o <strong>[$2 crei un'utenza]</strong>, le tue modifiche saranno attribuite al tuo nome utente, insieme ad altri benefici.",
        "anonpreviewwarning": "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
        "missingsummary": "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata con l'oggetto vuoto.",
-       "selfredirect": "<strong>Attenzione:</strong> stai creando un redirect alla medesima voce.\nSe fai clic nuovamente su \"{{int:savearticle}}\", il redirect sarà creato.",
+       "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": "'''Attenzione:''' non è stata specificato l'oggetto/l'intestazione di questo commento. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza intestazione.",
        "summary-preview": "Anteprima dell'oggetto:",
        "content-model-text": "testo normale",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Oggetto vuoto",
+       "content-json-empty-array": "Array vuoto",
        "duplicate-args-category": "Pagine contenenti chiamate a template con parametri duplicati",
        "duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
        "history-feed-empty": "La pagina richiesta non esiste; potrebbe essere stata cancellata dal sito o rinominata. Verificare con la [[Special:Search|pagina di ricerca]] se vi sono nuove pagine.",
        "rev-deleted-comment": "(Oggetto della modifica rimosso)",
        "rev-deleted-user": "(nome utente rimosso)",
-       "rev-deleted-event": "(azione del log rimossa)",
+       "rev-deleted-event": "(dettagli del registro rimossi)",
        "rev-deleted-user-contribs": "[nome utente o indirizzo IP rimosso - edit nascosto dalla cronologia]",
        "rev-deleted-text-permission": "Questa versione della pagina è stata '''cancellata'''.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
        "rev-suppressed-text-permission": "Questa versione della pagina è stata '''soppressa'''.\nConsultare il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log delle soppressioni] per ulteriori dettagli.",
        "revdelete-legend": "Imposta le seguenti limitazioni sulle versioni cancellate:",
        "revdelete-hide-text": "Testo della versione",
        "revdelete-hide-image": "Nascondi i contenuti del file",
-       "revdelete-hide-name": "Nascondi azione e oggetto della stessa",
+       "revdelete-hide-name": "Nascondi obbiettivo e parametri",
        "revdelete-hide-comment": "Oggetto della modifica o motivazione dell'azione",
        "revdelete-hide-user": "Nome o indirizzo IP dell'autore",
        "revdelete-hide-restricted": "Nascondi le informazioni indicate anche agli amministratori",
        "uploaderror": "Errore nel caricamento",
        "upload-recreate-warning": "'Attenzione'': un file con questo nome è stato cancellato o spostato.'''\nIl log delle cancellazioni e degli spostamenti di questa pagina viene qui riportato per comodità:",
        "uploadtext": "Usare il modulo sottostante per caricare nuovi file. Per visualizzare o ricercare i file già caricati, consultare il [[Special:FileList|log dei file caricati]]. Caricamenti di file e di nuove versioni di file sono registrati nel [[Special:Log/upload|log degli upload]], le cancellazioni nell'[[Special:Log/delete|apposito]].\n\nPer inserire un file all'interno di una pagina, fare un collegamento di questo tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' per usare la versione completa del file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' per usare una versione larga 200 pixel inserita in un box, allineata a sinistra e con 'testo alternativo' come didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' per generare un collegamento diretto al file senza visualizzarlo",
-       "upload-permitted": "Tipi di file consentiti: $1.",
-       "upload-preferred": "Tipi di file consigliati: $1.",
-       "upload-prohibited": "Tipi di file non consentiti: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipo di file consentito|Tipi di file consentiti}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo di file consigliato|Tipi di file consigliati}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo di file non consentito|Tipi di file non consentiti}}: $1.",
        "uploadlogpage": "File caricati",
        "uploadlogpagetext": "Di seguito sono elencati gli ultimi file caricati.\nConsultare la [[Special:NewFiles|galleria dei nuovi file]] per una visione d'insieme.",
        "filename": "Nome del file",
        "deleteprotected": "Non puoi cancellare questa pagina perché è stata protetta.",
        "deleting-backlinks-warning": "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|altre pagine]] contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
        "rollback": "Annulla le modifiche",
-       "rollback_short": "Rollback",
        "rollbacklink": "rollback",
        "rollbacklinkcount": "rollback di {{PLURAL:$1|una modifica|$1 modifiche}}",
        "rollbacklinkcount-morethan": "rollback di più di {{PLURAL:$1|una modifica|$1 modifiche}}",
        "namespace": "Namespace:",
        "invert": "Inverti selezione",
        "tooltip-invert": "Seleziona questa casella per nascondere le modifiche alle pagine all'interno del namespace selezionato (ed il namespace associato, se selezionato)",
+       "tooltip-whatlinkshere-invert": "Seleziona questa casella per nascondere i collegamenti dalle pagine all'interno del namespace selezionato",
        "namespace_association": "Namespace associato",
        "tooltip-namespace_association": "Seleziona questa casella per includere anche la pagina di discussione o l'oggetto del namespace associato con il namespace selezionato",
        "blanknamespace": "(Principale)",
        "thumbnail-temp-create": "Impossibile creare il file temporaneo delle miniature",
        "thumbnail-dest-create": "Impossibile salvare la miniatura nella destinazione",
        "thumbnail_invalid_params": "Parametri miniatura non corretti",
+       "thumbnail_toobigimagearea": "File con dimensioni maggiori di $1",
        "thumbnail_dest_directory": "Impossibile creare la directory di destinazione",
        "thumbnail_image-type": "Tipo di immagine non supportato",
        "thumbnail_gd-library": "Configurazione incompleta della libreria GD: funzione $1 mancante",
        "import-logentry-interwiki": "ha trasferito da altra wiki la pagina $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|una versione importata|$1 versioni importate}} da $2",
        "javascripttest": "Sperimentazione JavaScript",
-       "javascripttest-title": "In esecuzione test per $1",
        "javascripttest-pagetext-noframework": "Questa pagina è riservata all'esecuzione di test di JavaScript.",
        "javascripttest-pagetext-unknownframework": "Framework di test sconosciuto \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Azione sconosciuta \"$1\".",
        "javascripttest-pagetext-frameworks": "Per cortesia, scegli uno dei seguenti framework per i test: $1",
        "javascripttest-pagetext-skins": "Scegli una skin con cui eseguire i test:",
        "javascripttest-qunit-intro": "Vedi su mediawiki.org la [$1 documentazione riguardante i test].",
-       "javascripttest-qunit-heading": "Suite di test di JavaScript per QUnit in MediaWiki",
        "tooltip-pt-userpage": "La tua pagina utente",
        "tooltip-pt-anonuserpage": "La pagina utente di questo indirizzo IP",
        "tooltip-pt-mytalk": "La tua pagina di discussione",
        "hebrew-calendar-m10": "Tammuz",
        "hebrew-calendar-m10-gen": "Tammuz",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussioni]])",
-       "unknown_extension_tag": "Tag estensione sconosciuto: \"$1\"",
        "duplicate-defaultsort": "Attenzione: la chiave di ordinamento predefinita \"$2\" sostituisce la precedente \"$1\".",
        "duplicate-displaytitle": "<strong>Attenzione:</strong> il titolo visualizzato \"$2\" sostituisce il precedente titolo \"$1\".",
        "invalid-indicator-name": "<strong>Errore:</strong> attributo <code>name</code> degli indicatori dello stato della pagina non può essere vuoto.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Percorso voci]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Percorso script]",
+       "version-libraries": "Librerie installate",
+       "version-libraries-library": "Libreria",
+       "version-libraries-version": "Versione",
        "redirect": "Reindirizzamento da file, utente, pagina o versione",
        "redirect-legend": "Reindirizza a un file o una pagina",
        "redirect-summary": "Questa pagina speciale reindirizza a un file (specificando il nome del file), a una pagina (specificando un ID di versione o un ID pagina) o a un utente (specificando un ID utente numerico).\nEsempi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "La versione che hai specificato non esiste.",
        "dberr-problems": "Questo sito sta avendo dei problemi tecnici.",
        "dberr-again": "Prova ad attendere qualche minuto e ricaricare.",
-       "dberr-info": "(Impossibile contattare il server del database: $1)",
-       "dberr-info-hidden": "(Impossibile contattare il server del database)",
+       "dberr-info": "(Impossibile accedere al server del database: $1)",
+       "dberr-info-hidden": "(Impossibile accedere al server del database)",
        "dberr-usegoogle": "Puoi provare a cercare su Google nel frattempo.",
        "dberr-outofdate": "Nota che la loro indicizzazione dei nostri contenuti potrebbe non essere aggiornata.",
        "dberr-cachederror": "Quella che segue è una copia cache della pagina richiesta, e potrebbe non essere aggiornata.",
index f6184c0..75cb69e 100644 (file)
@@ -61,7 +61,9 @@
                        "Rxy",
                        "Mfuji",
                        "Takot",
-                       "SkyDaisy9"
+                       "SkyDaisy9",
+                       "Los688",
+                       "朝彦"
                ]
        },
        "tog-underline": "リンクの下線:",
@@ -89,7 +91,7 @@
        "tog-shownumberswatching": "ページをウォッチしている利用者数を表示",
        "tog-oldsig": "既存の署名:",
        "tog-fancysig": "署名をウィキ文として扱う (自動リンクなし)",
-       "tog-uselivepreview": "ライブプレビューを使用 (開発中)",
+       "tog-uselivepreview": "ライブプレビューを使用",
        "tog-forceeditsummary": "要約欄が空欄の場合に確認を促す",
        "tog-watchlisthideown": "自分の編集をウォッチリストに表示しない",
        "tog-watchlisthidebots": "ボットによる編集をウォッチリストに表示しない",
        "pool-queuefull": "プールキューがいっぱいです",
        "pool-errorunknown": "不明なエラー",
        "pool-servererror": "プール カウンター サービスは利用できません ($1)。",
+       "poolcounter-usage-error": "使用法の誤り: $1",
        "aboutsite": "{{SITENAME}}について",
        "aboutpage": "Project:{{SITENAME}}について",
        "copyright": "特に記載がない限り、内容は$1のライセンスで利用できます。",
        "filerenameerror": "ファイル名を「$1」から「$2」へ変更できませんでした。",
        "filedeleteerror": "ファイル「$1」を削除できませんでした。",
        "directorycreateerror": "ディレクトリ「$1」を作成できませんでした。",
+       "directoryreadonlyerror": "ディレクトリー「$1」は読み取り専用です。",
+       "directorynotreadableerror": "ディレクトリー「$1」は読み取りできません。",
        "filenotfound": "ファイル「$1」が見つかりませんでした。",
        "unexpected": "予期しない値「$1」=「$2」です。",
        "formerror": "エラー: フォームを送信できませんでした。",
        "anoneditwarning": "<strong>警告:</strong> ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。<strong>[$1 ログイン]</strong>または<strong>[$2 アカウントを作成]</strong>すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。",
        "anonpreviewwarning": "<em>ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。</em>",
        "missingsummary": "<strong>注意:</strong> 編集内容の要約が空欄です。\n「{{int:savearticle}}」をもう一度クリックすると、編集内容は要約なしで保存されます。",
+       "selfredirect": "<strong>警告:</strong> あなたはこのページを自身に転送させようとしています。\n転送先の設定を間違ったか、あるいは間違ったページを編集しているかもしれません。\n「{{int:savearticle}}」を再度クリックすると、そのままの転送ページが作成されます。",
        "missingcommenttext": "以下にコメントを入力してください。",
        "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名/見出しが空欄です。\n「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
        "summary-preview": "要約のプレビュー:",
        "content-model-text": "プレーンテキスト",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "空のオブジェクト",
+       "content-json-empty-array": "空の配列",
        "duplicate-args-category": "テンプレート呼び出しで引数が重複しているページ",
        "duplicate-args-category-desc": "引数が重複したテンプレート呼び出しを含むページ。例: <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>、<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>",
        "expensive-parserfunction-warning": "<strong>警告:</strong> このページでは、高負荷なパーサー関数の呼び出し回数が多過ぎます。\n\n{{PLURAL:$2|呼び出しを $2 回}}未満にしてください ({{PLURAL:$1|現在は $1 回}})。",
        "history-feed-empty": "要求されたページは存在しません。\nこのウィキから既に削除されたか、名前が変更された可能性があります。\n[[Special:Search|このウィキの検索]]で関連する新しいページを探してみてください。",
        "rev-deleted-comment": "(要約は除去されています)",
        "rev-deleted-user": "(利用者名は除去されています)",
-       "rev-deleted-event": "(記録は除去されています)",
+       "rev-deleted-event": "(è¨\98é\8c²ã\81®è©³ç´°ã\81¯é\99¤å\8e»ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99)",
        "rev-deleted-user-contribs": "[利用者名またはIPアドレスは除去されました - その編集は投稿記録で非表示にされています]",
        "rev-deleted-text-permission": "この版は<strong>削除されています</strong>。\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
        "rev-suppressed-text-permission": "この版は<strong>秘匿されています</strong>。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
        "revdelete-legend": "閲覧レベル制限を設定",
        "revdelete-hide-text": "版の本文",
        "revdelete-hide-image": "ファイル内容を隠す",
-       "revdelete-hide-name": "操作および対象を隠す",
+       "revdelete-hide-name": "対象および引数を隠す",
        "revdelete-hide-comment": "編集の要約",
        "revdelete-hide-user": "投稿者の利用者名/IPアドレス",
        "revdelete-hide-restricted": "他の利用者と同様に管理者からもデータを隠す",
        "deleteprotected": "このページは保護されているため削除できません。",
        "deleting-backlinks-warning": "'''警告:''' 削除しようとしているページは、[[Special:WhatLinksHere/{{FULLPAGENAME}}|他のページ]]からリンクまたは参照読み込みされています。",
        "rollback": "編集を巻き戻し",
-       "rollback_short": "巻き戻し",
        "rollbacklink": "巻き戻し",
        "rollbacklinkcount": "$1{{PLURAL:$1|編集}}を巻き戻し",
        "rollbacklinkcount-morethan": "$1{{PLURAL:$1|編集}}以上を巻き戻し",
        "thumbnail-temp-create": "一時的なサムネイルファイルを作成できません",
        "thumbnail-dest-create": "サムネイルを保存先に保存できません",
        "thumbnail_invalid_params": "サムネイル引数が無効です",
+       "thumbnail_toobigimagearea": "$1よりも大きな寸法のファイル",
        "thumbnail_dest_directory": "出力ディレクトリを作成できません",
        "thumbnail_image-type": "対応していない画像形式です",
        "thumbnail_gd-library": "GDライブラリの構成が不完全です: 関数$1が不足",
        "import-logentry-interwiki": "$1をウィキ間移動しました",
        "import-logentry-interwiki-detail": "$2からインポート済みの$1{{PLURAL:$1|版}}",
        "javascripttest": "JavaScript をテスト中",
-       "javascripttest-title": "$1 のテストの実行",
        "javascripttest-pagetext-noframework": "このページは JavaScript のテストを実行するために予約されています。",
        "javascripttest-pagetext-unknownframework": "テストフレームワーク「$1」は不明です。",
+       "javascripttest-pagetext-unknownaction": "不明な操作「$1」。",
        "javascripttest-pagetext-frameworks": "以下のテストフレームワークから1つ選択してください: $1",
        "javascripttest-pagetext-skins": "テストを実行する外装を選択してください:",
        "javascripttest-qunit-intro": "mediawiki.org上の[$1 テストのドキュメント]を参照してください。",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit テストスイート",
        "tooltip-pt-userpage": "自分の利用者ページ",
        "tooltip-pt-anonuserpage": "自分が編集しているIPアドレスの利用者ページ",
        "tooltip-pt-mytalk": "自分のトークページ",
        "hebrew-calendar-m11-gen": "アブ",
        "hebrew-calendar-m12-gen": "エルール",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|トーク]])",
-       "unknown_extension_tag": "不明な拡張機能タグ「$1」です",
        "duplicate-defaultsort": "<strong>警告:</strong> 既定のソートキー「$2」が、その前に書かれている既定のソートキー「$1」を上書きしています。",
        "duplicate-displaytitle": "<strong>警告:</strong> DISPLAYTITLE「$2」が、その前に書かれているDISPLAYTITLE「$1」を上書きしています。",
+       "invalid-indicator-name": "<strong>エラー:</strong> ページ・ステータス・インディケーターの <code>name</code> 属性は空であってはいけません。",
        "version": "バージョン情報",
        "version-extensions": "インストール済み拡張機能",
        "version-skins": "インストール済み外装",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 記事のパス]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath スクリプトパス]",
+       "version-libraries": "インストールされているライブラリー",
+       "version-libraries-library": "ライブラリー",
+       "version-libraries-version": "バージョン",
        "redirect": "ファイル名、利用者ID、ページID、版IDでの転送",
        "redirect-legend": "ファイルまたはページヘの転送",
        "redirect-summary": "この特別ページは、ファイル (ファイル名を指定)、ページ (版 ID またはページ ID を指定)、利用者ページ (利用者 ID を整数で指定) に転送されます。使用例: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]]",
        "compare-revision-not-exists": "指定した版は存在しません。",
        "dberr-problems": "申し訳ありません! このウェブサイトに技術的な障害が発生しています。",
        "dberr-again": "数分間待った後、もう一度読み込んでください。",
-       "dberr-info": "(データベースサーバー $1 に接続できませんでした)",
-       "dberr-info-hidden": "(データベース サーバーと通信できません)",
+       "dberr-info": "(データベース $1 にアクセスできません)",
+       "dberr-info-hidden": "(データベースにアクセスできません)",
        "dberr-usegoogle": "元に戻るまで、Googleを利用して検索できます。",
        "dberr-outofdate": "収集された内容は古い可能性があることに注意してください。",
        "dberr-cachederror": "これは要求されたページをキャッシュした複製であり、古くなっている可能性があります。",
index 9b54920..ea98632 100644 (file)
        "pool-timeout": "ბლოკირების ლოდინის დრო ამოიწურა",
        "pool-queuefull": "მოთხოვნების დამგროვებელი სავსეა",
        "pool-errorunknown": "უცნობი შეცდომა",
+       "poolcounter-usage-error": "გამოყენების შეცდომა: $1",
        "aboutsite": "{{SITENAME}}-ის შესახებ",
        "aboutpage": "Project:შესახებ",
        "copyright": "შინაარსი წარმოდგენილია $1 პირობებით (თუ სხვა არ არის მითითებული).",
        "copyrightpage": "{{ns:project}}:საავტორო უფლებები",
        "currentevents": "მიმდინარე მოვლენები",
        "currentevents-url": "Project:მიმდინარე მოვლენები",
-       "disclaimers": "á\83\9eá\83\90á\83¡á\83£á\83®á\83\98á\83¡á\83\9bá\83\92á\83\94á\83\91á\83\9aá\83\9dá\83\91á\83\98á\83¡ á\83\9bá\83\9dá\83®á\83¡á\83\9cა",
+       "disclaimers": "á\83\9eá\83\90á\83¡á\83£á\83®á\83\98á\83¡á\83\9bá\83\92á\83\94á\83\91á\83\9aá\83\9dá\83\91á\83\98á\83¡ á\83£á\83\90á\83 á\83§á\83\9dá\83¤ა",
        "disclaimerpage": "Project:პასუხისმგებლობის უარყოფა",
        "edithelp": "დახმარება",
        "mainpage": "მთავარი გვერდი",
        "changeemail-none": "(არაფერი)",
        "changeemail-password": "თქვენი პაროლი პროექტში {{SITENAME}}:",
        "changeemail-submit": "ელ-ფოსტის შეცვლა",
+       "changeemail-throttled": "თქვენ უკვე ძალიან ბევრჯერ სცადეთ შესვლა.\nგთხოვთ, მოიცადოთ $1, სანამ კიდევ სცდიდეთ.",
        "resettokens-tokens": "ჟეტონები:",
        "resettokens-token-label": "$1 (მიმდინარე მნიშვნელობა: $2)",
        "bold_sample": "მუქი ტექსტი",
        "edit-conflict": "რედაქციების კონფლიქტი.",
        "edit-no-change": "თქვენი შესწორება არ იქნა შენახული, რადგანაც ტექსტის ცვლილება არ მოხდა.",
        "postedit-confirmation-created": "გვერდი შეიქმნა.",
+       "postedit-confirmation-restored": "გვერდი აღდგა.",
        "postedit-confirmation-saved": "თქვენი რედაქტირება შენახულია.",
        "edit-already-exists": "ახალი გვერდის შექმნა არ მოხერხდა.\nის უკვე არსებობს.",
        "defaultmessagetext": "შეტყობინების სტანდარტული ტექსტი",
        "invalid-content-data": "დაუშვებელი მონაცემები",
        "content-not-allowed-here": "„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე",
        "editwarning-warning": "სხვა გვერდზე გადასვლამ შესაძლოა გამოიწვიოს ცვლილებების დაკარგვა.\nთუკი თქვენ დარეგისტრირებული ხართ სისტემაში, მაშინ შეგიძლიათ გამორთოთ ეს გაფრთხილება თქვენი კონფიგურაციის განყოფილებაში „{{int:prefs-editing}}“ .",
+       "editpage-notsupportedcontentformat-title": "კონტენტის ფორმატი შეუსაბამოა.",
        "content-model-wikitext": "ვიკიტექსტი",
        "content-model-text": "ჩვეულებრივი ტექსტი",
        "content-model-javascript": "ჯავასკრიპტი",
        "content-model-css": "CSS",
+       "content-json-empty-object": "ცარიელი ობიექტი",
+       "content-json-empty-array": "ცარიელი ტაბლო",
        "duplicate-args-category": "გვერდები, რომლებიც იყენებენ დუბლიკატ არგუმენტებს თარგების გამოძახებისას",
        "duplicate-args-category-desc": "გვერდები, რომლებიც იყენებენ დუბლიკატ არგუმენტებს თარგების გამოძახებისას, როგორებიც არის <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ან <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
        "expensive-parserfunction-warning": "ყურადღება. მოცემული გვერდი შეიცავს ძალიან ბევრ მძიმე ფუნქციას.\n\nგამოძახებათა რაოდენობა შეზღუდულია $2 დონეზე.ამ შემთხვევაში უნდა გაკეთდეს  $1 გამოძახება.",
        "undo-success": "რედაქტირების გაუქმება შესაძლებელია. გთხოვთ შეამოწმოთ განსხვავება ქვევით, რათა დარწმუნდეთ, რომ ეს ის არის რაც თქვენ გსურთ, შემდეგ კი შეინახეთ ცვლილებები რათა დაასრულოთ რედაქტირების გაუქმება.",
        "undo-failure": "რედაქტირების გაუქმება შეუძლებელია კონფლიქტური შუალედური რედაქტირებების გამო.",
        "undo-norev": "რედაქტირება ვერ გაუქმდება რადგანაც არ არსებობს ან წაშლილი იქნა.",
+       "undo-nochange": "როგორც ჩანს, რედაქტირება უკვე გაუქმდა.",
        "undo-summary": "[[Special:Contributions/$2|$2-ის]]([[User talk:$2|განხილვა]]) ცვლილებების გაუქმება (№$1)",
        "cantcreateaccounttitle": "ანგარიშის შექმნა ვერ ხერხდება",
        "cantcreateaccount-text": "ამ IP-მისამართიდან აიკრძალა (<b>$1</b>) მომხმარებელ [[User:$3|$3]]-ის მიერ.\n\n$3 -ემ ამგვარი ახსნა : ''$2''",
        "searchrelated": "მიბმული",
        "searchall": "ყველა",
        "showingresults": "ქვემოთ იხილეთ <b>$1</b>-მდე შედეგი დაწყებული #<b>$2</b>-იდან.",
-       "search-nonefound": "á\83\9bá\83\9dá\83\97á\83®á\83\9dá\83\95á\83\9cá\83\98á\83¡ á\83¨á\83\94á\83¡á\83\90á\83\91á\83\90á\83\9bá\83\98á\83¡á\83\9dá\83\91á\83\90 á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\9cá\83\90á\83\9eá\83\9dá\83\95á\83\9cá\83\98.",
+       "search-nonefound": "á\83\9bá\83¡á\83\92á\83\90á\83\95á\83¡á\83\98 á\83\9bá\83\9dá\83\97á\83®á\83\9dá\83\95á\83\9cá\83\98á\83\97 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\95á\83\94á\83  á\83\9bá\83\9dá\83\98á\83«á\83\94á\83\91á\83\9cá\83\90.",
        "powersearch-legend": "გაფართოებული ძიება",
        "powersearch-ns": "ძიება სახელთა სივრცეებში:",
        "powersearch-togglelabel": "მონიშვნა:",
        "right-move": "გვერდების გადატანა",
        "right-move-subpages": "გვერდები გადამისამართდეს ქვეგვერდებთან ერთად",
        "right-move-rootuserpages": "მომხმარებელთა ძირი გვერდების გადატანა",
+       "right-move-categorypages": "კატეგორიის გვერდების გადატანა",
        "right-movefile": "ფაილების გადატანა",
        "right-suppressredirect": "არ იქმნება გადამისამართება ძველი სახელიდან გვერდითვის სახელის შეცვლის შემთხვევაში",
        "right-upload": "ფაილების ატვირთვა",
        "action-createpage": "გვერდების შექმნა",
        "action-createtalk": "განხილვის გვერდების შექმნა",
        "action-createaccount": "ამ ანგარიშის შექმნა",
+       "action-history": "ამ გვერდის ისტორიის ნახვა",
        "action-minoredit": "მონიშვნა, როგორც მცირე რედაქტირება",
        "action-move": "ამ გვერდის გადატანა",
        "action-move-subpages": "გვერდისა და მისი ქვეგვერდების გადატანა",
        "action-move-rootuserpages": "მომხმარებელთა საბაზისო გვერდების გადატანა",
+       "action-move-categorypages": "კატეგორიის გვერდების გადატანა",
        "action-movefile": "ფაილის გადატანა",
        "action-upload": "ამ ფაილის ატვირთვა",
        "action-reupload": "არსებულ ფაილზე გადაწერა",
        "enhancedrc-history": "ისტორია",
        "recentchanges": "ბოლო ცვლილებები",
        "recentchanges-legend": "ბოლო ცვლილებების პარამეტრები",
-       "recentchanges-summary": "á\83£á\83\97á\83\95á\83\90á\83\9aá\83\97á\83\95á\83\90á\83\9aá\83\94á\83\97 á\83\95á\83\98á\83\99á\83\98á\83¡ á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83¡ á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94.",
+       "recentchanges-summary": "á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\97á\83\95á\83\90á\83\9aá\83\98 á\83\90á\83\93á\83\94á\83\95á\83\9cá\83\9dá\83\97 á\83\95á\83\98á\83\99á\83\98á\83¡ á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83¡.",
        "recentchanges-noresult": "მითითებულ პერიოდსა და სახელთა სივრცეში ცვლილებები არ არის.",
        "recentchanges-feed-description": "ვიკის უახლესი ცვლილებების მეთვალყურეობა ამ არხში.",
        "recentchanges-label-newpage": "ამ რედაქტირებით შეიქმნა ახალი გვერდი",
        "license": "ლიცენზია:",
        "license-header": "ლიცენზია",
        "nolicense": "არაფერი არის მონიშნული",
+       "licenses-edit": "ლიცენზიის პარამეტრების რედაქტირება",
        "license-nopreview": "(წინასწარ გადახედვა არ არის ხელმისაწვდომი)",
        "upload_source_url": "(თქვენ აირჩიეთ სწორი, საზოგადოდ ხელმისაწვდომი URL)",
        "upload_source_file": "(თქვენ აირჩიეთ ფაილი თქვენი კომპიუტერიდან)",
        "randompage-nopages": "{{PLURAL:$2|სახელთა შემდეგი სივრცე|სახელთა შემდეგ სივრცეში}} \"$1\" არ არის გვერდები.",
        "randomincategory": "კატეგორიის შემთხვევითი გვერდი",
        "randomincategory-invalidcategory": "კატეგორია „$1“ არ არსებობს.",
+       "randomincategory-nopages": "კატეგორიაში [[:კატეგორია:$1|$1]] გვერდები არაა.",
+       "randomincategory-category": "კატეგორია:",
+       "randomincategory-legend": "შემთხვევითი გვერდი კატეგორიაში",
        "randomredirect": "ნებისმიერი გადამისამართება",
        "randomredirect-nopages": "სახელთა სივრცეში „$1“ არ არის გადამისამართებები.",
        "statistics": "სტატისტიკა",
        "pageswithprop-submit": "მიდი",
        "doubleredirects": "ორმაგი გადამისამართება",
        "doubleredirectstext": "ამ გვერდზე ჩამოთვლილია გვერდები, რომლებიც გადამისამართებულია სხვა გადამისამართების გვერდებზე.\nყოველი მწკრივი შეიცავს ბმულებს პირველ და მეორე გადამისამართებაზე, აგრეთვე მეორე გადამისამართების ტექსტის პირველ სტრიქონს, რომელშიც ჩვეულებრივ მითითებულია რეალური „სამიზნე“ გვერდის სათაური. საჭიროა, რომ პირველი გადამისამართებაც უთითებდეს ამ გვერდზე.\n<del>გადახაზული</del> მონაცემები უკვე გამართულია.",
-       "double-redirect-fixed-move": "[[$1]] á\83\92á\83\90á\83\93á\83\90á\83¢á\83\90á\83\9cá\83\98á\83\9a á\83\98á\83¥á\83\9cá\83\90.\ná\83\90á\83\9bá\83\9fá\83\90á\83\9bá\83\90á\83\93 á\83\98á\83¡ გადამისამართებულია [[$2]]-ზე.",
-       "double-redirect-fixed-maintenance": "ორმაგი გადამისამართების გასწორება [[$1]]დან [[$2]]ზე.",
+       "double-redirect-fixed-move": "[[$1]] á\83\92á\83\90á\83\93á\83\90á\83¢á\83\90á\83\9cá\83\98á\83\9a á\83\98á\83¥á\83\9cá\83\90.\ná\83\98á\83\92á\83\98 á\83\92á\83\90á\83\9cá\83\90á\83®á\83\9aá\83\93á\83\90 á\83\93á\83\90 á\83\90á\83\9bá\83\9fá\83\90á\83\9bá\83\90á\83\93 გადამისამართებულია [[$2]]-ზე.",
+       "double-redirect-fixed-maintenance": "á\83\9dá\83 á\83\9bá\83\90á\83\92á\83\98 á\83\92á\83\90á\83\93á\83\90á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\94á\83\91á\83\98á\83¡ á\83\90á\83\95á\83¢á\83\9dá\83\9bá\83\90á\83¢á\83£á\83 á\83\98 á\83\92á\83\90á\83¡á\83¬á\83\9dá\83 á\83\94á\83\91á\83\90 [[$1]]á\83\93á\83\90á\83\9c [[$2]]á\83\96á\83\94.",
        "double-redirect-fixer": "გადამისამართება შემსწორებელი",
        "brokenredirects": "გაწყვეტილი გადამისამართება",
        "brokenredirectstext": "შემდეგი გადამისამართებები გაკეთებულია არარსებულ გვერდებზე:",
        "pager-older-n": "{{PLURAL:$1|უფრო ძველი 1|უფრო ძველი $1}}",
        "suppress": "დამალვა",
        "querypage-disabled": "ეს სპეცგვერდი გამორთულია წარმადობის გასაზრდელად.",
+       "apihelp": "API დახმარება",
+       "apihelp-no-such-module": "მოდული „$1“ ვერ მოიძებნა.",
        "booksources": "წიგნის წყაროები",
        "booksources-search-legend": "წიგნის წყაროს ძებნა",
        "booksources-isbn": "ISBN:",
+       "booksources-search": "ძიება",
        "booksources-text": "ქვემოთ არის ვებ გვერდების ბმულების სია სადაც იყიდება ახალი და ნახმარი წიგნები, და შესაძლოა შეიცავდნენ დამატებით ინფორმაციას წიგნების შესახებ, რომლებსაც ეძებთ:",
        "booksources-invalid-isbn": "თქვენს მიერ მითითებული ISBN, შეცდომას შეიცავს.  შეამოწმეთ, თუ თავდაპირველი წყარო სწორადაა აკრეფილი.",
        "specialloguserlabel": "შემსრულებელი:",
        "listgrouprights-removegroup-self": "შეუძლია წაშალოს {{PLURAL:$2|ჯგუფი|ჯგუფები}} თავისი ანგარიშიდან: $1",
        "listgrouprights-addgroup-self-all": "შეუძლია ყელა ჯგუფია ჩამატება ანგარიშს.",
        "listgrouprights-removegroup-self-all": "შეუძლია თავისი ანგარიშის ყველა ჯგუფის წაშლა.",
+       "listgrouprights-namespaceprotection-header": "სახელთა სივრცის შეზღუდვები",
        "listgrouprights-namespaceprotection-namespace": "სახელთა სივრცე",
        "trackingcategories-name": "შეტყობინების სახელი",
        "trackingcategories-nodesc": "აღწერა არ არის.",
        "delete-warning-toobig": "ამ გვერდს ძალიან გრძელი ისტორია გააჩნია,  $1 {{PLURAL:$1|ვერსიაზე|ვერსიიებზე|ვერსიებზე}} მეტი.\nმისმა წაშლამ შესაძლოა გამოიწვიოს საიტის მონაცემთა ბაზის  {{SITENAME}} არაკორექტული მუშაობა;\nიმოქმედეთ სიფრთხილით.",
        "deleting-backlinks-warning": "'''გაფრთხილება:''' რამდენიმე სხვა გვერდი დაკავშირებულია ამ წასაშლელ გვერდთან.",
        "rollback": "ცვლილებების გაუქმება",
-       "rollback_short": "სწრაფი გაუქმება",
        "rollbacklink": "სწრაფი გაუქმება",
        "rollbacklinkcount": "$1 {{PLURAL:$1|ცვლილების|ცვლილების}} გაუქმება",
        "rollbacklinkcount-morethan": "$1-ზე მეტი {{PLURAL:$1|ცვლილების|ცვლილების}} გაუქმება",
        "import-logentry-interwiki": "„$1“ — ტრანსვიკი იმპორტი",
        "import-logentry-interwiki-detail": "$1 ცვლილება $2-დან",
        "javascripttest": "JavaScript-ის ტესტირება",
-       "javascripttest-title": "მიმდინარეობს $1-ის ტესტირება",
        "javascripttest-pagetext-noframework": "ეს გვერდი დარეგისტრირებულია JavaScript-ის ტესტების გასაშვებად.",
        "javascripttest-pagetext-unknownframework": "„$1-ის“ ტესტირების უცნობი გარემო.",
+       "javascripttest-pagetext-unknownaction": "უცნობი ქმედება „$1“.",
        "javascripttest-pagetext-frameworks": "გთხოვთ, აირჩიეთ ტესტირების ერთ-ერთი შემდეგი გარემო: $1",
        "javascripttest-pagetext-skins": "ტესტების გასაშვებად აირჩიეთ გაფორმების თემა:",
        "javascripttest-qunit-intro": "იხილეთ [$1 ტესტირების დოკუმენტები] mediawiki.org-ზე.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit-ის ტესტების კრებული",
        "tooltip-pt-userpage": "თქვენი მომხმარებლის გვერდი",
        "tooltip-pt-anonuserpage": "ჩემი IP-ის მქონე მომხმარებლის გვერდი",
        "tooltip-pt-mytalk": "თქვენი განხილვის გვერდი",
        "exif-attributionurl": "ამ სამუშაოს გამოყენებისას, გთხოვთ, დატოვეთ ბმული",
        "exif-preferredattributionname": "ამ სამუშაოს გამოყენებისას, გთხოვთ, მიუთითეთ",
        "exif-pngfilecomment": "PNG ფაილის კომენტარი",
-       "exif-disclaimer": "á\83\9eá\83\90á\83¡á\83£á\83®á\83\98á\83¡á\83\9bá\83\92á\83\94á\83\91á\83\9aá\83\9dá\83\91á\83\98á\83¡ á\83\9bá\83\9dá\83®á\83¡á\83\9cა",
+       "exif-disclaimer": "á\83\9eá\83\90á\83¡á\83£á\83®á\83\98á\83¡á\83\9bá\83\92á\83\94á\83\91á\83\9aá\83\9dá\83\91á\83\98á\83¡ á\83£á\83\90á\83 á\83§á\83\9dá\83¤ა",
        "exif-contentwarning": "გაფრთხილება შინაარსის შესახებ",
        "exif-giffilecomment": "GIF ფაილის კომენტარი",
        "exif-intellectualgenre": "ობიექტის ტიპი",
        "watchlisttools-raw": "კონტროლის სიის რედაქტირება ტექსტის ფორმატში",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|განხილვა]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "უცნობი დამატების «$1» თეგი",
        "duplicate-defaultsort": "'''ყურადღება.'''სორტირების გასაღებს «$2»-ს გააჭრის წინა გასაღებს «$1»-ს.",
        "version": "ვერსია",
        "version-extensions": "დაყენებული გაფართოებები",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath გზა სტატიისაკენ]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath გზა სკრიპტისაკენ]",
+       "version-libraries": "დაინსტალირებული ბიბლიოთეკები",
+       "version-libraries-library": "ბიბლიოთეკა",
+       "version-libraries-version": "ვერსია",
        "redirect": "გადამისამართება ფაილიდან, მომხმარებლიდან, გვერდიდან ან ვერსიის იდენტიფიკატორიდან",
        "redirect-legend": "გადამისამართება ფაილზე ან გვერდზე",
        "redirect-submit": "მიდი",
index 48dbf78..a801a36 100644 (file)
@@ -10,7 +10,8 @@
                        "Salem333",
                        "Teak",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "SalemB"
                ]
        },
        "tog-underline": "Derrer izdayen:",
        "category_header": "Isebtar deg taggayt \"$1\"",
        "subcategories": "Adutaggayin",
        "category-media-header": "Media deg taggayt \"$1\"",
-       "category-empty": "''Taggayt-agi d tilemt.''",
+       "category-empty": "<em>Taggayt agi ur tesɛa asebtar, adu-taggayt neɣ afaylu agetmedia.</em>",
        "hidden-categories": "{{PLURAL:$1|Taggayt yeffren|Taggayin yeffren}}",
        "hidden-category-category": "Taggayin yeffren",
        "category-subcat-count": "Taggayt agi tesɛa {{PLURAL:$2|adu-taggayt|$2 adu-taggayin, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}}}} ddaw agi.",
        "errorpagetitle": "Agul",
        "returnto": "Uɣal ar $1.",
        "tagline": "Seg {{SITENAME}}",
-       "help": "Tallat",
+       "help": "Tallalt",
        "search": "Nadi",
        "searchbutton": "Nadi",
        "go": "Ẓer",
        "imagepage": "Ẓer asebter n tugna",
        "mediawikipage": "Ẓer asebter n izen",
        "templatepage": "Ẓer asebter n talɣa",
-       "viewhelppage": "Ẓer asebter n tallat",
+       "viewhelppage": "Ẓer asebter n tallalt",
        "categorypage": "Ẓer asebter n taggayin",
        "viewtalkpage": "Ẓer amyannan",
        "otherlanguages": "S tutlayin tiyaḍ",
        "currentevents-url": "Project:Isallen",
        "disclaimers": "Iɣtalen",
        "disclaimerpage": "Project:Iɣtalen",
-       "edithelp": "Tallat deg ubeddel",
+       "edithelp": "Tallalt deg ubeddel",
        "mainpage": "Asebter amenzawi",
        "mainpage-description": "Asebter amenzawi",
        "policy-url": "Project:Ilugan",
        "nstab-image": "Afaylu",
        "nstab-mediawiki": "Izen",
        "nstab-template": "Talɣa",
-       "nstab-help": "Tallat",
+       "nstab-help": "Tallalt",
        "nstab-category": "Taggayt",
        "nosuchaction": "Tigawt ulac-itt",
        "nosuchactiontext": "Wiki ur teɛqil ara tigawt-nni n URL",
        "accmailtitle": "Awal n tbaḍnit yettwazen.",
        "accmailtext": "Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetweceggaɛ i $2.\nYezmer ad yetbeddel ɣef usebtar [[Special:ChangePassword|Abeddel n awal uɛddi]] sakin tuqqna.",
        "newarticle": "(Amaynut)",
-       "newarticletext": "Tḍefreḍ azday ɣer usebter mazal ur yettwaxleq ara.\nAkken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar\n(ẓer [$1 asebter n tallat] akken ad tessneḍ kter).\nMa tɣelṭeḍ, wekki kan ɣef tqeffalt \"Back/Précédent\" n browser/explorateur inek.",
+       "newarticletext": "Tḍefreḍ azday ɣer usebter mazal ur yettwaxleq ara.\nAkken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar\n(ẓer [$1 asebter n tallalt] akken ad tessneḍ kter).\nMa tɣelṭeḍ, wekki kan ɣef tqeffalt \"Back/Précédent\" n browser/explorateur inek.",
        "anontalkpagetext": "---- ''Wagi d asebter n umyennan n useqdac adrig, mazal ur d-yesnufa ara amiḍan. I taɣẓint agi, ilaq an seqdec tansa IP ines iwakken at-id n sulu. Yiwet tansa IP tezmer at tettuseqdac sɣur aṭṭas n iseqdacen. Lukan ula d kečč aqla-k amseqdac adrig dɣa ur tebɣiḍ ara ad tettwabcreḍ izen am wigini, ihi [[Special:UserLogin/signup|snulfud amiḍan]] naɣ [[Special:UserLogin|qqened]] iwakken sya d asawen ur t-illint ara uguren n usulu.''",
        "noarticletext": "Ulac aḍris deg usebter-agi, tzemreḍ ad [[Special:Search/{{PAGENAME}}|tnadiḍ ɣef wezwel n usebter-agi]] deg isebtar wiyaḍ neɣ [{{fullurl:{{FULLPAGENAME}}|action=edit}} tettbeddileḍ asebter-agi].",
        "noarticletext-nopermission": "Imira ulac aḍris deg usebter agi.\nTzemreḍ [[Special:Search/{{PAGENAME}}|ad nadiḍ ɣef azwel agi]] deg isebtaren nniḍen,\nnaɣ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|asebter={{FULLPAGENAMEE}}}} ad nadiḍ deg iɣmisen iqqenen]</span>.",
        "tooltip-ca-nstab-image": "Ẓer asebter n tugna",
        "tooltip-ca-nstab-mediawiki": "Ẓer izen n system",
        "tooltip-ca-nstab-template": "Ẓer talɣa",
-       "tooltip-ca-nstab-help": "Ẓer asebter n tallat",
+       "tooltip-ca-nstab-help": "Ẓer asebter n tallalt",
        "tooltip-ca-nstab-category": "Ẓer asebter n taggayt",
        "tooltip-minoredit": "Wagi d abeddel afessas",
        "tooltip-save": "Smekti ibeddlen inek",
        "watchlisttools-edit": "Ẓer u beddel umuɣ n uɛessi",
        "watchlisttools-raw": "Beddel umuɣ n uɛessi (raw)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|amyannan]])",
-       "unknown_extension_tag": "Ticṛeṭ n usiɣzef « $1 » warisem",
        "duplicate-defaultsort": "Ɣur-wet : tasarut n ufran m-ulac « $2 » atsefεej tasarut n uqbel « $1 ».",
        "version": "Lqem",
        "version-extensions": "Isiɣzaf i serkeben",
index d3c9690..8c8088e 100644 (file)
@@ -8,7 +8,8 @@
                        "Daniyar",
                        "GaiJin",
                        "Kaztrans",
-                       "Balnur.s"
+                       "Balnur.s",
+                       "Нұрлан Рахымжанов"
                ]
        },
        "tog-underline": "Сілтеменің астын сызу:",
        "blankarticle": "<strong>Ескерту:</strong> Сіз бастамақшы болған бет бос.\nЕгер сіз «{{int:savearticle}}» дегенші қайта шертсеңіз бет қандайда бір мағлұматсыз басталады.",
        "anoneditwarning": "<strong> Ескерту:</strong>  Сіз жүйеге кірмегенсіз.\nIP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.",
        "anonpreviewwarning": "<em>Сіз жүйеге кірмегенсіз. IP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.</em>",
-       "missingsummary": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:</strong> Ó¨Ò£Ð´ÐµÐ¼ÐµÐ½Ñ\96Ò£ Ò\9bÑ\8bÑ\81Ò\9bаÑ\88а Ñ\82үйÑ\96ндемеÑ\81Ñ\96н ÐµÐ½Ð³Ñ\96збепÑ\81Ñ\96з.\n«{{int:savearticle}}» Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ò\9bайÑ\82а Ð±Ð°Ñ\81Ñ\81аңÑ\8bз Ó©Ò£Ð´ÐµÐ½Ð¼ÐµÒ£Ñ\96з Ñ\82үйÑ\96ндемеÑ\81Ñ\96з Ñ\81аÒ\9bÑ\82аладÑ\8b.",
+       "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "missingcommenttext": "Пікіріңізді төменге енгізіңіз.",
        "missingcommentheader": "<strong>Ескерту:</strong> Бұл пікірге тақырыпы/бас жолы жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "summary-preview": "Қысқаша түйіндемесін қарап шығу:",
        "yourtext": "Мәтініңіз",
        "storedversion": "Сақталған нұсқасы",
        "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Юникод белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
-       "editingold": "<strong>Ескерту: Осы беттің бұрыңғы нұсқасын өңдеудесіз.</strong>\nБұны сақтасаңыз осы нұсқадан кейінгі барлық өзгерістер жоғалады.",
+       "editingold": "<strong>Ескерту: Осы беттің бұрынғы нұсқасын өңдеудесіз.</strong> Бұны сақтасаңыз осы нұсқадан кейінгі барлық өзгерістер жоғалады.",
        "yourdiff": "Айырмашылықтар",
        "copyrightwarning": "{{SITENAME}} жобасына қосқан барлық үлестеріңіз $2 (көбірек ақпарат үшін: $1) аясында жарияланатынын ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін және ақысыз көпшілікке таралуын қаламасаңыз мұнда жарияламаңыз<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!</strong>",
        "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!",
        "delete-warning-toobig": "Бұл бетте үлкен өңдеу тарихы бар, $1 {{PLURAL:$1|түзетуден|түзетуден}} астам.\nБұның жоюы {{SITENAME}} торабындағы дерекқор әрекеттерді үзіп тастауын мүмкін;\nбұны абайлап өткізіңіз.",
        "deleting-backlinks-warning": "'''Ескерту:''' Сіз жоймақшы болған бетке [[Special:WhatLinksHere/{{FULLPAGENAME}}|басқа беттерден]] сілтенген немесе [[Special:WhatLinksHere/{{FULLPAGENAME}}|басқа беттерге]] кірістірілген.",
        "rollback": "Өңдемелерді шегіндіру",
-       "rollback_short": "Шегіндіру",
        "rollbacklink": "шегіндіру",
        "rollbacklinkcount": "$1 {{PLURAL:$1|өңдемені|өңдемені}} шегіндіру",
        "rollbacklinkcount-morethan": "$1-нан аса {{PLURAL:$1|өңдемені|өңдемелерді}} шегіндіру",
        "undelete-fieldset-title": "Нұсқаларды қалпына келтіру",
        "undeleteextrahelp": "Толық бет тарихын қалпына келтіру үшін барлық құсбелгі көздерді босатып <strong><em>{{int:undeletebtn}}</em></strong> батырмасын нұқыңыз.\nБөлектеумен қалпына келтіруді орындау үшін қалпына келтіру керек түзетулеріне сәйкес көздерге құсбелгімен белгілеп <strong><em>{{int:undeletebtn}}</em></strong> батырмасын басыңыз.",
        "undeleterevisions": "$1 түзету мұрағатталды",
-       "undeletehistory": "Ð\95геÑ\80 Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\81еңÑ\96з Ñ\82аÑ\80иÑ\85Ñ\8bна Ð±Ð°Ñ\80лÑ\8bÒ\9b Ñ\82үзеÑ\82Ñ\83леÑ\80 Ð´Ðµ Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\96ледÑ\96. \nÐ\95геÑ\80 Ð¶Ð¾Ñ\8eдан Ñ\81оң Ð´Ó\99л Ñ\81олай Ð°Ñ\82аÑ\83Ñ\8bмен Ð¶Ð°Ò£Ð° Ð±ÐµÑ\82 Ð±Ð°Ñ\81Ñ\82алÑ\81а Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\96лген Ñ\82үзеÑ\82Ñ\83леÑ\80 Ð±Ò±Ñ\80Ñ\8bÒ£ғы өңделу тарихында көрсетіледі.",
+       "undeletehistory": "Ð\95геÑ\80 Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\81еңÑ\96з Ñ\82аÑ\80иÑ\85Ñ\8bндаÒ\93Ñ\8b Ð±Ð°Ñ\80лÑ\8bÒ\9b Ñ\82үзеÑ\82Ñ\83леÑ\80 Ð´Ðµ Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\96ледÑ\96. Ð\95геÑ\80 Ð¶Ð¾Ñ\8eдан Ñ\81оң Ð´Ó\99л Ñ\81олай Ð°Ñ\82аÑ\83Ñ\8bмен Ð¶Ð°Ò£Ð° Ð±ÐµÑ\82 Ð±Ð°Ñ\81Ñ\82алÑ\81а Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\96лген Ñ\82үзеÑ\82Ñ\83леÑ\80 Ð±Ò±Ñ\80Ñ\8bнғы өңделу тарихында көрсетіледі.",
        "undeleterevdel": "Егер бұл үстіңгі бетте аяқталса, не файл түзетуі жарым-жартылай жойылған болса, жою болдырмауы орындалмайды.\nОсындай жағдайларда, ең жаңа жойылған түзетуін алып тастауыңыз не жасыруын болдырмауыңыз жөн.",
        "undeletehistorynoadmin": "Бұл бет жойылған.\nЖою себебі алдындағы өңдеген қатысушылар егжей-тегжейлерімен бірге төмендегі қысқаша мазмұндамасында көрсетілген.\nМына жойылған түзетулерін көкейкесті мәтіні тек әкімшілерге жетімді.",
        "undelete-revision": "$4,  $5  кезіндегі $3 жойған $1 дегеннің жойылған түзетуі:",
        "blocklogtext": "Бұл қатысушыларды бұғаттау және бұғаттауынан босату әрекеттерінің журналы.\nӨздіктік бұғатталған IP мекенжайлар тізімделмеген.\nҚазіргі уақыттағы белсенді тиымдар мен бұғаттауларды [[Special:BlockList|бұғаттау тізімінен]] қараңыз.",
        "unblocklogentry": "$1 есімді қатысушыны бұғаттауынан босатты",
        "block-log-flags-anononly": "тек аноним қатысушылар",
-       "block-log-flags-nocreate": "тіркелуін өшіріді",
+       "block-log-flags-nocreate": "тіркелуін өшірді",
        "block-log-flags-noautoblock": "автобұғаттау өшірілген",
        "block-log-flags-noemail": "е-пошта өшірілген",
        "block-log-flags-nousertalk": "өз талқылау бетін өңдей алмайтындай ету",
        "databasenotlocked": "Дерекқор құлыпталған жоқ.",
        "move-page": "«$1» дегенді жылжыту",
        "move-page-legend": "Бетті жылжыту",
-       "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\nҚаласаңыз, бұрыңғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n</strong>Ескерту!</strong>\nБұл көп қаралатын бет үшін қатаң және күтілмеген өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
-       "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\n[[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
+       "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз. Беттің бұрынғы атауы жаңа бетке айдағыш сілтеме ретінде қалады. Қаласаңыз, бұрынғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз. Жылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз. Егер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет - бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрынғы атауына қайтаруды мүмкін ету үшін жасалған. </strong>Ескерту!</strong> Бұл көп қаралатын бет үшін қатаң және күтпеген өзгеріс болуы мүмкін; ілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
+       "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз. Беттің бұрынғы атауы жаңа бетке айдағыш сілтеме ретінде қалады. [[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз. Жылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз. Егер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту \"'орындалмайды\"'. Бұл шара әлдеқашаннан бар, беттің қайта жазылуынан сақтайды. Алайда, егер бет - бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрынғы атауына қайтаруды мүмкіндік беру үшін жасалған. \"'Ескерту!\"' Бұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін; ілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetalktext": "Келесі жағдай орын алса, қатысты талқылау беті '''жылжытылмайды''':\n*жаңа атаумен аталатын беттің талқылау беті әлдеқашан бар болған кезде (бұл жағдайда талқылауын қолмен көшіруге болады, бірақ түйіндемесіне қай беттен көшірілгендігін міндетті түрде жазыңыз)\n*төмендегі қорапшадан құсбелгі алынып тасталғанда.\n\nАл мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
        "movearticle": "Бетті жылжыту:",
        "moveuserpage-warning": "<strong>Ескерту:</strong> Сіз қатысушы бетін жылжытпақшысыз. Назар аударыңыз, қатысушы беті ғана жылжытылуы мүмкін және қатысушы аты <em>өзгертілмейді</em>.",
-       "movecategorypage-warning": "<strong>Ескерту:</strong> Сіз санат бетінің атауын өзгерткелі жатырсыз. Бұл әрекетіңізде санат атауы ғана өзгерте аласыз сондықтан санаттың бұрыңғы атауындағы қандай да бір бет санаттың жаңа атауына өздігінен <em>санатталмайтыны</em> есіңізде болсын. Санаттың бұрыңғы атауындағы беттері мен санатшаларын жаңа атауына қайта санаттап шығуға тура келеді.",
+       "movecategorypage-warning": "<strong>Ескерту:</strong> Сіз санат бетінің атауын өзгерткелі жатырсыз. Бұл әрекетіңізде санат атауы ғана өзгерте аласыз, сондықтан санаттың бұрынғы атауындағы қандай да бір бет санаттың жаңа атауына өздігінен <em>санатталмайтыны</em> есіңізде болсын. Санаттың бұрынғы атауындағы беттері мен санатшаларын жаңа атауына қайта санаттап шығуға тура келеді.",
        "movenologintext": "Бетті жылжыту үшін тіркелген қатысуышы болуыңыз және [[Special:UserLogin|кіруіңіз]] керек.",
        "movenotallowed": "{{SITENAME}} жобасында беттерді жылжытуға рұқсатыңыз жоқ.",
        "movenotallowedfile": "Файлдарды жылжытуға рұқсатыңыз жоқ.",
        "tooltip-feed-atom": "Бұл беттің Atom арнасы",
        "tooltip-t-contributions": "Осы қатысушының үлестерінің тізімі",
        "tooltip-t-emailuser": "Осы қатысушыға хат жөнелту",
+       "tooltip-t-info": "Бұл бет туралы көбірек мәлімет",
        "tooltip-t-upload": "Файлдарды жүктеу",
        "tooltip-t-specialpages": "Барлық арнайы беттер тізімі",
        "tooltip-t-print": "Бұл беттің басып шығарышқа арналған нұсқасы",
        "hebrew-calendar-m11-gen": "абтың",
        "hebrew-calendar-m12-gen": "айлолдың",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|талқылауы]])",
-       "unknown_extension_tag": "Белгісіз кеңейтпе белгісі \"$1\"",
        "version": "Нұсқа",
        "version-extensions": "Орнатылған кеңейтімдер",
        "version-skins": "Орнатылған мәнерлер",
        "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-rights-rights": "$1 $3 Ò¯Ñ\88Ñ\96н Ñ\82оп Ð¼Ò¯Ñ\88елÑ\96гÑ\96н $4 Ð´ÐµÐ³ÐµÐ½Ð½ÐµÐ½ $5 Ð´ÐµÐ³ÐµÐ½Ð³Ðµ {{GENDER:$2|өзгеÑ\80Ñ\82Ñ\82Ñ\96}}",
        "logentry-rights-rights-legacy": "$1 $3 үшін топ мүшелігін {{GENDER:$2|өзгерті}}",
        "logentry-upload-upload": "$1 $3 файлын {{GENDER:$2|жүктеді}}",
+       "logentry-upload-overwrite": "$1 $3 дегеннің жаңа нұсқасын {{GENDER:$2|жүктеді}}",
        "rightsnone": "(ешқандай)",
        "revdelete-summary": "өңдеменің қысқаша мазмұндамасы",
        "feedback-subject": "Тақырып:",
index 86ad9fb..2cca3e1 100644 (file)
        "hebrew-calendar-m10-gen": "tımozdıñ",
        "hebrew-calendar-m11-gen": "abtıñ",
        "hebrew-calendar-m12-gen": "aýloldıñ",
-       "unknown_extension_tag": "Tanılmağan keñeýtpe belgisi «$1»",
        "version": "Jüýe nusqası",
        "version-extensions": "Ornatılğan keñeýtimder",
        "version-specialpages": "Arnaýı better",
index 0d10bec..b6cd802 100644 (file)
        "watchlisttools-edit": "មើលនិងកែប្រែបញ្ជីតាមដាន",
        "watchlisttools-raw": "កែប្រែបញ្ជីតាមដានឆៅ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ការពិភាក្សា]])",
-       "unknown_extension_tag": "ស្លាក​នៃផ្នែកបន្ថែម \"$1\" មិនស្គាល់",
        "version": "កំណែ",
        "version-extensions": "ផ្នែកបន្ថែមដែលបានដំឡើង",
        "version-skins": "សំបក",
        "specialpages-group-wiki": "ទិន្នន័យនិងឧបករណ៍",
        "specialpages-group-redirects": "ទំព័របញ្ជូនបន្តពិសេសៗ",
        "specialpages-group-spam": "ឧបករណ៍ស្ព៊ែម",
+       "specialpages-group-developer": "ឧបករណ៍​អ្នកអភិវឌ្ឍ",
        "blankpage": "ទំព័រទទេ",
        "intentionallyblankpage": "ទំព័រនេះត្រូវបានទុកចោលឱ្យនៅទំនេរដោយចេតនា",
        "tags": "ស្លាក​បំលាស់​ប្ដូរ​ដែល​មាន​សុពលភាព​",
index 60b7594..6f9c049 100644 (file)
@@ -70,7 +70,7 @@
        "tog-shownumberswatching": "주시하는 사용자 수 보이기",
        "tog-oldsig": "현재 서명:",
        "tog-fancysig": "서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)",
-       "tog-uselivepreview": "실시간 미리 보기 사용하기 (실험 기능)",
+       "tog-uselivepreview": "실시간 미리 보기 사용하기",
        "tog-forceeditsummary": "편집 요약을 쓰지 않았을 때 알려주기",
        "tog-watchlisthideown": "주시문서 목록에서 내 편집을 숨기기",
        "tog-watchlisthidebots": "주시문서 목록에서 봇 편집을 숨기기",
        "badtitletext": "요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
        "perfcached": "다음 자료는 캐시된 것이며 최신이 아닐 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 한 개|결과 $1개}}가 있습니다.",
        "perfcachedts": "다음 자료는 캐시된 것으로, $1에 마지막으로 업데이트되었습니다. 캐시에 최대 {{PLURAL:$4|결과 한 개|결과 $4개}}가 있습니다.",
-       "querypage-no-updates": "이 문서의 ì\83\88ë¡\9c ê³ ì¹¨ì\9d´ í\98\84ì\9e¬ ë¹\84í\99\9cì\84±í\99\94ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9e\90ë£\8cê°\80 ì\9e ì\8b\9c ì\83\88ë¡\9c ê³ ì¹\98ì§\80 ì\95\8aì\9d\84 ê²\83ì\9e\85ë\8b\88ë\8b¤.",
+       "querypage-no-updates": "이 문서의 ê°±ì\8b ì\9d´ í\98\84ì\9e¬ ì¤\91ì§\80ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9e\90ë£\8cê°\80 ì\9e ì\8b\9c ê°±ì\8b ë\90\98ì§\80 ì\95\8aì\9d\84 ê²\83ì\9e\85ë\8b\88ë\8b¤.",
        "viewsource": "원본 보기",
        "viewsource-title": "$1 문서 원본 보기",
        "actionthrottled": "동작 중지",
        "viewsourcetext": "문서의 원본을 보거나 복사할 수 있습니다:",
        "viewyourtext": "이 문서에 남긴 '''내 편집''' 내용을 보거나 복사할 수 있습니다:",
        "protectedinterface": "이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.\n모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
-       "editinginterface": "<strong>경고</strong>: 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.\n이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.\n모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/ translatewiki.net]에 참여하시기 바랍니다.",
+       "editinginterface": "<strong>경고</strong>: 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.\n이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.",
        "translateinterface": "모든 위키를 위해 번역을 추가하거나 바꾸려면, 미디어위키 지역화 프로젝트인 [//translatewiki.net/ translatewiki.net]을 사용해 주시기 바랍니다.",
        "cascadeprotected": "이 문서는 다음 \"연쇄적\" 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다:\n$2",
        "namespaceprotected": "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
        "anoneditwarning": "<strong>경고:</strong> 로그인하고 있지 않습니다. 편집하면 당신의 IP 주소가 공개적으로 보여집니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 만들면]</strong>, 당신의 편집에 다른 이익과 함께, 사용자 이름이 표시됩니다.",
        "anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
        "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
+       "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
        "missingcommentheader": "'''알림:''' 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
        "summary-preview": "요약 미리 보기:",
        "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하려면 계정이 존재하는지 확인해주세요.",
        "userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
        "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참고하십시오:",
-       "clearyourcache": "'''참고:''' 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* '''파이어폭스 / 사파리''': ''Shift'' 키를 누르면서 새로 고침을 클릭하거나, ''Ctrl-F5'' 또는 ''Ctrl-R'' 을 입력 (Mac에서는 ''⌘-R'')\n* '''구글 크롬''': ''Ctrl-Shift-R''키를 입력 (Mac에서는 ''⌘-Shift-R'')\n* '''인터넷 익스플로러''': ''Ctrl'' 키를 누르면서 새로 고침을 클릭하거나, ''Ctrl-F5''를 입력.\n* '''오페라''': ''도구→설정''에서 캐시를 비움",
+       "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>Firefox / Safari</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>Google Chrome</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>Opera</strong>: <em>도구→설정</em>에서 캐시를 비움",
        "usercssyoucanpreview": "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "userjsyoucanpreview": "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "usercsspreview": "'''사용자 CSS의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
        "content-model-text": "일반 텍스트",
        "content-model-javascript": "자바스크립트",
        "content-model-css": "CSS",
+       "content-json-empty-object": "빈 오브젝트",
+       "content-json-empty-array": "빈 배열",
        "duplicate-args-category": "중복된 인수를 사용한 틀의 호출을 포함한 문서",
        "duplicate-args-category-desc": "문서에 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>나 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>와 같은, 인수를 중복하여 사용한 틀 호출을 포함합니다.",
        "expensive-parserfunction-warning": "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.\n\n$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
        "last": "이전",
        "page_first": "처음",
        "page_last": "마지막",
-       "histlegend": "비교하려는 판을 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: '''({{int:cur}})''' = 최신 판과 비교, '''({{int:last}})''' = 이전 판과 비교, '''{{int:minoreditletter}}'''= 사소한 편집",
+       "histlegend": "비교하려는 판을 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
        "history-fieldset-title": "역사 찾아보기",
        "history-show-deleted": "삭제된 것만",
        "histfirst": "오래됨",
        "history-feed-empty": "요청한 문서가 존재하지 않습니다.\n해당 문서가 삭제되었거나, 문서 이름이 바뀌었을 수 있습니다.\n[[Special:Search|위키의 검색]]을 사용해 관련 문서를 찾아보세요.",
        "rev-deleted-comment": "(편집 요약 삭제됨)",
        "rev-deleted-user": "(사용자 이름 삭제됨)",
-       "rev-deleted-event": "(기록 동작이 제거됨)",
+       "rev-deleted-event": "(기록 정보가 제거됨)",
        "rev-deleted-user-contribs": "[사용자 이름 또는 IP 주소 삭제됨 -  기여 목록에서 편집이 숨겨짐]",
        "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-suppressed-text-view": "이 문서의 판은 <strong>숨겨져</strong> 있습니다.\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-deleted-unhide-diff": "비교하려는 판 가운데 <strong>삭제</strong>된 판이 있습니다. 자세한 내용은 [{{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}}/suppress|page={{FULLPAGENAMEE}}}} 해당 숨김 기록]에서 찾아볼 수 있습니다.",
+       "rev-suppressed-diff-view": "비교하려는 판 가운데 <strong>숨겨진</strong> 판이 있습니다.\n숨겨진 판과 이 판의 편집 비교를 할 수 있습니다. 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 찾아볼 수 있습니다.",
        "rev-delundel": "보이기/숨기기",
        "rev-showdeleted": "보이기",
        "revisiondelete": "판 삭제/되살리기",
        "revdelete-legend": "보이기 제한을 설정",
        "revdelete-hide-text": "판 문자열",
        "revdelete-hide-image": "파일을 숨기기",
-       "revdelete-hide-name": "ëª\85ë ¹ ë\82´ì\9a©ê³¼ ë\8c\80ì\83\81ì\9d\84 숨기기",
+       "revdelete-hide-name": "ëª\85ë ¹ ë\82´ì\9a©ê³¼ ë³\80ì\88\98를 숨기기",
        "revdelete-hide-comment": "편집 요약",
        "revdelete-hide-user": "편집자의 사용자 이름/IP 주소",
        "revdelete-hide-restricted": "관리자도 보지 못하게 숨기기",
        "mergehistory-from": "원본 문서:",
        "mergehistory-into": "대상 문서:",
        "mergehistory-list": "합칠 수 있는 문서 역사",
-       "mergehistory-merge": "[[:$1]] ë¬¸ì\84\9cì\9d\98 ë\8b¤ì\9d\8c í\8c\90ì\9d´ [[:$2]] ë¬¸ì\84\9cë¡\9c í\95©ì¹  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\në³\91í\95©í\95\98ë ¤ë\8a\94 í\8c\90ê³¼ ê·¸ ì\9d´ì \84ì\9d\98 í\8c\90ì\9d\84 ì\84 í\83\9dí\95\98ì\8b\9c려면 ë\9d¼ë\94\94ì\98¤ ë²\84í\8a¼ì\9d\84 ì\9d´ì\9a©í\95´ì£¼ì\84¸ì\9a\94.\n둘러보기 링크를 이용하는 것은 이 문서를 초기화시킬 것입니다.",
+       "mergehistory-merge": "[[:$1]] ë¬¸ì\84\9cì\9d\98 ë\8b¤ì\9d\8c í\8c\90ì\9d\84 [[:$2]] ë¬¸ì\84\9cë¡\9c í\95©ì¹  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\në\9d¼ë\94\94ì\98¤ ë²\84í\8a¼ì\9c¼ë¡\9c ì\84 í\83\9dí\95\9c í\8c\90ê³¼ ê·¸ ì\9d´ì \84í\8c\90ì\9d´ í\95©ì³\90ì§\91ë\8b\88ë\8b¤.\n둘러보기 링크를 이용하는 것은 이 문서를 초기화시킬 것입니다.",
        "mergehistory-go": "합칠 수 있는 편집 보기",
        "mergehistory-submit": "판 합치기",
        "mergehistory-empty": "합칠 수 있는 판이 없습니다.",
        "right-bot": "봇의 편집으로 취급",
        "right-nominornewtalk": "토론 문서에 사소한 편집으로 새 메시지를 보낼 수 없음",
        "right-apihighlimits": "API 상한 상승",
-       "right-writeapi": "API 작성",
+       "right-writeapi": "쓰기 API 사용",
        "right-delete": "문서 삭제",
        "right-bigdelete": "문서 역사가 긴 문서를 삭제",
        "right-deletelogentry": "특정 기록 항목을 삭제 및 되살리기",
        "right-protect": "보호 수준 바꾸기 및 연쇄 보호된 문서 편집",
        "right-editprotected": "\"{{int:protect-level-sysop}}\"로 보호된 문서 편집",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"로 보호된 문서 편집",
+       "right-editcontentmodel": "문서의 콘텐츠 모델을 편집",
        "right-editinterface": "사용자 인터페이스를 편집",
        "right-editusercssjs": "다른 사용자의 CSS와 자바스크립트 문서를 편집",
        "right-editusercss": "다른 사용자의 CSS 문서를 편집",
        "action-viewmywatchlist": "내 주시문서 목록 보기",
        "action-viewmyprivateinfo": "내 개인 정보 보기",
        "action-editmyprivateinfo": "내 개인 정보 편집",
+       "action-editcontentmodel": "문서의 콘텐츠 모델을 편집",
        "nchanges": "$1개 {{PLURAL:$1|바뀜}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|마지막 방문 이후}} $1개",
        "enhancedrc-history": "역사",
        "badfilename": "파일 이름이 \"$1\"로 바뀌었습니다.",
        "filetype-mime-mismatch": "\".$1\" 파일 확장자와 이 파일의 MIME 형식($2)이 일치하지 않습니다.",
        "filetype-badmime": "\"$1\" MIME 형식을 가진 파일은 올릴 수 없습니다.",
-       "filetype-bad-ie-mime": "이 파일을 올릴 수 없습니다. 인터넷 익스플로러가 잠재적으로 위험한 파일 형식으로 판단하여 사용이 금지된 \"$1\"로 인식할 수 있습니다.",
+       "filetype-bad-ie-mime": "이 파일을 올릴 수 없습니다. Internet Explorer가 잠재적으로 위험한 파일 형식으로 판단하여 사용이 금지된 \"$1\"로 인식할 수 있습니다.",
        "filetype-unwanted-type": "'''\".$1\"''' 확장자는 권장하지 않습니다.\n권장하는 {{PLURAL:$3|파일 확장자}}는 $2입니다.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.\n$2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.",
        "filetype-missing": "파일에 확장자(\".jpg\" 등)가 없습니다.",
        "protectedpages-timestamp": "시간 기록",
        "protectedpages-page": "문서",
        "protectedpages-expiry": "만료 기한",
-       "protectedpages-performer": "사용자를 보호",
+       "protectedpages-performer": "보호한 사용자",
        "protectedpages-params": "보호 변수",
        "protectedpages-reason": "이유",
        "protectedpages-unknown-timestamp": "알 수 없음",
        "deletereasonotherlist": "다른 이유",
        "deletereason-dropdown": "* 일반적인 삭제 이유\n** 스팸\n** 문서 훼손 행위\n** 저작권 침해\n** 작성자의 요청\n** 깨진 넘겨주기",
        "delete-edit-reasonlist": "삭제 이유 편집",
-       "delete-toobig": "ì\9d´ ë¬¸ì\84\9cì\97\90ë\8a\94 {{PLURAL:$1|í\8e¸ì§\91 ì\97­ì\82¬}}ê°\80 $1ê°\9c ì\9e\88ì\8aµë\8b\88ë\8b¤.\ní\8e¸ì§\91 ì\97­ì\82¬ê°\80 ê¸´ ë¬¸ì\84\9c를 ì\82­ì \9cí\95\98ë©´ {{SITENAME}}ì\97\90 í\81° í\98¼ë\9e\80ì\9d\84 ì¤\84 ì\88\98 ì\9e\88기 ë\95\8c문ì\97\90 ì\82­ì \9cí\95  ì\88\98 ì\97\86ì\8aµ니다.",
+       "delete-toobig": "ì\9d´ ë¬¸ì\84\9cì\97\90ë\8a\94 {{PLURAL:$1|í\8e¸ì§\91 ì\97­ì\82¬}}ê°\80 $1ê°\9c ì\9d´ì\83\81 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n{{SITENAME}}ì\97\90 ì\9d\98ë\8f\84í\95\98ì§\80 ì\95\8aì\9d\80 í\98¼ë\9e\80ì\9d\84 ì¤\84 ì\88\98 ì\9e\88기 ë\95\8c문ì\97\90 ì\9d´ë\9f° ë¬¸ì\84\9cì\9d\98 ì\82­ì \9cë\8a\94 ì \9cí\95\9cë\90©니다.",
        "delete-warning-toobig": "이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.\n편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.\n주의해 주세요.",
        "deleteprotected": "이 문서가 잠겨 있기 때문에 삭제할 수 없습니다.",
        "deleting-backlinks-warning": "'''경고:''' 삭제하려는 문서가 [[Special:WhatLinksHere/{{FULLPAGENAME}}|다른 문서]]에 링크되어 있거나 끼워져 있습니다.",
        "rollback": "편집 되돌리기",
-       "rollback_short": "되돌리기",
        "rollbacklink": "되돌리기",
        "rollbacklinkcount": "{{PLURAL:$1|편집}} $1회 되돌리기",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|편집}} $1회 이상 되돌리기",
        "thumbnail-temp-create": "임시 섬네일 파일을 만들 수 없습니다",
        "thumbnail-dest-create": "대상 경로에 섬네일을 저장할 수 없습니다.",
        "thumbnail_invalid_params": "섬네일 변수가 잘못되었습니다",
+       "thumbnail_toobigimagearea": "$1 이상의 파일 용량",
        "thumbnail_dest_directory": "새 목적 디렉터리를 만들 수 없습니다.",
        "thumbnail_image-type": "그림 형식이 지원되지 않습니다",
        "thumbnail_gd-library": "GD 라이브러리 설정이 잘못되었습니다: $1 함수를 찾을 수 없습니다.",
        "import-logentry-interwiki": "$1 문서를 다른 위키에서 가져왔습니다",
        "import-logentry-interwiki-detail": "$2에서 {{PLURAL:$1|판}} $1개를 가져왔습니다",
        "javascripttest": "자바스크립트 테스트",
-       "javascripttest-title": "$1 테스트 실행",
        "javascripttest-pagetext-noframework": "이 문서는 자바스크립트 테스트를 실행하기 위한 용도로 할당되어 있습니다.",
        "javascripttest-pagetext-unknownframework": "실험용 프레임워크 \"$1\"를 알 수 없습니다.",
        "javascripttest-pagetext-frameworks": "다음 실험용 프레임워크 중 하나를 선택하세요: $1",
        "javascripttest-pagetext-skins": "실험할 스킨을 선택하세요:",
        "javascripttest-qunit-intro": "mediawiki.org의 [$1 테스트 설명서]를 참고하세요.",
-       "javascripttest-qunit-heading": "미디어위키 자바스크립트 QUnit 실험군",
        "tooltip-pt-userpage": "내 사용자 문서",
        "tooltip-pt-anonuserpage": "현재 사용하는 IP 주소의 사용자 문서",
        "tooltip-pt-mytalk": "내 토론 문서",
        "pageinfo-header-edits": "편집 역사",
        "pageinfo-header-restrictions": "문서 보호",
        "pageinfo-header-properties": "문서 속성",
-       "pageinfo-display-title": "ë³´ì\97¬ì¤\84 ì\9d´ë¦\84",
+       "pageinfo-display-title": "ë³´ì\97¬ì¤\84 ì \9c목",
        "pageinfo-default-sort": "기본 정렬 키",
        "pageinfo-length": "문서 길이 (바이트)",
        "pageinfo-article-id": "문서 ID",
        "watchlisttools-edit": "주시문서 목록 보기/편집하기",
        "watchlisttools-raw": "주시문서 목록 직접 편집하기",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|토론]])",
-       "unknown_extension_tag": "알 수 없는 확장 기능 태그 \"$1\"",
        "duplicate-defaultsort": "'''경고:''' 기본 정렬 키 \"$2\"가 이전의 기본 정렬 키 \"$1\"를 덮어쓰고 있습니다.",
        "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 제목 표시는 기존의 표시되는 제목 \"$1\"을 덮어씁니다.",
        "invalid-indicator-name": "<strong>오류:</strong> 문서 상태 표시기의 <code>name</code> 특성은 비어 있지 않아야 합니다.",
        "tags-tag": "태그 이름",
        "tags-display-header": "바뀜 목록의 모양",
        "tags-description-header": "태그에 대한 설명",
-       "tags-active-header": "í\99\9cì\84±í\95\98ê² ì\8aµë\8b\88ê¹\8c?",
+       "tags-active-header": "í\99\9cì\84±í\99\94 ì\97¬ë¶\80",
        "tags-hitcount-header": "태그된 바뀜",
        "tags-active-yes": "예",
        "tags-active-no": "아니오",
        "logentry-newusers-create": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-create2": "$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-byemail": "$3 사용자 계정을 $1님이 {{GENDER:$2|만들었고}} 비밀번호는 이메일로 보냈습니다",
-       "logentry-newusers-autocreate": "$1 ì\82¬ì\9a©ì\9e\90 ê³\84ì \95ì\9d\84 ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c {{GENDER:$2|ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤}}",
+       "logentry-newusers-autocreate": "$1 사용자 계정을 자동으로 {{GENDER:$2|만들었습니다}}",
        "logentry-rights-rights": "$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-rights-legacy": "$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-autopromote": "$1 사용자의 권한을 자동적으로 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
        "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
        "api-error-publishfailed": "내부 오류: 서버가 임시 파일을 게시하지 못했습니다.",
        "api-error-stasherror": "파일을 안전한 곳으로 업로드 하는 동안 오류가 발생했습니다.",
+       "api-error-stashzerolength": "서버는 파일을 저장하지 못했는데, 파일의 용량이 0이기 때문입니다.",
        "api-error-stashnotloggedin": "파일을 업로드하기 위해 로그인이 필요합니다.",
        "api-error-timeout": "서버가 제 시간 내에 응답하지 않았습니다.",
        "api-error-unclassified": "알 수 없는 오류가 발생했습니다.",
        "log-name-pagelang": "언어 바꾸기 기록",
        "log-description-pagelang": "문서 언어를 바꾼 기록입니다.",
        "logentry-pagelang-pagelang": "$1 사용자가 $3의 문서 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}.",
-       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 스킨이 포함된 것으로 보입니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 프로그램]을 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 스킨을 모두 활성화하려면 <code>LocalSettings.php</code> 안에 다음 줄을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
-       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 프로그램]을 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
+       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 스킨이 포함된 것으로 보입니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 스킨을 모두 활성화하려면 <code>LocalSettings.php</code> 안에 다음 줄을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
+       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (활성화)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''비활성화''')",
        "mediastatistics": "미디어 통계",
index 65fa28a..079d75c 100644 (file)
        "hebrew-calendar-m12": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Klaafe]])",
        "timezone-utc": "<i lang=\"en\">UTC</i>",
-       "unknown_extension_tag": "„<code>$1</code>“ es en zosäzlejje Kennzeichnung, die kenne mer nit.",
        "duplicate-defaultsort": "'''Opjepaß:'''\nDä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlößel „$2“.",
        "duplicate-displaytitle": "<strong>opjepaß:</strong> Dä Nahme „$2“ övverschriev dä fröjere Nahme „$1“ för zem Aanzeije.",
        "version": "Väsjohn vun de Wiki Soffwär zeije",
index 282de51..633acdf 100644 (file)
        "pool-timeout": "Timeout bis d'Spär opgehuewen ass",
        "pool-queuefull": "Pool-Queue ass voll",
        "pool-errorunknown": "Onbekannte Feeler",
+       "poolcounter-usage-error": "Benotzungsfeeler: $1",
        "aboutsite": "Iwwer {{SITENAME}}",
        "aboutpage": "Project:Iwwer",
        "copyright": "Den Inhalt ass ënner $1 disponibel wann et net anescht uginn ass.",
        "viewyourtext": "Dir kënnt de Quelltext vun '''Ären Ännerungen''' op dëser Säit kucken a kopéieren:",
        "protectedinterface": "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.\n\nFir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
        "editinginterface": "<strong>Opgepasst:</strong> Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. \nÄnnerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn.",
+       "translateinterface": "Fir Iwwersetzunge fir all Wikien z'änneren oder dobäizesetze benotzt w.e.g.  [//translatewiki.net/ translatewiki.net], de Projet fir d'Lokalisatioun vu MediaWiki.",
        "cascadeprotected": "Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:\n$2",
        "namespaceprotected": "Dir hutt net déi néideg Rechter fir d'Säiten am Nummraum '''$1''' ze änneren.",
        "customcssprotected": "Dir hutt net d'Recht dës CSS-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
        "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Bnotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
        "anonpreviewwarning": "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
        "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
-       "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung op deeselwechten Artikel.\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung ugeluecht.",
+       "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": "'''Denkt drun:''' Dir hutt keen Titel/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:",
        "content-model-text": "Kloertext",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Eidelen Objet",
        "expensive-parserfunction-warning": "'''Opgepasst:'' Dës Säit huet ze vill Ufroe vu komplexe Parserfunktiounen.\n\nEt däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|ass et $1 Ufro|sinn et $1 Ufroe}}.",
        "expensive-parserfunction-category": "Säiten, déi komplex Parserfunktiounen ze dacks opruffen",
        "post-expand-template-inclusion-warning": "Opgepasst: D'Gréisst vun den agebonnene Schablounen ass ze grouss, e puer Schabloune kënnen net agebonne ginn.",
        "history-feed-empty": "Déi ugefrote Säit gëtt et net.\nVläicht gouf se geläscht oder geréckelt.\n[[Special:Search|Sicht]] op {{SITENAME}} no relevanten neie Säiten.",
        "rev-deleted-comment": "(Resumé vun der Ännerung ewechgeholl)",
        "rev-deleted-user": "(Benotzernumm ewechgeholl)",
-       "rev-deleted-event": "(Aktioun aus dem Logbuch erausgeholl)",
+       "rev-deleted-event": "(Detailer aus dem Logbuch erausgeholl)",
        "rev-deleted-user-contribs": "[Benotzernumm oder IP-Adress ewechgeholl - Ännerung an der Lescht vun de Kontributioune verstoppt]",
        "rev-deleted-text-permission": "Dës Versioun vun der Säit gouf '''geläscht'''.\nDir fannt eventuell méi Informatiounen an der [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsch-Logbuch].",
        "rev-suppressed-text-permission": "Dës Versioun vun der Säit gouf <strong>geläscht</strong>..\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsch-Logbuch].",
        "revdelete-legend": "Limitatioune fir d'Sichtbarkeet festleeën",
        "revdelete-hide-text": "Text vun der Versioun",
        "revdelete-hide-image": "Bildinhalt verstoppen",
-       "revdelete-hide-name": "Logbuch-Aktioun verstoppen",
+       "revdelete-hide-name": "Zil a Parametere verstoppen",
        "revdelete-hide-comment": "Resumé vun der Ännerung",
        "revdelete-hide-user": "Dem Auteur säi Benotzernumm/IP-Adress",
        "revdelete-hide-restricted": "Donnéeën och fir Administrateuren suppriméieren geneesou wéi fir déi Aner",
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "showingresults": "Hei gesitt der  {{PLURAL:$1| '''1''' Resultat|'''$1''' Resultater}}, ugefaange mat #'''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> of <strong>$3</strong>|Resultater <strong>$1 - $2</strong> vu(n) <strong>$3</strong>}}",
        "search-nonefound": "Fir Är Ufro gouf näischt fonnt.",
        "powersearch-legend": "Erweidert Sich",
        "powersearch-ns": "Sichen an den Nummraim:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Ënnerscheeder",
        "prefs-help-prefershttps": "Dës Astellung gëtt déi nächste Kéier wierksam wou Dir Iech ageloggt.",
+       "prefswarning-warning": "Dir hutt Ännerunge vun Ären Astellunge gemaach, déi nach net gespäichert goufen.\n\nWann Dir vun dëser Säit erof gitt ouni op \"$1\" ze klicken, da ginn Är Astellungen net aktualiséiert.",
        "prefs-tabs-navigation-hint": "Tipp: Dir kënnt d'Feiler no lénks an no riets benotze fir tëscht den Tabs an der Lëscht vun den Tabs ze navigéieren.",
        "email-address-validity-valid": "D'E-Mail-Adress schéngt valabel ze sinn",
        "email-address-validity-invalid": "Gitt eng valabel E-Mail-Adress an",
        "action-viewmywatchlist": "kuckt Är Iwwerwaachungslëscht",
        "action-viewmyprivateinfo": "Är privat Informatioune kucken",
        "action-editmyprivateinfo": "Är privat Informatiounen änneren",
+       "action-editcontentmodel": "de Modell vum Inhalt vun enger Säit änneren",
        "nchanges": "$1 {{PLURAL:$1|Ännerung|Ännerungen}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|zanter dem leschte Passage}}",
        "enhancedrc-history": "Versiounen",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
-       "rclistfrom": "Nei Ännerunge vu(n) $3 $2 u weisen",
+       "rclistfrom": "Nei Ännerunge vum $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
        "rcshowhideminor-show": "Weisen",
        "rcshowhideminor-hide": "Verstoppen",
        "uploaderror": "Feeler bäim Eroplueden",
        "upload-recreate-warning": "'''Opgepasst: E Fichier mat deem Numm gouf scho geläscht oder geréckelt.'''\n\nHei fannt Dir en Extrait aus dem Läsch- a Réckel-Logbuch fir dëse Fichier.",
        "uploadtext": "Benotzt dëse Formulaire, fir nei Fichieren eropzelueden.\nGitt op d'[[Special:FileList|Lëscht vun den eropgeluedene Fichieren]], fir no Fichieren ze sichen déi virdrun eropgeluede goufen, Eropluedunge fannt dir an der [[Special:Log/upload|Lëscht vun den eropgeluedene Fichieren]], geläscht Fichiere stinn am [[Special:Log/delete|Läschlog]].\n\nFir e '''Bild''' op enger Säit ze benotzen, schreift amplaz vum Bild eng vun dëse Formelen:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.jpg]]</nowiki></code>''' fir déi ganz Versioun vum Fichier ze benotzen\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.png|200px|thumb|left|alt text]]</nowiki></code>''' fir eng 200 Pixel breet Versioun an enger Këscht am lénke Rand mat 'alt text' als Beschreiwung\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichier.ogg]]</nowiki></code>''' fir e Fichier direkt ze verlinken ouni de Fichier ze weisen",
-       "upload-permitted": "Erlaabt Formater vun de Fichieren: $1.",
-       "upload-preferred": "Fichierszorten déi am beschte funktionéieren: $1.",
-       "upload-prohibited": "Verbuede Fichiers Formater: $1.",
+       "upload-permitted": "{{PLURAL:$2|Erlaabten Typ|Erlaabt Type}} vu Fichieren: $1.",
+       "upload-preferred": "{{PLURAL:$2|Fichierszort|Fichierszorten}} déi am beschte {{PLURAL:$2|funktionéiert|funktionéieren}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Verbuedene|Verbuede}} Fichiers {{PLURAL:$2|Format|Formater}}: $1.",
        "uploadlogpage": "Logbuch vum Eroplueden",
        "uploadlogpagetext": "Dëst ass d'Lëscht vun de rezente Fichieren déi eropgeluede goufen.\nKuckt [[Special:NewFiles|d'Gallerie vun de neie Fichieren]] wann Dir méi e visuellen Iwwerbléck wëllt",
        "filename": "Numm vum Fichier",
        "enotif_lastvisited": "All Ännerungen op ee Bléck: $1",
        "enotif_lastdiff": "Kuckt $1 fir dës Ännerung.",
        "enotif_anon_editor": "Anonyme Benotzer $1",
-       "enotif_body": "Léiwe $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT\n\nDen Editeur kontaktéieren:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEt gi soulaang keng weider Maile geschéckt, bis Dir d'Säit nees emol besicht hutt wärend deem Dir ageloggt sidd.\nOp Ärer Iwwerwaachungslëscht kënnt Dir all Noriichtemarkeren zesummen zrécksetzen.\n\n\nÄre frëndlechen {{SITENAME}} Noriichtessystem\n\n--\n\nFir d'Astellungen op Ären E-Mailnoriichten z'änneren, besicht w.e.g.\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nFir d'Astellunge vun Ärer Iwwerwaachungslëscht z'änneren, besicht w.e.g.\n{{canonicalurl:Special:Watchlist/edit}}\n\nFeedback a weider Hëllef:\n$HELPPAGE",
+       "enotif_body": "Léiwe $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT\n\nDen Editeur kontaktéieren:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEt gi soulaang keng weider Maile geschéckt, bis Dir d'Säit nees emol besicht hutt wärend deem Dir ageloggt sidd.\nOp Ärer Iwwerwaachungslëscht kënnt Dir all Noriichtemarkeren zesummen zrécksetzen.\n\n\nÄre frëndleche(n) {{SITENAME}} Noriichtessystem\n\n--\n\nFir d'Astellungen op Ären E-Mailnoriichten z'änneren, besicht w.e.g.\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nFir d'Astellunge vun Ärer Iwwerwaachungslëscht z'änneren, besicht w.e.g.\n{{canonicalurl:Special:Watchlist/edit}}\n\nFeedback a weider Hëllef:\n$HELPPAGE",
        "created": "gemaach",
        "changed": "geännert",
        "deletepage": "Säit läschen",
        "deleteprotected": "Dir däerft dëst Säit net läsche well se gespaart ass.",
        "deleting-backlinks-warning": "'''Opgepasst:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Aner Säite]] linken op déi Säit déi Dir am Gaang sidd ze läschen oder déi Säit Déi Dir am Gaang sidd ze läschen ass an aner Säiten agebonn.",
        "rollback": "Ännerungen zrécksetzen",
-       "rollback_short": "Zrécksetzen",
        "rollbacklink": "Zrécksetzen",
        "rollbacklinkcount": "{{PLURAL:$1|Eng Ännerung|$1 Ännerungen}} zrécksetzen",
        "rollbacklinkcount-morethan": "méi wéi {{PLURAL:$1|Eng Ännerung|$1 Ännerungen}} zrécksetzen",
        "thumbnail-temp-create": "Den temporäre Fichier fir d'Minitaurbild konnt net ugeluecht ginn",
        "thumbnail-dest-create": "D'Miniatur bild konnt net do gespäichert gi wou dat virgesinn ass",
        "thumbnail_invalid_params": "Ongëlteg Miniatur-Parameter",
+       "thumbnail_toobigimagearea": "Fichier mat Dimensioune méi grouss wéi $1",
        "thumbnail_dest_directory": "Den Zilepertoire konnt net ugeluecht ginn.",
        "thumbnail_image-type": "Bildtyp gëtt net ënnerstëtzt",
        "thumbnail_gd-library": "D'Konfiguratioun vun der GD-Bibliothéik (GD library) ass net komplett: D'Funktioun $1 feelt",
        "import-logentry-interwiki": "huet $1 importéiert (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Versioun|Versiounen}} importéiert vu(n) $2",
        "javascripttest": "JavaScript-Test",
-       "javascripttest-title": "$1-Tester ginn elo gemaach",
        "javascripttest-pagetext-noframework": "Dës Säit ass fir Java-Script-Tester reservéiert.",
        "javascripttest-pagetext-unknownframework": "Onbekannten Test-Framework \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Onbekannt Aktioun \"$1\".",
        "javascripttest-pagetext-frameworks": "Sicht w.e.g. eng vun dësen Test-Strukturen eraus: $1",
        "javascripttest-pagetext-skins": "Sicht en Interface (skin) eraus fir d'Tester ze maachen:",
        "javascripttest-qunit-intro": "Kuckt d'[$1 Dokumentatioun vun den Tester] op mediawiki.org",
-       "javascripttest-qunit-heading": "JavaScript-QUnit Testserie op MediaWiki",
        "tooltip-pt-userpage": "Är Benotzersäit",
        "tooltip-pt-anonuserpage": "Benotzersäit vun der IP-Adress vun där aus Dir den Ament Ännerunge maachtt",
        "tooltip-pt-mytalk": "Är Diskussiounssäit",
        "tooltip-pt-mycontris": "Lëscht vun Äre Kontributiounen",
        "tooltip-pt-login": "Sech umelle gëtt gäre gesinn, Dir musst et awer net maachen.",
        "tooltip-pt-logout": "Ofmellen",
+       "tooltip-pt-createaccount": "Et gëtt Iech geroden e Benotzerkont unzeleeën an Iech anzeloggen; dat ass awer net obligatoresch",
        "tooltip-ca-talk": "Diskussioun iwwer de Säiteninhalt",
        "tooltip-ca-edit": "Dës Säit ka geännert ginn. Maacht vun der Méiglechkeet Gebrauch fir ze \"kucken ouni ofzespäicheren\" a kuckt ob alles an der Rei ass ier der ofspäichert.",
        "tooltip-ca-addsection": "En neien Abschnitt ufänken.",
        "watchlisttools-edit": "Iwwerwaachungslëscht weisen an änneren",
        "watchlisttools-raw": "Net-formatéiert Iwwerwaachungslëscht änneren",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussioun]])",
-       "unknown_extension_tag": "Onbekannten Erweiderungs-Tag \"$1\"",
        "duplicate-defaultsort": "'''Opgepasst:''' Den Zortéierschlëssel \"$2\" iwwerschreift de virege Standard-Zortéierschlëssel \"$1\".",
        "duplicate-displaytitle": "<strong>Opgepasst:</strong> Den Titel dee gewise gëtt \"$2\" iwwerschreift deen Titel dee virdru gewise gouf \"$1\".",
        "version": "Versioun",
        "version-entrypoints": "URLe vun Agangspunkten",
        "version-entrypoints-header-entrypoint": "Agangspunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Installéiert Bibliothéiken",
+       "version-libraries-library": "Bibliothéik",
+       "version-libraries-version": "Versioun",
        "redirect": "Viruleedung duerch e Fichier, e Benotzer, eng Säit oder eng Versiouns-ID",
        "redirect-legend": "Viruleedung op ee Fichier oder eng Säit",
        "redirect-summary": "Dës Spezialsäit ass eng Viruleedung op e Fichier (Fichiersnumm uginn), eng Säit (Versiounsnummer uginn) oder eng Benotzersäit (numeresch Benotzeridentifikatioun uginn).\nGebrauch: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], oder [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "D'Versioun déi Dir uginn hutt gëtt et net.",
        "dberr-problems": "Pardon! Dëse Site huet technesch Schwieregkeeten.",
        "dberr-again": "Versicht e puer Minutten ze waarden an dann nei ze lueden.",
-       "dberr-info": "(Den Datebank-Server kann net erreecht ginn: $1)",
-       "dberr-info-hidden": "(Den Datebank-Server kann net erreecht ginn)",
+       "dberr-info": "(D'Datebank kann net erreecht ginn: $1)",
+       "dberr-info-hidden": "(D'Datebank kann net erreecht ginn)",
        "dberr-usegoogle": "An der Tëschenzäit kënnt Dir probéiere mam Google ze sichen.",
        "dberr-outofdate": "Denkt drunn, datt de Sichindex vun eisen Inhalte méiglecherweis net aktuell ass.",
        "dberr-cachederror": "Dëst ass eng tëschegespäichert Kopie vun der gefroter Säit, a si kann eventuell net aktuell sinn.",
        "api-error-overwrite": "D'Iwwerschreiwe vun engem Fichier ass net erlaabt.",
        "api-error-stashfailed": "Interne Feeler: de Server konnt den temporäre Fichier net späicheren.",
        "api-error-publishfailed": "Interne Feeler: de Server konnt den temporäre Fichier net publizéieren.",
+       "api-error-stasherror": "Beim Eropluede vum Fichier ass e Feeler geschitt.",
+       "api-error-stashzerolength": "De Server konnt de Fichier net späicheren, well en eng Längt vun Null hat.",
        "api-error-timeout": "De Server huet net bannen där Zäit geäntwert déi virgesinn ass.",
        "api-error-unclassified": "En onbekannte Feeler ass geschitt",
        "api-error-unknown-code": "Onbekannte Feeler: \"$1\"",
        "action-pagelang": "d'Sprooch vun der Säit änneren",
        "log-name-pagelang": "Log vum Ännere vun der Sprooch",
        "log-description-pagelang": "Dëst ass a Log mat den Ännerunge vun de Sprooche vun de Säiten.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|huet}} d'Sprooch vun der Säit $3 vu(n) $4 op $5 geännert.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktivéiert)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desaktivéiert''')",
        "mediastatistics": "Statistike vun de Medien",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Méiglech Erweiderungen",
        "mediastatistics-table-count": "Zuel vun de Fichieren",
+       "mediastatistics-table-totalbytes": "Gesamtgréisst",
        "mediastatistics-header-unknown": "Onbekannt",
        "mediastatistics-header-bitmap": "Bitmap-Biller",
        "mediastatistics-header-drawing": "Zeechnungen (Vektorbiller)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videoen",
+       "mediastatistics-header-multimedia": "Rich Media",
        "mediastatistics-header-office": "Office",
        "mediastatistics-header-text": "Textuell",
        "mediastatistics-header-archive": "Kompriméiert Formater",
index f609c72..d008401 100644 (file)
        "tog-numberheadings": "سربلگه خود شماره گر",
        "tog-showtoolbar": "نوار اوزار ويرايشت نشون بيه",
        "tog-editondblclick": "بلگيا نه وا دوبار پورنين ويرايشت بكيد",
-       "tog-editsectiononrightclick": "بهر ویرایشت نه وا راس کلیک کردن د بهر عنوانیا فعال کو",
-       "tog-watchcreations": "بلگیایی که مه راس کمه و فایلیایی که مه سوار کمه اضاف کو د سیل برگه مه",
+       "tog-editsectiononrightclick": "بهرجا ویرایشت نه وا راس پورنین د بهرجا داسونیا کنشتگر کو",
+       "tog-watchcreations": "بلگیایی که مه راس کمه و جانیایایی که مه سوار کمه اضاف کو د سیل برگه مه",
        "tog-watchdefault": "بلگیا و جانیایی که مه ویرایشت کمه اضاف کو د سیل برگم",
        "tog-watchmoves": "بلگیاو جانیایی  که مه جاوه جا کمه د سیل برگم اضاف کو",
        "tog-watchdeletion": "بلگیا و جانیایی که مه پاک کمه اضاف کو د سیل برگم",
        "tog-watchrollback": "همه بلگه یا نه د جایی که مه د سیل برگم می کم اضاف کو.",
        "tog-minordefault": "همه ویرایشتیا کؤچک نه وا پیش فرض بیئن نشو دار کو.",
        "tog-previewontop": "پیش سیل نه دما جعوه ویرایشت نشو بیئه",
-       "tog-previewonfirst": "پیش سیل نه د اولین ویرایشت نشو بیئه",
-       "tog-enotifwatchlistpages": "اوسه که یه گل بلگه یا فایلی د سیل برگ مه آلشت بوئه منه وا ایمیل خور کو",
-       "tog-enotifusertalkpages": "وختی که بلگه گپسن کاریار آلشت پیدا کرد منه وا ایمیل خور کو",
+       "tog-previewonfirst": "پیش سیل نه د اولی ویرایشت نشو بیئه",
+       "tog-enotifwatchlistpages": "اوسه که یه گل بلگه یا جانیا د سیل برگ مه آلشت بوئه منه وا انجومانامه خور کو",
+       "tog-enotifusertalkpages": "د گاتی که بلگه گپسن کاریار آلشت پیدا کرد منه وا انجومانامه خور کو",
        "tog-enotifminoredits": "همچنو اوسه که ویرایشتیا کؤچکی د بلگیا یا جانیایا انجوم بوئه منه خور کو",
-       "tog-enotifrevealaddr": "نشونی ایمیل منه د انجومانامه اشگار نشو بیه",
-       "tog-shownumberswatching": "انازه کاریاریایی که د حالت دیئنن نشو بیه",
+       "tog-enotifrevealaddr": "نشونی انجومانامه منه د انجومانامه اشگار نشو بیه",
+       "tog-shownumberswatching": "انازه کاریاریایی که د حال و بال دیئنن نشو بیه",
        "tog-oldsig": "امضايی هيئش:",
-       "tog-fancysig": "Ù\88ا Ø§Ù\85ضا Ú\86Û\8c Ù\88Û\8cÚ©Û\8c Ù\85تÙ\86 Ø¨Ø±Ø®Ù\88رد Ú©و",
-       "tog-uselivepreview": "د پیش سیل زنه استفاده کو",
-       "tog-forceeditsummary": "منه وختی که یه گل چکسه ویرایشت حالی وارد بوئه سریع خور کو",
+       "tog-fancysig": "Ù\88ا Ø§Ù\85ضا Ú\86Û\8c Ù\88Û\8cÚ©Û\8c Ù\85تÙ\86 Ø±Ù\81تار Ø¯Ø§Ø´Øªو",
+       "tog-uselivepreview": "پیش سیل زنه وه کار بیئر",
+       "tog-forceeditsummary": "منه د گاتی که یه گل چکسه ویرایشت حالی وارد بوئه سریع خور کو",
        "tog-watchlisthideown": "قام كو ويرايشت منه د",
        "tog-watchlisthidebots": "ویرایشت یا بوت نه د سیل برگ قام کو",
        "tog-watchlisthideminor": "قام كو ويرايشت کؤچک منه د",
        "tog-watchlisthideliu": "ویرایشت یا کاریاریا وامئن سامونه نه د سیل برگ قام کو",
        "tog-watchlisthideanons": "ویرایشت یا کاروریا نادیار نه د سیل برگ قام کو",
        "tog-watchlisthidepatrolled": "ویرایش تیا د تی رس نه د سیل برگ قام کو",
-       "tog-ccmeonemails": "کپی انجومانامه یا منه که سی کاریاریا تر می فرسنم سیم کل کو",
+       "tog-ccmeonemails": "ورداشته انجومانامه یا منه که سی کاریاریا تر می فرسنم سیم کل کو",
        "tog-diffonly": "بلگیایی که د ور گرته فرخیا هارن نشون نیه",
        "tog-showhiddencats": "دسه يا قام بيئنه نشون بيه",
        "tog-norollbackdiff": "فرخیا نه د بین بوریت نها یه گل عقو گرد کردن",
-       "tog-useeditwarning": "د Ú¯Ø§ØªÛ\8c Ú©Ù\87 Ø¢Ù\84شتÛ\8cا Ø°Ø®Û\8cره نبیه د بلگه ویرایشت وه جا می نم خورم کو",
-       "tog-prefershttps": "همیشه د گاتی که مه وامئن هئم د ارتواط امن استفاده کو",
+       "tog-useeditwarning": "د Ú¯Ø§ØªÛ\8c Ú©Ù\87 Ø¢Ù\84شتÛ\8cا Ø§Ù\85اÛ\8cÛ\8cه نبیه د بلگه ویرایشت وه جا می نم خورم کو",
+       "tog-prefershttps": "همیشه د گاتی که مه وامئن هئم د ارتواط امن وه کار بیئر",
        "underline-always": "هميشه",
        "underline-never": "هيژوخت",
        "underline-default": "پوسه یا دوارته نیئر پیش فرض",
        "category-empty": "ای دسه واقعن ده ور گرته هیژ بلگه ای یا وارسگر ای نی",
        "hidden-categories": "{{PLURAL:$1|دسته قام بيه|دسته يا قام بيه}}",
        "hidden-category-category": "دسه یا قام بیه",
-       "category-subcat-count": "{{جمی:$2|ای دسه فقط زیر دسه دینداگر هان دش .|ای دسه {{جمی:$1| زیردسه|$1 زیردسه یا}}هئ , خارج د $2 کل.}}",
+       "category-subcat-count": "{{جمی:$2|ای دسه فقط زیر دسه دینداگر هان دش .|ای دسه {{جمی:$1| زیردسه|$1 زیردسه یا}}هئ , وه در د $2 کل.}}",
        "category-subcat-count-limited": "ای دسه وا دم {{جمی:$1|زیردسه|$1زیردسه یا}} بوئه",
-       "category-article-count": "{{جمی:$2|ای دسه ده ور گرته بلگه نهاییه .| {{جمی:$1| بلگه هئ|$1 بلگیا هئن}} د ای دسه, خارج د $2 کل.}}",
+       "category-article-count": "{{جمی:$2|ای دسه ده ور گرته بلگه نهاییه .| {{جمی:$1| بلگه هئ|$1 بلگیا هئن}} د ای دسه, وه در $2 کل.}}",
        "category-article-count-limited": "نها {{جمی:$1|بلگه هئ|$1بلگیا هئن}} د دسه ایسنی .",
-       "category-file-count": "{{جمی:$2|ای دسه فقط شامل فایل نهایی هئ file.| نهایی {{جمی:$1|فایل هئ|$1 فایلیا هئن}} د ای دسه, وه در د کل $2 .}}",
+       "category-file-count": "{{جمی:$2|ای دسه فقط شامل جانیا نهایی هئ file.| نهایی {{جمی:$1|جانیا هئ|$1 جانیایا هئن}} د ای دسه, وه در د کل $2 .}}",
        "category-file-count-limited": " {{جمی:$1|[جانیا هئ|1$جانیایا هئن}}نهایی هان د دسه ایسنی.",
        "listingcontinuesabbrev": "دماله",
        "index-category": "بلگيا سيائه دار",
        "noindex-category": "بلگيا بی سيائه",
-       "broken-file-category": "بلگیایی که هوم پیوند فایلیا اشکسه دارن",
+       "broken-file-category": "بلگیایی که هوم پیوند جانیایا اشکسه دارن",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دباره",
        "article": "مینونه بلگه",
        "history": "ويرگار بلگه",
        "history_short": "ويرگار",
        "updatedmarker": "د آخرین دیئن مه وه هنگوم سازی کو",
-       "printableversion": "نسقه چاپ بيئنی",
+       "printableversion": "نسقه پلا بيئنی",
        "permalink": "هوم پیوند هميشئی",
-       "print": "چاپ كردن",
+       "print": "پلا كردن",
        "view": "ديئن",
        "view-foreign": "د $1 نه بوینیت",
        "edit": "ويرايشت",
        "create-local": "یه گل توضیح ولات نشینی اضاف بکیتو",
        "editthispage": "ويرايشت ای بلگه",
        "create-this-page": "راس كردن ای بلگه",
-       "delete": "حذف كردن",
+       "delete": "پاکسا كردن",
        "deletethispage": "ای بلگه نه پاکسا بكيد",
        "undeletethispage": "ای بلگه نه پاکسا نكيد",
        "undelete_short": "زنه کردن {{جمی:$1|یه گل ویرایشت|$1 ویرایشتیا}}",
        "viewdeleted_short": "بوینیت {{[جمی:$1|یه گل ویرایشت پاکسا بیه|$1ویرایشتیا پاکسا بیه}}",
        "protect": "پر و پیم بكيد",
        "protect_change": "آلشت بكيد",
-       "protectthispage": "ای بلگه نه حفاظت بكيد",
-       "unprotect": "حمايت آلشت بكيد",
-       "unprotectthispage": "حفاظت دی بلگه نه آلشت بكيد",
+       "protectthispage": "ای بلگه نه پر و پیم بكيد",
+       "unprotect": "پر و پیم کردن نه آلشت بکیت",
+       "unprotectthispage": "پر و پیم کردن د ای بلگه نه آلشت بكيد",
        "newpage": "بلگه نو",
        "talkpage": "دباره ای بلگه قصه بكيد",
-       "talkpagelinktext": "وت و واچ",
+       "talkpagelinktext": "چک چنه",
        "specialpage": "بلگه ويجه",
        "personaltools": "اوزاريا شصقی",
-       "articlepage": "ديئن محتوا بلگه",
+       "articlepage": "ديئن مینونه بلگه",
        "talk": "گپ",
        "views": "ديئنيا",
        "toolbox": "اوزاريا",
        "projectpage": "ديئن بلگه پروجه",
        "imagepage": "ديئن بلگه جانیا",
        "mediawikipage": "ديئن بلگه پيغوم",
-       "templatepage": "ديئن بلگه قالو",
+       "templatepage": "ديئن بلگه چوئه",
        "viewhelppage": "ديئن بلگه هومياری",
        "categorypage": "ديئن بلگه دسه بنی",
        "viewtalkpage": "ديئن چك چنه يا",
        "otherlanguages": "د زونيا هنی",
        "redirectedfrom": "(ورگشتن د$1)",
-       "redirectpagesub": "بلگه دوباره ورگشتن",
+       "redirectpagesub": "بلگه واگردونی",
        "redirectto": "واگردونی سی:",
        "lastmodifiedat": "ای بلگه تازه ايا وضع آلشت بيه د $1, د $2.",
        "viewcount": "ای بلگه قاول دسترسی بيه {{PLURAL:$1|once|$1 times}}.",
        "pool-queuefull": "اماییه کاری گی گرتن پر بیه",
        "pool-errorunknown": "خطا نادیار",
        "pool-servererror": "پول سنتر خذمتگه د دسرس نئ($1).",
+       "poolcounter-usage-error": "خطار وه کار گرتن:$1",
        "aboutsite": "دباره {{SITENAME}}",
        "aboutpage": "پروجه:دباره",
        "copyright": "مینونه د دسرس هئ سی $1 مر وه شلک هنی نوشته بوئه",
        "copyrightpage": "{{ان اس:پروجه}}:کپی رایت",
        "currentevents": "پيشومدل تازه باو",
        "currentevents-url": "پروجه:پيشومدل تازه باو",
-       "disclaimers": "منکریا",
+       "disclaimers": "کذو کننه یا",
        "disclaimerpage": "پروجه:منكر بيئن كاروريا",
        "edithelp": "هومياری سی ويرايشت",
        "mainpage": "سرآسونه",
        "policy-url": "پروجه:خط و مش",
        "portal": "درآسونه کومله یکی",
        "portal-url": "پروجه:سرآسونه کومله یکی",
-       "privacy": "رهبرد رازداری",
-       "privacypage": "پروجه: خط مشی راز واداشتن",
-       "badaccess": "خطا :اجازÙ\87 Ø¨Ø¦Û\8cر",
-       "badaccess-group0": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87 انجوم کاری که حاستیت نارین",
-       "badaccess-groups": "ای کاری که شما هاستیته سی کاریاریا د  {{جمی:$2|گرو|یکی د گرویا}}: $1 مئدود بیه",
-       "versionrequired": "یه نسقه د نیازمنیا ویکی وارسگر\n$1",
-       "versionrequiredtext": "نسقه $1 ویکی وارسگر سی وه کار گرتن د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
+       "privacy": "پولتیک رازینه داری",
+       "privacypage": "پروجه: خط مشی رازینه کاری کردن",
+       "badaccess": "خطا :صÙ\84ادارÛ\8c Ú©Ù\88",
+       "badaccess-group0": "Ø´Ù\85ا ØµÙ\84ا انجوم کاری که حاستیت نارین",
+       "badaccess-groups": "ای کاری که شما هاستیته سی کاریاریا د  {{جمی:$2|گرو|یکی د گرویا}}: $1 کم بیه",
+       "versionrequired": "یه نسقه د حاستنیا ویکی وارسگر\n$1",
+       "versionrequiredtext": "نسقه $1 ویکی وارسگر سی وه کار گرتن د ای بلگه لازمه.\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
        "ok": "خوئه",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
-       "retrievedfrom": "بازÙ\8aاÙ\81ته د\"$1\"",
+       "retrievedfrom": "د Ù\86Ù\88 Ø²Ù\86Ù\87 Ø¨Û\8cه د\"$1\"",
        "youhavenewmessages": "شما داريت $1($2)",
        "youhavenewmessagesfromusers": "{{جمی:$4|شما }} $1 د {{جمی:$3|کاریار هنی|$3 کاریاریا}}داریتو($2).",
-       "youhavenewmessagesmanyusers": "شما $1 د خيلی کاریار داريت ($2).",
-       "newmessageslinkplural": "{{جمی:$1|یه گل پیغوم تازه|999=پیغوم ئل تازه}}",
+       "youhavenewmessagesmanyusers": "شما $1 د  فره کاریار داريت ($2).",
+       "newmessageslinkplural": "{{جمی:$1|یه گل پیغوم تازه|999=پیغومیا تازه}}",
        "newmessagesdifflinkplural": "آخر {{جمی:$1|آلشت|آلشتیا}}",
        "youhavenewmessagesmulti": "شما یه گل پیغوم تازه د $1 داریتو",
        "editsection": "ويرايشت",
        "viewsourceold": "سرچشمه نه بوينيت",
        "editlink": "ويرايشت",
        "viewsourcelink": "سرچشمه نه بوينيت",
-       "editsectionhint": "ويرايشت يه بشق:$1",
+       "editsectionhint": "ويرايشت يه گل بهرجا:$1",
        "toc": "مینونه یا",
        "showtoc": "نشو دئن",
        "hidetoc": "قام كردن",
        "thisisdeleted": "دیئن یا ورگنين $1?",
        "viewdeleted": "دیئن$1?",
        "restorelink": "{{جمی:$1|یه گل ویرایشت پاک بیه|$1 ویرایشتیا پاک بیه}}",
-       "feedlinks": "خورحو:",
-       "feed-invalid": "نوع مشترک بین خورحو نامعتور",
-       "feed-unavailable": "خور حونیا د دسرس نئین",
-       "site-rss-feed": "خورخو RSS سی $1",
-       "site-atom-feed": "خور حون Atom سی $1",
-       "page-rss-feed": "خورحو RSS سی «$1»",
-       "page-atom-feed": "خور حون Atom سی $1",
+       "feedlinks": "هوال حون:",
+       "feed-invalid": "نوع مشترک بین هوال حون نامعتور",
+       "feed-unavailable": "هوال حونیا د دسرس نئین",
+       "site-rss-feed": "هوال حون RSS سی $1",
+       "site-atom-feed": "هوال حون Atom سی $1",
+       "page-rss-feed": "هوال حون RSS سی «$1»",
+       "page-atom-feed": "هوال حون Atom سی $1",
        "feed-atom": "اتم",
        "feed-rss": "آر اس اس",
        "red-link-title": "$1(بلگه وجود ناره)",
-       "sort-descending": "كم بيئن منظم",
-       "sort-ascending": "زياد بيئن منظم",
+       "sort-descending": "كم بيئن سرجاخود",
+       "sort-ascending": "زياد بيئن سرجاخود",
        "nstab-main": "بلگه",
        "nstab-user": "بلگه کاریار",
-       "nstab-media": "بلگه رسانه",
+       "nstab-media": "بلگه وارسگر",
        "nstab-special": "بلگيا ويجه",
        "nstab-project": "بلگه پروجه",
        "nstab-image": "جانیا",
        "nstab-template": "چوئه",
        "nstab-help": "بلگه هومياری",
        "nstab-category": "دسه",
-       "nosuchaction": "چنو كاری وجود ناره",
-       "nosuchactiontext": "کارÛ\8c Ú©Ù\87 Ù\88ا Û\8cÙ\88 Ø¢Ø± Ø§Ù\84 Ù\85Ø´Ù\82ص Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86ئ.\nشاÛ\8cت Ø´Ù\85ا Û\8cÙ\88 Ø¢Ø± Ø§Ù\84 Ù\86Ù\87 Ø¯Ø±Ù\88س Ù\86Ù\86شتÛ\8cتÙ\87Ø\8c Û\8cا Û\8cÙ\87 Ú¯Ù\84 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د Ù\86ادرست Ù\88ارد Ø¨Û\8cÙ\87.\nÙ\88Ù\87 Ø´Ø§Û\8cد Ù\88Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ø¨Ø§Ú¯ Ø¯ Ù\86رÙ\85 Ø§Ù\81زار Ø§Ø³ØªÙ\81اده بیه وا {{نوم مالگه}} هشاره داشتوه.",
-       "nosuchspecialpage": "چنو بلگه خاصی وجود ناره",
+       "nosuchaction": "چنی کنشتگری وجود ناره",
+       "nosuchactiontext": "کارÛ\8c Ú©Ù\87 Ù\88ا Û\8cÙ\88 Ø¢Ø± Ø§Ù\84 Ù\85Ø´Ù\82ص Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86ئ.\nشاÛ\8cت Ø´Ù\85ا Û\8cÙ\88 Ø¢Ø± Ø§Ù\84 Ù\86Ù\87 Ø¯Ø±Ù\88س Ù\86Ù\86شتÛ\8cتÙ\87Ø\8c Û\8cا Û\8cÙ\87 Ú¯Ù\84 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د Ù\86ادرست Ù\88ارد Ø¨Û\8cÙ\87.\nÙ\88Ù\87 Ø´Ø§Û\8cد Ù\88Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ø³Û\8cسرÛ\8cÚ© Ø¯ Ù\86رÙ\85 Ø§Ù\81زار Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±Øªه بیه وا {{نوم مالگه}} هشاره داشتوه.",
+       "nosuchspecialpage": "چنی بلگه خاصی وجود ناره",
        "nospecialpagetext": "<strong>شما سی یه گل بلگه نامعتور درحاست داشتیته.</strong>\nیه گل نوم گه سی  اعتوار بلگه یا بوئه د [[ویجه:بلگه یا ویجه|{{رقم:بلگه یا ویجه}}]] پیدا با.",
        "error": "خطا",
        "databaseerror": "خطا د جاگه دونسمنيا",
-       "databaseerror-text": "یه خطا جست کردن د پایگا داده پیش اوما.یه ممکنه یه در کار ونن د نرم اوزار پیش بیاره",
-       "databaseerror-textcl": "خطاجست گرتن پايگاه دونسمنيا پيشومد كرده",
+       "databaseerror-text": "یه خطا جست کردن د رسینه جا پیش اوما.یه ممکنه یه در کار ونن د نرم اوزار پیش بیاره",
+       "databaseerror-textcl": "خطاجست گرتن رسینه جا دونسمنيا پيشومد كرده",
        "databaseerror-query": "نوم گشتن: $1",
-       "databaseerror-function": "تابع:$1",
+       "databaseerror-function": "Ø¢Ù\84شت Ù\88Ù\86:$1",
        "databaseerror-error": "خطا: $1",
-       "laggedslavemode": "زÙ\86Ù\87ار:بÙ\84Ú¯Ù\87 Ø´Ø§Ù\8aت Ø´Ù\88Ù\85Ù\84 Ø±Ù\88زاÙ\85دÙ\8aا تازه باو نبوئه",
+       "laggedslavemode": "زÙ\86Ù\87ار:بÙ\84Ú¯Ù\87 Ø´Ø§Ù\8aت Ø¯ Ù\88ر Ú¯Ø±Û\8cÙ\86Ù\87 Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c تازه باو نبوئه",
        "readonly": "جاگه دونسمنيا بسه بيه",
-       "enterlockreason": "دلیل قلف کردن نه بنیست،یه وختی سی وا کردن قلف د ویر داشتویت.",
-       "readonlytext": "پایگا دونسمنیا ایسه سی دئن ورودی یا تازه یا آلشتگریا هنی قلف بیه،شایت سی منن معمولی پایگا دونسمنی نها وه که ورئرده وه حالت عادیش.\nمدیری که ونه قلف کرده ونه گوته:$1",
-       "missing-article": "پاگا دونمسمنی نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.\nمعمولند یه سی یه که فرخ ویرگار رئته دش بیه پاک بیه.",
-       "missingarticle-rev": "(دوواره ديئن#: $1)",
+       "enterlockreason": "دلیل قلف کردن نه بنیست،یه گاتی سی وا کردن قلف د ویر داشتویت.",
+       "readonlytext": "رسینه جا ایسه سی دئن ورودی یا تازه یا آلشتگریا هنی قلف بیه،شایت سی منن معمولی رسینه جانها وه که ورئرده وه حال و بال عادیش.\nدیوونداری که ونه قلف کرده ونه گوته:$1",
+       "missing-article": "رسینه جا نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.\nمعمولند یه سی یه که فرخ ویرگار رئته دش بیه پاک بیه.",
+       "missingarticle-rev": "(وانئری#: $1)",
        "missingarticle-diff": "(فرخ: $1، $2)",
-       "readonly_lag": "ای پاگا دونسمنی قلف بیه تا اوسه که سرور پایگا دونسمنیا وه مینجاون برسه.",
+       "readonly_lag": "ای رسینه جا قلف بیه تا اوسه که سرور رسینه جا وه مینجاون برسه.",
        "internalerror": "خطا داخلی",
        "internalerror_info": "خطا داخلی:$1",
-       "filecopyerror": "نبوئه فایل $1 د $2 کپی بوئه",
-       "filerenameerror": "نبوئه فایل $1 د $2 نوم آلشت بوئه",
-       "filedeleteerror": "نبوئه فایل $1 پاک بوئه",
+       "filecopyerror": "نبوئه جانیا $1 د $2 ورداشته بوئه",
+       "filerenameerror": "نبوئه جانیا $1 د $2 نوم آلشت بوئه",
+       "filedeleteerror": "نبوئه جانیا $1 پاکسا بوئه",
        "directorycreateerror": "نبوئه سردسه $1 راس بوئه.",
-       "filenotfound": "نتونیت فایل $1 پیدا بکید",
+       "directoryreadonlyerror": "فقط موئه نشونگه \"$1\" بحونی.",
+       "directorynotreadableerror": "نشونگه \"$1\" حننی نئ.",
+       "filenotfound": "نتونیت جانیا $1 نه پیدا بکید",
        "unexpected": "ارزایشت ناحاسته: \"$1\"=\"$2\".",
-       "formerror": "خطا:Ù\86بÙ\88ئÙ\87 Ù\81رÙ\85 وه مو بئيت",
+       "formerror": "خطا:Ù\86بÙ\88ئÙ\87 Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 وه مو بئيت",
        "badarticleerror": "ای انجوم دئنی د ای بلگه انجوم نگره.",
-       "cannotdelete": "بلگه یا فایل$1 نبوئه پاک با.\nشایت یه ایسه وا کسی هنی پاک بیه.",
-       "cannotdelete-title": "نبوئه بلگه $1 حذف بو",
-       "delete-hook-aborted": "پاک بیئن وا قلاو جلوگری بیه.\nهیچ توضیئ سیش نئ.",
-       "no-null-revision": "سی بلگه$1 دوواره خنثی دیئن راس بکید",
-       "badtitle": "موضو گن",
-       "badtitletext": "عÙ\86Ù\88اÙ\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\87 Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86Û\8cØ\8cÛ\8cا  Û\8cÙ\87 Ú¯Ù\84 Ù\85ئÙ\86 Ø²Ù\88Ù\86Û\8c Û\8cا Ù\85ئÙ\86 Ù\88Û\8cÚ©Û\8c Ø¹Ù\86Ù\88اÙ\86 ØºÙ\84Ø·Ù\87.\nÛ\8cÙ\87 Ø´Ø§Û\8cت Ø´Ù\88Ù\85Ù\84 Û\8cÚ©Û\8c Ø¨Ø§ Û\8cا Ø¨Û\8cشتر Ú©Ø§Ø±Ø§Ú©ØªØ±Û\8cا Ù\86بÙ\88ئÙ\87 Ø³Û\8c Ø§Û\8c Ù\85Ù\88ضÙ\88عÛ\8cا Ø§Ø³ØªÙ\81اده بوئن",
+       "cannotdelete": "بلگه یا جانیا $1 نبوئه پاکسا با.\nشایت یه ایسه وا کسی هنی پاکسابیه.",
+       "cannotdelete-title": "نبوئه بلگه $1 پاکسا بو",
+       "delete-hook-aborted": "پاکسا بیئن وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
+       "no-null-revision": "سی بلگه$1 وانئری خنثی نه راس بکید",
+       "badtitle": "داسون گن",
+       "badtitletext": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\87 Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86Û\8cØ\8cÛ\8cا  Û\8cÙ\87 Ú¯Ù\84 Ù\85ئÙ\86 Ø²Ù\88Ù\86Û\8c Û\8cا Ù\85ئÙ\86 Ù\88Û\8cÚ©Û\8c Ø¯Ø§Ø³Ù\88Ù\86 ØºÙ\84Ø·Ù\87.\nÛ\8cÙ\87 Ø´Ø§Û\8cت Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Û\8cÚ©Û\8c Ø¨Ø§ Û\8cا Ø¨Û\8cشتر Ú©Ø§Ø±Ø§Ú©ØªØ±Û\8cا Ù\86بÙ\88ئÙ\87 Ø³Û\8c Ø§Û\8c Ø¯Ø§Ø³Ù\88Ù\86Û\8cا Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±Øªه بوئن",
        "perfcached": "رسینه یا نهایی د ویرگه نهونی موکشت بینه و شایت هنی وه هنگوم سازی نبینه.بیشترونه {{جمی:$4|یه گل نتیجه|$4 یه گل نتیجه}} د ویرگه نهونی هان د دسرس.",
        "perfcachedts": "رسینه یا نهایی د ویرگه نهونی موکشت بینه و شایت هنی وه هنگوم سازی نبینه.بیشترونه {{جمی:$4|یه گل نتیجه|$4 یه گل نتیجه}} د ویرگه نهونی هان د دسرس.",
        "querypage-no-updates": "نبوئه ای بلگه وه هنگوم سازی با.\nرسینه یا ایچه تازه نبیه.",
        "viewyourtext": "شما تونیت سرچشمه ویرایشتیا تونه ای د بلگه بوینیت و دشو ورداریت",
        "protectedinterface": "ای بلگه سی نرم افزار د ای ویکی نیسسه آماده می که، و د   .\nسی اضاف کردن یا آلشت دئن د همه ویکی یا لطفا [//translatewiki.net/ translatewiki.net] نه به کار بؤریت، ولات نشین کنی پروجه ویکی وارسگر.",
        "editinginterface": "<strong>زئنار دئن:</strong> شما داریت بلگه ای نه که سی      بیه ویرایشت می کید.",
-       "cascadeprotected": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø¯ Ù\88Û\8cراÛ\8cشت Ù\85حاÙ\81ظت بیه سی یه که {{جمی:$1|وه بلگه یه |ونو بلگه یان}} که ها دش د                 :\n$2",
+       "cascadeprotected": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø¯ Ù\88Û\8cراÛ\8cشت Ù¾Ø± Ù\88 Ù¾Û\8cÙ\85 بیه سی یه که {{جمی:$1|وه بلگه یه |ونو بلگه یان}} که ها دش د                 :\n$2",
        "namespaceprotected": "شما حقی سی ویرایشت بلگه یایی که هان د نومجا  <strong>$1</strong> ناریت.",
        "customcssprotected": "شما سی ویرایشت ای بلگه سی اس اس اجازه ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.",
-       "customjsprotected": "Ø´Ù\85ا Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت Ø§Ø¬Ø§Ø²Ù\87 ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.",
+       "customjsprotected": "Ø´Ù\85ا Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت ØµÙ\84ا ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.",
        "mycustomcssprotected": "شما حق ناریت ای بلگه سی اس اس نه ویرایشت بکید",
        "mycustomjsprotected": "شما حق ناریت ای بلگه جاوا اسکریپت نه ویرایشت بکید",
        "myprivateinfoprotected": "شما حق ناریت دونسمنیا خصوصی نه ویرایشت بکید",
        "invalidtitle-unknownnamespace": "نوم نامعتور سی شماره نومجا ناشناس $1 و نیسه \"$2\"",
        "exception-nologin": "نبوئه وارد بوئيد",
        "exception-nologin-text": "شما وارد [[ویجه:وامین اومائن کاریار|وامین اومائن]] بوئیت سی یه تونستویت که د ای بلگه یا کنشت دسرسی داشتویت.",
-       "exception-nologin-text-manual": "Ø®Ù\88اÙ\87Ø´Ù\85Ù\86Û\8cدم که $1 تونسه بوئه د ای بلگه دسرسی داشتوه یا کاری انجوم بیئه.",
-       "virus-badscanner": "سازÙ\88ارÙ\87 Ú¯Ù\86\88Û\8cرÙ\88س Ù\86اشÙ\86اس:<em>$1</em>",
+       "exception-nologin-text-manual": "دتÙ\88 ØªÙ\82اضا Ù\85Û\8cÚ©Û\8cم که $1 تونسه بوئه د ای بلگه دسرسی داشتوه یا کاری انجوم بیئه.",
+       "virus-badscanner": "سازÙ\88ارÙ\87 Ú¯Ù\86\88Û\8cرÙ\88س Ù\86ادÛ\8cار:<em>$1</em>",
        "virus-scanfailed": "زل بیئن شکست حرد($1)",
-       "virus-unknownscanner": "Ù\88Ù\8aرÙ\88س Ù\83Ø´ Ù\86اآشگار",
+       "virus-unknownscanner": "Ù\88Ù\8aرÙ\88س Ù\83Ø´ Ù\86ادÛ\8cار",
        "logouttext": "<strong>شما هنی نریتته وه در.</strong>\n\nد ویرتو با که ویرگه نهو انجومیارتو نه پاکسا نکیت، سی یه پاره ای د بلگه یا ممکنه جوری نشو دئه بوئن چی یه که منیستی  شما هنی هایین وامین.",
        "welcomeuser": "خوش اومايت،$1!",
        "welcomecreation-msg": "حساوتو دروس بیه.\nد ویرتو نروئه که{{نوم دیارگه}} [[Special:Preferences|preferences]]  خوتونه آلشت بکیت",
        "yourname": "نوم کاریاری:",
-       "userlogin-yourname": "نوم كاروری",
+       "userlogin-yourname": "نوم کاریاری",
        "userlogin-yourname-ph": "نوم کاریاری تو نه وارد بكيد",
-       "createacct-another-username-ph": "نوم كاروری ته وارد كو",
-       "yourpassword": "پاسورد:",
-       "userlogin-yourpassword": "رمز",
-       "userlogin-yourpassword-ph": "رمز بزه",
-       "createacct-yourpassword-ph": "رمزه بزه",
-       "yourpasswordagain": "دوواره رمز بزه",
-       "createacct-yourpasswordagain": "رمز محكم كو",
-       "createacct-yourpasswordagain-ph": "دوواره رمز بزه",
-       "remembermypassword": "اومائن وا مئن منه د ای مرورگر د ویر داشتو(سی بیشترونه$1{{جمی:$1|روز|روزیا}})",
-       "userlogin-remembermypassword": "منه مئن سيستم وادار",
-       "userlogin-signwithsecure": "د وصل بيئن امن استفاده كو",
+       "createacct-another-username-ph": "نوم کاریاری ته وارد كو",
+       "yourpassword": "رازینه گواردن:",
+       "userlogin-yourpassword": "رازینه گواردن",
+       "userlogin-yourpassword-ph": "رازینه گواردن نه بزه",
+       "createacct-yourpassword-ph": "رازینه گواردن نه بزه",
+       "yourpasswordagain": "دوواره رازینه گواردن نه بزه",
+       "createacct-yourpasswordagain": "رازینه گواردن نه پشت راس كو",
+       "createacct-yourpasswordagain-ph": "دوواره رازینه گواردن نه بزه",
+       "remembermypassword": "اومائن وا مین منه د ای دوارته نیئر د ویر داشتو(سی بیشترونه$1{{جمی:$1|روز|روزیا}})",
+       "userlogin-remembermypassword": "منه مین سامونه وادار",
+       "userlogin-signwithsecure": "د وصل بيئن امن وه کار بیئر",
        "yourdomainname": "پوشگیر شما:",
-       "password-change-forbidden": "شما نتونید پاسوردیانه د ای ویکی آلشت بکید",
-       "externaldberror": "اشتÙ\88اÛ\8cÛ\8c Ø¯ Ø§Ø±ØªÙ\88اط Ù\88ا Ø±Ø³Û\8cÙ\86Ù\87 Ú¯Ø§ Ù¾Û\8cØ´ Ø§Ù\88Ù\85ائÙ\87 Û\8cا Û\8cÙ\86Ù\87 Ú©Ù\87 Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87 وه هنگوم سازی حساو خارجی تونه ناریت.",
-       "login": "اومائن",
+       "password-change-forbidden": "شما نتونید رازینه گواردتون خوتونه د ای ویکی آلشت بکید",
+       "externaldberror": "اشتÙ\88اÛ\8cÛ\8c Ø¯ Ø§Ø±ØªÙ\88اط Ù\88ا Ø±Ø³Û\8cÙ\86Ù\87 Ú¯Ø§ Ù¾Û\8cØ´ Ø§Ù\88Ù\85ائÙ\87 Û\8cا Û\8cÙ\86Ù\87 Ú©Ù\87 Ø´Ù\85ا ØµÙ\84ا وه هنگوم سازی حساو خارجی تونه ناریت.",
+       "login": "وا مین اومائن",
        "nav-login-createaccount": " اومائن د سيستم/راس كردن حساو",
        "userlogin": " اومائن د سيستم/راس كردن حساو",
-       "userloginnocreate": "اومائن",
-       "logout": "رئتن",
-       "userlogout": "د سيستم دراومائن",
-       "notloggedin": "نبوئه وارد بوئيد",
+       "userloginnocreate": "وا مین اومائن",
+       "logout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù\87 Ø¯Ø±Ø§Ù\88Ù\85ائن",
+       "userlogout": "د سامونه دراومائن",
+       "notloggedin": "نبوئه بیاییت وامین",
        "userlogin-noaccount": "یه گل حساو ناریت؟",
        "userlogin-joinproject": "وصل بوييت {{SITENAME}}",
-       "nologin": "حساو كاروری ناريت؟$1",
+       "nologin": "حساو کاریاری ناريت؟$1",
        "nologinlink": "يه گل حساو راست بكيد",
        "createaccount": "حساو راست بكيد",
        "gotaccount": "ایسنی حساو کاروری داریتو؟$1",
-       "gotaccountlink": "اومائن",
+       "gotaccountlink": "وا مین اومائن",
        "userlogin-resetlink": "جزییات وامین اومائن تونه د ویر بردیته",
-       "userlogin-resetpassword-link": "پاسورد د ویرتو رئته؟",
+       "userlogin-resetpassword-link": "رازینه گواردن د ویرتو رئته؟",
        "userlogin-helplink2": "هومیاری وا مین اومائن",
-       "userlogin-loggedin": "شما ایسه د عنوان {{جنس:$1|$1}} اومایته وا مین.\nد فرم هاری سی وا مین اومائن وه عنوان کاریار هنی استفاده بکیتو.",
+       "userlogin-loggedin": "شما ایسه چی {{جنس:$1|$1}} اومایته وا مین.\nد نوم بلگه هاری سی وا مین اومائن چی یه گل کاریار هنی وه کار بیئرتو.",
        "userlogin-createanother": "يه گل حساوهنی راست بكيد",
-       "createacct-emailrequired": "نشونی ايميل",
-       "createacct-emailoptional": "نشونی ايميل",
-       "createacct-email-ph": "نوم نشون ايميلتونه وارد بكيت",
-       "createacct-another-email-ph": "Ù\8aÙ\87 Ú¯Ù\84 Ø§Ù\8aÙ\85Ù\8aÙ\84 وارد بكيت",
-       "createaccountmail": "د یه گل پاسورد موقتیه بختکی استفاده بکید و ونه سی یه گل نشونی ایمیل ویجه بفرسنیت",
+       "createacct-emailrequired": "تیرنشون انجومانامه",
+       "createacct-emailoptional": "تیرنشون انجومانامه",
+       "createacct-email-ph": "تیرنشون انجومانامه تونه وارد بكيت",
+       "createacct-another-email-ph": "Ù\8aÙ\87 Ú¯Ù\84 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 وارد بكيت",
+       "createaccountmail": "د یه گل رازینه گواردن موقتیه بختکی وه کار بیئریت و ونه سی یه گل نشونی انجومانامه ویجه کل بکیت",
        "createacct-realname": "نوم راستكی(مژبوری نيئ)",
        "createaccountreason": "دليل",
        "createacct-reason": "دليل",
        "createacct-reason-ph": "سی چی شما داريتو يه گل حساو هنی راس می كيد",
        "createacct-captcha": "وارسی امنيت دار بين",
-       "createacct-imgcaptcha-ph": "Ù\85تÙ\86Û\8c نه كه د وارو ميئنيت وارد بكيد",
+       "createacct-imgcaptcha-ph": "Ù\86Û\8cسسÙ\87 نه كه د وارو ميئنيت وارد بكيد",
        "createacct-submit": "حساو خوتونه راس بكيد",
        "createacct-another-submit": "يه گل حساوهنی راست بكيد",
        "createacct-benefit-heading": "{{نوم مالگه}} وه دس خلکی چی شما راس بیه.",
        "createacct-benefit-body1": "{{جمی:$1|ویرایشت|ویرایشتیا}}",
        "createacct-benefit-body2": "{{جمی:$1|بلگه|بلگه یا}}",
        "createacct-benefit-body3": "تازه{{جمی:$1|هومیار|هومیارا}}",
-       "badretype": "پاسوردی که شما دئیته مطاوقت ناره",
-       "userexists": "کارور نوم که وارد بیه د ایسه استفاده بوئه.\nلطف بکید یه گل نوم هنی انتخاو بکید",
+       "badretype": "رازینه گواردنی که شما دئیته مطاوقت ناره",
+       "userexists": "کاریارنوم که وارد بیه د ایسه وه کار گرته بوئه.\nلطف بکید یه گل نوم هنی انتخاو بکید",
        "loginerror": "خطا اومائن د سيستم",
        "createacct-error": "خطا راس كردن حساو",
        "createaccounterror": "نبوئه حساو راس بكيد:$1",
-       "nocookiesnew": "حساو کاروری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاروریا استفاده می که.کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاروری تازه و پسورد هنی بیایت وا مئن.",
-       "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاروریا استفاده می که. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
-       "nocookiesfornew": "حساو کاروری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.\nمطمئن بوئیت که کوکیا فعال بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.",
+       "nocookiesnew": "حساو کاریاری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاریاریا وه کار میئره .کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاریاری تازه و رازینه گواردن هنی بیایت وا مئن.",
+       "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاریاریا وه کار میئره. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
+       "nocookiesfornew": "حساو کاریاری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.\nمطمئن بوئیت که کوکیا کنشتگر بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "noname": "شما یه گل نوم کاروری خو ناریت",
-       "loginsuccesstitle": "اومائن د سيستم موفق بی",
-       "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د دعنوان \"$1\".'",
+       "noname": "شما یه گل نوم کاریاری خو ناریت",
+       "loginsuccesstitle": "اومائن د سامونه موفق بی",
+       "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د چی\"$1\".'",
        "nosuchuser": "چنی کاریاری و نوم  \"$1\" نئیش.\nنوم کاریاری وه حرفیا حساس هئ.\nروشت نیسنن تونه وارسی بکید،یا [[ویجه:وامین اومائن کاریار/ثوت نام کردن|یه گل حساو تازه راس بکید]].",
-       "nosuchusershort": "چنو کاروری وا ای نوم $1 نی ئیش.\nنیسنن تونه دوواره نئری بکیتو",
-       "nouserspecified": "شما باید یه نوم کارور اختصاص بئیتو",
-       "login-userblocked": "کارور قلف بیه.وامین اومائن اجازه نی ئن",
-       "wrongpassword": "پاسورد غلط وارد بیه.\nهنی تلاش بکید",
-       "wrongpasswordempty": "پاسوردی که دئیت حالیه.د نؤ تلاش بکیت",
-       "passwordtooshort": "پاسورد با حداقل  {{PLURAL:$1|1 character|$1 characters}}          با",
-       "password-name-match": "پاسوردتو با د نوم کاروریتو فرخ داشتوه",
-       "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاروری ممنو بیه.",
-       "mailmypassword": "د نۈ وارد كردن رمز",
-       "passwordremindertitle": "پاسورد موقت تازه سی {{SITENAME}}",
+       "nosuchusershort": "چنو کاریاری وا ای نوم $1 نی ئیش.\nنیسنن تونه دوواره نئری بکیتو",
+       "nouserspecified": "شما باید یه نوم کاریاری تیاری بکیت",
+       "login-userblocked": "کاریار قلف بیه.وامین اومائن اجازه نی ئن",
+       "wrongpassword": "رازینه گواردن غلط وارد بیه.\nهنی تلاش بکید",
+       "wrongpasswordempty": "رازینه گواردنی که دئیت حالیه.د نؤ تلاش بکیت",
+       "passwordtooshort": "رازینه گواردن با حداقل  {{PLURAL:$1|1 character|$1 characters}}          با",
+       "password-name-match": "رازینه گواردنتو با د نوم کاریاری فرخ داشتوه",
+       "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاریاری قدقن بیه.",
+       "mailmypassword": "د نۈ وارد كردن رازینه گواردن",
+       "passwordremindertitle": "رازینه گواردن موقت تازه سی {{SITENAME}}",
        "passwordremindertext": "یه نفر(شات خوتو،د تیرنشون آی پی $1) یه گل رازینه گواردن هنی سی {{نوم دیارگه}}($4) حاسته.یه گل رازینه گواردن موقتی سی کاریاری\"$2\" دروس بیه و د \"$3\" جاگر بیه. ار قصدتو یه بیه،شما واس ایسه روئیت وامین و یه گل رازینه گواردن هنی انتخاو بکید.\nرازینه گورادن موقتی د  {{جمی:$5|یه رو|$5 رو}}  تموم بوئه.\n\nار یه نفر هنی یه حاست داشتوئه،یا ار رازینه گورادن تونه د ویرتو اوما، و ار نحاستیت ونه آلشت بکیت، شما شایت د ای پیغوم تیه پوش بکیت و بحایت د وه کار بسن رازینه گواردن دماترتو دماداری بکیت.",
-       "noemail": "هیچ نشونی ایمیلی سی کارور $1 ضفط نبیه.",
-       "noemailcreate": "شما باید یه نشونی نومه معتور فراهم بکید",
-       "passwordsent": "یه گل پاسورد هنی سی تیرنشون انجانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.",
+       "noemail": "هیچ تیرنشون انجومانامه ای سی کاریار $1 ضفط نبیه.",
+       "noemailcreate": "شما باید یه تیرنشون انجومانامه خو فراهم بکید",
+       "passwordsent": "یه گل رازینه گواردن هنی سی تیرنشون انجومانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.",
        "blocked-mailpassword": "نها آی پی شما سی ویرایشت گرته بیه، و",
        "eauthentsent": "یه گل انجومانامه پشت راس کردنی د یه گل تیرنشون ویجه کل بیه.\nدما یه که یه گل انجومانامه هنی د حساو کل بوئه، شما واس دما رئنمونی نه د انجومانامه بئریت، سی یه که حساو شما راستکی پشت راست بوئه.",
-       "throttled-mailpassword": "یه گل پسورد دواره زنه بیه ایسه کل بیه، د آخری {{جمی:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{جمی:$1|ساعت|$1 ساعتیا}} کل بیه.",
+       "throttled-mailpassword": "یه گل رازینه گواردن دواره زنه بیه ایسه کل بیه، د آخری {{جمی:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{جمی:$1|ساعت|$1 ساعتیا}} کل بیه.",
        "mailerror": "خطا داره کل موئه:$1",
-       "acct_creation_throttle_hit": "سÛ\8cÙ\84 Ú©Ø±Û\8cا Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø¯ ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ø§Ø³ØªÙ\81ادÙ\87 Ú©Ø±Ø¯Ù\86Ù\87 Ø¯ Ø±Ù\88ز Ø¯Ù\85اÛ\8cÛ\8c {{جÙ\85Û\8c:$1|1 Ø­Ø³Ø§Ù\88|$1 Ø­Ø³Ø§Ù\88Û\8cا}} Ù\86Ù\87 Ø¯Ø±Ù\88س Ú©Ø±Ø¯Ù\86Ù\87Ø\8c Ù\88 Ù\88Ù\87 Ø¯ Ø¨Û\8cشترÙ\88Ù\86Ù\87 ØµÙ\84ا Ø¯Ø¦Ù\86 Ø¯ Ø§Û\8c Ø¯Ù\88رÙ\87 Ú¯Ø§ØªÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cÙ\87.\nد Ù\86تÛ\8cجÙ\87Ø\8c Ø³Û\8cÙ\84 Ú©Ø±Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ø§Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ø§Ø³ØªÙ\81ادÙ\87 Ú©Ø±Ø¯نه نمی تونن  حساویا بیشتری د ای گات دروس بکن.",
-       "emailauthenticated": "نشونی انجومانامه تونه د $2 سی 3$ مئکم بیه.",
+       "acct_creation_throttle_hit": "سÛ\8cÙ\84 Ú©Ø±Û\8cا Ø§Û\8c Ù\88Û\8cÚ©Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±ØªÙ\86Ù\87 Ø¯ Ø±Ù\88ز Ø¯Ù\85اÛ\8cÛ\8c {{جÙ\85Û\8c:$1|1 Ø­Ø³Ø§Ù\88|$1 Ø­Ø³Ø§Ù\88Û\8cا}} Ù\86Ù\87 Ø¯Ø±Ù\88س Ú©Ø±Ø¯Ù\86Ù\87Ø\8c Ù\88 Ù\88Ù\87 Ø¯ Ø¨Û\8cشترÙ\88Ù\86Ù\87 ØµÙ\84ا Ø¯Ø¦Ù\86 Ø¯ Ø§Û\8c Ø¯Ù\88رÙ\87 Ú¯Ø§ØªÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cÙ\87.\nد Ù\86تÛ\8cجÙ\87Ø\8c Ø³Û\8cÙ\84 Ú©Ø±Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ø§Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±Øªنه نمی تونن  حساویا بیشتری د ای گات دروس بکن.",
+       "emailauthenticated": "تیرنشون انجومانامه تونه د $2 سی 3$ مئکم بیه.",
        "emailnotauthenticated": "تیرنشون انجومانامه شما تا ایسه پشت راسگری نبیه.\nهنی انجومانامه ای سی چیا ری به نها کل نبیه.",
        "noemailprefs": "یه گل تیرنشون انجومانامه د الویتیاتو سی یه که ای ویجه گیا کار بکن انتخاو بکیت.",
-       "emailconfirmlink": "Ù\86Ø´Ù\88Ù\86Û\8c Ø§Ù\8aÙ\85Ù\84تÙ\88 Ù\86Ù\87 Ù\85Ø­Ù\83Ù\85 Ø¨Ù\83Ù\8aد",
+       "emailconfirmlink": "پشت Ø±Ø§Ø³ Ú©Ø±Ø¯Ù\86 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
        "invalidemailaddress": "تیرنشون انجومانامه حاستنی نئ شکل وه چوئه خوئی ناره.\nلطفن یه گل تیرنشون چوئه دار وارد بکیت یا ای رشنه گه نه حالی بنیت.",
-       "cannotchangeemail": "نشونی ایمیل حساو نتونه د ای ویکی آلشت بوئه.",
-       "emaildisabled": "ای مالگه نتونه ایمیل بفرسنه",
+       "cannotchangeemail": "تیرنشون انجومانامه حساو نتونه د ای ویکی آلشت بوئه.",
+       "emaildisabled": "ای مالگه نتونه انجومانامه کل نمی که",
        "accountcreated": "حساو راس بی",
        "accountcreatedtext": "حساو کاریاری سی [[{{ns:کاریار}}:$1|$1]] ([[{{ns:کاریار چک چنه}}:$1|چک چنه]]) دروس بیه.",
        "createaccount-title": "حساو راس کرده سی  {{SITENAME}}",
-       "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و پاسوردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.",
+       "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($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ار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش استفاده بوئه.",
+       "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش وه کار گرته بوئه.",
        "pt-login": "وا مین اومائن",
        "pt-login-button": "وا مین اومائن",
        "pt-createaccount": "يه گل حساو راست بكيد",
-       "pt-userlogout": "د سيستم دراومائن",
-       "php-mail-error-unknown": "خطا Ù\86اشÙ\86اس Ù\85ئÙ\86 ØªØ§Ù\88ع  PHP's mail()",
-       "user-mail-no-addy": "سی کل کردن ایمیل بی نشونه ایمیل صورت گرته",
-       "user-mail-no-body": "سی کل کردن ایمیل وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
-       "changepassword": "پاسورد نه آلشت بكيت",
-       "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل پاسورد هنی وارد بکیتو.",
+       "pt-userlogout": "د سامونه دراومائن",
+       "php-mail-error-unknown": "خطا Ù\86ادÛ\8cار Ù\85Û\8cÙ\86 Ø¢Ù\84شت Ù\88Ù\86 PHP's mail()",
+       "user-mail-no-addy": "سی کل کردن انجومانامه د یه گل انجومانامه بی تیرنشون کنشتگری بیه",
+       "user-mail-no-body": "سی کل کردن انجومانامه وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
+       "changepassword": "رازینه گواردن نه آلشت بكيت",
+       "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل رازینه گواردن هنی وارد بکیتو.",
        "resetpass_text": "<!-- یه گل نیسسه ایچه اضاف بکیت -->",
-       "resetpass_header": "پاسورد حساوتونه آلشت بکید",
-       "oldpassword": "پاسورد قدیمی:",
-       "newpassword": "پاسورد تازه:",
-       "retypenew": "رمز تازه نه دوواره بنیسید:",
-       "resetpass_submit": "پاسور بنیت و وامین بیایت",
-       "changepassword-success": "پاسورد شما وا موفقیت آلشت بی",
+       "resetpass_header": "رازینه گواردن حساوتونه آلشت بکید",
+       "oldpassword": "رازینه گواردن قدیمی:",
+       "newpassword": "رازینه گواردن تازه:",
+       "retypenew": "رازینه گواردن تازه نه دوواره انجومیارنیسی :",
+       "resetpass_submit": "رازینه گواردن بنیت و وامین بیایت",
+       "changepassword-success": "رازینه گواردن شما د خوئی آلشت بی",
        "changepassword-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید",
-       "resetpass_forbidden": "پاسوردیا نتونن آلشت بوئن",
-       "resetpass-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت",
-       "resetpass-submit-loggedin": "پاسورد نه آلشت بكيت",
+       "resetpass_forbidden": "رازینه گواردناتون نتونن آلشت بوئن",
+       "resetpass-no-info": "شما با بیایت د سامونه تا د ای بلگه دسرسی داشتویت",
+       "resetpass-submit-loggedin": "رازینه گواردن نه آلشت بكيت",
        "resetpass-submit-cancel": "انجوم شیوسن",
        "resetpass-wrong-oldpass": "رازینه گواردن تازه یا موقتی نامعتور.\nشات شما ایسنی یا رازینه گواردن خوتونه د خوئی آلشت دئیته یا یه گل رازینه گواردن موقت هنی درحاست دئیته.",
        "resetpass-recycled": "لطفن رازینه گواردن خوتونه سی چیا تر د رازینه گواردن ایسنی د نو زنه بکیت",
        "resetpass-temp-emailed": "شما وا یه گل رازینه موقتی که انجوما گر بیه  اومایته وامین.\nسی تموم کردن اومائن وامین، یه گل رازینه گواردن هنی د ایچه  جاگر بکیت.",
-       "resetpass-temp-password": "رمز موقت:",
+       "resetpass-temp-password": "رازینه گواردن موقت:",
        "resetpass-abort-generic": "آلشت دئن رازینه گواردن وا یه گل فره پوش خرو بیه.",
        "resetpass-expired": "رازینه گواردن شما منقضی بیه. لطفن یه گل رازینه گواردن هنی سی وامین اومائن جاگری بکیت.",
        "resetpass-expired-soft": "رازینه گواردن شما منقضی بیه و واس د نو زنه با. لطفن یه گل رازینه هنی انتخاو بکیت، یا سی د نو زنه کردن د نهاتر د ایچه \"{{int:resetpass-submit-cancel}}\" بپورنیت.",
-       "resetpass-validity-soft": "زازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.",
-       "passwordreset": "د نۈ وارد كردن رمز",
+       "resetpass-validity-soft": "رازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.",
+       "passwordreset": "د نۈ وارد كردن رازینه گواردن",
        "passwordreset-text-one": "ای نوم بلگه نه سی گرتن یه گل رازینه گواردن موقتی وا انجومانامه پر بکیت.",
        "passwordreset-text-many": "{{جمی:$1|یه گل د رشنه گه یا نه سی یه که رازینه گواردن موقتی وا انجومانامه گرته بوئه پر بکیت}}",
-       "passwordreset-legend": "د نۈ وارد كردن رمز",
-       "passwordreset-disabled": "نو کرد پاسورد د ای ویکی غیرفعال بیه.",
-       "passwordreset-emaildisabled": "چی یا هنی ایمیل د ای ویکی غیرفعال بیه.",
-       "passwordreset-username": "نوم كاروری:",
+       "passwordreset-legend": "د نۈ وارد كردن رازینه گواردن",
+       "passwordreset-disabled": "نو کرد رازینه گواردن د ای ویکی ناکشتگر بیه.",
+       "passwordreset-emaildisabled": "چی یا هنی انجومانامه د ای ویکی ناکشتگر بیه.",
+       "passwordreset-username": "نوم کاریاری:",
        "passwordreset-domain": "پوشگیر",
-       "passwordreset-capture": "ایمیل نتیجه نه بوینیتو؟",
-       "passwordreset-capture-help": "ار شما ای جعوه نه وارسی بکید. ایمیل و خوئی اوسه که سی کارور کل بیه بوئه بوینیتش.",
-       "passwordreset-email": "نشونی ايميل",
+       "passwordreset-capture": "انجومانامه نتیجه نه بوینیتو؟",
+       "passwordreset-capture-help": "ار شما ای جعوه نه وارسی بکید. انجومانامه و خوئی اوسه که سی کاریار کل بیه بوئه بوینیتش.",
+       "passwordreset-email": "تیرنشون انجومانامه",
        "passwordreset-emailtitle": "جزئیات حساو ها د {{نوم مالگه}}",
        "passwordreset-emailtext-ip": "یه کسی(شات خوتو، وا تیرنشون آی پی $1) سی د نو زنه کردن رازینه گواردن تو د {{SITENAME}}  درحاست کرده($4).\nسی کاریار «$2» یه گل رازینه گواردن موقتی دروس بیه و و هؤمبراور «$3» ئه.\nار تمارزو تو یه بیه ایسه باید بیایت وامین سامونه و یه گل رازینه گواردن هنی بهاییت\nرازینه گواردن شما د طیل {{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ار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
-       "passwordreset-emailelement": "نوم کاروری: $1\nپاسورد موقتی: $2",
-       "passwordreset-emailsent": "پاسورد هنی سی ایمیل کل بیه.",
-       "passwordreset-emailsent-capture": "پاسورد تازه تو د ایمیلتو که د هار نشو دئه بیه کل بیه",
+       "passwordreset-emailelement": "نوم کاریاری: $1\nرازینه گواردن موقتی: $2",
+       "passwordreset-emailsent": "رازینه گواردن هنی سی انجومانامه کل بیه.",
+       "passwordreset-emailsent-capture": "رازینه گواردن تازه تو د انجومانامه تو که د هار نشو دئه بیه کل بیه",
        "passwordreset-emailerror-capture": "رازینه گواردن د انجومانامه د نو زنه کننه راس بیه، و وه د هار دیاری می که، اما کل بیین وه د{{جنس:$2|کاریار}} شکست حرده:$1",
-       "changeemail": "ایمیل تو نه آلشت بکید",
+       "changeemail": "انجومانامه تو نه آلشت بکید",
        "changeemail-text": "ای نوم بلگه نه سی آلشت دئن تیرنشون انجومانامه تو پر بکیت. شما سی پشت راس کردن ای آلشت واس رازینه گواردن خوتونه وارد بکیت.",
-       "changeemail-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت",
-       "changeemail-oldemail": "نشونی ایمیل تازه باو:",
-       "changeemail-newemail": "نشونی ایمیل تازه",
+       "changeemail-no-info": "شما با بیایت د سامونه تا د ای بلگه دسرسی داشتویت",
+       "changeemail-oldemail": "تیرنشون انجومانامه تازه باو:",
+       "changeemail-newemail": "تیرنشون انجومانامه تازه:",
        "changeemail-none": "(هيش كوم)",
-       "changeemail-password": "شما {{SITENAME}} پاسورد:",
-       "changeemail-submit": "آلشت کردن ایمیل",
+       "changeemail-password": "{{SITENAME}} رازینه گواردن شما:",
+       "changeemail-submit": "آلشت کردن انجومانامه",
        "changeemail-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید.",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.",
        "bold_tip": "متن توپر بيه",
        "italic_sample": "نوشته كج كوله",
        "italic_tip": "نوشته كج كوله",
-       "link_sample": "عÙ\86Ù\88اÙ\86 Ù\84Ù\8aÙ\86Ù\83",
-       "link_tip": "Ù\84Û\8cÙ\86Ú© Ù\85ئÙ\86 Ù\88Ù\86",
-       "extlink_sample": "http://www.example.com نوم ديس ون",
+       "link_sample": "داسÙ\88Ù\86 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د",
+       "link_tip": "Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د Ø¯Ø§Ø®Ù\84Û\8c",
+       "extlink_sample": "http://www.example.com داسون هوم پیوند",
        "extlink_tip": "هوم پیوند خارجی(د ویر داشتو)",
-       "headline_sample": "سرخط نوشته",
-       "headline_tip": "قدم 2 خط سر ون",
-       "nowiki_sample": "د Ø§Û\8cÚ\86Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ù\85تÙ\86 بی شلک وارد بکید",
+       "headline_sample": "سرخط نیسسه",
+       "headline_tip": "ریرتراز 2 خط سر ون",
+       "nowiki_sample": "د Ø§Û\8cÚ\86Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ù\86Û\8cسسÙ\87 بی شلک وارد بکید",
        "nowiki_tip": "شلک ویکی نه ندید بگر",
        "image_sample": "Example.jpg",
        "image_tip": "جانیا محاط بيه",
        "media_sample": "Example.ogg",
-       "media_tip": "فایل هوم پیوند",
-       "sig_tip": "اÙ\85ضا Ø´Ù\85ا Ù\88 Ø¨Ø±Ú\86سÙ\88 وخت",
-       "hr_tip": "خط Ø§Ù\81Ù\82 Ù\88Ù\86Ù\87(سÙ\88ا Ø³Ù\88ا Ø¯Ø´ Ø§Ø³ØªÙ\81ادÙ\87 Ú©و)",
+       "media_tip": "جانیا هوم پیوند",
+       "sig_tip": "اÙ\85ضا Ø´Ù\85ا Ù\88 Ø¯Û\8cس Ù\88Ù\86 وخت",
+       "hr_tip": "خط Ø¢Ø³Ù\88 Ù\88Ù\86Ù\87(سÙ\88ا Ø³Ù\88ا Ù\88Ù\87 Ú©Ø§Ø± Ø¨Û\8cئرشو)",
        "summary": "چكسته",
        "subject": "موضو/سر خط:",
        "minoredit": "يه ويرايشت كؤچكيه",
        "watchthis": "ديئن ای بلگه",
        "savearticle": "اماییه کردن بلگه",
        "preview": "پيش سيل",
-       "showpreview": "پيش نمائش نشون بيئه",
+       "showpreview": "پيش سیل نشون بيئه",
        "showdiff": "آلشتيانه نشون بيئه",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "anoneditwarning": "<strong>زئنار:</strong> شما هنی نیوماته وامین. تیرنشون آی پی شما هر گاتی که آلشتی راس بکیت سی کل خلک دیاره. ار <strong>[$1 روئیت وامین]</strong> یا <strong>[$2 یه گل حساو کاریاری راس بکیت]</strong>، ویرایشتیا شما وه نوم کاریاری خوتون دیاری می که، و وا چیا بیتر هنی.",
        "anonpreviewwarning": "<em>شما نیومائته وامین. تیرنشون آی پی شما د ویرگار ویرایشت ای بلگه اماییه بوئه.</em>",
        "missingsummary": "<strong>د ویر ونا:</strong> شما هنی یه گل چکسته ویرایشتی نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
-       "missingcommenttext": "Ù\84Ø·Ù\81Ù\86 Ø¯ Ø§Û\8cÚ\86Ù\87 Ù\86ظر بیئتو",
+       "missingcommenttext": "Ù\84Ø·Ù\81Ù\86 Ø¯ Ø§Û\8cÚ\86Ù\87 Ù\88Û\8cر Ù\88 Ø¨Ø§Ù\88ر بیئتو",
        "missingcommentheader": "<strong>د ویر ونا:</strong> شما هنی یه گل موضوع/سرخط سی ای ویر و باور نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
        "summary-preview": "چکسته پیش سیل:",
        "subject-preview": "پیش سیل موضو سرخط",
-       "blockedtitle": "كارور قلف بيه",
+       "blockedtitle": "کاریار نهاگری بیه",
        "blockedtext": "<strong>نوم کاریاری شما یا تیرنشون آی پی شما قلف بیه.</strong>\n\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:<em>$2</em>.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\n\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر  یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو معلوم کرده بویت و باید امکان وه کار بستن وه نه داشتویت.\n\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.",
+       "autoblockedtext": "نوم کاریاری شما یا تیرنشون آی پی شما سی یه که یه گل کاریاری هنی وه کارش بسته خودانجومن قلف بیه $1 ونه قلف کرده.\nدلیل ها د ایچه\n\n:<em>$2</em>.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\n\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر  یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو دیاری کرده بویت و باید امکان وه کار بستن وه نه داشتویت.\n\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.",
        "blockednoreason": "هیژ دلیلی دئه نبیه",
        "whitelistedittext": "شما باید $1 سی ویرایشت بلگیا",
        "confirmedittext": "شما واس دما ویرایشت کردن بلگه یا تیرنشون انجومانامه تونه پشت راس بکیت.\nلطفا یه گل تیرنشون خو سی [[Special:اولویتیا|اولویتیا کاریار]] بنیت.",
        "nosuchsectiontitle": "نبوئه بشخ پیدا بوئه",
        "nosuchsectiontext": "شما سی ویرایشت کردن جایی که وجود ناره تلاش کردیته.\nشات وه اوسه که شما بلگه نه می دیئته جا وه جا بیه یا پاکسا بیه.",
        "loginreqtitle": "وامین اومائن لازمه",
-       "loginreqlink": "اومائن",
+       "loginreqlink": "وا مین اومائن",
        "loginreqpagetext": "$1 لطف بکید بلگه یا هنی نه بوینیت",
-       "accmailtitle": "پاسورد کل بی",
+       "accmailtitle": "رازینه گواردن کل بی",
        "accmailtext": "یه گل رازینه گواردن شامسکی سی[[چک چنه کاریار:$1|$1]] سی $2 کل بیه.بوئه وه نه د گات وه کار بستن بلگه اومائن وامین د <em>[[Special:آلشت دئن رازینه گواردن|آلشت دئن رازینه گواردن]]</em>  آلشت دئه بوئه.",
        "newarticle": "تازه",
-       "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن مرورگر تونه بپورنیت.",
+       "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن دوارته نیئر تونه بپورنیت.",
        "anontalkpagetext": "----",
        "noarticletext": "د تازه یا د ای بلگه متن نی.\nشما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}   د هنی پی جوری بوئه  logs]</span>   \n   [{{fullurl:{{FULLPAGENAME}}|action=edit}} یای ای بلگه نه ویرایشت بکیدpage]</span>.",
        "noarticletext-nopermission": "د تازه یا د ای بلگه متن نی.\nشما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}   د هنی پی جوری بوئه  logs]</span>      اما شما حق ناریتو ای بلگه نه راس بکیت",
        "missing-revision": "وانئیری #$1 د بلگه ای که نومش ونه \"{{FULLPAGENAME}}\" وجود ناره.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د   [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا بوئن.",
        "userpage-userdoesnotexist": "حساو کاریاری\"$1\" ثوت نام نبیه.\nار میهایت ای بلگه نه بسازیتو یا ویرایشت بکیت یه گل وارسی انجوم بئیت.",
        "userpage-userdoesnotexist-view": "حساو کارور\"$1\" ثوت نبیه.",
-       "blocked-notice-logextract": "ای کارور ایسنی دسرسی ناره.\nآخری نشون قلف ورودی د هار ایچه سی سرچشمه آماده بیه:",
-       "clearyourcache": "<strong>تÙ\88جÙ\87 داشتویت:</strong> نها اماییه کاری, شات مژبور وه وه کار ونن ویرگه نهو دوارته نیئر خوتو سی دیئن ای آلشتیا بوئیت .\n* <strong>فایرفاکس/ سفری:</strong> بپورنیت ری<em>شیفت</em> اوسه که می پورنیت<em>د نو سوار بوئه</em>یا هنی ری <em>Ctrl-F5</em> بپورنیت یا<em>Ctrl-R</em> (<em>⌘-R</em> د سامونه مک)\n* <strong>گوگل کروم:</ strong>بپورنیت ری <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> یا د سامونه)\n* <strong>اینترنت اکسپلورر:</strong> <em>Ctrl</em> واداریت اوسه که می پورنیت ری <em>Refresh</em>, یل بپورنیت ری<em>Ctrl-F5</em>\n* <strong>اوپرا:</strong> ویرگه نهو نه د <em>اوزاریا→ اولویتیا پاک بکیت</em>",
-       "usercssyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن سی اس اس تازه دما اماییه کاری استفاده بکیت .",
-       "userjsyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن دما اماییه کاری جاوا اسکریپت تازه استفاده بکیت .",
+       "blocked-notice-logextract": "ای کاریار ایسنی دسرسی ناره.\nآخری پهرستنومه قلف ورودی د هار ایچه سی سرچشمه آماده بیه:",
+       "clearyourcache": "<strong>د Ù\88Û\8cر داشتویت:</strong> نها اماییه کاری, شات مژبور وه وه کار ونن ویرگه نهو دوارته نیئر خوتو سی دیئن ای آلشتیا بوئیت .\n* <strong>فایرفاکس/ سفری:</strong> بپورنیت ری<em>شیفت</em> اوسه که می پورنیت<em>د نو سوار بوئه</em>یا هنی ری <em>Ctrl-F5</em> بپورنیت یا<em>Ctrl-R</em> (<em>⌘-R</em> د سامونه مک)\n* <strong>گوگل کروم:</ strong>بپورنیت ری <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> یا د سامونه)\n* <strong>اینترنت اکسپلورر:</strong> <em>Ctrl</em> واداریت اوسه که می پورنیت ری <em>Refresh</em>, یل بپورنیت ری<em>Ctrl-F5</em>\n* <strong>اوپرا:</strong> ویرگه نهو نه د <em>اوزاریا→ اولویتیا پاک بکیت</em>",
+       "usercssyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن سی اس اس تازه دما اماییه کاری وه کار بیئریت.",
+       "userjsyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن دما اماییه کاری جاوا اسکریپت تازه وه کار بیئریت.",
        "usercsspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت سی اس اس کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "userjspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت جاوا اسکریپت کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "sitecsspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت ای سی اس اس  نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "session_fail_preview_html": "<strong>د بدبختی ما سی یه که رسینه یا جلسه مونه د دس دئیمه نمی تونیم کار پردازشت ویرایشت شمانه انجوم بیئمو.</strong>\nلطفن هنی تلاش بکیت.\n\n<em>سی یه که {{نوم دیارگه}} یه گل ردیف اچ تی ام ال کنشتگر بیه داره، پیش سیل سی یه که د دس حمله یا جاوا اسکریپ د امون با قام کرده بیه..</em>\n\n<strong>ار وه گات قانونی تلاش سی ویرایشته،لطفا د نو تلاش بکیت.</strong>\nار هنی کار وه دروس کار نکرد،[[Special:UserLogout|اومائن وه در]] نه ازمایشت بکیت و د نو بیایت وامین.",
        "token_suffix_mismatch": "<strong>ویرایشتیا شما سی یه که دووارته نئر شما نیسسه یا نقطه نیائن نه د رازینه امنیتی ویرایشت د یک تیچسه.</strong>\nویرایشت سی یه که د خراو بیئن نیسسه بلگه نهاگری با رد بیه.\nای رخ ون د گاتیایی پیش میا که شما د یه گل رسینه جا پروکسی استفاده می کیت.",
        "edit_form_incomplete": "<strong>پاره ای د ویرایشتا وه رسینه جا نمی رسن، هنی وارسی بکیت سی یه که بوینیت ویرایشتیا شما خوئه و هنی تلاش بکیت .</strong>",
-       "editing": "د حالت ويرايشت$1",
+       "editing": "د حال و بال ويرايشت$1",
        "creating": "راس كردن $1",
-       "editingsection": "د حال ویرایشت$1(بشخ)",
-       "editingcomment": "د حال ویرایشت$1(بشخ تازه)",
+       "editingsection": "د حال و بال ویرایشت$1(بشخ)",
+       "editingcomment": "د حال و بال ویرایشت$1(بهرجا تازه)",
        "editconflict": "تضاد د ویرایشت:$1",
-       "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه روئی متن بلگه متن نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د متن هاری نشو دئه هئ.\nشما با آلشتیاتونه د متن که هئش یکی بکید.\nفقط متنی که ها د رو د وختی که شما\"{{رقم:ذخیره گوتار}}\" نه گزارشت می کید اماییه بوئه",
-       "yourtext": "Ù\85تÙ\86 شما",
+       "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه وارو نیسسه بلگه نیسسه نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د نیسسه هاری نشو دئه هئ.\nشما با آلشتیاتونه د نیسسه که هئش یکی بکید.\nفقط متنی که ها د رو د گاتی که شما\"{{رقم:اماییه کاری گوتار}}\" نه گزارشت می کید اماییه بوئه",
+       "yourtext": "Ù\86Û\8cسسÙ\87 شما",
        "storedversion": "دوواره دیئن انبار بیه.",
        "nonunicodebrowser": "<strong>زئنار:دووارته نئر شما وا نیسسه یا یونیکد سازگاری ناره.</strong>\nیه گل راحل وه کار گرته بیه سی یه که شما بلگه یا نه وا امنیت ویرایشت بکیت:\nنیسه یا غیر-ASCII  د پایه رازینه یا 16 تایی دتو نشو دئه بوئه.",
        "editingold": "<strong>زئنار:شما داریت یه گل وانئری نا به هنگوم بیه نه سی ای بلگه ویرایشت می کید</strong>\nار شما ونه اماییه بکیت،هر آلشتی که د اول سی ای وانئری انجوم بیه گم بوئه.",
        "semiprotectedpagewarning": "<strong>د ویر داشتویت:</strong> ای بلگه سی یه که فقط کاریاریا ثوت نام کرده تونستون دش ویرایشت بکه ن پر و پیم بیه.\nآخرین پهرستنومه دئه بیه سی سرچشمه هار نها اماییه بیه:",
        "cascadeprotectedwarning": "<strong>زئنار:</strong> ای بلگه",
        "titleprotectedwarning": "<strong>زئنار:ای بلگه پر و پیم بیه سی یه که[[ویجه:نوم گه حقوق گرو|حقوق ویجه]] باید ونه دروس بکن .</strong>\nآخرین پهرستنومه دئه بیه سی سرچشمه دئن نهااماییه بیه:",
-       "templatesused": "{{جمی:$1|چوئه|چوئه یا}}د ای بلگه استفاده بیه:",
+       "templatesused": "{{جمی:$1|چوئه|چوئه یا}}د ای بلگه وه کار گرته بیه:",
        "templatesusedpreview": "{{جمی:$1|چوئه|چوئه یا}}استفاده بیه د ای پیش سیل:",
-       "templatesusedsection": "{{جمی:$1|چوئه|چوئه یا}} استفاده بیه د ای بخش:",
-       "template-protected": "(حمايت بيه)",
-       "template-semiprotected": "(نيم-حفاظت بيه)",
+       "templatesusedsection": "{{جمی:$1|چوئه|چوئه یا}} وه کار گرته بیه د ای بخش:",
+       "template-protected": "(پر و پیم بيه)",
+       "template-semiprotected": "نصم و نیمه پر و پیم بیه",
        "hiddencategories": "ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ",
        "edittools-upload": "-",
        "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].",
        "nocreate-loggedin": "شما حق ناریت  که بلگه یا تازه نه راس بکید.",
-       "sectioneditnotsupported-title": "ویرایشت بخش حمایت نبوئه",
-       "sectioneditnotsupported-text": "ویرایشت بشقی د ای بلگه نئیش.",
+       "sectioneditnotsupported-title": "ویرایشت بهرجا حامین داری نبوئه",
+       "sectioneditnotsupported-text": "ویرایشت بهرجایی د ای بلگه نئیش.",
        "permissionserrors": "خطا اجازه دئین",
        "permissionserrorstext": "شما حق ناریت ونه انجوم بیئت, سی{{جمی:$1|دلیل|دلیلیا}} نهایی:",
        "permissionserrorstext-withaction": "شما سی $2 اجازه ناریت\nسی دمال کردن{{PLURAL:$1|reason|reasons}}:",
-       "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی راحتی تو فراهم بیه:",
-       "moveddeleted-notice": "ای بلگه پاک بیه.\nپاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه",
+       "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی فراغتتو آماده بیه:",
+       "moveddeleted-notice": "ای بلگه پاکسا بیه.\nپاکسا بین و جمشت ای بلگه سی سرچشمه دئین آماده بیه",
        "log-fulllog": "دیئن همه پهرستنومه یا",
-       "edit-hook-aborted": "ویرایشت وا قلاو جلوگری بیه.\nهیچ توضیئ سیش نئ.",
+       "edit-hook-aborted": "ویرایشت وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
        "edit-gone-missing": "نبوئه ای بلگه نه وه هنگوم بکیت.\nوه نظر میا که وه پاکسا بیه.",
        "edit-conflict": "مخالفت نه ویرایشت بکید",
        "edit-no-change": "سی یه که آلشتیا د یه گل نیسسه دروس بیه د ویرایشت شما تیه پوشی بیه.",
        "postedit-confirmation-restored": "بلگه د نو اماییه بیه.",
        "postedit-confirmation-saved": "ویرایشتتو اماییه بی",
        "edit-already-exists": "نبوئه یه گل بلگه تازه راس بکید.\nوه هئیش.",
-       "defaultmessagetext": "Ù\85تÙ\86 پیغوم پیش فرض",
+       "defaultmessagetext": "Ù\86Û\8cسسÙ\87 پیغوم پیش فرض",
        "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3",
        "invalid-content-data": "دنسمنی مینونه نامعتور",
-       "content-not-allowed-here": " Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87\"$1\" Ø³Û\8c Ø¨Ù\84Ú¯Ù\87 [[$2]] Ø§Ø¬Ø§Ø²Ù\87 نه دئه بیه",
+       "content-not-allowed-here": " Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87\"$1\" Ø³Û\8c Ø¨Ù\84Ú¯Ù\87 [[$2]] ØµÙ\84ا نه دئه بیه",
        "editwarning-warning": "ار ای بلگه نه ول بکیت هر آلشتی که دئیته پاک بوئه.\nار شما هاییت وا مین،شما می تونیت ای زئنار نه د \"{{int:prefs-editing}}\" که ها د بخش اولویتیا شما ناکشتگر بکیت.",
        "editpage-notsupportedcontentformat-title": "شلک مینونه دماگری نبیه",
        "editpage-notsupportedcontentformat-text": "وضع و بار مینونه $1 د مدل مینونه $2 حامین نبوئه.",
-       "content-model-wikitext": "Ù\88Ù\8aÙ\83Û\8c Ù\85تÙ\86",
-       "content-model-text": "Ù\85تÙ\86 ساده",
+       "content-model-wikitext": "Ù\88Ù\8aÙ\83Û\8c Ù\86Û\8cسسÙ\87",
+       "content-model-text": "Ù\86Û\8cسسÙ\87 ساده",
        "content-model-javascript": "جاوا اسكريپت",
        "content-model-css": "سی اس اس",
+       "content-json-empty-object": "سرتال حالی",
+       "content-json-empty-array": "آرایه حالی",
        "expensive-parserfunction-warning": "<strong>زئنار:</strong>ای بلگه مینونه دار واحونی دستوریا مئن اشکافت فره ای هئ.\n\nانازه و باید د کمتر با$2 {{جمی:$2|واحونی|واحونیا}}، ایسه {{جمی:$1|$1 واحونی|$1 واحونیا}}ئه.",
        "expensive-parserfunction-category": "بلگه یایی که واحونی پیوندگر خطا گرون فره ای ها دشو",
-       "post-expand-template-inclusion-warning": "زنئار قالو شومل انازه ای یه که فره گپه.پاره ای د قالویا نه د بر نگره",
-       "post-expand-template-inclusion-category": "بÙ\84Ú¯Û\8cا Ø´Ù\88Ù\85Ù\84 Ù\82اÙ\84Ù\88Û\8c ین که انازش د حد اومائه وه در",
-       "post-expand-template-argument-warning": "زÙ\86Ù\87ار Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø´Ù\88Ù\85Ù\84 Ø­Ø¯Ø§Ù\82Ù\84 Û\8cÙ\87 Ù\82اÙ\84Ù\88 سی چک چنه یه که انازه فره گپه.\nگپسنیا پاک بینه.",
-       "post-expand-template-argument-category": "بÙ\84Ú¯Ù\87 Ø´Ù\88Ù\85Ù\84 Ù\82اÙ\84Ù\88 چک چنیا د بین رئته",
-       "parser-template-loop-warning": "حلقه قالو کشف بیه:[[$1]]",
+       "post-expand-template-inclusion-warning": "زنئار چوئه د ور گرته انازه ای یه که فره گپه.پاره ای د چوئه یا نه د ور نمیئره.",
+       "post-expand-template-inclusion-category": "بÙ\84Ú¯Û\8cا Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Ú\86Ù\88ئÙ\87 ین که انازش د حد اومائه وه در",
+       "post-expand-template-argument-warning": "زÙ\86Ù\87ار Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Ø­Ø¯Ø§Ù\82Ù\84 Û\8cÙ\87 Ú\86Ù\88ئÙ\87 سی چک چنه یه که انازه فره گپه.\nگپسنیا پاک بینه.",
+       "post-expand-template-argument-category": "بÙ\84Ú¯Ù\87 Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Ú\86Ù\88ئÙ\87 چک چنیا د بین رئته",
+       "parser-template-loop-warning": "حلقه چوئه دیاری کرده:[[$1]]",
        "parser-template-recursion-depth-warning": "محدودیت پی یا ورئشتن چوئه رد بی($1)",
        "language-converter-depth-warning": "محدودیت پی یا زون والرن رد بی($1)",
        "node-count-exceeded-category": "بلگه یا که د بیشرونه شماره گرو فره پئشکرد کردنه",
        "expansion-depth-exceeded-warning": "بلگه د پی یا ووله بیین پئشکرد کرد",
        "parser-unstrip-loop-warning": "گردوله د فرمونه Unstrip پیدا بیه",
        "parser-unstrip-recursion-limit": "د بیشترونه د سرچشمه رئتن د دستور Unstrip واروتر رئتیته($1)",
-       "converter-manual-rule-error": "خطا د قانون دسی زون",
+       "converter-manual-rule-error": "خطا د قانون والرشتن دسی زون",
        "undo-success": "نبوئه ویرایشت نه انجومشیو بکیت.\nلطفا ای فرخی که ها د هار نه وارسی بکیت تا یه کاریه که میهات انجوم بئیت، و اوسه آلشتیا هار نه اماییه بکیت سی یه که خمثی کردن ویرایشت نه انجوم بئیت.",
        "undo-failure": "سی ری به ری بیئن ای ویرایشت وا ویرایشتیا مینجایی، نبوئه ای ویرایشت نه خومثی بکیت.",
        "undo-norev": "نبوئه ای ویرایشت نه خومثی بکیت سی یه که یا وجود ناره یا پاکسا بیه.",
        "revision-info": "دوواره سیل بیه چی $1 وا $2",
        "previousrevision": "اصلاح دمايی",
        "nextrevision": "تازه ترن دوبار دیئن",
-       "currentrevisionlink": "آخرین دوواره دیئن",
+       "currentrevisionlink": "آخری دوواره دیئن",
        "cur": "تازه باو",
        "next": "نيایی",
        "last": "دمايی",
        "page_first": "اولی",
        "page_last": "آخر",
        "histlegend": "انتخاو فرخدار:جعویا رادیو نه سی دوواره دیئن و وارسی نشو دار بکید و یا ری رئتن کلیک بکید .<br />\nشرح نوشته: '''({{int:cur}})''' = وا آخری دوواره دیئن فرخ داره '''({{ int:last}})'''= وا دواره دیئن انجوم دئنی فرخ داره  '''{{int:minoreditletter}}''' =ویرایشت کؤچک.",
-       "history-fieldset-title": "ویرگار مرور ون",
+       "history-fieldset-title": "ویرگار دوارته نیئری",
        "history-show-deleted": "فقط پاكسا بيه",
        "histfirst": "قديمي تري",
        "histlast": "تازه تري",
        "rev-deleted-comment": "(ویرایشت چکسته جا وه جا بیه)",
        "rev-deleted-user": "(نوم کاروری جا وه جا بیه)",
        "rev-deleted-event": "(انجوم گر پهرستنومه جا وه جا بیه)",
-       "rev-deleted-user-contribs": "[نوم کاروری یا نشونی آی پی جا وه جا بیه - چیا قام بیه د ور هوم یاریانه ویرایشت بکید]",
+       "rev-deleted-user-contribs": "[نوم کاریاری یا تیرنشون آی پی جا وه جا بیه - چیا قام بیه د ور هوم یاریانه ویرایشت بکید]",
        "rev-deleted-text-permission": "وانئری ای بلگه <strong>پاکسا بیه</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکسا کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساکردن].",
        "rev-suppressed-text-permission": "وانئری بلگه <strong>پاکساگری</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکساگری کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساگری کردن].",
        "rev-deleted-text-unhide": "وانئری ای بلگه <strong>پاکسا بیه</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکسا کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساکردن].\nشما  هنی تونیت [$1ای وانئری نه بونیت] ار بهاییت.",
        "rev-suppressed-unhide-diff": "وانئری ای بلگه <strong>پاکساگری بیه</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکساگری کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساگری کردن].\nشما  هنی تونیت [$1ای وانئری نه بونیت] ار بهاییت.",
        "rev-deleted-diff-view": "وانئری ای بلگه <strong>پاکسا بیه</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکسا کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساکردن].",
        "rev-suppressed-diff-view": "وانئری بلگه <strong>پاکساگری</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکساگری کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساگری کردن].",
-       "rev-delundel": "آلشت وضئيت ديئن",
-       "rev-showdeleted": "Ù\86Ø´Ù\88 Ø¯Ø§Ø¦Ù\86",
+       "rev-delundel": "آلشت حال و بال ديئن",
+       "rev-showdeleted": "نشو دئن",
        "revisiondelete": "پاکسا کردن/زنه کردن وانئریا",
        "revdelete-nooldid-title": "وانیری تمارزی بیه نامعتوره",
        "revdelete-nooldid-text": "شما وانئریا حاسنی نه سی انجوم دئن ای کار ره ون تیاری نکردیته، یا وانئریا تیارگر بیه وجود نارن، یا یه که شما میهایت وانئری ایسنی نه قام بکیت.",
-       "revdelete-no-file": "فایل مشقص بیه وجود ناره.",
+       "revdelete-no-file": "جانیا تیار بیه وجود ناره.",
        "revdelete-show-file-confirm": "شما د دل میهایت که وانئری پاکسا بیه ای جانیا نه بونیت \"<nowiki>$1</nowiki>\" د $2 تا $3؟",
        "revdelete-show-file-submit": "هری",
        "revdelete-selected-text": "{{جمی:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
        "revdelete-suppress-text": "پاکساگری فقط با <strong>تئنا</strong> سی جایایی که هان د هار وه کار گرته بوئه:\n*دونسمنیایی که فره تنادارن\n*دونسمنیا نامناسو شخصی\n*: <em>تیرنشون حونه، شماره تیلیفون،رازینه زایاره ای و چیا تر</em>",
        "revdelete-legend": "میزونکاری محدودیتیا دیار بیین.",
        "revdelete-hide-text": "متن دوواره دیئن",
-       "revdelete-hide-image": "چی یا مئن فایل قام کو",
+       "revdelete-hide-image": "چی یا مین جانیا نه قام کو",
        "revdelete-hide-name": "آرمون و انجوم گر نه قام بکید",
        "revdelete-hide-comment": "چکسه نه ویرایشت بکید",
-       "revdelete-hide-user": "نوم کاروری ویرایشتگر/نشونی آی پی",
+       "revdelete-hide-user": "نوم کاریاری ویرایشتگر/تیرنشون آی پی",
        "revdelete-hide-restricted": "پاکساگری کردن رسینه یا سی دیوونداریا و کسونا تر",
        "revdelete-radio-same": "آلشت نکید",
        "revdelete-radio-set": "قام بیه",
        "revdelete-failure": "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
        "logdelete-success": "<strong>پهرستنومه دیار بیین د خوئی میزونکاری بی.</strong>",
        "logdelete-failure": "<strong>پهرستنومه دیار بیین نبوئه میزونکاری با.</strong> $1",
-       "revdel-restore": "آلشت وضئيت ديئن",
+       "revdel-restore": "آلشت حال و بال ديئن",
        "pagehist": "ويرگار بلگه",
        "deletedhist": "ویرگار پاکسا بیه",
        "revdelete-hide-current": "خطا د قام کردن چی که ها د ویرگار $2 ساعت $1: ای نسقه، نسقه ایسنی یه و نبوئه نهوش بکیت.",
        "revdelete-reasonotherlist": "دلیل هنی",
        "revdelete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "revdelete-offender": "نیسنه وانیری:",
-       "suppressionlog": "پهرستنومه پاکسازی",
+       "suppressionlog": "پهرستنومه پاکساگری",
        "suppressionlogtext": "د هار یه گل نوم گه ای هئ که مینونه یا پاکسا بیه و قلف بیه  که هان دش د ورتیه دیوونداریا قام بینه.\n[[ویجه:نوم گه قلف بیه|نوم گه قلف بیئنیا]]نه سی نوم گه ایی که انجومکاریا قدقن بیه و قلف بینیا هان دش بونیت.",
        "mergehistory": "ویرگاریا بلگه نه یکی بکید",
-       "mergehistory-header": "ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.\nمطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگار هئ.",
+       "mergehistory-header": "ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.\nمطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگاره.",
        "mergehistory-box": "دوواره دیئن دوبلگه ای نه سر یک سازی کو:",
        "mergehistory-from": "بلگه سرچشمه:",
        "mergehistory-into": "بلگه مقصد:",
        "mergehistory-submit": "سر یک سازی دوواره دیئنیا",
        "mergehistory-empty": "هیپ دوواره دیئنی نبوئه یکی سازی بوئه.",
        "mergehistory-success": "$3 {{جمی:$3|وانیری|وانیریا}} د [[:$1]] وه خوئی د [[:$2]] سریک سازی بی.",
-       "mergehistory-fail": "سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا زمون و بلگه نه د نو وارسی بکید.",
-       "mergehistory-fail-toobig": "نبوئه وه یک شیوسن ویرگان انجوم دئه سی یکه وه بیشتر د محدودیت $1 {{PLURAL:$1|نسقه}}جا وه جا موئه.",
+       "mergehistory-fail": "سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا گات و بلگه نه د نو وارسی بکید.",
+       "mergehistory-fail-toobig": "نبوئه وه یک شیوسن ویرگا انجوم دئه سی یکه وه بیشتر د محدودیت $1 {{PLURAL:$1|نسقه}}جا وه جا موئه.",
        "mergehistory-no-source": "سرچشمه بلگه $1 وجود ناره.",
        "mergehistory-no-destination": "بلگه مقصد $1 وجود ناره.",
        "mergehistory-invalid-source": "نوم ون بلگه سرچشمه با معتور بوئه.",
        "diff-empty": "(بی فرق)",
        "diff-multi-sameuser": "({{PLURAL:$1|یه گل نسقه مینجایی|$1 نسقه یا مینجایی}} وه دس{{PLURAL:$2|کاریاری تر|$2 کاریاریا}} نشو دئه نبیه)",
        "diff-multi-otherusers": "({{PLURAL:$1|یه گل نسقه مینجایی|$1 نسقه یا مینجایی}} وه دس{{PLURAL:$2|کاریاری تر|$2 کاریاریا}} نشو دئه نبیه)",
-       "diff-multi-manyusers": "({{جمی:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{جمی:$2|کارور|کاروریا}} نشو دئه نبیه)",
+       "diff-multi-manyusers": "({{جمی:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{جمی:$2|کاریار|کاریاریا}} نشو دئه نبیه)",
        "difference-missing-revision": "{{PLURAL:$2|یه گل ویرایشت|$2 ویرایشت}} د فرق مینجا($1) {{PLURAL:$2|پیدا نبی|پیدا نبینه}}.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د   [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا بوئن.",
        "searchresults": "نتيجه يا پی جوری",
        "searchresults-title": "نتيجه يا پی جوری سی \"$1\"",
-       "titlematches": "عÙ\86Ù\88اÙ\86 Ø¨Ù\84Ú¯Ù\87 Ù\85طاÙ\88Ù\82ت Ø¯Ø§Ø±ه",
+       "titlematches": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Û\8cÚ©Û\8c Ø¨Û\8cه",
        "textmatches": "هومسازی نیسسه بلگه.",
        "notextmatches": "نیسسه بلگه هومسازی ناره",
        "prevn": "وادما {{PLURAL:$1|$1}}",
        "viewprevnext": "ديئن ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''ایچه بلگه ای هئ وه نوم\"[[:$1]]\" که ها د ای ویکی'''",
        "searchmenu-new": "'''ای بلگه نه راس كو \"[[:$1]]\" د ای  ويكي!'''",
-       "searchprofile-articles": "بلگيا محتوا",
-       "searchprofile-images": "رسانيا جمی",
+       "searchprofile-articles": "بلگيا مینونه دار",
+       "searchprofile-images": "وارسگریا خلکمن",
        "searchprofile-everything": "همه چی",
-       "searchprofile-advanced": "پيشرفته",
+       "searchprofile-advanced": "پیشکرده",
        "searchprofile-articles-tooltip": "بگرد مئن $1",
-       "searchprofile-images-tooltip": "بگرد Ø³Û\8c Ù\81اÙ\8aÙ\84Ù\8aا",
-       "searchprofile-everything-tooltip": "همه محتوا نه پی جوری كو (شاملا بلگيا چك چنه)",
+       "searchprofile-images-tooltip": "جاÙ\86Û\8cاÛ\8cاÙ\86Ù\87 Ù¾Û\8c Ø¬Ù\88رÛ\8c Ú©Ù\88",
+       "searchprofile-everything-tooltip": "همه مینونه یا نه پی جوری كو (شاملا بلگيا چك چنه)",
        "searchprofile-advanced-tooltip": "نوم جايا نوم ديار بگرد",
        "search-result-size": "$1 ({{جمی:$2|1 کلیمه|$2 کلیمه یا}})",
        "search-result-category-size": "{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 جانیا|$3 جانیایا}}",
        "showingresultsinrange": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2''' تا شماره '''$3'''.",
        "search-showingresults": "{{PLURAL:$4|نتیجه یا<strong>$1</strong> د <strong>$3</strong>|نتیجه یا<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "search-nonefound": "هیژ نتیجه یی سی پی جست تو مطاوقت نکرده",
-       "powersearch-legend": "پی جوری پیشبرده",
-       "powersearch-ns": "نوم جايا نوم ديار بگرد:",
+       "powersearch-legend": "پی جوری پیشکرده",
+       "powersearch-ns": "د نوم جايا نوم ديار پی جوری بک:",
        "powersearch-togglelabel": "چك كردن:",
        "powersearch-toggleall": "همه",
        "powersearch-togglenone": "هيش كوم",
        "mypreferences": "خصوصيات هنی",
        "prefs-edits": "شماره ویرایشتا:",
        "prefsnologintext2": "لطف بکیت بیایت وامین و ترجیحات خوتونه آلشت بئیت.",
-       "prefs-skin": "پوست",
+       "prefs-skin": "پوس",
        "skin-preview": "پیش سیل",
        "datedefault": "هیچ ترجیحات دش نئ",
-       "prefs-labs": "گزÛ\8cÙ\86شتÛ\8cا Ø¢Ø²Ù\85اÛ\8cشتی",
-       "prefs-user-pages": "بلگیا كارور",
-       "prefs-personal": "پروفایل کارور",
+       "prefs-labs": "گزÛ\8cÙ\86شتÛ\8cا Ø§Ø²Ù\85اشتی",
+       "prefs-user-pages": "بلگه یا کاریار",
+       "prefs-personal": "پروفایل کاریار",
        "prefs-rc": "آلشتیا تازه باو",
        "prefs-watchlist": "سیل برگ",
        "prefs-watchlist-days": "روزیا نه د سیل برگ نشو دئه بو:",
        "prefs-watchlist-edits-max": "شماره بیشترونه:1000",
        "prefs-watchlist-token": "نشونه سیل برگ:",
        "prefs-misc": "شيوسن",
-       "prefs-resetpass": "پاسورد نه آلشت بكيت",
-       "prefs-changeemail": "نشونی ایمیل تو نه آلشت بکید",
-       "prefs-setemail": "Ù\8aÙ\87 Ú¯Ù\84 Ø§Ù\8aÙ\85Ù\8aÙ\84 بنیت",
+       "prefs-resetpass": "رازینه گواردن نه آلشت بكيت",
+       "prefs-changeemail": "تیرنشون انجومانامه تو نه آلشت بکید",
+       "prefs-setemail": "Ù\8aÙ\87 Ú¯Ù\84 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 بنیت",
        "prefs-email": "چیا هنی انجومانامه",
        "prefs-rendering": "شلک و ری",
        "saveprefs": "اماییه كردن",
        "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
-       "prefs-editing": "د حالت ويرايشت",
+       "prefs-editing": "د حال و بال ویرایشت",
        "rows": "رديفيا:",
        "columns": "ستينا:",
        "searchresultshead": "پی جوری",
        "prefs-help-recentchangescount": "یه شامل آلشتیا تازه،ویرگاریا بلگه و پهرستنومه یا هئ.",
        "prefs-help-watchlist-token2": "یه یه گل کلیت رازینه دار سی خوارک تیارگه سیل برگه شمانه.\nهر کسی که شما مئشناسیت می تونه سیل برگ شما نه بوحونه،په ونه هومبئری نکیت.[[Special:ResetTokens|ار لازمه ونه آلشت بئیت ایچه نه بپورنیت]].",
        "savedprefs": "ویجه گیا هنی تو اماییه بیه.",
-       "timezonelegend": "وخت راساگه",
-       "localtime": "وخت ولاتی:",
-       "timezoneuseserverdefault": "وخت راساگه",
+       "timezonelegend": "گات راساگه",
+       "localtime": "گات ولاتی:",
+       "timezoneuseserverdefault": "ویکی پیش فرض($1) وه کار بونیت",
        "timezoneuseoffset": "هنی",
-       "servertime": "وخت سرور:",
+       "servertime": "گات رسینه جا:",
        "guesstimezone": "وا جاگرد پر بوئه",
        "timezoneregion-africa": "افرقا",
        "timezoneregion-america": "امركا",
        "timezoneregion-europe": "اوروپا",
        "timezoneregion-indian": "جهوناو هند",
        "timezoneregion-pacific": "جهوناو آروم",
-       "allowemail": "ایمیل سی کاروریا هنی فعال کو",
+       "allowemail": "انجومانامه نه سی کاریاریا هنی کنشتگر کو",
        "prefs-searchoptions": "پی جوری",
        "prefs-namespaces": "نوم جایا",
        "default": "پيش فرض",
-       "prefs-files": "فايلا",
+       "prefs-files": "جانیایا",
        "prefs-custom-css": "سی اس اس جاافتائه",
        "prefs-custom-js": "جاوا نیسسه جاافتائه",
        "prefs-common-css-js": " سی اس اس/جاوا اسکریپت بهر بیه سی همه پوسه یا:",
        "prefs-reset-intro": "شما می تونیت ای بلگه سی د نو زنه کردن ترجیحات خوت وه شکل تیارگه پیش فرض وه کار بوونیت.\nیه ورئشت پذیر نئ.",
-       "prefs-emailconfirm-label": "Ù\85ئکÙ\85 Ú©Ø±Ø¯Ù\86 Ø§Û\8cÙ\85Û\8cÙ\84:",
-       "youremail": "اÙ\8aÙ\85Ù\8aÙ\84:",
-       "username": "{{جنس:$1|نوم کاروری}}:",
+       "prefs-emailconfirm-label": "پش Ø±Ø§Ø³Øª Ú©Ø±Ø¯Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87:",
+       "youremail": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87:",
+       "username": "{{جنس:$1|نوم کاریاری}}:",
        "prefs-memberingroups": "{{جنس:$2|اندوم}}  {{جمی:$1|گرویا|گرویا}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "موقع ثوت نام:",
+       "prefs-registration": "گات ثوت نام:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "نوم راستكی:",
        "yourlanguage": "زون:",
-       "yourvariant": "محتوا آلشتگر زون:",
+       "yourvariant": "مینونه آلشتگر زون:",
        "prefs-help-variant": "قسه وری انتخاوی شما سی نمائشت مینونه بلگه یا د ای ویکی.",
        "yournick": "امضا تازه:",
        "prefs-help-signature": "ویر و باوریا نیسسه بیه د بلگه چک چنه باید وا«<nowiki>~~~~</nowiki>» امضا بان؛ ای نشون وه شکل خودانجومی وه امضا شما و مؤر ویرگار تبدیل بوئه.",
        "badsig": "امضا خؤم بی اعتوار.\nسردیسیا اچ تی ام ال نه وارسی بکیت.",
-       "badsiglength": "اÙ\85ضا Ø´Ù\85ا Ù\81رÙ\87 Ú¯Ù¾Ù\87.\nØ·Û\8cÙ\84 امضا باید کمتر  د $1 {{PLURAL:$1|نیسه}} بوئه.",
+       "badsiglength": "اÙ\85ضا Ø´Ù\85ا Ù\81رÙ\87 Ú¯Ù¾Ù\87.\nدرازا امضا باید کمتر  د $1 {{PLURAL:$1|نیسه}} بوئه.",
        "yourgender": "شما بیشتر میهایت که چه جوری گوته بوئه؟",
        "gender-unknown": "مه میهام چی یی نموئم",
        "gender-male": "وه(پیا) بلگه یا ویکی نه ویرایشت می که",
        "gender-female": "وه(زئنه)بلگه یا ویکی نه ویرایشت می که",
        "prefs-help-gender": "انجوم دئن ای میزونکاری دل به هاییه.\nنرم افزار سی هشاره درست وه جنسیت و گوتن شما سی کسونا تر د شکل درست وه کار بسن یه گل دستور زون یه نه وه کار می بنه.\nای دونسمنیا سی کل خلک دیارن.",
-       "email": "پیومک برقی",
-       "prefs-help-realname": "نوم راستکی دل به حائه.\nار شما ونه وارد بکیت د گات واگردونی وه آرنگیاتو و نسوت دئن ونو وه خوتو د نوم راستکی استفاده بوئه.",
-       "prefs-help-email": "نشونی ایمیل اختیاری هئ.اما سی بازجست پاسورد دش نیاز بوئه.شما باید پاسوردتونه د ویر بوریت",
-       "prefs-help-email-others": "شما می تونید سی پیوند گرتن تو وا نهایین ایمیل مئن یه هوم پیوند د بلگه کاروری یا بلگه چک چنه تو انتخاو بکید.\nنشونی ایمیلتو وختی که کاروریا هنی وا تو پیوند می گرن دیار نی.",
-       "prefs-help-email-required": "نشونی ایمیل لازم هئ.",
+       "email": "انجومانامه",
+       "prefs-help-realname": "نوم راستکی دل به حائه.\nار شما ونه وارد بکیت د گات واگردونی وه آرنگیاتو و نسوت دئن ونو وه خوتو نوم راستکی وه کار گرته بوئه.",
+       "prefs-help-email": "تیرنشون ایمیل دل بهاییه.اما سی وایافت رازینه گواردن دش میهایتش.شما باید رازینه گواردنتونه د ویر بوریت",
+       "prefs-help-email-others": "شما می تونید سی پیوند گرتن تو وا نهایین انجومانامه مین یه هوم پیوند د بلگه کاریاری یا بلگه چک چنه تو انتخاو بکید.تیرنشون انجومانامه تونه د گاتی که کاریاریا هنی وا تو پیوند می گرن دیار نی.",
+       "prefs-help-email-required": "تیرنشون انجومانامه واس با.",
        "prefs-info": "دونسمنیا اولیه",
        "prefs-i18n": "جهون ولاتمنی",
        "prefs-signature": "امضا",
-       "prefs-dateformat": "شلک وخت",
-       "prefs-timeoffset": "جا وه جایی زمونی",
-       "prefs-advancedediting": "گزÛ\8cÙ\86Ù\87 Û\8cا Ø¹Ù\85Ù\88Ù\85ی",
+       "prefs-dateformat": "شلک گات",
+       "prefs-timeoffset": "جا وه جایی گاتی",
+       "prefs-advancedediting": "گزÛ\8cÙ\86Ù\87 Û\8cا Ø®Ù\84Ú©Ù\85Ù\86ی",
        "prefs-editor": "ويرايشتگر",
        "prefs-preview": "پیش سیل",
        "prefs-advancedrc": "گزینه یا پیشکرده",
        "prefs-help-prefershttps": "کارگرایی ای ترجیح نها وامین اومائن نهایی شما وه کار گرته بوئه.",
        "prefswarning-warning": "آلشتیا شما ری ترجیحاتتو هنی اماییه نبیه.\nار ای بلگه نه بی یه که ری \"$1\" بپورنیت ول بکیت ترجیحیا شما اماییه نبوئن.",
        "prefs-tabs-navigation-hint": "نکته: شما می تونید د کلیتیا لادیار کن چپ و راست نه سی رئتن مین تبیا که هان د نوم گه تبیا وه کار بونیت.",
-       "email-address-validity-valid": "نشونی ایمیل دیار بیه خوئه",
-       "email-address-validity-invalid": "یه گل نشونی ایمیل خو وارد بکید",
+       "email-address-validity-valid": "تیرنشون انجومانامه دیار بیه خوئه",
+       "email-address-validity-invalid": "یه گل تیرنشون انجومانامه خو وارد بکید",
        "userrights": "حقوق دیوونداری کاریار",
        "userrights-lookup-user": "دسه یا کاروری نه دیوون داری بکیت",
-       "userrights-user-editname": "نوم كاروری ته وارد كو",
-       "editusergroup": "ویرایشت گرویا کاروری",
+       "userrights-user-editname": "یه گل نوم کاریاری وارد بکیت:",
+       "editusergroup": "ویرایشت گرویا کاریاری",
        "editinguser": "آلشت دئن حقوق کاریاری کاریار'''[[کاریار:$1|$1]]''' $2",
-       "userrights-editusergroup": "ویرایشت گرویا کاروری",
+       "userrights-editusergroup": "ویرایشت گرویا کاریاری",
        "saveusergroups": "اماییه کردن گرویا کاریاری",
        "userrights-groupsmember": "اندوم:",
        "userrights-groupsmember-auto": "اندوم ضمنی:",
        "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "شما می تونیت دسه یای که ای کاریار ها دشو آلشت بئیتو:\n* جعوه نشودار وه ای مئنیه که کاریار ها د او دسه.\n* جعوه بی نشون وه ای مئنیه که کاریار د او دسه نئ.\n* نشون* د ای مئنیه که ار شما او دسه نه اضاف بکیتو د نهاتر نموئه ؤردارینش یا برعسگش.",
        "userrights-reason": "دليل:",
-       "userrights-no-interwiki": "شما سی ویرایشت حقوق کارور د ویکی یا هنی دسرسی ناریت.",
+       "userrights-no-interwiki": "شما سی ویرایشت حقوق کاریار د ویکی یا هنی دسرسی ناریت.",
        "userrights-nodatabase": "پاگا دونسمنی $1 یا نیئش یا د ولاتنشین نئ.",
        "userrights-nologin": "شما باید وا یه گل حساو کاریاری دیووندار [[Special:UserLogin|روئیت وامین ]] تا تونستوییت حقوق کاریاری کاریار نه گماشته کاری بکیت.",
-       "userrights-notallowed": "شما سی اضاف کردن  حقوق کارور یا ورداشتنش دسرسی ناریت.",
+       "userrights-notallowed": "شما سی اضاف کردن  حقوق کاریار یا ورداشتنش دسرسی ناریت.",
        "userrights-changeable-col": "گرویایی که شما تونیت ویرایشت بکید",
        "userrights-unchangeable-col": "گرویایی که شما نتونیت ویرایشت بکید",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
        "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
        "group": "گرو",
-       "group-user": "کاروریا",
-       "group-autoconfirmed": "کاروریا خودوادار",
+       "group-user": "کاریاریا",
+       "group-autoconfirmed": "کاریاریا خود پش راست بیه",
        "group-bot": "بتیا",
-       "group-sysop": "مدیریا",
+       "group-sysop": "دیوونداریا",
        "group-bureaucrat": "بروکراتیا",
        "group-suppress": "تیه پایا",
        "group-all": "(همه)",
-       "group-user-member": "{{جنس:$1|کارور}}",
+       "group-user-member": "{{جنس:$1|کاریار}}",
        "group-autoconfirmed-member": "{{جنس:$1|کاریار خودانجومکار}}",
        "group-bot-member": "{{حنس:$1|بوت}}",
-       "group-sysop-member": "{{جنس:$1|مدیر}}",
+       "group-sysop-member": "{{جنس:$1|دیووندار}}",
        "group-bureaucrat-member": "{{جنس:$1|بروکرات}}",
        "group-suppress-member": "{{جنس:$1|تیه پا}}",
-       "grouppage-user": "{{ns:project}}:کاروریا",
+       "grouppage-user": "{{ns:project}}:کاریاریا",
        "grouppage-autoconfirmed": "{{ns:project}}:کاریار خودانجومکار",
        "grouppage-bot": "{{ns:project}}:بوت یا",
        "grouppage-sysop": "{{ns:project}}:دیوونداریا",
        "right-move-subpages": "بلگه یا و زیر بلگه یا شونه جا وه جا کو",
        "right-move-rootuserpages": "بلگه یا ریشه ای کارور نه جا وه جا کو",
        "right-move-categorypages": "دسه بلگه یا نه جا وه جا بکیت",
-       "right-movefile": "فایلیا نه جا وه جا کو",
+       "right-movefile": "جانیایا نه جا وه جا کو",
        "right-suppressredirect": "اوسه که بلگه یا د بین رئتنه هیچ واگردونی سی بلگه یا سرچشمه دروس نبیه",
-       "right-upload": "سوار کردن فايلا",
+       "right-upload": "سوار کردن جانیایا",
        "right-reupload": "سوارکرد هنی جانیایی که دماتر بئیشه",
        "right-reupload-own": "سوارکرد هنی جانیایی که د دماتر وه دس همو کاریار سوارکرد بیه.",
        "right-reupload-shared": "باطل‌کردن ولات نشینی جانیایا هومبئر بیه",
-       "right-upload_by_url": "سوار کرد فایلیا د یو آر ال",
+       "right-upload_by_url": "سوار کرد جانیایا د یو آر ال",
        "right-purge": "پاک کردن مینجاگر بلگه بی یه که بلگه پشت راس کردن دیاری بکه",
        "right-autoconfirmed": "د محدودیتیا سرعت آی پی-پایه کارگرایی ناره",
        "right-bot": "باور بیه چی یه گل پردازشت خودانجوم",
        "right-nominornewtalk": "حیرده ویرایشت بلگه یا چک چنه وه شکلی که باعث گوتن پیغوم تازه نبوئه.",
        "right-apihighlimits": "سخم بالاتر د وه کار بسن API",
-       "right-writeapi": "د نیسنن ای پی آی استفاده بکید",
+       "right-writeapi": "د نیسنن ای پی آی وه کار بئیریت",
        "right-delete": "بلگیا نه پاکسا کو",
        "right-bigdelete": "بلگه یایی که ویرگار گپی دارن پاکسا بکیت",
        "right-deletelogentry": "پاکسا کردن و ناپاکسا کردن داده واریایی ویجه ای د پهرستنومه",
        "right-deletedhistory": "دیئن چیا پاکسا بیه د ویرگار، بی یه که نیسسه ونونه بؤنیت.",
        "right-deletedtext": "دیئن نیسسه پاکسا بیه و آلشتیایی که هان مینجا وانئریا پاکسا بیه",
        "right-browsearchive": "بلگه یا پاک بیه نه پی جوری کو",
-       "right-undelete": "ای بلگه نه حذف نكيد",
+       "right-undelete": "ای بلگه نه پاکسا نكيد",
        "right-suppressrevision": "دیئن و زنه کردن وانئریایی بلگه یایی که د دس کاریاریا نهو بینه",
        "right-viewsuppressed": "دیئن وانئریایی که د تیه هر کاریاری قام بیه",
        "right-suppressionlog": "دیئن پهرستنومه یا خصوصی",
        "right-protect": "آلشت دئن انازه پر و پیم کردن بلگه یا و ویرایشت بلگه یا پر و پیم بیه تافی",
        "right-editprotected": "ویرایشت بلگه یا پر و پیم بیه چی «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "ویرایشت بلگه یا پر و پیم بیه چی «{{int:protect-level-autoconfirmed}}»",
-       "right-editinterface": "راوط کارور نه ویرایشت کو",
-       "right-editusercssjs": "فایلیا جاوا اسکریپت و سی اس اس کاروریا هنی نه ویرایشت کو",
-       "right-editusercss": "فایلیا سی اس اس کاروریا هنی نه ویرایشت کو",
-       "right-edituserjs": "فایلیا جاوا اسکریپت کاروریا هنی نه ویرایشت کو",
-       "right-editmyusercss": "فایلیا سی اس اس کارور خوتو نه ویرایشت کو",
-       "right-editmyuserjs": "فایلیا جاوا اسکریپت کارور خوتو نه ویرایشت کو",
+       "right-editcontentmodel": "ویرایشت مدل مینونه یه گل بلگه",
+       "right-editinterface": "راوط کاریار نه ویرایشت کو",
+       "right-editusercssjs": "جانیایا جاوا اسکریپت و سی اس اس کاریاریا هنی نه ویرایشت کو",
+       "right-editusercss": "جانیایا سی اس اس کاریاریا هنی نه ویرایشت کو",
+       "right-edituserjs": "جانیایا جاوا اسکریپت کاریاریا هنی نه ویرایشت کو",
+       "right-editmyusercss": "جانیایا سی اس اس کاریار خوتو نه ویرایشت کو",
+       "right-editmyuserjs": "جانیایا جاوا اسکریپت کاریار خوتو نه ویرایشت کو",
        "right-viewmywatchlist": "سیل برگ خوتونه بوینیت",
        "right-editmywatchlist": "سیل برگ خوتونه ویرایشت بکیت. د ویرتو با که پاره ای د انجومکاریا بی دسرسی ئم می تونن ای بلگه یا نه اضافه بکن.",
-       "right-viewmyprivateinfo": "دونسمنیا شصقی خوتونه بوینیت(چی نشونی ایمیل،نوم راستکی)",
-       "right-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)",
+       "right-viewmyprivateinfo": "دونسمنیا شصقی خوتونه بوینیت(چی تیرنشون انجومانامه،نوم راستکی)",
+       "right-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید(چی تیرنشون انجومانامه،نوم راستکی)",
        "right-editmyoptions": "اولویتیا تونه ویرایشت بکیت",
        "right-rollback": "چواشه کردن سریع ویرایشتیا آخری کاریاری که یه بلگه ویجه نه ویرایشت دئه",
        "right-markbotedits": "نشودار کردن ویرایشتیا چواشه بیه چی ویرایشتیا یه گل بات",
        "right-patrolmarks": "دیئن سردیس سردیاری کردن د آلشتیا ایسنی",
        "right-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه",
        "right-mergehistory": "وه یک شیوسن ویرگار ای بلگه",
-       "right-userrights": "حقوق همه کاروریانه ویرایشت بکید",
-       "right-userrights-interwiki": "حقوق همه کاروریانه د ویکی یا هنی ویرایشت بکید",
+       "right-userrights": "حقوق همه کاریاریانه ویرایشت بکید",
+       "right-userrights-interwiki": "حقوق همه کاریاریانه د ویکی یا هنی ویرایشت بکید",
        "right-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
        "right-override-export-depth": "وه در دئن بلگه یایی که بلگه یا هوم پیوند بیه تا پی یا 5 ها دشو",
-       "right-sendemail": "سی کاروریا هنی ایمیل کل بکید",
-       "right-passwordreset": "پاسورد ایمیلیا د نو دئه بیه نه بوینیت",
-       "newuserlogpage": "راس بیه وا کارور",
-       "newuserlogpagetext": "یه پهرستنومه راس بیئن کارور هئ.",
+       "right-sendemail": "سی کاریاریا هنی انجومانامه کل بکید",
+       "right-passwordreset": "رازینه گواردن انجومانامه د نو دئه بیه نه بوینیت",
+       "newuserlogpage": "راس بیه وا کاریار",
+       "newuserlogpagetext": "یه پهرستنومه راس بیئن کاریاره",
        "rightslog": "پهرستنومه حقوق کاریار",
-       "rightslogtext": "یه پهرستنومه آلشتیا حقوق کارور هئ.",
-       "action-read": "ای بلگه نه بحون",
+       "rightslogtext": "یه پهرستنومه آلشتیا حقوق کاریاره.",
+       "action-read": "ای بلگه نه بحو",
        "action-edit": "ای بلگه نه ويرايشت بكيد",
        "action-createpage": "راس کردن بلگیا",
        "action-createtalk": "بلگه یا چک چنه نه راس بکید",
-       "action-createaccount": "حساو ای کارور نه راس بکید",
+       "action-createaccount": "حساو ای کاریار نه راس بکید",
        "action-history": "ویرگار ای بلگه نه بوینیت",
        "action-minoredit": "ای ویرایشت نه چی یه حیرده ویرایشت نشو بیئت",
        "action-move": "لی بلگه جا وه جا کو",
        "action-move-subpages": "ای بلگه و زیر بلگه یاشه جا وه جا بکید",
-       "action-move-rootuserpages": "بلگه یا ریشه ای کارور نه جا وه جا بکید",
+       "action-move-rootuserpages": "بلگه یا ریشه ای کاریار نه جا وه جا بکید",
        "action-move-categorypages": "جا وه جا کردن دسه بلگه یا",
-       "action-movefile": "ای فایل جا وه جا بکید",
-       "action-upload": "ای فایل سوار بکید",
+       "action-movefile": "ای جانیا نه جا وه جا بکید",
+       "action-upload": "ای جانیا نه سوار بکید",
        "action-reupload": "نیسئین ری جانیا ایسنی",
        "action-reupload-shared": "باطل کردن ای جانیا ری یه گل گنجینه هومبئر",
-       "action-upload_by_url": "ای فایله نه د یو آر ال سوار بکید",
+       "action-upload_by_url": "ای جانیا نه د یو آر ال سوار بکید",
        "action-writeapi": "د نیسنن ای پی آی استفاده بکید",
        "action-delete": "ای بلگه نه پاکسا کو",
-       "action-deleterevision": "ای بازدئین پاک کو",
+       "action-deleterevision": "ای وانئری نه پاک کو",
        "action-deletedhistory": "ویرگار پاکسا بیه ای بلگه نه بوینیت",
        "action-browsearchive": "بلگه یا پاک بیه نه پی جوری بکید",
        "action-undelete": "ای بلگه نه پاک نکو",
        "action-suppressrevision": "وانئری و زنه کردن وانئریا پاک بیه",
        "action-suppressionlog": "ای پهرستنومه خصوصی نه بوینیت",
-       "action-block": "ای کارور نه د ویرایشت کردن منع کو",
-       "action-protect": "ریترازیا حفاظت د ای بلگه نه آلشت بکید",
+       "action-block": "ای کاریار نه د ویرایشت کردن نهاگری کو",
+       "action-protect": "ریترازیا پر و پیم کاری د ای بلگه نه آلشت بکید",
        "action-rollback": "چواشه کردن سریع ویرایشتیا آخری کاریاری که یه بلگه ویجه نه ویرایشت دئه",
        "action-import": "بلگه یا نه د ویکی هنی وارد بکید",
-       "action-importupload": "بلگه یا نه د فایل سوار بیه وارد بکید",
+       "action-importupload": "بلگه یا نه د جانیا سوار بیه وارد بکید",
        "action-patrol": "سردیاری کردن د ویرایشتیا کسونا تر",
        "action-autopatrol": "سردیاری کردن د ویرایشتیا خوتو",
        "action-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه",
        "action-mergehistory": "وه یک شیوسن ویرگار ای بلگه",
-       "action-userrights": "حقوق همه کاروریانه ویرایشت بکید",
-       "action-userrights-interwiki": "حقوق همه کاروریانه د ویکی یا هنی ویرایشت بکید",
-       "action-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
-       "action-sendemail": "ایمیلیانه کل کو",
+       "action-userrights": "حقوق همه کاریاریا نه ویرایشت بکید",
+       "action-userrights-interwiki": "حقوق همه کاریاریانه د ویکی یا هنی ویرایشت بکید",
+       "action-siteadmin": "رسینه جا نه قلف بکید یا نکید",
+       "action-sendemail": "انجومانامه یا نه کل کو",
        "action-editmywatchlist": "سیل برگ خوتونه ویرایشت بکید",
        "action-viewmywatchlist": "سیل برگ خوتونه بوینیت",
        "action-viewmyprivateinfo": "دونسمنیا خوتونه بوینیت",
        "action-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید",
+       "action-editcontentmodel": "ویرایشت مدل مینونه یه گل بلگه",
        "nchanges": "$1 {{جمی:$1|آلشت|آلشتیا}}",
        "enhancedrc-since-last-visit": "$1 {{جمی:$1|د آخری دیئن}}",
        "enhancedrc-history": "ويرگار",
-       "recentchanges": "تغÙ\8aرÙ\8aا ØªØ§Ø²Ù\87",
-       "recentchanges-legend": "گزينه يا آلشتيا تازه",
+       "recentchanges": "Ø¢Ù\84شتÛ\8cا Ø§Û\8cسÙ\86Û\8c",
+       "recentchanges-legend": "گزینه یا آلشتیا ایسنی",
        "recentchanges-summary": "دو بیشتر آلشتیا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
-       "recentchanges-noresult": "Ù\87Û\8cÚ\98 Ø¢Ù\84شتÛ\8c Ø¯ Ø·Û\8cÙ\84 دوره دیار بیه وا ای معیاریا یکی نبی.",
+       "recentchanges-noresult": "Ù\87Û\8cÚ\98 Ø¢Ù\84شتÛ\8c Ø¯ Ø¯Ø±Ø§Ø²Ø§ دوره دیار بیه وا ای معیاریا یکی نبی.",
        "recentchanges-feed-description": "دو بیشتر آلشتیا تازباو نه د ویکی که ها د هوال حون پیگری کو.",
        "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "يه ويرايشت كؤچكيه",
        "rcshowhideliu": "$1 کاروريا ثوت نام کرده",
        "rcshowhideliu-show": "نشو دئن",
        "rcshowhideliu-hide": "قام کردن",
-       "rcshowhideanons": "$1 کاروريا ناشناس",
+       "rcshowhideanons": "کاریار نادیار $1",
        "rcshowhideanons-show": "نشو دئن",
        "rcshowhideanons-hide": "قام کردن",
        "rcshowhidepatr": "$1 ویرایشتیا تیه پرس بیه",
        "diff": "فرخ",
        "hist": "ويرگار",
        "hide": "قام كردن",
-       "show": "نشون دائن",
+       "show": "نشو دئن",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "ب",
        "rc_categories_any": "هرکوم",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{جمی:$1|بایت|بایتیا}} نها آلشت",
-       "newsectionsummary": "/* $1 */ بخش تازه",
+       "newsectionsummary": "/* $1 */ بهرجا تازه",
        "rc-enhanced-expand": "جزيات نشون بيئه",
        "rc-enhanced-hide": "جزياته قام كو",
        "rc-old-title": "ذاتا چی \"$1\" راس بیه",
-       "recentchangeslinked": "تغÙ\8aرÙ\8aا Ù\85رتبط",
-       "recentchangeslinked-feed": "آلشتیا مرتبط",
-       "recentchangeslinked-toolbox": "تغÙ\8aرÙ\8aا Ù\85رتبط",
-       "recentchangeslinked-title": "آلشتيا مرتوط وا $1",
+       "recentchangeslinked": "Ø¢Ù\84شتÛ\8cا ØªÛ\8c Û\8cÚ©Û\8c",
+       "recentchangeslinked-feed": "آلشتیا تی یکی",
+       "recentchangeslinked-toolbox": "Ø¢Ù\84شتÛ\8cا ØªÛ\8c Û\8cÚ©Û\8c",
+       "recentchangeslinked-title": "آلشتیا تی یکی د $1",
        "recentchangeslinked-summary": "ای نوم گه تازه د بلگیایی که وا بلگیا ویجه هوم پیوند بینه آلشت بیه(یا سی اندومیا دسه بنی بیه)\nبلگیا یی که هان [[Special:Watchlist|your watchlist]]و گپ بینه",
        "recentchangeslinked-page": "نوم بلگه:",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
-       "upload": "بÙ\84Ù\85 Ú¯Ù\8aر Ù\83ردÙ\86 Ù\81اÙ\8aÙ\84ا",
-       "uploadbtn": "سوار کردن فایل",
+       "upload": "سÙ\88ار Ú©Ø±Ø¯Ù\86 Ø¬Ø§Ù\86Û\8cا",
+       "uploadbtn": "سوار کردن جانیا",
        "reuploaddesc": "سوار کردن نه انجوم شیو بکیت و د ورئردیت جابلگ سوارکرد",
        "upload-tryagain": "کل کردن توضیحیا آلشت دئیه بیه جانیا",
        "uploadnologin": "وارد نبیه",
        "upload-prohibited": "جورا جانیا مجاز:$1.",
        "uploadlogpage": "سوارکرد",
        "uploadlogpagetext": "نومگه هاری یه گل نومگه د آخری سوارکرد جانیایا هئ.\nسی د نو سیل کردن[[Special:NewFiles|عسگدونی جانیایا تازه نه]] به ونیت.",
-       "filename": "نوم فایل",
+       "filename": "نوم جانیا",
        "filedesc": "چكسته",
        "fileuploadsummary": "چکسه",
-       "filereuploadsummary": "آلشتیا فایل:",
+       "filereuploadsummary": "آلشتیا جانیا:",
        "filestatus": "حال و بال کپی رایت",
        "filesource": "سرچشمه:",
        "ignorewarning": "تیه پوشی د زئنار و اماییه کردن جانیا",
        "illegalfilename": "نوم جانیا «$1» د وه گیرنه نیسه یایی که د نوم بلگه یا صاحاو اجاره نیئن.\nلطفن نوم جانیا نه آلشت بئیت و ونه د نو نوم بنیت.",
        "filename-toolong": "نوم جانیا شایت گپتر د 240 بایت نبا.",
        "badfilename": "نوم جانیا د \"$1\" آلشت بیه.",
-       "filetype-mime-mismatch": "دماون جانیا «$1.‎» وا نوع MIME وه($2) یکی نئ.",
+       "filetype-mime-mismatch": "دمادیس جانیا «$1.‎» وا نوع MIME وه($2) یکی نئ.",
        "filetype-badmime": "جانیایی که نوع MIME ونو $1 بوئه سی سوارکرد اجازه دار نیئن.",
        "filetype-bad-ie-mime": "نبوئه ای جانیانه سوار بکیت سی یه که اینترنت اکسپلورر ونه چی «$1» میشناسه، سی یه که وه یه گل جانیا ناصلادار و شات خطردار با.",
        "filetype-unwanted-type": "'''«‎.‎$1»''' یه گل جانیا حاستنی نئ.\n{{PLURAL:$3|جانیا ورتیه گر|جانیایا ورتیه گر}} د ای قرارن: $2 .",
        "filetype-banned-type": "&lrm;'''\".$1\"''' {{PLURAL:$4|یه گل جانیا ناصلاداره|جانیایایی که صلادار نیئن}}.\n{{PLURAL:$3|جانیا صلادار|جانیایا صلادار}} د ای قرارن: $2.",
        "filetype-missing": "ای جانیا هیچ اضاف کردی ناره(چی \"جی پی جی\")",
-       "empty-file": "فایلی که دئی ته حالی بیه.",
-       "file-too-large": "فایلی که دئی ته فره گپ بی.",
-       "filename-tooshort": "نوم فایل فره کؤچکه.",
+       "empty-file": "جانیایی که دئی ته حالی بیه.",
+       "file-too-large": "جانیایی که دئی ته فره گپ بی.",
+       "filename-tooshort": "نوم جانیا فره کؤچکه.",
        "filetype-banned": "چنی جانیا قدقه بیه.",
        "verification-error": "جانیا د ازمایشت پشت راسگری نگوارد.",
        "hookaborted": "آلشتی که میهاستیت دروس بکیت وا یه گل قلاو اضاف کرد انجوم نگرت.",
-       "illegal-filename": "نوم فایل اجاره ندئه بیه.",
+       "illegal-filename": "نوم جانیا صلا ندئه ئه.",
        "overwrite": "نیسنن ری یه گل جانیایی که هیئش صلا ندئه بیه",
        "unknown-error": "یه گل خطا نادیار ری ون کرده.",
        "tmp-create-error": "نبوئه جانیا موقتی نه راس بکیتو.",
        "savefile": "جانیا نه اماییه کو",
        "uploaddisabled": "سوار کردن د کار نئ.",
        "copyuploaddisabled": "سوار کردن وا یو آر ال د کار نئ.",
-       "uploaddisabledtext": "سوار کرد فایلیا د کار نئ.",
+       "uploaddisabledtext": "سوار کرد جانیایا د کار نئ.",
        "php-uploaddisabledtext": "سوارکرد جانیایا د پی اچ پی ناکشتگر بیه.\nلطفن میزونکاری سوارکرد جانیا نه وارسی بکیت.",
        "uploadscripted": "ای بلگه مینونه دار رازینه اچ تی امل یا نیسسه یه که شایت وه ناخوشی وا دوراته نیئر واشکافت با.",
        "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '$1' داره.",
        "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.",
        "uploadvirus": "د ای جانیا ویروس هئ!\nجزیات:$1",
        "uploadjava": "ای جانیا یه گل جانیا زیپه که مینونه دار جانیایی د نوع کلاس جاوائه.\nسوارکردن جانیایا جاوا قدقن بیه، سی یه که شایت ونو صلا دور زئن محدودیتیا امنیتی نه بی ئن.",
-       "upload-source": "سرچشمه فایل",
+       "upload-source": "سرچشمه جانیا",
        "sourcefilename": "سرچشمه نوم جانیا:",
        "sourceurl": "سرچشمه يو آر ال:",
-       "destfilename": "نوم فایل مقصد:",
+       "destfilename": "نوم جانیا مقصد:",
        "upload-maxfilesize": "بیشترونه انازه جانیا:$1",
        "upload-description": "شرح جانیا",
        "upload-options": "گزینه یا سوارکرد",
        "upload-failure-subj": "مشگل د سوارکردن",
        "upload-failure-msg": "یه گل مشلگل د سوارکردتو سی [$2] بی:$1",
        "upload-warning-subj": "هشدار سوارکرد",
-       "upload-warning-msg": "د Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ø³Ù\88ارکرد Ù\85Ø´Ú¯Ù\84Û\8c Ø¨Û\8c [$2]. Ø´Ù\85ا Ù\85Û\8c ØªÙ\88Ù\86Û\8cت Ø¯[[Special:Upload/stash/$1|Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ø³Ù\88ارکرد]] Ø¤Û\8cرذیت تا ای مشگل نه برطرف بکیت.",
+       "upload-warning-msg": "د Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ø³Ù\88ارکرد Ù\85Ø´Ú¯Ù\84Û\8c Ø¨Û\8c [$2]. Ø´Ù\85ا Ù\85Û\8c ØªÙ\88Ù\86Û\8cت Ø¯[[Special:Upload/stash/$1|Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ø³Ù\88ارکرد]] Ø¤Û\8cرئیت تا ای مشگل نه برطرف بکیت.",
        "upload-proto-error": "پروتکل نادروس",
        "upload-proto-error-text": "سوارکرد د د دیرادیر ائتیاج وه تیرنشونیایی داره که وا <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code> شرو بان.",
        "upload-file-error": "خطا مینونه",
-       "upload-file-error-text": "گات ØªÙ\84اش Ø³Û\8c Ø±Ø§Ø³ Ú©Ø±Ø¯Ù\86 Û\8cÙ\87 Ú¯Ù\84 Ø¬Ø§Ù\86Û\8cا Ù\85Ù\88Ù\82تÛ\8c Ø¯ Ø³Ø±Ù\88ر یه گل خطا مینونه پیش اومائه.\nلطفن وا یه گل [[Special:ListUsers/sysop|دیووندار]] تماس بئریت.",
+       "upload-file-error-text": "گات ØªÙ\84اش Ø³Û\8c Ø±Ø§Ø³ Ú©Ø±Ø¯Ù\86 Û\8cÙ\87 Ú¯Ù\84 Ø¬Ø§Ù\86Û\8cا Ù\85Ù\88Ù\82تÛ\8c Ø¯ Ø±Ø³Û\8cÙ\86Ù\87 Ø¬Ø§ یه گل خطا مینونه پیش اومائه.\nلطفن وا یه گل [[Special:ListUsers/sysop|دیووندار]] تماس بئریت.",
        "upload-misc-error": "خطا سوار کرد ناشناخته",
        "upload-misc-error-text": "د گات سوارکرد خطایی نادیاری پیش اومائه.\nلطف بکیت یه دل بایت که تیرنشون اینترنتی خو و د دسرسه و هنی تلاش بکیت.\nار مشگل هنی بیئش وا یه گل [[Special:ListUsers/sysop|دیوونداریا]] تماس بئیریت.",
        "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
        "backend-fail-stream": "نبوئه جانیا\"$1\" کل بوئه.",
        "backend-fail-backup": "نبوئه سی \"$1\" پشتجا گرت.",
-       "backend-fail-notexists": "فایل $1 وجود ناره.",
+       "backend-fail-notexists": "جانیا $1 وجود ناره.",
        "backend-fail-hashes": "گرتن هش یا جانیا سی ری به ری یک نیاین د خوئی انجوم نگرت.",
        "backend-fail-notsame": "جانیا ناهمتایی ها د $1 .",
        "backend-fail-invalidpath": "\"$1\" ره خوئی سی امائیه کردن نئ.",
        "upload-curl-error28": "تموم بیئن مئلت سی سوار کرد",
        "upload-curl-error28-text": "ای دیارگه فره دیر دتو واکنشت نشو دئه.\nلطف بکیت سی یه که دیارگه کنشگتر و ری خطه یه گل وارسی بکیت، اوسه یه گر واستید و هنی تلاش بکیت.\nشایت بیتر با که د گات خلوتری هنی تلاش بکیت.",
        "license": "ليانس دار بيئن",
-       "license-header": "د Ø´Ù\83ل ليسانس دار بيئن",
+       "license-header": "د Ø­Ø§Ù\84 Ù\88بال ليسانس دار بيئن",
        "nolicense": "هیچی انتخاو نبیه",
        "licenses-edit": "گزینه یا مجوز ویرایشت",
        "license-nopreview": "(پیش سیل د دسرس نئ)",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "deleteprotected": "شما نمی تونیت ای بلگه نه پاکسا بکیت سی یه که وه پر و پیم بیه.",
        "rollback": "چواشه کردن ویرایشتیا",
-       "rollback_short": "چواشه کردن",
        "rollbacklink": "ورگشتن",
        "rollbacklinkcount": "چواشه کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "rollbacklinkcount-morethan": "چواشه کردن بیشتر د$1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "unblocked-id": "قلف $1 ورداشته بیه.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] رفع نهاگری بیه.",
        "blocklist": "كاروريا منع بيه",
-       "ipblocklist": "Ù\83ارÙ\88رÙ\8aا Ù\85Ù\86ع Ø¨Ù\8aه",
+       "ipblocklist": "Ù\83ارÙ\88رÙ\8aا Ù\86Ù\87اگرÛ\8c Ø¨Û\8cه",
        "ipblocklist-legend": "یه گل کارور منع بیه بجوریت",
        "blocklist-userblocks": "قام کردن حساو قلف بیه",
        "blocklist-tempblocks": "قام کردن نهاگرتنیا موقت",
        "import-logentry-interwiki": "$1 نه تراویکی کرد",
        "import-logentry-interwiki-detail": "$1 {{جمی:$1|وانئری|وانئریا}} د $2 وامین اومائنه",
        "javascripttest": "ازمایشت کردن جاوا اسکریپت",
-       "javascripttest-title": "د حال انجوم دئن ازمایشتیا $1",
        "javascripttest-pagetext-noframework": "ای بلگه سی انجوم دئن ازمایشتیا جاوا اسکریپت اماییه کاری بیه.",
        "javascripttest-pagetext-unknownframework": "چوئه کار نادیار ازمایشت \"$1\"",
        "javascripttest-pagetext-frameworks": "لطفن یه گل د چوئه یا ازمایشت هاری نه انتخاو بکیت :$1",
        "javascripttest-pagetext-skins": "یه گل پوسه نه سی انجوم دئن ازمایشتا انتخاو بکیت:",
        "javascripttest-qunit-intro": "[$1 مستندیا ازمایشت] نه د mediawiki.org سیل بکیت.",
-       "javascripttest-qunit-heading": "کومله ازمایشت QUnit جاوااسکریپت سی ویکی وارسگر",
        "tooltip-pt-userpage": "بلگه كارورتو",
        "tooltip-pt-anonuserpage": "بلگه کاریاری تیرنشون آی پی ای که دش ویرایشت می کید",
        "tooltip-pt-mytalk": "بلگه قسه كردن شما",
        "exif-objectcycle-p": "فقط ایواره",
        "exif-objectcycle-b": "هم شو صو و هم ایواره",
        "exif-dc-contributor": "هومیارا",
+       "exif-dc-date": "گاتیا",
        "exif-dc-publisher": "درتیجن",
        "exif-dc-relation": "وارسگر مرتوط",
        "exif-dc-rights": "حقوق",
        "exif-iimcategory-hth": "تن آزایی",
        "exif-iimcategory-hum": "حاستنی انسانی",
        "exif-iimcategory-lab": "کار",
+       "exif-iimcategory-lif": "گواردن زئشت و شادی کردن",
        "exif-iimcategory-pol": "سیاستا",
        "exif-iimcategory-rel": "دین و ائتقات",
        "exif-iimcategory-sci": "دونسمنی و سازیاری",
        "confirmemail": "پشت راس کردن تیرنشون انجومانامه",
        "confirmemail_send": "کل کردن رازینه پشت راس کاری",
        "confirmemail_sent": "انجومانامه پشت راس کردن کل بیه.",
+       "confirmemail_needlogin": "لطف بکید $1 نه سی تیرنشون انجومانامه تو پشت راس بکید.",
+       "confirmemail_success": "تیرنشون انجومانامه تو پشت راس بیه.\nشایت شما ایسه بهایت [[Special:چی یه گل کاریار|بیایت وامین]]و د ویکی لذت بوریت",
+       "confirmemail_loggedin": "تیرنشون انجومانامه شما ایسه پشت راس بیه.",
        "confirmemail_subject": "{{SITENAME}} تیرنشون انجومانامه پشت راست کردن",
        "confirmemail_invalidated": "پشت راس کنی انجومانامه انجوم شیو بیه",
        "invalidateemail": "انجومشیو کردن پشت راس کردن انجومانامه",
        "scarytranscludetoolong": "[یو آر ال فره گپه]",
+       "deletedwhileediting": "<strong>زئنار:</strong>ای بلگه د او گاتی که شما شرو د ویرایشت کردیته پاکسا بیه!",
        "recreate": "د نو راس کردن",
        "confirm_purge_button": "خوئه",
        "confirm-watch-button": "خوئه",
        "hijri-calendar-m4": "رجو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "سردیس دمادیس نادیار \"$1\"",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
        "version": "نسقه",
        "version-extensions": "دمادیسیا پورسه",
+       "version-skins": "پوسه یا پورسه بیه",
        "version-specialpages": "بلگيا ويجه",
        "version-variables": "آلشت ونا",
        "version-antispam": "نهاگرتن هرزنومه",
        "version-other": "هنی",
        "version-hook-name": "نوم قلاو",
        "version-no-ext-name": "[بی نوم]",
+       "version-license": "لیسانس ویکی وارسگر",
        "version-ext-license": "ليسانس",
        "version-ext-colheader-name": "دمادیس",
        "version-skin-colheader-name": "پوسه",
        "version-entrypoints-header-url": "يو آر ال",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
+       "version-libraries-library": "کتاوگه",
+       "version-libraries-version": "نسقه",
        "redirect": "واگردونی وا جانیا،بلگه یا وانیئری نوم دیارکو",
+       "redirect-legend": "واگردونی د جانیا یا بلگه",
        "redirect-submit": "رو",
        "redirect-lookup": "پی جوری:",
        "redirect-value": "ارزایشت:",
        "compare-page1": "بلگه 1",
        "compare-page2": "بلگه 2",
        "compare-rev1": "دوواره ديئن1",
+       "compare-rev2": "وانئری 2",
        "compare-submit": "کنار یک نیاین",
+       "compare-invalid-title": "داسونی که شما تیار کردیته خو نئ.",
        "compare-title-not-exists": "سرون مشقص بیه وجود ناره.",
        "compare-revision-not-exists": "وانئری که شما تی دیار کردیته وجود ناره.",
+       "dberr-info-hidden": "(نبوئه د رسینه گا دسرسی داشت)",
        "htmlform-required": "یه دئه واس بوئه.",
        "htmlform-submit": "دئن",
        "htmlform-reset": "انجومشیو کردن آلشتیا",
        "htmlform-chosen-placeholder": "یه گل گزینه انتخاو بکیت",
        "htmlform-cloner-create": "هنی اضاف بکیت",
        "htmlform-cloner-delete": "ؤرداشتن",
+       "htmlform-cloner-required": "سی کمترونه یه گل ارزایشت لازمه",
        "revdelete-content-hid": "مینونه قام بیه",
+       "revdelete-summary-hid": "چکسته ویرایشت قام بیه",
        "revdelete-uname-hid": "نوم کاروری قام بیه",
        "revdelete-content-unhid": "مینونه قام نبیه",
+       "revdelete-summary-unhid": "چکسته ویرایشت قام نبیه",
        "revdelete-uname-unhid": "نوم کاروری قام نبیه",
        "rightsnone": "(هيش كوم)",
        "revdelete-summary": "چکسه ویرایشت",
        "feedback-message": "پيغوم:",
        "feedback-cancel": "انجوم شیوسن",
        "feedback-submit": "کل کردن نهاهوال حون",
+       "feedback-error2": "خطا:ویرایشت خو نبی",
        "feedback-close": "انجوم بی",
        "feedback-bugnew": "مه وارسیش کردمه. یه گل سیسرک تازه گزارشت بی",
        "searchsuggest-search": "پی جوری",
        "log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
        "default-skin-not-found-row-enabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
+       "mediastatistics": "آماریا وارسگر",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایتیا}} ($2; $3%)",
        "mediastatistics-table-count": "شماره جانیایا",
+       "mediastatistics-table-totalbytes": "انازه وه یک شیوسه",
        "mediastatistics-header-unknown": "نادیار",
        "mediastatistics-header-bitmap": "عسگیا بیت مپ",
+       "mediastatistics-header-drawing": "کشیاریا(عسگیا وکتور)",
        "mediastatistics-header-audio": "دنگ",
        "mediastatistics-header-video": "عسگ و فیلم",
        "mediastatistics-header-multimedia": "وارسگر خو",
index 59dd3bb..350f703 100644 (file)
@@ -28,7 +28,8 @@
                        "Xabier Armendaritz",
                        "לערי ריינהארט",
                        "Vogone",
-                       "아라"
+                       "아라",
+                       "Aswanas"
                ]
        },
        "tog-underline": "Pabraukti nuorodas:",
        "pool-timeout": "Baigėsi laikas laukiant užrakto",
        "pool-queuefull": "Telkinio eilė pilna",
        "pool-errorunknown": "Nežinoma klaida",
+       "poolcounter-usage-error": "Naudojimo klaida: $1",
        "aboutsite": "Apie {{SITENAME}}",
        "aboutpage": "Project:Apie",
        "copyright": "Turinys pateikiamas pagal  $1  jei nenurodyta kitaip.",
        "hidetoc": "slėpti",
        "collapsible-collapse": "Sutraukti",
        "collapsible-expand": "Išplėsti",
+       "confirmable-confirm": "Ar esate {{GENDER:$1|tikras|tikra}}?",
        "confirmable-yes": "Taip",
        "confirmable-no": "Ne",
        "thisisdeleted": "Žiūrėti ar atkurti $1?",
        "nospecialpagetext": "<strong>Toks specialusis puslapis neegzistuoja</strong>\n\nEgzistuojančių specialiųjų puslapių sąrašą galite rasti [[Special:SpecialPages|specialiųjų puslapių sąraše]].",
        "error": "Klaida",
        "databaseerror": "Duomenų bazės klaida",
+       "databaseerror-text": "Įvyko duomenų bazės klaida.\nTai gali rodyti programinės įrangos sutrikimą.",
+       "databaseerror-textcl": "Įvyko duomenų bazės klaida.",
        "databaseerror-query": "Užklausa:$1",
+       "databaseerror-function": "Paskirtis: $1",
        "databaseerror-error": "Klaida: $1",
        "laggedslavemode": "Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.",
        "readonly": "Duomenų bazė užrakinta",
        "filerenameerror": "Nepavyksta pervardinti failo iš „$1“ į „$2“.",
        "filedeleteerror": "Nepavyksta ištrinti failo „$1“.",
        "directorycreateerror": "Nepavyko sukurti aplanko „$1“.",
+       "directoryreadonlyerror": "Nukreiptis \"$1\" yra skirta tik skaitymui.",
+       "directorynotreadableerror": "Nukreiptis \"$1\" neskaitoma.",
        "filenotfound": "Nepavyksta rasti failo „$1“.",
        "unexpected": "Netikėta reikšmė: „$1“=„$2“.",
        "formerror": "Klaida: nepavyko apdoroti formos duomenų",
        "protectedpagetext": "Šis puslapis yra užrakintas, saugant jį nuo redagavimo.",
        "viewsourcetext": "Jūs galite žiūrėti ir kopijuoti puslapio kodą:",
        "viewyourtext": "Jūs galite matyti ir kopijuoti '''savo redagavimų''' tekstą į šį puslapį:",
-       "protectedinterface": "Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas.",
-       "editinginterface": "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.\nJei norite pridėti ir keisti vertimus, siūlome pasinaudoti [//translatewiki.net/wiki/Main_Page?setlang=lt „translatewiki.net“], „MediaWiki“ lokalizacijos projektu.",
+       "protectedinterface": "Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas. Norėdami pridėti ar pakeisti vertimus visose wiki, naudokite [//translatewiki.net/ translatewiki.net] MediaWiki vertimų projektą.",
+       "editinginterface": "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.",
+       "translateinterface": "Kad pridėtumėte vertimus visoms wiki, naudokitės  [//translatewiki.net/ translatewiki.net] – projektu, skirtu MediaWiki vertimams į vietines kalbas.",
        "cascadeprotected": "Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:\n$2",
        "namespaceprotected": "Jūs neturite teisės redaguoti puslapių '''$1''' srityje.",
        "customcssprotected": "Jūs neturite teisės keisti šį CSS puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.",
        "invalidtitle-unknownnamespace": "Klaidingas pavadinimas nežinomoje vardų erdvėje numeriu $1 ir tekstu \"$2\"",
        "exception-nologin": "Neprisijungęs",
        "exception-nologin-text": "Šiam puslapiui ar veiksmui reikalingas prisijungimas šioje wiki.",
+       "exception-nologin-text-manual": "Prašome $1, kad galėtumėte pasiekti puslapį ar įvykdyti veiksmą.",
        "virus-badscanner": "Neleistina konfigūracija: nežinomas virusų skeneris: ''$1''",
        "virus-scanfailed": "skanavimas nepavyko (kodas $1)",
        "virus-unknownscanner": "nežinomas antivirusas:",
-       "logouttext": "'''Dabar jūs esate atsijungęs.'''\n\nGalite toliau naudoti {{SITENAME}} anonimiškai arba <span class='plainlinks'>[$1 prisijunkite]</span> iš naujo tuo pačiu ar kitu naudotoju.\nPastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs iki tol, kol išvalysite savo naršyklės podėlį.",
+       "logouttext": "<strong>Dabar jūs esate atsijungęs.</strong>\n\nPastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs iki tol, kol išvalysite savo naršyklės podėlį.",
        "welcomeuser": "Sveiki,  $1 !",
        "welcomecreation-msg": "Jūsų paskyra buvo sukurta.\nNepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].",
        "yourname": "Naudotojo vardas:",
        "userlogin-resetlink": "Pamiršote savo prisijungimo duomenis?",
        "userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
        "userlogin-helplink2": "Padėti prisijungti",
+       "userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nNaudokite žemiau pateiktą pavidalą, kad prisijungtumėte kaip kitas naudotojas.",
        "userlogin-createanother": "Sukurti kitą paskyrą",
        "createacct-emailrequired": "Elektroninio pašto adresas",
        "createacct-emailoptional": "Elektroninio pašto adresas (neprivaloma)",
        "createaccount-text": "Projekte {{SITENAME}} ($4) kažkas sukūrė paskyrą „$2“ su slaptažodžiu „$3“ panaudodamas jūsų el. pašto adresą.\nJūs turėtumėte prisijungti ir pasikeisti savo slaptažodį.\n\nJūs galite nekreipti dėmesio į laišką, jei ši paskyra buvo sukurta per klaidą.",
        "login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite $1 prieš bandant vėl.",
        "login-abort-generic": "Jūsų prisijungimas buvo nesėkmingas - Nutraukta",
+       "login-migrated-generic": "Jūsų paskyra buvo perkelta ir jūsų naudotojo vardo šioje wiki daugiau nebėra.",
        "loginlanguagelabel": "Kalba: $1",
        "suspicious-userlogout": "Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.",
+       "createacct-another-realname-tip": "Tikrojo vardo nurodyti nebūtina.\nJei pasirinksite jį nurodyti, jis bus naudojamas parodymui, kas atliko straipsnio papildymus.",
        "pt-login": "Prisijungti",
        "pt-login-button": "Prisijungti",
        "pt-createaccount": "Sukurti paskyrą",
        "user-mail-no-addy": "Bandyta išsiųsti elektroninį laišką be el. pašto adreso.",
        "user-mail-no-body": "Mėginta siųsti tuščia ar pernelyg trumpą E-pašto žinutė.",
        "changepassword": "Pakeisti slaptažodį",
-       "resetpass_announce": "Jūs prisijungėte su atsiųstu laikinuoju kodu. Norėdami užbaigti prisijungimą, čia jums reikia nustatyti naująjį slaptažodį:",
+       "resetpass_announce": "Norint užbaigti prisijungimą jums reikia nustatyti naująjį slaptažodį.",
        "resetpass_text": "<!-- Įterpkite čia tekstą -->",
        "resetpass_header": "Keisti paskyros slaptažodį",
        "oldpassword": "Senas slaptažodis:",
        "retypenew": "Pakartokite naują slaptažodį:",
        "resetpass_submit": "Nustatyti slaptažodį ir prisijungti",
        "changepassword-success": "Jūsų slaptažodis pakeistas sėkmingai!",
+       "changepassword-throttled": "Jūs pastaruoju metu atlikote pernelyg daug bandymų prisijungti. Prašome luktelėti $1 prieš bandant iš naujo.",
        "resetpass_forbidden": "Slaptažodžiai negali būti pakeisti",
        "resetpass-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "resetpass-submit-loggedin": "Keisti slaptažodį",
        "resetpass-submit-cancel": "Atšaukti",
        "resetpass-wrong-oldpass": "Klaidingas laikinas ar esamas slaptažodis.\nJūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikiną slaptažodį.",
+       "resetpass-recycled": "Atkurkite savo slaptažodį kitokiu, nei buvo prieš tai.",
+       "resetpass-temp-emailed": "Jūs prisijungęs laikinu slaptažodžiu, gautu per elektroninį paštą. Kad baigtumėte jungtis, čia turite nustatyti naują slaptažodį:",
        "resetpass-temp-password": "Laikinas slaptažodis:",
        "resetpass-abort-generic": "Slaptažodžio keitimas buvo nutrauktas nuo ekstenzijos.",
+       "resetpass-expired": "Jūsų slaptažodžio galiojimas baigėsi. Prašome nustatyti naują prisijungimo slaptažodį.",
+       "resetpass-expired-soft": "Jūsų slaptažodžio galiojimas baigėsi ir jį reikia atkurti iš naujo. Pasirinkite naują slaptažodį dabar arba spauskite \"{{int:resetpass-submit-cancel}}\", kad būtų atstatytas vėliau.",
+       "resetpass-validity-soft": "Jūsų slaptažodis netinkamas: $1\n\nPasirinkite naują slaptažodį dabar arba spauskite \"{{int:resetpass-submit-cancel}}\", kad būtų atkurtas vėliau.",
        "passwordreset": "Atstatyti slaptažodį",
        "passwordreset-text-one": "Užpildykite šią formą, norėdami atkurti savo slaptažodį.",
-       "passwordreset-text-many": "{{PLURAL:$1|Užpildykite viena iš laukų slaptažodžio atkurimui.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Užpildykite vieną iš laukų slaptažodžio atkūrimui.}}",
        "passwordreset-legend": "Atstatyti slaptažodį",
        "passwordreset-disabled": "Slaptažodžių atstatymai šiame wikyje išjungti.",
        "passwordreset-emaildisabled": "El. pašto funkcijos uždraustos šiame wiki.",
        "passwordreset-capture-help": "Jei jūs čia pažymėsite, tai e-mail laiškas (su laikinuoju slaptažodžiu) bus parodytas jums prieš išsiunčiant jį naudotojui.",
        "passwordreset-email": "E-pašto adresas:",
        "passwordreset-emailtitle": "Paskyros informacija apie {{sitename}}",
-       "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, IP adresu $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu $2\n\n{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigsis po {{PLURAL:$5|vienos dienos| $5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kitas padarė šį prašymą arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
+       "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, IP adresu $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kitas padarė šį prašymą arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailtext-user": "Naudotojas $1 svetainėje {{SITENAME}} sukūrė užklausą slaptažodžio priminimui svetainėje {{SITENAME}}\n($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. \n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galioti po {{PLURAL:$5|vienos dienos|$5 dienų}}. Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas padarė tai be jūsų žinios arba jūs prisiminėte savo pirminį slaptažodį, ir jūs nebenorite jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailelement": "Naudotojo vardas: $1\nLaikinas slaptažodis: $2",
        "passwordreset-emailsent": "Slaptažodžio priminimo laiškas buvo išsiųstas.",
        "passwordreset-emailsent-capture": "Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.",
-       "passwordreset-emailerror-capture": "Priminimo e-mail laiškas buvo sugeneruotas, toks koks parodytas, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
+       "passwordreset-emailerror-capture": "Priminimo elektroninis laiškas buvo sukurtas, toks, koks parodytas žemiau, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
        "changeemail": "Pakeisti el. pašto adresą",
        "changeemail-text": "Užpildykite šią formą, jei norite pakeisti savo el. pašto adresą. Jums reikės įvesti savo slaptažodį, siekiant patvirtinti šį pakeitimą.",
        "changeemail-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "changeemail-none": "(nėra)",
        "changeemail-password": "Jūsų {{SITENAME}} slaptažodis:",
        "changeemail-submit": "Keisti el. pašto adresą",
+       "changeemail-throttled": "Jūs atlikote pernelyg daug bandymų prisijungti.\nLuktelėkite $1 prieš bandant vėl.",
+       "resettokens-token-label": "$1 (dabartinė reikšmė: $2)",
        "bold_sample": "Paryškintas tekstas",
        "bold_tip": "Paryškinti tekstą",
        "italic_sample": "Tekstas kursyvu",
        "preview": "Peržiūra",
        "showpreview": "Rodyti peržiūrą",
        "showdiff": "Rodyti skirtumus",
-       "anoneditwarning": "'''Dėmesio:''' Jūs nesate prisijungęs. Jūsų IP adresas bus įrašytas į šio puslapio istoriją.",
+       "blankarticle": "<strong>Dėmesio:</strong> Jūsų kuriamas straipsnis yra tuščias. Jei vėl paspausite \"{{int:savearticle}}\", puslapis bus sukurtas be jokio turinio.",
+       "anoneditwarning": "<strong>Dėmesio:</strong> Jūs nesate prisijungęs. Jūsų IP adresas bus viešai matomas, jei atliksite kokius nors keitimus. Jeigu <strong>[$1 prisijungsite]</strong> arba <strong>[$2 sukursite paskyrą]</strong>, jūsų keitimai bus priskirti jūsų naudotojo vardui; drauge įgysite naujų galimybių.",
        "anonpreviewwarning": "''Jūs nesate prisijungęs. Išsaugojant jūsų IP adresas bus rodomas šio puslapio redagavimo istorijoje.''",
        "missingsummary": "'''Priminimas:''' Jūs nenurodėte keitimo komentaro. Jei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus išsaugotas be jo.",
+       "selfredirect": "<strong>Dėmesio:</strong> Jūs nukreipiate puslapį atgal į jį patį. Galbūt parinkote netinkamą nukreipimo kreipinį arba taisote ne tą straipsnį. \nJei vėl paspausite \"{{int:savearticle}}\", šis nukreipimas vis vien bus sukurtas.",
        "missingcommenttext": "Prašome įvesti komentarą.",
        "missingcommentheader": "'''Priminimas:''' Jūs nenurodėte šio komentaro pavadinimo/antraštės.\nJei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
        "summary-preview": "Komentaro peržiūra:",
        "loginreqlink": "prisijungti",
        "loginreqpagetext": "Jums reikia $1, kad matytumėte kitus puslapius.",
        "accmailtitle": "Slaptažodis išsiųstas.",
-       "accmailtext": "Atsitiktinai sugeneruotas naudotojo [[User talk:$1|$1]] slaptažodis nusiųstas į $2.\n\nŠios naujos paskyros slaptažodis gali būti pakeistas ''[[Special:ChangePassword|keisti slaptažodį]]'' puslapyje.",
+       "accmailtext": "Atsitiktinai sukurtas naudotojo [[User talk:$1|$1]] slaptažodis nusiųstas į $2.\n\nŠios naujos paskyros slaptažodis gali būti pakeistas <em>[[Special:ChangePassword|keisti slaptažodį]]</em> puslapyje beprisijungiant.",
        "newarticle": "(Naujas)",
        "newarticletext": "Jūs patekote į dar neegzistuojantį puslapį.\nNorėdami sukurti puslapį, pradėkite rašyti žemiau esančiame įvedimo lauke\n(plačiau [$1 pagalbos puslapyje]).\nJei patekote čia per klaidą, paprasčiausiai spustelkite  naršyklės mygtuką '''atgal'''.",
        "anontalkpagetext": "----''Tai yra anoniminio naudotojo, nesusikūrusio arba nenaudojančio paskyros, aptarimų puslapis.\nDėl to naudojamas IP adresas jo identifikavimui.\nŠis IP adresas gali būti dalinamas keliems naudotojams.\nJeigu Jūs esate anoniminis naudotojas ir atrodo, kad komentarai nėra skirti Jums, [[Special:UserLogin/signup|sukurkite paskyrą]] arba [[Special:UserLogin|prisijunkite]], ir nebūsite tapatinamas su kitais anoniminiais naudotojais.''",
        "edit-conflict": "Redagavimo konfliktas.",
        "edit-no-change": "Jūsų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.",
        "postedit-confirmation-created": "Puslapis sukurtas.",
+       "postedit-confirmation-restored": "Puslapis buvo atkurtas.",
        "postedit-confirmation-saved": "Jūsų pakeitimas išsaugotas.",
        "edit-already-exists": "Negalima sukurti naujo puslapio.\nJis jau egzistuoja.",
        "defaultmessagetext": "Numatytasis pranešimo tekstas",
+       "content-failed-to-parse": "Turinys $2 neatitinka tipui $1: $3",
        "invalid-content-data": "Neleistinas turinys.",
        "content-not-allowed-here": "Turinys \"$1\" puslapyje [[$2]] nėra leistinas.",
-       "editwarning-warning": "Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.",
+       "editwarning-warning": "Palikdamas šį puslapį jūs galite prarasti visus padarytus pakeitimus.\nJei esate prisijungęs, galite išjungti šį perspėjimą jūsų nustatymų skyrelyje \"{{int:prefs-editing}}\".",
        "editpage-notsupportedcontentformat-title": "Turinio formatas nepalaikomas",
        "editpage-notsupportedcontentformat-text": "Turinio formatas $1 nepalaiko turinio modelio $2.",
        "content-model-wikitext": "wikitekstas",
        "content-model-text": "paprastasis tekstas",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tuščias objektas",
+       "content-json-empty-array": "Tuščias masyvas",
+       "duplicate-args-category": "Puslapiai, naudojantys pasikartojančias skiltis iššaukiant šablonus",
+       "duplicate-args-category-desc": "Puslapiai, turintys šablonų, naudojančių pasikartojančias skiltis, iššaukimus, pavyzdžiui <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> arba <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Įspėjimas: Šiame puslapyje yra per daug užtrunkančių analizatoriaus funkcijų šaukinių.\n\nTai turėtų būti mažiau nei $2 {{PLURAL:$2|šaukinys|šaukiniai|šaukinių}}, tačiau dabar yra $1 {{PLURAL:$1|šaukinys|šaukiniai|šaukinių}}.",
        "expensive-parserfunction-category": "Puslapiai su per daug brangių kodo analizuoklio funkcijų šaukinių",
        "post-expand-template-inclusion-warning": "Įspėjimas: Šablonų įterpimo dydis per didelis.\nKai kurie šablonai nebus įtraukti.",
        "parser-template-loop-warning": "Aptiktas šablono ciklas: [[$1]]",
        "parser-template-recursion-depth-warning": "Šablono rekursinio gylio riba viršyta ($1)",
        "language-converter-depth-warning": "Kalbos keitiklio gylio riba viršyta ($1)",
+       "node-count-exceeded-category": "Puslapiai, kuriuose viršytas saitų kiekis",
+       "node-count-exceeded-category-desc": "Puslapyje viršijamas didžiausias saitų kiekis.",
+       "node-count-exceeded-warning": "Puslapis, viršijantis didžiausią saitų kiekį",
+       "expansion-depth-exceeded-category": "Puslapiai, kuriuose viršijamas plėtros gylis",
+       "expansion-depth-exceeded-category-desc": "Puslapis viršija didžiausią plėtros gylį.",
+       "expansion-depth-exceeded-warning": "Puslapis, viršijantis didžiausią plėtros gylį",
+       "parser-unstrip-loop-warning": "Rastas neuždarytas ciklas",
+       "converter-manual-rule-error": "Rankinėje kalbos pertvarkymo taisyklėje rasta klaida",
        "undo-success": "Keitimas gali būti atšauktas. Prašome patikrinti palyginimą, esantį žemiau, kad patvirtintumėte, kad jūs tai ir norite padaryti, ir tada išsaugokite pakeitimus, esančius žemiau, kad užbaigtumėte keitimo atšaukimą.",
        "undo-failure": "Keitimas negali būti atšauktas dėl konfliktuojančių tarpinių keitimų.",
        "undo-norev": "Keitimas negali būti atšauktas, kadangi jis neegzistuoja arba buvo ištrintas.",
+       "undo-nochange": "Panašu, kad keitimas jau buvo atšauktas.",
        "undo-summary": "Atšauktas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) keitimas ($1 versija)",
+       "undo-summary-username-hidden": "Atmesti versiją $1, atliktą paslėpto naudotojo",
        "cantcreateaccounttitle": "Paskyrų kūrimas negalimas",
        "cantcreateaccount-text": "Paskyrų kūrimą iš šio IP adreso ('''$1''') užblokavo [[User:$3|$3]].\n\n$3 nurodyta priežastis yra ''$2''",
+       "cantcreateaccount-range-text": "Naudotojas [[User:$3|$3]] nustatė draudimą kurti paskyras iš IP adresų plotmės '''$1''', į kurią patenka ir jūsiškis IP adresas ('''$4''').",
        "viewpagelogs": "Rodyti šio puslapio specialiuosius veiksmus",
        "nohistory": "Šis puslapis neturi keitimų istorijos.",
        "currentrev": "Dabartinė versija",
        "currentrev-asof": "Dabartinė $1 versija",
        "revisionasof": "$1 versija",
-       "revision-info": "$1 versija naudotojo $2",
+       "revision-info": "$1 versija, sukurta {{GENDER:$6|$2}}$7",
        "previousrevision": "←Ankstesnė versija",
        "nextrevision": "Vėlesnė versija→",
        "currentrevisionlink": "Dabartinė versija",
        "rev-deleted-event": "(įrašas pašalintas)",
        "rev-deleted-user-contribs": "[vardas arba IP adresas pašalintas - redagavimas paslėptas nuo prisidėjimų]",
        "rev-deleted-text-permission": "Ši puslapio versija buvo '''pašalinta'''.\nDaugiau detalių galima rasti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} trynimų istorijoje].",
+       "rev-suppressed-text-permission": "Ši puslapio versija buvo <strong>pašalinta</strong>.\nDaugiau smulkmenų galima rasti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} trynimų istorijoje].",
        "rev-deleted-text-unhide": "Ši puslapio versija buvo '''ištrinta'''.\nTrynimo detales rasite [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ištrintų puslapių sąraše].\nKaip administratorius, jūs vis dar galite [$1 peržiūrėti šią versiją].",
        "rev-suppressed-text-unhide": "Ši puslapio versija buvo '''paslėpta'''.\nDaugiau detalių gali būti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} slėpimų istorijoje].\nKaip administratorius, jūs vis dar galite [$1 peržiūrėti šią versiją].",
        "rev-deleted-text-view": "Ši puslapio versija buvo '''pašalinta'''.\nKaip administratorius, jūs galite ją pamatyti;\ndaugiau detalių gali būti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} trynimų istorijoje].",
        "revdelete-no-file": "Nurodytas failas neegzistuoja.",
        "revdelete-show-file-confirm": "Ar tikrai norite peržiūrėti ištrintą failo „<nowiki>$1</nowiki>“ $2 $3 versiją?",
        "revdelete-show-file-submit": "Taip",
+       "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|pasirinkta versija|pasirinktos versijos|pasirinktų versijų}}:",
+       "revdelete-selected-file": "[[:$2]] {{PLURAL:$1|pasirinkta rinkmenos versija|pasirinktos rinkmenos versijos|pasirinktų rinkmenos versijų}}:",
        "logdelete-selected": "{{PLURAL:$1|Pasirinktas istorijos įvykis|Pasirinkti istorijos įvykiai}}:",
+       "revdelete-text-text": "Pašalintos versijos vis dar bus matomos puslapio istorijoje, bet jų dalys nebebus viešai pasiekiamos.",
+       "revdelete-text-file": "Pašalintos rinkmenos versijos vis dar bus matomos puslapio istorijoje, bet jų dalys nebebus viešai pasiekiamos.",
+       "logdelete-text": "Pašalinti veiksmai vis dar bus matomi veiksmų istorijose, bet jų dalys nebebus viešai pasiekiamos.",
+       "revdelete-text-others": "Kiti administratoriai vis dar galės pasiekti paslėptą turinį ir jį atkurti, nebent būtų nustatyti papildomi apribojimai.",
        "revdelete-confirm": "Prašome patvirtinti, kad jūs tai ketinate padaryti, kad jūs suprantate padarinius, ir kad jūs tai darote pagal [[{{MediaWiki:Policy-url}}|politiką]].",
-       "revdelete-suppress-text": "Ištrynimas turėtų būti taikomas '''tik''' šiais atvejais:\n* Netinkama asmeninė informacija\n*: ''namų adresai, telefonų numeriai, asmens kodai ir t. t.''",
+       "revdelete-suppress-text": "Ištrynimas turėtų būti taikomas <strong>tik</strong>  šiais atvejais:\n* Galimai šmeižikiška informacija\n* netinkama asmeninė informacija\n*: <em>namų adresai, telefonų numeriai, asmens kodai ir t. t.</em>",
        "revdelete-legend": "Nustatyti matomumo apribojimus:",
        "revdelete-hide-text": "Versijos tekstas",
        "revdelete-hide-image": "Slėpti failo turinį",
        "mergehistory-empty": "Versijos negali būti sujungtos",
        "mergehistory-success": "$3 [[:$1]] {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
        "mergehistory-fail": "Nepavyksta atlikti istorijų sujungimo, prašome patikrinti puslapio ir laiko parametrus.",
+       "mergehistory-fail-toobig": "Nepavyksta sulieti istorijos, nes būtina pernešti daugiau, nei leidžia $1 riba, {{PLURAL:$1|versijos|versijų}}.",
        "mergehistory-no-source": "Šaltinio puslapis $1 neegzistuoja.",
        "mergehistory-no-destination": "Rezultato puslapis $1 neegzistuoja.",
        "mergehistory-invalid-source": "Pradinis puslapis turi turėti leistiną pavadinimą.",
        "showhideselectedversions": "Rodyti/slėpti pasirinktas versijas",
        "editundo": "atšaukti",
        "diff-empty": "(Jokio skirtumo)",
+       "diff-multi-sameuser": "(nerodoma {{PLURAL:$1|viena tarpinė versija, sukurta|$1 tarpinės versijos, sukurtos|$1 tarpinių versijų, sukurtų}} to paties naudotojo)",
+       "diff-multi-otherusers": "(nerodoma {{PLURAL:$1|viena tarpinė versija, sukurta|$1 tarpinės versijos, sukurtos|$1 tarpinių versijų, sukurtų}} {{PLURAL:$2|vieno naudotojo|$2 naudotojų}})",
        "diff-multi-manyusers": "(daugiau nei $2 {{PLURAL:$2|naudotojo|naudotojų|naudotojų}} $1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}})",
        "searchresults": "Paieškos rezultatai",
        "searchresults-title": "Paieškos rezultatai „$1“",
        "search-result-category-size": "{{PLURAL:$1|1 narys|$1 narių}} ({{PLURAL:$2|1 subkategorijoje|$2 subkategorijų}}, {{PLURAL:$3|1 failas|$3 failų}})",
        "search-redirect": "(peradresavimas $1)",
        "search-section": "(skyrius $1)",
+       "search-category": "(kategorija $1)",
+       "search-file-match": "(atitinka rinkmenos turinį)",
        "search-suggest": "Galbūt norėjote $1",
        "search-interwiki-caption": "Dukteriniai projektai",
        "search-interwiki-default": "Rezultatai iš $1:",
        "searchrelated": "susiję",
        "searchall": "visi",
        "showingresults": "Žemiau rodoma iki '''$1''' {{PLURAL:$1|rezultato|rezultatų|rezultatų}} pradedant #'''$2'''.",
+       "showingresultsinrange": "Žemiau rodoma iki {{PLURAL:$1|<strong>1</strong> gavinio|<strong>$1</strong> gavinių}} imtyje nuo <strong>$2</strong> iki <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Davinys <strong>$1</strong> iš <strong>$3</strong>|Daviniai <strong>$1 - $2</strong> iš <strong>$3</strong>}}",
        "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.",
        "powersearch-legend": "Išplėstinė paieška",
        "powersearch-remember": "Atsiminti pasirinkimą būsimoms paieškoms",
        "search-external": "Išorinė paieška",
        "searchdisabled": "Projekto {{SITENAME}} paieška yra uždrausta. Galite pamėginti ieškoti Google paieškos sistemoje. Paieškos sistemoje projekto {{SITENAME}} duomenys gali būti pasenę.",
+       "search-error": "Vykdant paiešką įvyko klaida: $1",
        "preferences": "Nustatymai",
        "mypreferences": "Nustatymai",
        "prefs-edits": "Keitimų skaičius:",
+       "prefsnologintext2": "Prisijunkite, kad galėtumėte keisti savo nustatymus.",
        "prefs-skin": "Išvaizda",
        "skin-preview": "Peržiūra",
        "datedefault": "Jokio pasirinkimo",
        "prefs-email": "El. pašto nustatymai",
        "prefs-rendering": "Išvaizda",
        "saveprefs": "Išsaugoti",
-       "restoreprefs": "Grąžinti visus numatytuosius nustatymus",
+       "restoreprefs": "Grąžinti visus numatytuosius nustatymus (visose skiltyse)",
        "prefs-editing": "Redagavimas",
        "rows": "Eilutės:",
        "columns": "Stulpeliai:",
        "recentchangesdays-max": "(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})",
        "recentchangescount": "Numatytasis rodomas keitimų skaičius:",
        "prefs-help-recentchangescount": "Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.",
+       "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kurį jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei reikia jį anuliuoti, [[Special:ResetTokens|spauskite čia]].",
        "savedprefs": "Nustatymai sėkmingai išsaugoti.",
        "timezonelegend": "Laiko juosta:",
        "localtime": "Vietinis laikas:",
        "prefs-emailconfirm-label": "El. pašto patvirtinimas:",
        "youremail": "El. paštas:",
        "username": "{{GENDER:$1Naudotojo vardas}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|Grupės|Grupių}} narys:",
+       "prefs-memberingroups": "{{PLURAL:$1|Grupės|Grupių}} {{GENDER:$2|narys|narė}}:",
        "prefs-registration": "Registravimosi laikas:",
        "yourrealname": "Tikrasis vardas:",
        "yourlanguage": "Sąsajos kalba:",
        "badsiglength": "Jūsų parašas per ilgas.\nJį turi sudaryti ne daugiau kaip $1 {{PLURAL:$1|simbolis|simboliai|simbolių}}.",
        "yourgender": "Lytis:",
        "gender-unknown": "Aš nenoriu pasakyti",
-       "gender-male": "Jis redaguoja wiki puslapius",
-       "gender-female": "Ji redaguoja wiki puslapius",
+       "gender-male": "Vyras",
+       "gender-female": "Moteris",
        "prefs-help-gender": "Pasirinktinai: naudojama teisingam sistemos kreipimuisi į jus.\nŠi informacija yra vieša.",
        "email": "El. paštas",
        "prefs-help-realname": "Tikrasis vardas yra neprivalomas.\nJei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.",
        "prefs-displaywatchlist": "Rodymo nuostatos",
        "prefs-diffs": "Skirtumai",
        "prefs-help-prefershttps": "Šis nustatymas suveiks kitą kartą prisijungiant.",
+       "prefswarning-warning": "Jūs atlikote savo nustatymų pakeitimus, kurie dar nebuvo išsaugoti.\nJei paliksite puslapį nepaspaudę \"$1\", jūsų nustatymai nebus atnaujinti.",
+       "prefs-tabs-navigation-hint": "Patarimas: galite naudoti kairės ir dešinės rodyklių ženkliukus, kad skirtukų sąraše judėtumėte tarp skirtukų.",
        "email-address-validity-valid": "Panašu, kad E-pašto adresas yra teisingas",
        "email-address-validity-invalid": "Įveskite korektišką e-pašto adresą",
        "userrights": "Naudotojų teisių valdymas",
        "userrights-changeable-col": "Grupės, kurias galite keisti",
        "userrights-unchangeable-col": "Grupės, kurių negalite keisti",
        "userrights-conflict": "Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.",
+       "userrights-removed-self": "Jūs sėkmingai panaikinote savo paties teises. Taigi, daugiau nebegalite pasiekti šio puslapio.",
        "group": "Grupė:",
        "group-user": "Naudotojai",
        "group-autoconfirmed": "Automatiškai patvirtinti naudotojai",
        "right-move": "Pervadinti puslapius",
        "right-move-subpages": "Perkelti puslapius su jų subpuslapiais",
        "right-move-rootuserpages": "Perkelti šakninius naudotojo puslapius",
+       "right-move-categorypages": "Pervardyti kategorijų puslapius",
        "right-movefile": "Perkelti failus",
        "right-suppressredirect": "Nekurti peradresavimo iš seno pavadinimo, kuomet puslapis pervadinamas",
        "right-upload": "Įkelti failus",
        "right-browsearchive": "Ieškoti ištrintų puslapių",
        "right-undelete": "Atkurti puslapį",
        "right-suppressrevision": "Peržiūrėti ir atkurti versijas, paslėptas nuo administratorių",
+       "right-viewsuppressed": "Peržiūrėti versijas, paslėptas nuo visų naudotojų",
        "right-suppressionlog": "Žiūrėti privačius įvykių sąrašus",
        "right-block": "Blokuoti redagavimo galimybę kitiems naudotojams",
        "right-blockemail": "Blokuoti elektroninio pašto siuntimo galimybę naudotojui",
        "right-proxyunbannable": "Apeiti automatinius proxy serverių blokavimus",
        "right-unblockself": "Atblokuoti pačius",
        "right-protect": "Pakeisti apsaugos lygius ir redaguoti apsaugotus puslapius",
-       "right-editprotected": "Redaguoti apsaugotus puslapius (be pakopinės apsaugos)",
+       "right-editprotected": "Taisyti puslapius, apsaugotus kaip \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Taisyti puslapius, apsaugotus kaip \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Keisti naudotojo aplinką",
        "right-editusercssjs": "Redaguoti kitų naudotojų CSS ir JS failus",
        "right-editusercss": "Redaguoti kitų naudotojų CSS failus",
        "right-editmyusercss": "Redaguoti savo vartotojo CSS failus",
        "right-editmyuserjs": "Redaguokite savo naudotojo vartotojo JavaScript failus",
        "right-viewmywatchlist": "Peržiūrėti savo stebimų sąrašą",
+       "right-editmywatchlist": "Keiskite savo stebimųjų sąrašą. Atminkite, kad kai kurie veiksmai vis vien pridės puslapius netgi be tokios teisės.",
+       "right-viewmyprivateinfo": "Peržiūrėti asmeninius duomenis (pvz., elektroninis paštas, tikras vardas)",
+       "right-editmyprivateinfo": "Keisti asmeninius duomenis (pvz., elektroninis paštas, tikras vardas)",
        "right-editmyoptions": "Redaguoti savo nuostatas",
        "right-rollback": "Greitai atmesti paskutinio naudotojo tam tikro puslapio pakeitimus",
        "right-markbotedits": "Žymėti atmestus keitimus kaip atliktus boto",
        "action-createpage": "kurti puslapius",
        "action-createtalk": "kurti aptarimų puslapius",
        "action-createaccount": "kurti šią naudotojo paskyrą",
+       "action-history": "peržiūrėti šio puslapio istoriją",
        "action-minoredit": "žymėti keitimą kaip smulkų",
        "action-move": "pervadinti šį puslapį",
        "action-move-subpages": "pervadinti šį puslapį ir jo subpuslapius",
        "action-move-rootuserpages": "perkelti pagrindinius naudotojų puslapius",
+       "action-move-categorypages": "pervardyti kategorijų puslapius",
        "action-movefile": "perkelti šį failą",
        "action-upload": "įkelti šią rinkmeną",
        "action-reupload": "perrašyti šį esamą failą",
        "action-viewmyprivateinfo": "peržiūrėti jūsų privačią informaciją",
        "action-editmyprivateinfo": "redaguoti savo privačią informaciją",
        "nchanges": "$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|nuo paskutinio apsilankymo}}",
        "enhancedrc-history": "istorija",
        "recentchanges": "Naujausi keitimai",
        "recentchanges-legend": "Naujausių keitimų parinktys",
        "recentchanges-summary": "Šiame puslapyje yra patys naujausi pakeitimai šiame projekte.",
+       "recentchanges-noresult": "Per nurodytą laiką atliktų keitimų, atitinkančių nurodytas sąlygas, nėra.",
        "recentchanges-feed-description": "Sekite pačius naujausius projekto keitimus šiame šaltinyje.",
        "recentchanges-label-newpage": "Šiuo keitimu sukurtas naujas puslapis",
        "recentchanges-label-minor": "Tai smulkus pakeitimas",
        "recentchanges-label-unpatrolled": "Šis keitimas dar nebuvo patikrintas",
        "recentchanges-label-plusminus": "Šiuo baitų skaičiumi pakeista puslapio apimtis",
        "recentchanges-legend-heading": "'''Paaiškinimai:'''",
-       "recentchanges-legend-newpage": "$1 - naujas puslapis",
-       "rcnotefrom": "Žemiau yra pakeitimai pradedant <strong>$2</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
+       "rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
        "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
        "rcshowhideminor": "$1 smulkius keitimus",
        "rcshowhideminor-show": "Rodyti",
        "uploaderror": "Įkėlimo klaida",
        "upload-recreate-warning": "'''Dėmėsio: Failas šiuo pavadinimu buvo ištrintas arba pervadintas.'''\n\nJūsų patogumui pateiktas įrašas apie šio puslapio trynimą ar pervadinimą:",
        "uploadtext": "Kad įkeltumėte failą, naudokitės žemiau pateikta forma.\nNorėdami peržiūrėti ar ieškoti anksčiau įkeltų paveikslėlių, eikite į [[Special:FileList|įkeltų failų sąrašą]], įkėlimai yra registruojami [[Special:Log/upload|įkėlimų sąraše]], trynimai — [[Special:Log/delete|trynimų sąraše]].\n\nNorėdami panaudoti įkeltą failą puslapyje, naudokite tokias nuorodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Failas.jpg]]</nowiki></code>''' norėdami naudoti pilną failo versiją\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Failas.png|200px|thumb|left|alternatyvusis tekstas]]</nowiki></code>''' norėdami naudoti 200 pikselių pločio paveikslėlį rėmelyje puslapio kairėje; „alternatyvus tekstas“ bus naudojamas paveikslėlio aprašymui.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Failas.ogg]]</nowiki></code>''' tiesioginei nuorodai į failą.",
-       "upload-permitted": "Leidžiami rinkmenų tipai: $1.",
-       "upload-preferred": "Pageidautini failų tipai: $1.",
-       "upload-prohibited": "Uždrausti failų tipai: $1.",
+       "upload-permitted": "{{PLURAL:$2|Leidžiamas rinkmenos tipas|Leidžiami rinkmenų tipai}}: $1.",
+       "upload-preferred": "Pageidautini failai {{PLURAL:$2|type|types}}: $1.",
+       "upload-prohibited": "Uždrausti failai {{PLURAL:$2|type|types}}: $1.",
        "uploadlogpage": "Įkėlimų sąrašas",
        "uploadlogpagetext": "Žemiau pateikiamas paskutinių failų įkėlimų sąrašas.\nTaip pat galite peržvelgti [[Special:NewFiles|naujausių failų galeriją]].",
        "filename": "Failo vardas",
        "windows-nonascii-filename": "Ši viki neleidžia naudoti failų vardų su specialiais simboliais.",
        "fileexists": "Rinkmena tokiu pačiu pavadinimu jau esti, prašome pažiūrėti <strong>[[:$1]]</strong>, jei nesate tikras, ar norite perrašyti šią rinkmeną.\n[[$1|thumb]]",
        "filepageexists": "Šio failo aprašymo puslapis jau buvo sukurtas <strong>[[:$1]]</strong>, bet šiuo metu nėra jokio failo šiuo pavadinimu.\nJūsų įvestas komentaras neatsiras aprašymo puslapyje.\nJei norite, kad jūsų komentaras ten atsirastų, jums reikia jį pakeisti pačiam.\n[[$1|thumb]]",
-       "fileexists-extension": "Failas su panašiu pavadinimu jau yra: [[$2|thumb]]\n* Įkeliamo failo pavadinimas: <strong>[[:$1]]</strong>\n* Jau esančio failo pavadinimas: <strong>[[:$2]]</strong>\nPrašome pasirinkti kitą vardą.",
+       "fileexists-extension": "Rinkmena panašiu pavadinimu jau yra: [[$2|thumb]]\n* Įkeliamos rinkmenos pavadinimas: <strong>[[:$1]]</strong>\n* Jau esančios rinkmenos pavadinimas: <strong>[[:$2]]</strong>\nPrašome pasirinkti kitą vardą.",
        "fileexists-thumbnail-yes": "Rinkmena turbūt yra sumažinto dydžio ''(miniatiūra)''. [[$1|thumb]]\nPrašome peržiūrėti rinkmeną <strong>[[:$1]]</strong>.\nJeigu tai yra toks pats pradinio dydžio paveikslėlis, tai įkelti papildomos miniatūros nereikia.",
        "file-thumbnail-no": "Failo pavadinimas prasideda  <strong>$1</strong>.\nAtrodo, kad yra sumažinto dydžio paveikslėlis ''(miniatiūra)''.\nJei jūs turite šį paveisklėlį pilna raiška, įkelkite šitą, priešingu atveju prašome pakeisti failo pavadinimą.",
        "fileexists-forbidden": "Failas tokiu pačiu vardu jau egzistuoja ir negali būti perrašytas;\nprašome eiti atgal ir įkelti šį failą kitu vardu. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Failas tokiu vardu jau egzistuoja bendrojoje failų saugykloje;\nJei visvien norite įkelti savo failą, prašome eiti atgal ir įkelti šį failą kitu vardu. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Šis failas yra {{PLURAL:$1|šio failo|šių failų}} dublikatas:",
        "file-deleted-duplicate": "Failas, identiškas šiam failui ([[:$1]]), seniau buvo ištrintas. Prieš įkeldami jį vėl patikrinkite šio failo ištrynimo istoriją.",
+       "file-deleted-duplicate-notitle": "Rinkmena, visiškai atitinkanti šią, anksčiau buvo ištrinta, o jos pavadinimas uždraustas. Jums reiktų paprašyti kieno nors, turinčio galimybę peržiūrėti uždraustą rinkmeną, kad jis išaiškintų padėtį, prieš bandant vėl kelti rinkmeną.",
        "uploadwarning": "Dėmesio",
        "uploadwarning-text": "Prašome pakeisti failo aprašymą ir bandykite dar kartą.",
        "savefile": "Išsaugoti rinkmeną",
        "php-uploaddisabledtext": "Failų įkėlimai uždrausti PHP nustatymuose.\nPatikrinkite ''file_uploads'' nustatą.",
        "uploadscripted": "Šis failas turi HTML arba programinį kodą, kuris gali būti klaidingai suprastas interneto naršyklės.",
        "uploadscriptednamespace": "Šis SVG failas turi neteisėtą vietą vardui '$1'",
+       "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.",
        "upload-source": "Pradinė rinkmena",
        "license": "Licencija:",
        "license-header": "Licensija",
        "nolicense": "Nepasirinkta",
+       "licenses-edit": "Keisti licencijų parinktis",
        "license-nopreview": "(Peržiūra negalima)",
-       "upload_source_url": " (tikras, viešai prieinamas URL)",
+       "upload_source_url": "(pasirinkta rinkmena iš tikro, viešai pasiekiamo URL adreso)",
        "upload_source_file": "(pasirinkta rinkmena jūsų kompiuteryje)",
-       "listfiles-summary": "Šiame specialiame puslapyje rodomi visi įkelti failai.\nKai sąrašas susiaurinamas pagal naudotoją, rodomi tik tie failai, kurių naujausią versiją jis yra įkėlęs.",
+       "listfiles-delete": "trinti",
+       "listfiles-summary": "Šiame specialiame puslapyje rodomos visos įkeltos rinkmenos.",
        "listfiles_search_for": "Ieškoti failo pavadinimo:",
        "imgfile": "failas",
        "listfiles": "Failų sąrašas",
        "listfiles_size": "Dydis",
        "listfiles_description": "Aprašymas",
        "listfiles_count": "Versijos",
+       "listfiles-show-all": "Įtraukti senesnes paveikslėlių versijas",
        "listfiles-latestversion": "Dabartinė versija",
        "listfiles-latestversion-yes": "Taip",
        "listfiles-latestversion-no": "Ne",
        "sharedupload": "Ši rinkmena yra iš $1 ir gali būti naudojama kitose wiki svetainėse.",
        "sharedupload-desc-there": "Šis failas yra iš $1 ir gali būti naudojamas kituose projektuose.\nNorėdami sužinoti daugiau, žiūrėkite [$2 failo aprašymą].",
        "sharedupload-desc-here": "Šis failas yra iš $1 ir gali būti naudojamas kituose projektuose.\nInformacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.",
+       "sharedupload-desc-edit": "Ši rinkmena yra iš $1 ir gali būti naudojama kituose projektuose.\nGal norite pakeisti aprašymą jos [$2 aprašymo puslapyje]?",
+       "sharedupload-desc-create": "Ši rinkmena yra iš $1 ir gali būti naudojama kituose projektuose.\nGal norite pakeisti aprašymą jos [$2 aprašymo puslapyje]?",
        "filepage-nofile": "Joks failas su duotu pavadinimu neegzistuoja.",
        "filepage-nofile-link": "Joks failas su duotu pavadinimu neegzistuoja, bet vis dar galite [$1 jį įkelti].",
        "uploadnewversion-linktext": "Įkelti naują šios rinkmenos atmainą",
        "unwatchedpages": "Nestebimi puslapiai",
        "listredirects": "Peradresavimų sąrašas",
        "listduplicatedfiles": "Pasikartojančių rinkmenų sąrašas",
+       "listduplicatedfiles-summary": "Tai rinkmenų sąrašas, kuriame pati vėliausia rinkmenos versija laikoma kai kurių kitų rinkmenų dublikatu. Vertinamos tik vietinės rinkmenos.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] turi [[$3|{{PLURAL:$2|dublikatą|$2 dublikatus|$2 dublikatų}}]].",
        "unusedtemplates": "Nenaudojami šablonai",
        "unusedtemplatestext": "Šis puslapis rodo sąrašą puslapių, esančių {{ns:template}} vardų srityje, kurie nėra įterpti į jokį kitą puslapį. Nepamirškite patikrinti kitų nuorodų prieš juos ištrinant.",
        "unusedtemplateswlh": "kitos nuorodos",
        "randompage": "Atsitiktinis puslapis",
        "randompage-nopages": "{{PLURAL:$2|Šioje vardų srityje|Šiose vardų srityse}} nėra jokių puslapių: $1.",
+       "randomincategory": "Atsitiktinis puslapis kategorijoje",
+       "randomincategory-invalidcategory": "Kategorijos pavadinimu „$1“ nėra.",
+       "randomincategory-nopages": "[[:Category:$1|$1]] kategorijoje nėra puslapių.",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Atsitiktinis puslapis kategorijoje",
        "randomredirect": "Atsitiktinis peradresavimas",
        "randomredirect-nopages": "Vardų srityje „$1“ nėra jokių peradresavimų.",
        "statistics": "Statistika",
        "pageswithprop-submit": "Eiti",
        "doubleredirects": "Dvigubi peradresavimai",
        "doubleredirectstext": "Šiame puslapyje yra puslapių, kurie nukreipia į kitus peradresavimo puslapius, sąrašas.\nKiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, taip pat antrojo peradresavimo paskirtis, kuris paprastai yra „tikrasis“ paskirties puslapis, į kurį pirmasis peradresavimas ir turėtų rodyti.\n<del>Išbraukti</del> įrašai yra išspręsti.",
-       "double-redirect-fixed-move": "[[$1]] buvo perkeltas, dabar tai peradresavimas į [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] buvo pervardytas; dabar tai peradresavimas į [[$2]].",
        "double-redirect-fixed-maintenance": "Tvarkomas dvigubas peradresavimas iš [[$1]] į [[$2]].",
        "double-redirect-fixer": "Peradresavimų tvarkyklė",
        "brokenredirects": "Peradresavimai į niekur",
        "ninterwikis": "$1 {{PLURAL:$1|interviki nuoroda|interviki nuorodos}}",
        "nlinks": "$1 {{PLURAL:$1|nuoroda|nuorodos|nuorodų}}",
        "nmembers": "$1 {{PLURAL:$1|narys|nariai|narių}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|narys|nariai|narių}}",
        "nrevisions": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}",
        "nviews": "$1 {{PLURAL:$1|parodymas|parodymai|parodymų}}",
        "nimagelinks": "Naudojama $1 {{PLURAL:$1|puslapyje|puslapiuose|puslapių}}",
        "wantedfiles": "Trokštami failai",
        "wantedfiletext-cat": "Sekantys failai yra naudojami, bet neegzistuoja. Čia failai iš išorinių saugyklų gali būti išvardinti, nors jie jose ir egzistuoja. Failai netenkinantys šių sąlygų gali būti <del>perbraukti</del>. Papildomai peržiūrėkite [[:$1|puslapius]], kuriuose yra naudojami čia išvardinti neegzistuojantys failai.",
        "wantedfiletext-nocat": "Sekantys failai yra naudojami, bet neegzistuoja. Čia failai iš išorinių saugyklų gali būti išvardinti, nors jie jose ir egzistuoja. Failai netenkinantys šių sąlygų gali būti <del>perbraukti</del>.",
+       "wantedfiletext-nocat-noforeign": "Šios rinkmenos yra naudojamos, tačiau nesti.",
        "wantedtemplates": "Trokštami šablonai",
        "mostlinked": "Daugiausiai nurodomi puslapiai",
        "mostlinkedcategories": "Daugiausiai nurodomos kategorijos",
        "mostrevisions": "Puslapiai su daugiausiai keitimų",
        "prefixindex": "Visi puslapiai pagal pavadinimo pradžią",
        "prefixindex-namespace": "Visi puslapiai prasidedantys ($1 vardų sritis)",
+       "prefixindex-strip": "Paslėpti priešdėlį gavinių sąraše",
        "shortpages": "Trumpiausi puslapiai",
        "longpages": "Ilgiausi puslapiai",
        "deadendpages": "Puslapiai-aklavietės",
        "deadendpagestext": "Šie puslapiai neturi nuorodų į kitus puslapius šiame projekte.",
        "protectedpages": "Užrakinti puslapiai",
        "protectedpages-indef": "Tik neapibrėžtos apsaugos",
+       "protectedpages-summary": "Šiame puslapyje pateikti puslapiai, kurie šiuo metu užrakinti. Pavadinimų, kurie uždrausti nuo kūrimo, sąrašą žiūrėkite čia: [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Tik pakopinė apsauga",
        "protectedpages-noredirect": "Slėpti peradresavimus",
        "protectedpagesempty": "Šiuo metu nėra apsaugotas joks failas su šiais parametrais.",
        "protectedpages-timestamp": "Laiko žyma",
        "protectedpages-page": "Puslapis",
        "protectedpages-expiry": "Galioja iki",
+       "protectedpages-performer": "Užrakinantis naudotojas",
+       "protectedpages-params": "Užrakinimo nuostatos",
        "protectedpages-reason": "Priežastis",
        "protectedpages-unknown-timestamp": "Nežinomas",
        "protectedpages-unknown-performer": "Nežinomas vartotojas",
        "protectedtitles": "Apsaugoti pavadinimai",
+       "protectedtitles-summary": "Tai pavadinimų, kuriais uždrausta kurti puslapius, sąrašas. Šiuo metu užrakintų puslapių sąrašą žiūrėkite čia: [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Šiuo metu nėra jokių pavadinimų apsaugotų šiais parametrais.",
        "listusers": "Naudotojų sąrašas",
        "listusers-editsonly": "Rodyti tik keitimus atlikusius naudotojus",
        "listusers-creationsort": "Rodyti pagal paskyros sukūrimo datą",
+       "listusers-desc": "Išdėstyti abėcėline tvarka",
        "usereditcount": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}",
        "usercreated": "{{GENDER:$3|Naudotojo|Naudotojos|Naudotojo}} $3 paskyra sukurta $1 $2",
        "newpages": "Naujausi puslapiai",
        "pager-older-n": "$1 {{PLURAL:$1|senesnis|senesni|senesnių}}",
        "suppress": "Peržiūra",
        "querypage-disabled": "Šiame specialiajame puslapyje yra išjungta dėl neefektyvumo.",
+       "apihelp": "API pagalba",
+       "apihelp-no-such-module": "Nerasta modulio $1.",
        "booksources": "Knygų šaltiniai",
        "booksources-search-legend": "Knygų šaltinių paieška",
+       "booksources-search": "Ieškoti",
        "booksources-text": "Žemiau yra nuorodų sąrašas į kitas svetaines, kurios parduoda naujas ar naudotas knygas, bei galbūt turinčias daugiau informacijos apie knygas, kurių ieškote:",
        "booksources-invalid-isbn": "Duotas ISBN atrodo neteisingas; patikrinkite, ar nepadarėte kopijavimo klaidų.",
        "specialloguserlabel": "Naudotojas:",
        "listgrouprights-removegroup-self": "Pašalinti {{PLURAL:$2|grupę|grupes}} iš savo paskyros: $1",
        "listgrouprights-addgroup-self-all": "Priskirti visas grupes prie paskyros",
        "listgrouprights-removegroup-self-all": "Pašalinti visas grupes iš savo paskyros",
+       "listgrouprights-namespaceprotection-header": "Vardų srities apribojimai",
+       "listgrouprights-namespaceprotection-namespace": "Vardų sritis",
+       "listgrouprights-namespaceprotection-restrictedto": "Teisė(s), leidžiančios naudotojui atlikti keitimus",
+       "trackingcategories": "Sekimo kategorijos",
+       "trackingcategories-summary": "Šiame puslapyje išdėstytos sekimo kategorijos, kurias savaime sudaro MediaWiki programinė įranga. Jų pavadinimus galima pakeisti pakeičiant sistemos pranešimus {{ns:8}} vardų srityje.",
+       "trackingcategories-msg": "Sekimo kategorija",
+       "trackingcategories-name": "Pranešimo pavadinimas",
+       "trackingcategories-desc": "Įtraukimo kategorijon sąlygos",
+       "noindex-category-desc": "Šis puslapis nėra indeksuojamas robotų, nes jame yra specialus įrašas <code><nowiki>__NOINDEX__</nowiki></code> ir yra vardų srityje, kuri ši vėliava leidžiama.",
+       "post-expand-template-inclusion-category-desc": "Puslapio dydis viršija <code>$wgMaxArticleSize</code>, kai išskleidžiami visi šablonai, todėl keletas šablonų liko neišskleista.",
+       "broken-file-category-desc": "Puslapyje yra neveikianti rinkmenos nuoroda (yra rinkmenos nuoroda, tačiau pačios rinkmenos nėra).",
+       "trackingcategories-nodesc": "Nėra aprašymo.",
+       "trackingcategories-disabled": "Kategorija išjungta",
        "mailnologin": "Nėra adreso",
        "mailnologintext": "Jums reikia būti [[Special:UserLogin|prisijungusiam]] ir turi būti įvestas teisingas el. pašto adresas jūsų [[Special:Preferences|nustatymuose]], kad siųstumėte el. laiškus kitiems nautotojams.",
        "emailuser": "Rašyti laišką šiam naudotojui",
        "emailuser-title-target": "Siųsti E-pašto žinutę {{GENDER:$1|user}}",
        "emailuser-title-notarget": "El. pašto vartotojas",
        "emailpage": "Siųsti el. laišką naudotojui",
-       "emailpagetext": "Jūs gali pasinaudoti šia forma norėdami nusiųsti el. laišką šiam naudotojui.\nEl. pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.",
+       "emailpagetext": "Jūs galite pasinaudoti šiuo pavyzdžiu, norėdami nusiųsti elektroninį laišką šiam naudotojui.\nElektroninio pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.",
        "defemailsubject": "{{SITENAME}} el. pašto iš vartotojo \" $1 \"",
        "usermaildisabled": "Naudotojo elektroninis paštas išjungtas",
        "usermaildisabledtext": "Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.",
        "mywatchlist": "Stebimų sąrašas",
        "watchlistfor2": "Naudotojo $1 $2",
        "nowatchlist": "Neturite nei vieno stebimo puslapio.",
-       "watchlistanontext": "Prašome $1, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.",
+       "watchlistanontext": "Prašome prisijungti, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.",
        "watchnologin": "Neprisijungęs",
        "addwatch": "Pridėti į stebimųjų sąrašą",
        "addedwatchtext": "Puslapis „[[:$1]]“ pridėtas į [[Special:Watchlist|stebimųjų sąrašą]].\nBūsimi puslapio bei atitinkamo aptarimo puslapio pakeitimai bus rodomi stebimųjų puslapių sąraše,\ntaip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąraše]], kad išsiskirtų iš kitų puslapių.",
+       "addedwatchtext-short": "Puslapis „$1“ pridėtas į jūsų stebimųjų sąrašą.",
        "removewatch": "Pašalinti iš stebimųjų sąrašo",
        "removedwatchtext": "Puslapis „[[:$1]]“ pašalintas iš jūsų [[Special:Watchlist|stebimųjų sąrašo]].",
+       "removedwatchtext-short": "Puslapis „$1“ pašalintas iš jūsų stebimųjų sąrašo.",
        "watch": "Stebėti",
        "watchthispage": "Stebėti šį puslapį",
        "unwatch": "Nebestebėti",
        "deletecomment": "Priežastis:",
        "deleteotherreason": "Kita/papildoma priežastis:",
        "deletereasonotherlist": "Kita priežastis",
-       "deletereason-dropdown": "*Dažnos trynimo priežastys\n** Autoriaus prašymas\n** Autorystės teisių pažeidimas\n** Vandalizmas",
+       "deletereason-dropdown": "* Dažnos trynimo priežastys\n** Brukalai\n** Vandalizmas\n** Autorystės teisių pažeidimas\n** Autoriaus prašymas\n** Neteisingas nukreipimas",
        "delete-edit-reasonlist": "Keisti trynimo priežastis",
        "delete-toobig": "Šis puslapis turi ilgą keitimų istoriją, daugiau nei $1 {{PLURAL:$1|revizija|revizijos|revizijų}}. Tokių puslapių trynimas yra apribotas, kad būtų išvengta atsitiktinio {{SITENAME}} žlugdymo.",
        "delete-warning-toobig": "Šis puslapis turi ilgą keitimų istoriją, daugiau nei $1 {{PLURAL:$1|revizija|revizijos|revizijų}}. Trinant jis gali sutrikdyti {{SITENAME}} duomenų bazės operacijas; būkite atsargūs.",
+       "deleteprotected": "Jūs šio puslapio ištrinti negalite, nes jis apsaugotas.",
+       "deleting-backlinks-warning": "'''Dėmesio:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Kiti puslapiai]] nurodo ar įtraukia puslapį, kurį ruošiatės trinti.",
        "rollback": "Atmesti keitimus",
-       "rollback_short": "Atmesti",
        "rollbacklink": "atmesti",
        "rollbacklinkcount": "atmesti $1 {{PLURAL:$1|keitimą|keitimus}}",
        "rollbacklinkcount-morethan": "atmesti daugiau nei $1 {{PLURAL:$1|keitimą|keitimų}}",
        "protect-othertime": "Kitas laikas:",
        "protect-othertime-op": "kitas laikas",
        "protect-existing-expiry": "Esamas galiojimo laikas: $3, $2",
+       "protect-existing-expiry-infinity": "Esamas galiojimo laikas: begalinis",
        "protect-otherreason": "Kita/papildoma priežastis:",
        "protect-otherreason-op": "Kita priežastis",
        "protect-dropdown": "*Įprastos užrakinimo priežastys\n** Intensyvus vandalizmas\n** Nuolatinis nepageidautinų nuorodų dėliojimas\n** Beprasmis redagavimo karas\n** Didelės svarbos puslapis\n** Pakartotinis ištrinto puslapio atkūrinėjimas",
        "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis",
        "mycontris": "Įnašai",
        "contribsub2": "Dėl {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Naudotojo paskyra „$1“ neužregistruota.",
        "nocontribs": "Jokie keitimai neatitiko šių kriterijų.",
        "uctop": "(dabartinis)",
        "month": "Nuo mėnesio (ir anksčiau):",
        "sp-contributions-newbies-sub": "Neseniai prisiregistravusieji",
        "sp-contributions-newbies-title": "Naujai užsiregistravusių naudotojų indėlis",
        "sp-contributions-blocklog": "Blokavimų sąrašas",
+       "sp-contributions-suppresslog": "ištrintas naudotojo indėlis",
        "sp-contributions-deleted": "ištrintas naudotojo indėlis",
        "sp-contributions-uploads": "nuotraukos",
        "sp-contributions-logs": "Specialiųjų veiksmų sąrašas",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] buvo užblokuotas.<br />\nAplankykite [[Special:BlockList|IP blokavimų istoriją]] norėdami jį peržiūrėti.",
        "ipb-blockingself": "Jūs ruošiatės užblokuoti save! Ar tikrai norite tai padaryti?",
        "ipb-confirmhideuser": "Jūs ruošiatės užblokuoti naudotoją, pasirinkę „slėpti naudotoją“ nustatymą. Tai paslėps naudotojo vardą visuose sąrašuose ir žurnalo įrašuose. Ar tikrai norite tai padaryti?",
+       "ipb-confirmaction": "Jei esate tikras, pažymėkite \"{{int:ipb-confirm}}\" laukelį apačioje.",
        "ipb-edit-dropdown": "Redaguoti blokavimų priežastis",
        "ipb-unblock-addr": "Atblokuoti $1",
        "ipb-unblock": "Atblokuoti naudotojo vardą arba IP adresą",
        "ipb-blocklist": "Rodyti egzistuojančius blokavimus",
-       "ipb-blocklist-contribs": "$1 indėlis",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} indėlis",
        "unblockip": "Atblokuoti naudotoją",
        "unblockiptext": "Naudokite šią formą, kad atkurtumėte redagavimo galimybę\nankščiau užblokuotam IP adresui ar naudotojui.",
        "ipusubmit": "Atblokuoti šį adresą",
        "unblocked": "[[User:$1|$1]] buvo atblokuotas",
        "unblocked-range": "$1 buvo atblokuotas",
        "unblocked-id": "Blokavimas $1 buvo pašalintas",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] buvo atblokuotas.",
        "blocklist": "Blokuoti naudotojai",
        "ipblocklist": "Blokuoti naudotojai",
        "ipblocklist-legend": "Rasti užblokuotą naudotoją",
        "range_block_disabled": "Administratoriams neleidžiama blokuoti IP adresų sričių.",
        "ipb_expiry_invalid": "Galiojimo laikas neleistinas.",
        "ipb_expiry_temp": "Paslėptų naudotojų vardų blokavimas turi būti neribotas.",
-       "ipb_hide_invalid": "Negalima paslėpti šios paskyros; ji gali turėti per daug keitimų.",
+       "ipb_hide_invalid": "Negalima paslėpti šios paskyros; ji gali turėti daugiau nei {{PLURAL:$1|vieną keitimą|$1 keitimus|$1 keitimų}}.",
        "ipb_already_blocked": "„$1“ jau užblokuotas",
        "ipb-needreblock": "$1 jau yra užblokuotas. Ar norite pakeisti nustatymus?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Kitas blokavimas|Kiti blokavimai}}",
        "movenotallowedfile": "Jūs neturite teisės perkelti failus.",
        "cant-move-user-page": "Jūs neturite teisės pervardyti naudotojų puslapių (išskyrus subpuslapius).",
        "cant-move-to-user-page": "Jūs neturite teisių perkelti puslapį į naudotojo puslapį (išskyrus į naudotojo popuslapį).",
+       "cant-move-category-page": "Neturite teisių pervadinti kategorijų puslapius.",
+       "cant-move-to-category-page": "Neturite teisės pervadinti puslapio į kategorijos puslapį.",
        "newtitle": "Naujas pavadinimas:",
        "move-watch": "Stebėti šį puslapį",
        "movepagebtn": "Pervadinti puslapį",
        "allmessages-prefix": "Perkošti pagal pradžią:",
        "allmessages-language": "Kalba:",
        "allmessages-filter-submit": "Rodyti",
+       "allmessages-filter-translate": "Versti",
        "thumbnail-more": "Padidinti",
        "filemissing": "Dingęs failas",
        "thumbnail_error": "Klaida kuriant sumažintą paveikslėlį: $1",
        "thumbnail-temp-create": "Negalima sukurti laikinos failo miniatiūros",
        "thumbnail-dest-create": "Negalima išsaugoti failo miniatiūros",
        "thumbnail_invalid_params": "Neleistini miniatiūros parametrai",
+       "thumbnail_toobigimagearea": "Rinkmenos matmenys didesni nei $1",
        "thumbnail_dest_directory": "Nepavyksta sukurti paskirties aplanko",
        "thumbnail_image-type": "Paveikslėlio tipas nėra palaikomas",
        "thumbnail_gd-library": "Nepilna GD bibliotekos konfigūracija: trūksta funkcijos $1",
        "import": "Importuoti puslapius",
        "importinterwiki": "Tarpprojektinis importas",
        "import-interwiki-text": "Pasirinkite projektą ir puslapio pavadinimą importavimui.\nVersijų datos ir redaktorių vardai bus išlaikyti.\nVisi tarpprojektiniai importo veiksmai yra registruojami  [[Special:Log/import|importo istorijoje]].",
+       "import-interwiki-sourcewiki": "Pradinė wiki:",
+       "import-interwiki-sourcepage": "Pirminis puslapis:",
        "import-interwiki-history": "Kopijuoti visas istorijos versijas šiam puslapiui",
        "import-interwiki-templates": "Įtraukti visus šablonus",
        "import-interwiki-submit": "Importuoti",
        "import-logentry-interwiki": "tarpprojektinis $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} iš $2",
        "javascripttest": "JavaScript testavimas",
-       "javascripttest-title": "Vykdomas $1 testavimas",
        "javascripttest-pagetext-noframework": "Šis puslapis yra skirtas vykdyti JavaScript testavimus.",
        "javascripttest-pagetext-unknownframework": "Nežinoma \"$1\" testavimo struktūra.",
        "javascripttest-pagetext-frameworks": "Prašome pasirinkti vieną iš išvardintų testavimo struktūrų: $1",
        "javascripttest-pagetext-skins": "Pasirinkite naudotojo sąsajos išvaizdą, kuriai atliksite testavimą:",
        "javascripttest-qunit-intro": "Peržiūrėkite [$1 testavimo dokumentaciją]",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit bandymų komplektas",
        "tooltip-pt-userpage": "Jūsų naudotojo puslapis",
        "tooltip-pt-anonuserpage": "Naudotojo puslapis jūsų IP adresui",
        "tooltip-pt-mytalk": "Jūsų aptarimo puslapis",
        "tooltip-pt-mycontris": "Jūsų darytų keitimų sąrašas",
        "tooltip-pt-login": "Rekomenduojame prisijungti, nors tai nėra privaloma.",
        "tooltip-pt-logout": "Atsijungti",
+       "tooltip-pt-createaccount": "Esate skatinamas susikurti paskyrą ir prisijungti, tačiau, tai nėra privaloma",
        "tooltip-ca-talk": "Puslapio turinio aptarimas",
        "tooltip-ca-edit": "Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuką prieš išsaugodami.",
        "tooltip-ca-addsection": "Pradėti naują aptariamą temą",
        "tooltip-feed-atom": "Šio puslapio Atom šaltinis",
        "tooltip-t-contributions": "Rodyti šio naudotojo keitimų sąrašą",
        "tooltip-t-emailuser": "Siųsti laišką šiam naudotojui",
+       "tooltip-t-info": "Daugiau žinių apie šį puslapį",
        "tooltip-t-upload": "Įkelti failus",
        "tooltip-t-specialpages": "Specialiųjų puslapių sąrašas",
        "tooltip-t-print": "Šio puslapio versija spausdinimui",
        "spam_reverting": "Atkuriama į ankstesnę versiją, neturinčios nuorodų į $1",
        "spam_blanking": "Visos versijos turėjo nuorodų į $1, išvaloma",
        "spam_deleting": "Visos versijos turėjo nuorodų į $1, ištrinama",
-       "simpleantispam-label": "Anti-spam patikra.\n'''NE'''pildykite!",
+       "simpleantispam-label": "Brukalų patikra.\n'''NE'''pildykite!",
        "pageinfo-title": "„$1“ informacija",
        "pageinfo-not-current": "Atsiprašome, neįmanoma pateikti šios senų versijų informacijos.",
        "pageinfo-header-basic": "Pagrindinė informacija",
        "pageinfo-recent-edits": "Paskutinųjų keitimų skaičius (per $1 laikotarpį)",
        "pageinfo-recent-authors": "Pastarųjų skirtingų redaguotojų skaičius",
        "pageinfo-magic-words": "Magiškas(-i) {{PLURAL:$1|žodis|žodžiai}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Paslėpta kategorija|Paslėptos kategorijos|Paslėptų kategorijų}} ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Įtrauktas šablonas|Įtraukti šablonai|Įtrauktų šablonų}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Įtrauktas puslapis|Įtraukti puslapiai|Įtrauktų puslapių}} ($1)",
        "pageinfo-toolboxlink": "Puslapio informacija",
        "pageinfo-redirectsto": "Nukreipimai į",
        "pageinfo-redirectsto-info": "informacija",
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
+       "newimages-showbots": "Rodyti robotų atliktus įkėlimus",
        "noimages": "Nėra ką parodyti.",
        "ilsubmit": "Ieškoti",
        "bydate": "pagal datą",
        "exif-compression-3": "CCITT 3 grupės fakso kodavimas",
        "exif-compression-4": "CCITT 4 grupės fakso kodavimas",
        "exif-copyrighted-true": "Autorinės teisės",
-       "exif-copyrighted-false": "Viešas domenas",
+       "exif-copyrighted-false": "Autorinių teisių padėtis nenustatyta",
        "exif-unknowndate": "Nežinoma data",
        "exif-orientation-1": "Standartinis",
        "exif-orientation-2": "Apversta horizontaliai",
        "confirmemail_subject": "{{SITENAME}} el. pašto adreso patvirtinimas",
        "confirmemail_body": "Kažkas, tikriausiai jūs IP adresu $1, užregistravo\npaskyrą „$2“ susietą su šiuo el. pašto adresu projekte {{SITENAME}}.\n\nKad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir aktyvuotumėte\nel. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyrą registravote *ne* jūs, eikite šia nuoroda,\nkad atšauktumėte el. pašto adreso patvirtinimą:\n\n$5\n\nPatvirtinimo kodas baigs galioti $4.",
        "confirmemail_body_changed": "Kažkas, tikriausiai jūs IP adresu $1, projekte {{SITENAME}}\npakeitė paskyros „$2“ el. pašto adresą.\n\nKad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir vėl aktyvuotumėte\nel. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, eikite šia nuoroda,\nkad atšauktumėte el. pašto adreso patvirtinimą:\n\n$5\n\nPatvirtinimo kodas baigs galioti $4.",
-       "confirmemail_body_set": "Kažkas (tikriausiai jūs) iš IP adreso $1,\nnustatė svetainės {{SITENAME}} paskyros „$2“ e-pašto adresą į jūsiškį.\n\nKad patvirtintumėte, kad ši paskyra tikrai priklauso jums ir tokiu būdu aktyvuotumėte\ne-pašto funkcijas svetainėje {{SITENAME}}, atverkite šią nuorodą jūsų naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, spauskite šią nuorodą,\nkad atšauktumėte e-pašto adreso patvirtinimą:\n\n$5\n\nŠis patvirtinimo kodas baigs galioti $4.",
+       "confirmemail_body_set": "Kažkas (tikriausiai jūs) iš IP adreso $1,\nnustatė svetainės {{SITENAME}} paskyros „$2“ elektroninio pašto adresą į jūsiškį.\n\nKad patvirtintumėte, kad ši paskyra tikrai priklauso jums ir tokiu būdu aktyvuotumėte\nelektroninio pašto galimybes svetainėje {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, spauskite šią nuorodą,\nkad atšauktumėte elektroninio pašto adreso patvirtinimą:\n\n$5\n\nŠis patvirtinimo kodas baigs galioti $4.",
        "confirmemail_invalidated": "El. pašto adreso patvirtinimas atšauktas",
        "invalidateemail": "El. pašto patvirtinimo atšaukimas",
        "scarytranscludedisabled": "[Tarpprojektinis įterpimas yra išjungtas]",
        "confirm-watch-top": "Pridėti šį puslapį į stebimųjų sąrašą?",
        "confirm-unwatch-button": "Gerai",
        "confirm-unwatch-top": "Pašalinti šį puslapį iš jūsų stebimųjų sąrašo?",
+       "quotation-marks": "„$1“",
        "imgmultipageprev": "← ankstesnis puslapis",
        "imgmultipagenext": "kitas puslapis →",
        "imgmultigo": "Eiti!",
        "imgmultigoto": "Eitį į puslapį $1",
+       "img-lang-default": "(numatytoji kalba)",
+       "img-lang-info": "Rodyti šį vaizdą $1 kalba. $2",
+       "img-lang-go": "Eiti",
        "ascending_abbrev": "didėjanti tvarka",
        "descending_abbrev": "mažėjanti tvarka",
        "table_pager_next": "Kitas puslapis",
        "autosumm-replace": "Puslapis keičiamas su „$1“",
        "autoredircomment": "Nukreipiama į [[$1]]",
        "autosumm-new": "Naujas puslapis: $1",
+       "autosumm-newblank": "Sukurtas tuščias puslapis",
        "size-kilobytes": "$1 KiB",
        "size-megabytes": "$1 MiB",
        "size-gigabytes": "$1 GiB",
        "watchlistedit-raw-done": "Jūsų stebimųjų sąrašas buvo atnaujintas.",
        "watchlistedit-raw-added": "$1 {{PLURAL:$1|puslapis buvo pridėtas|puslapiai buvo pridėti|puslapių buvo pridėta}}:",
        "watchlistedit-raw-removed": "$1 {{PLURAL:$1|puslapis buvo pašalintas|puslapiai buvo pašalinti|puslapių buvo pašalinta}}:",
+       "watchlistedit-clear-title": "Išvalytas stebimųjų sąrašas",
+       "watchlistedit-clear-legend": "Išvalyti stebimųjų sąrašą",
+       "watchlistedit-clear-explain": "Visi pavadinimai bus pašalinti iš jūsų stebimųjų sąrašo",
+       "watchlistedit-clear-titles": "Pavadinimai:",
+       "watchlistedit-clear-submit": "Išvalyti stebimųjų sąrašą (tai negrįžtamas veiksmas!)",
+       "watchlistedit-clear-done": "Jūsų stebimųjų sąrašas buvo išvalytas.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 pavadinimas|$1 pavadinimai|$1 pavadinimų}} pašalinta:",
+       "watchlistedit-too-many": "Pernelyg daug puslapių, kad juos visus čia būtų galima parodyti.",
        "watchlisttools-clear": "Išvalyti stebimųjų sąrašą",
        "watchlisttools-view": "Rodyti susijusius keitimus",
        "watchlisttools-edit": "Rodyti ir redaguoti stebimųjų sąrašą",
        "watchlisttools-raw": "Redaguoti grynąjį sąrašą",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|aptarimas]])",
-       "unknown_extension_tag": "Nežinoma priedo žymė „$1“",
        "duplicate-defaultsort": "Įspėjimas: Numatytasis rikiavimo raktas „$2“ pakeičia ankstesnį numatytąjį rikiavimo raktą „$1“.",
        "version": "Versija",
        "version-extensions": "Įdiegti priedai",
-       "version-skins": "Išvaizda",
+       "version-skins": "Įrašytos išvaizdos",
        "version-specialpages": "Specialieji puslapiai",
        "version-parserhooks": "Analizatoriaus gaudliai",
        "version-variables": "Kintamieji",
        "version-hook-name": "Gaudlio pavadinimas",
        "version-hook-subscribedby": "Užsakyta",
        "version-version": "(Versija $1)",
+       "version-no-ext-name": "[be pavadinimo]",
        "version-license": "MediaWiki licencija",
+       "version-ext-license": "Licencija",
+       "version-ext-colheader-name": "Plėtinys",
+       "version-skin-colheader-name": "Išvaizda",
+       "version-ext-colheader-version": "Versija",
+       "version-ext-colheader-license": "Licencija",
+       "version-ext-colheader-description": "Aprašymas",
+       "version-ext-colheader-credits": "Autoriai",
+       "version-license-title": "$1 licencija",
+       "version-credits-title": "$1 autoriai",
        "version-poweredby-credits": "Šis projektas naudoja '''[https://www.mediawiki.org/ MediaWiki]''', autorystės teisės © 2001-$1 $2.",
        "version-poweredby-others": "kiti",
+       "version-poweredby-translators": "translatewiki.net vertėjai",
        "version-credits-summary": "Už indėlį kuriant [[Special:Version|MediaWiki]] dėkojame",
        "version-license-info": "MediaWiki yra nemokama programinė įranga; galite ją platinti ir/arba modifikuoti pagal GNU General Public License, kurią publikuoja Free Software Foundation; taikoma 2-oji licenzijos versija arba (Jūsų pasirinkimu) bet kuri vėlesnė versija. \n\nMediaWiki yra platinama su viltimi, kad ji bus naudinga, bet BE JOKIOS GARANTIJOS; be jokios numanomos PARDAVIMO arba TINKAMUMO TAM TIKRAM TIKSLUI garantijos. Daugiau informacijos galite sužinoti GNU General Public License. \n\nJūs turėjote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License kopiją] kartu su šia programa, jei ne, rašykite Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, JAV arba [//www.gnu.org/licenses/old-licenses/gpl-2.0.html perskaitykite ją internete].",
        "version-software": "Įdiegta programinė įranga",
        "redirect-lookup": "Peržvalgos:",
        "redirect-value": "Vertė:",
        "redirect-user": "Naudotojo ID",
+       "redirect-page": "Puslapio ID",
        "redirect-revision": "Puslapio peržiūra",
        "redirect-file": "Failo vardas",
        "redirect-not-exists": "Vertė nėra nustatyta",
        "fileduplicatesearch-result-n": "Šis failas „$1“ turi $2 {{PLURAL:$2|identišką dublikatą|identiškus dublikatus|identiškų dublikatų}}.",
        "fileduplicatesearch-noresults": "Nėra failo pavadinimu \"$1\".",
        "specialpages": "Specialieji puslapiai",
+       "specialpages-note-top": "Paaiškinimai",
        "specialpages-note": "* Įprasti specialieji puslapiai.\n* <span class=\"mw-specialpagerestricted\">Apriboto pasiekiamumo specialieji puslapiai.</span>",
        "specialpages-group-maintenance": "Sistemos palaikymo pranešimai",
        "specialpages-group-other": "Kiti specialieji puslapiai",
        "tags-tag": "Žymos pavadinimas",
        "tags-display-header": "Išvaizda keitimų sąrašuose",
        "tags-description-header": "Visas reikšmės aprašymas",
+       "tags-active-header": "Veikiantis?",
        "tags-hitcount-header": "Pažymėti pakeitimai",
+       "tags-active-yes": "Taip",
+       "tags-active-no": "Ne",
        "tags-edit": "taisyti",
        "tags-hitcount": "$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}",
        "comparepages": "Palyginti puslapius",
        "dberr-problems": "Atsiprašome! Svetainei iškilo techninių problemų.",
        "dberr-again": "Palaukite kelias minutes ir perkraukite puslapį.",
        "dberr-info": "(Nepavyksta pasiekti duomenų bazės serverio: $1)",
+       "dberr-info-hidden": "(Nepavyksta susisiekti su duomenų bazės serveriu)",
        "dberr-usegoogle": "Šiuo metu jūs galite ieškoti per „Google“.",
        "dberr-outofdate": "Mūsų turinio kopijos ten gali būti pasenusios.",
        "dberr-cachederror": "Tai prašomo puslapio išsaugota kopija, ji gali būti pasenusi.",
        "htmlform-no": "Ne",
        "htmlform-yes": "Taip",
        "htmlform-chosen-placeholder": "Pasirinkite parinktį",
+       "htmlform-cloner-create": "Pridėti dar",
+       "htmlform-cloner-delete": "Pašalinti",
+       "htmlform-cloner-required": "Bent viena reikšmė būtina.",
        "sqlite-has-fts": "$1 su visatekstės paieškos palaikymu",
        "sqlite-no-fts": "$1 be visatekstės paieškos palaikymo",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
        "logentry-rights-rights": "$1 pakeista narystė grupėje $3 iš $4 į $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|pakeista}} narystė grupėje $3",
        "logentry-rights-autopromote": "$1 buvo automatiškai {{GENDER:$2|pervestas}} iš $4 į $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|įkėlė}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|įkėlė}} naują $3 versiją",
+       "logentry-upload-revert": "$1 {{GENDER:$2|įkėlė}} $3",
        "rightsnone": "(jokių)",
        "revdelete-summary": "keitimo paaiškinimas",
        "feedback-bugornote": "Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].\nKitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentaras bus įtrauktas į puslapį „[$3 $2]“, kartu su jūsų naudotojo vardu ir jūsų naudojama naršykle.",
        "expand_templates_output": "Rezultatas",
        "expand_templates_ok": "Gerai",
        "expand_templates_remove_comments": "Pašalinti komentarus",
-       "expand_templates_preview": "Peržiūra"
+       "expand_templates_preview": "Peržiūra",
+       "pagelanguage": "Puslapio kalbos pasirinkimas",
+       "pagelang-name": "Puslapis",
+       "pagelang-language": "Kalba",
+       "pagelang-use-default": "Naudoti numatytąją kalbą",
+       "pagelang-select-lang": "Pasirinkite kalbą",
+       "right-pagelang": "Keisti puslapio kalbą",
+       "action-pagelang": "keisti puslapio kalbą",
+       "log-name-pagelang": "Keisti kalbos žurnalą",
+       "mediastatistics-table-mimetype": "MIME tipas",
+       "json-error-syntax": "Sintaksės klaida"
 }
index c028e24..0f94255 100644 (file)
        "october-date": "$1. oktobris",
        "november-date": "$1. novembris",
        "december-date": "$1. decembris",
-       "pagecategories": "{{PLURAL:$1|Kategorija|Kategorijas}}",
+       "pagecategories": "{{PLURAL:$1|Kategorijas|Kategorija|Kategorijas}}",
        "category_header": "Raksti, kas ietverti kategorijā \"$1\".",
        "subcategories": "Apakškategorijas",
        "category-media-header": "Faili kategorijā \"$1\"",
        "category-empty": "''Šī kategorija šobrīd nesatur ne lapas, ne failus''",
-       "hidden-categories": "{{PLURAL:$1|Slēpta kategorija|Slēptas kategorijas}}",
+       "hidden-categories": "{{PLURAL:$1|Slēptas kategorijas|Slēpta kategorija|Slēptas kategorijas}}",
        "hidden-category-category": "Slēptās kategorijas",
-       "category-subcat-count": "{{PLURAL:$2|Šajai kategorijai ir tikai viena apakškategorija.|Šajai kategorijai ir $2 apakškategorijas, no kurām ir {{PLURAL:$1|redzama viena|redzamas $1}}.}}",
-       "category-subcat-count-limited": "Šai kategorijai ir {{PLURAL:$1|viena apakškategorija|$1 apakškategorijas}}.",
-       "category-article-count": "{{PLURAL:$2|Šī kategorija satur tikai šo vienu lapu.|Šajā kategorijā kopā ir $2 lapas, šobrīd ir {{PLURAL:$1|redzama viena no tām|redzamas $1 no tām}}.}}",
-       "category-article-count-limited": "Šajā kategorijā ir {{PLURAL:$1|šī viena lapa|šīs $1 lapas}}.",
-       "category-file-count": "{{PLURAL:$2|Šī kategorija satur tikai šo vienu failu.|Šajā kategorijā ir $2 faili, no kuriem {{PLURAL:$1|redzams ir viens|ir redzami $1}}.}}",
-       "category-file-count-limited": "Šajā kategorijā atrodas {{PLURAL:$1|tikai šis fails|šie $1 faili}}.",
+       "category-subcat-count": "{{PLURAL:$2|Šai kategorijai ir $2 apakškategorijas, no kurām ir {{PLURAL:$1|redzamas $1|redzama $1|redzamas $1}}.|Šai kategorijai ir $2 apakškategorija.|Šai kategorijai ir $2 apakškategorijas, no kurām ir {{PLURAL:$1|redzamas $1|redzama $1|redzamas $1}}.}}",
+       "category-subcat-count-limited": "Šai kategorijai ir {{PLURAL:$1|$1 apakškategorijas|$1 apakškategorija|$1 apakškategorijas}}.",
+       "category-article-count": "{{PLURAL:$2|Šajā kategorijā kopā ir $2 lapu, šobrīd ir {{PLURAL:$1|redzamas $1 no tām|redzama $1 no tām|redzamas $1 no tām}}.|Šī kategorija satur $2 lapu.|Šajā kategorijā kopā ir $2 lapas, šobrīd ir {{PLURAL:$1|redzamas $1 no tām|redzama $1 no tām|redzamas $1 no tām}}.}}",
+       "category-article-count-limited": "Šajā kategorijā ir {{PLURAL:$1|šīs $1 lapas|šī $1 lapa|šīs $1 lapas}}.",
+       "category-file-count": "{{PLURAL:$2|Šajā kategorijā ir $2 failu, no kuriem {{PLURAL:$1|ir redzami $1|redzams ir $1|ir redzami $1}}.|Šī kategorija satur tikai $2 failu.|Šajā kategorijā ir $2 faili, no kuriem {{PLURAL:$1|ir redzami $1|redzams ir $1|ir redzami $1}}.}}",
+       "category-file-count-limited": "Šajā kategorijā atrodas {{PLURAL:$1|šie $1 faili|tikai šis fails|šie $1 faili}}.",
        "listingcontinuesabbrev": " (turpinājums)",
        "index-category": "Indeksētās lapas",
        "noindex-category": "Neindeksētās lapas",
        "print": "Drukāt",
        "view": "Skatīt",
        "edit": "Labot šo lapu",
+       "edit-local": "Labot vietējo aprakstu",
        "create": "Izveidot",
+       "create-local": "Pievienot vietējo aprakstu",
        "editthispage": "Izmainīt šo lapu",
        "create-this-page": "Izveidot šo lapu",
        "delete": "Dzēst",
        "deletethispage": "Dzēst šo lapu",
        "undeletethispage": "Atjaunot šo lapu",
-       "undelete_short": "Atjaunot $1 {{PLURAL:$1|versiju|versijas}}",
-       "viewdeleted_short": "Apskatīt {{PLURAL:$1|vienu dzēstu labojumu|$1 dzēstus labojumus}}",
+       "undelete_short": "Atjaunot $1 {{PLURAL:$1|versijas|versiju|versijas}}",
+       "viewdeleted_short": "Apskatīt {{PLURAL:$1|$1 dzēstus labojumus|$1 dzēstu labojumu|$1 dzēstus labojumus}}",
        "protect": "Aizsargāt",
        "protect_change": "izmainīt",
        "protectthispage": "Aizsargāt šo lapu",
        "redirectpagesub": "Pāradresācijas lapa",
        "redirectto": "Pāradresēt uz:",
        "lastmodifiedat": "Šajā lapā pēdējās izmaiņas izdarītas $2, $1.",
-       "viewcount": "Šī lapa ir tikusi apskatīta $1 {{PLURAL:$1|reizi|reizes}}.",
+       "viewcount": "Šī lapa ir tikusi apskatīta $1 {{PLURAL:$1|reizes|reizi|reizes}}.",
        "protectedpage": "Aizsargāta lapa",
        "jumpto": "Pārlēkt uz:",
        "jumptonavigation": "navigācija",
        "jumptosearch": "meklēt",
        "view-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz lietotāju mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīties vēlreiz.\n\n$1",
        "pool-errorunknown": "Nezināma kļūda",
+       "poolcounter-usage-error": "Izmantošanas kļūda: $1",
        "aboutsite": "Par {{grammar:akuzatīvs|{{SITENAME}}}}",
        "aboutpage": "Project:Par",
        "copyright": "Saturs ir pieejams saskaņā ar $1, ja vien nav norādīts citādi.",
        "privacypage": "Project:Privātuma politika",
        "badaccess": "Atļaujas kļūda",
        "badaccess-group0": "Tev nav atļauts izpildīt darbību, kuru tu pieprasīji.",
-       "badaccess-groups": "Darbības izpilde, ko Tu pieprasīji, ir pieejama tikai $1 {{PLURAL:$2|lietotāju grupai|lietotāju grupām}}.",
+       "badaccess-groups": "Darbības izpilde, ko Tu pieprasīji, ir pieejama tikai $1 {{PLURAL:$2|lietotāju grupām|lietotāju grupai|lietotāju grupām}}.",
        "versionrequired": "Nepieciešamā ''MediaWiki'' versija: $1.",
        "versionrequiredtext": "Lai lietotu šo lapu, nepieciešama ''MediaWiki'' versija $1. Sk. [[Special:Version|versija]].",
        "ok": "Labi",
        "retrievedfrom": "Saturs iegūts no \"$1\"",
        "youhavenewmessages": "Tev ir $1 (skatīt $2).",
        "youhavenewmessagesmanyusers": "Jums ir $1 no daudziem lietotājiem ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|jauns vēstījums|999=jauni vēstījumi}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|pēdējā izmaiņa|999=pēdējās izmaiņas}}",
+       "newmessageslinkplural": "{{PLURAL:$1|999=jauni vēstījumi|jauns vēstījums|999=jauni vēstījumi}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|999=pēdējās izmaiņas|pēdējā izmaiņa|999=pēdējās izmaiņas}}",
        "youhavenewmessagesmulti": "Tev ir jauns ziņojums: $1",
        "editsection": "labot šo sadaļu",
        "editold": "labot",
        "confirmable-no": "Nē",
        "thisisdeleted": "Apskatīt vai atjaunot $1?",
        "viewdeleted": "Skatīt $1?",
-       "restorelink": "$1 {{PLURAL:$1|dzēsto versiju|dzēstās versijas}}",
+       "restorelink": "$1 {{PLURAL:$1|dzēstās versijas|dzēsto versiju|dzēstās versijas}}",
        "feedlinks": "Barotne:",
        "feed-invalid": "Nederīgs abonētās barotnes veids.",
        "feed-unavailable": "Sindicētās plūsmas nav pieejamas",
        "yourpasswordagain": "Atkārto paroli",
        "createacct-yourpasswordagain": "Apstipriniet paroli",
        "createacct-yourpasswordagain-ph": "Vēlreiz ievadiet paroli",
-       "remembermypassword": "Atcerēties pēc pārlūka aizvēršanas (spēkā ne vairāk kā $1 {{PLURAL:$1|diena|dienas}}).",
+       "remembermypassword": "Atcerēties pēc pārlūka aizvēršanas (spēkā ne vairāk kā $1 {{PLURAL:$1|dienas|diena|dienas}}).",
        "userlogin-remembermypassword": "Atcerēties mani",
        "userlogin-signwithsecure": "Izmantot drošu savienojumu",
        "yourdomainname": "Tavs domēns",
        "createacct-submit": "Izveidot savu kontu",
        "createacct-another-submit": "Izveidot citu lietotāja kontu",
        "createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
-       "createacct-benefit-body1": "{{PLURAL:$1|labojums|labojumi}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|lapa|lapas}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|nesens dalībnieks|neseni dalībnieki}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|labojumi|labojums|labojumi}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|lapas|lapa|lapas}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|neseni dalībnieki|nesens dalībnieks|neseni dalībnieki}}",
        "badretype": "Tevis ievadītās paroles nesakrīt.",
        "userexists": "Ievadītais lietotājvārds jau ir aizņemts.\nLūdzu, izvēlieties citu vārdu.",
        "loginerror": "Neveiksmīga ieiešana",
        "login-userblocked": "Šis lietotājs ir bloķēts. Pieslēgšanās nav atļauta.",
        "wrongpassword": "Tu ievadīji nepareizu paroli. Lūdzu, mēģini vēlreiz.",
        "wrongpasswordempty": "Parole bija tukša. Lūdzu mēģini vēlreiz.",
-       "passwordtooshort": "Tava parole ir pārāk īsa.\nTajā jābūt vismaz {{PLURAL:$1|1 zīmei|$1 zīmēm}}.",
+       "passwordtooshort": "Tava parole ir pārāk īsa.\nTajā jābūt vismaz {{PLURAL:$1|$1 zīmēm|1 zīmei|$1 zīmēm}}.",
        "password-name-match": "Tava parole nedrīkst būt tāda pati kā tavs lietotājvārds.",
        "password-login-forbidden": "Šī lietotājvārda un paroles izmantošana ir aizliegta.",
        "mailmypassword": "Atiestatīt paroli",
        "passwordremindertitle": "Jauna pagaidu parole no {{SITENAME}}s",
-       "passwordremindertext": "Kads (iespejams, Tu pats, no IP adreses $1)\nludza, lai nosutam Tev jaunu {{SITENAME}} ($4) paroli.\nLietotajam $2 pagaidu parole tagad ir $3.\nLudzu, nomaini paroli, kad esi veiksmigi iekluvis ieksa.\nTavas pagaidu paroles deriiguma terminsh beigsies peec {{PLURAL:$5|vienas dienas|$5 dienaam}}.\n\nJa paroles pieprasījumu bija nosūtījis kāds cits, vai arī tu atcerējies savu veco paroli, šo var ignorēt. Vecā parole joprojām darbojas.",
+       "passwordremindertext": "Kāds (iespējams, Tu pats, no IP adreses $1)\nlūdza, lai nosūtām Tev jaunu {{SITENAME}} ($4) paroli.\nLietotajam $2 pagaidu parole tagad ir $3.\nLudzu, nomaini paroli, kad esi veiksmīgi iekļuvis iekšš.\nTavas pagaidu paroles derīguma termiņš beigsies pēc {{PLURAL:$5|$5 dienām|$5 dienas|$5 dienām}}.\n\nJa paroles pieprasījumu bija nosūtījis kāds cits, vai arī tu atcerējies savu veco paroli, šo var ignorēt. Vecā parole joprojām darbojas.",
        "noemail": "Lietotājs \"$1\" nav reģistrējis e-pasta adresi.",
        "noemailcreate": "Tev jānorāda derīgu e-pasta adresi",
        "passwordsent": "Esam nosūtījuši jaunu paroli uz e-pasta adresi, kuru ir norādījis lietotājs $1. Lūdzu, nāc iekšā ar jauno paroli, kad būsi to saņēmis.",
        "eauthentsent": "Apstiprinājuma e-pasts tika nosūtīts uz norādīto e-pasta adresi. Lai varētu saņemt citus ''meilus'', izpildi vēstulē norādītās instrukcijas, lai apstiprinātu, ka šī tiešām ir tava e-pasta adrese.",
        "throttled-mailpassword": "Paroles atgādinājums jau ir ticis nosūtīts {{PLURAL:$1|pēdējās stundas|pēdējo $1 stundu}} laikā.\nLai novērstu šīs funkcijas ļaunprātīgu izmantošanu, iespējams nosūtīt tikai vienu paroles atgādinājumu, {{PLURAL:$1|katru stundu|katras $1 stundas}}.",
        "mailerror": "E-pasta sūtīšanas kļūda: $1",
-       "acct_creation_throttle_hit": "Lietotāji no tavas IP adreses šajā viki pēdējo 24 stundu laikā jau ir izveidojuši {{PLURAL:$1|1 kontu|$1 kontus}}, kas ir maksimālais atļautais skaits šajā laika periodā.\nTādēļ šobrīd no šīs IP adreses vairs nevar izveidot jaunus kontus.",
+       "acct_creation_throttle_hit": "Lietotāji no tavas IP adreses šajā viki pēdējo 24 stundu laikā jau ir izveidojuši {{PLURAL:$1|$1 kontus|1 kontu|$1 kontus}}, kas ir maksimālais atļautais skaits šajā laika periodā.\nTādēļ šobrīd no šīs IP adreses vairs nevar izveidot jaunus kontus.",
        "emailauthenticated": "Tava e-pasta adrese tika apstiprināta $2, $3.",
        "emailnotauthenticated": "Tava e-pasta adrese <strong>vēl nav apstiprināta</strong> un zemāk norādītās iespējas nav pieejamas.",
        "noemailprefs": "Norādi e-pasta adresi, lai lietotu šīs iespējas.",
        "passwordreset-text-one": "Aizpildiet šo veidlapu, lai atiestatītu savu paroli.",
        "passwordreset-legend": "Atiestatīt paroli",
        "passwordreset-disabled": "Paroles atiestates šajā viki ir atspējotas.",
+       "passwordreset-emaildisabled": "Šajā viki ir atspējotas e-pasta iespējas.",
        "passwordreset-username": "Lietotājvārds:",
        "passwordreset-domain": "Domēns:",
        "passwordreset-capture": "Apskatīt izveidoto e-pastu?",
        "protectedpagewarning": "'''BRĪDINĀJUMS: Šī lapa ir aizsargāta, tikai lietotāji ar administratora privilēģijām var to izmainīt.'''\n\nPēdējais aizsargāšanas reģistra ieraksts ir apskatāms zemāk:",
        "semiprotectedpagewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, lai to varētu labot tikai reģistrēti lietotāji.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
        "titleprotectedwarning": "'''Brīdinājums: Šī lapa ir slēgta un to var izveidot tikai [[Special:ListGroupRights|noteikti]] lietotāji.'''",
-       "templatesused": "Šajā lapā {{PLURAL:$1|izmantotā veidne|izmantotās veidnes}}:",
-       "templatesusedpreview": "Šajā pirmskatā {{PLURAL:$1|izmanotā veidne|izmantotās veidnes}}:",
-       "templatesusedsection": "Šajā sadaļā {{PLURAL:$1|izmantotā veidne|izmantotās veidnes}}:",
+       "templatesused": "Šajā lapā {{PLURAL:$1|izmantotās veidnes|izmantotā veidne|izmantotās veidnes}}:",
+       "templatesusedpreview": "Šajā pirmskatā {{PLURAL:$1|izmantotās veidnes|izmanotā veidne|izmantotās veidnes}}:",
+       "templatesusedsection": "Šajā sadaļā {{PLURAL:$1|izmantotās veidnes|izmantotā veidne|izmantotās veidnes}}:",
        "template-protected": "(aizsargāta)",
        "template-semiprotected": "(daļēji aizsargāta)",
-       "hiddencategories": "Šī lapa ietilpst {{PLURAL:$1|1 slēptajā kategorijā|$1 slēptajās kategorijās}}:",
+       "hiddencategories": "Šī lapa ietilpst {{PLURAL:$1|$1 slēptajās kategorijās|1 slēptajā kategorijā|$1 slēptajās kategorijās}}:",
        "nocreatetext": "{{grammar:lokatīvs|{{SITENAME}}}} ir atslēgta iespēja izveidot jaunas lapas.\nTu vari atgriezties atpakaļ un izlabot esošu lapu, vai arī [[Special:UserLogin|ielogoties, vai izveidot kontu]].",
        "nocreate-loggedin": "Tev nav atļaujas veidot jaunas lapas.",
        "sectioneditnotsupported-title": "Sadaļa rediģēšana nav atbalstīta",
        "sectioneditnotsupported-text": "Sadaļu rediģēsana šajā lapā nav atļauta.",
        "permissionserrors": "Atļauju kļūda",
-       "permissionserrorstext": "Tev nav atļauts veikt šo darbību {{PLURAL:$1|šāda iemesla|šādu iemeslu}} dēļ:",
-       "permissionserrorstext-withaction": "Tev nav atļauts $2 {{PLURAL:$1|šāda iemesla|šādu iemeslu}} dēļ:",
+       "permissionserrorstext": "Tev nav atļauts veikt šo darbību {{PLURAL:$1|šādu iemeslu|šāda iemesla|šādu iemeslu}} dēļ:",
+       "permissionserrorstext-withaction": "Tev nav atļauts $2 {{PLURAL:$1|šādu iemeslu|šāda iemesla|šādu iemeslu}} dēļ:",
        "recreate-moveddeleted-warn": "'''Brīdinājums: Tu atjauno lapu, kas ir tikusi izdzēsta'''\n\nTev vajadzētu pārliecināties, vai ir lietderīgi turpināt izmainīt šo lapu.\nTe var apskatīties dzēšanas un pārvietošanas reģistrus, kuros jābūt datiem par to kas, kad un kāpēc šo lapu izdzēsa.",
        "moveddeleted-notice": "Šī lapa ir tikusi izdzēsta.\nTe var apskatīties dzēšanas un pārvietošanas reģistru fragmentus, lai noskaidrotu kurš, kāpēc un kad to izdzēsa.",
        "log-fulllog": "Paskatīties pilnu reģistru",
        "content-model-text": "vienkāršs teksts",
        "content-model-javascript": "JavaScript kods",
        "content-model-css": "CSS stils",
+       "content-json-empty-object": "Tukšs objekts",
+       "content-json-empty-array": "Tukšs masīvs",
        "expensive-parserfunction-category": "Lapas ar pārāk daudz laikietilpīgiem apstrādes funkciju izsaukumiem",
        "post-expand-template-inclusion-warning": "'''Brīdinājums:''' iekļauto veidņu izmērs ir par lielu.\nDažas veidnes netiks iekļautas.",
        "post-expand-template-inclusion-category": "Lapas, kurām pārsniegts iekļauto veidņu apjoms",
        "history-show-deleted": "Tikai dzēstās",
        "histfirst": "Senākās",
        "histlast": "Jaunākās",
-       "historysize": "({{PLURAL:$1|1 baits|$1 baiti}})",
+       "historysize": "({{PLURAL:$1|$1 baiti|1 baits|$1 baiti}})",
        "historyempty": "(tukša)",
        "history-feed-title": "Versiju hronoloģija",
        "history-feed-description": "Šīs wiki lapas versiju hronoloģija",
        "revdelete-nooldid-title": "Nederīga mērķa versija",
        "revdelete-no-file": "Norādītais fails neeksistē.",
        "revdelete-show-file-submit": "Jā",
-       "logdelete-selected": "{{PLURAL:$1|Izvēlētais reģistra ieraksts|Izvēlētie reģistra ieraksti}}:",
+       "logdelete-selected": "{{PLURAL:$1|Izvēlētie reģistra ieraksti|Izvēlētais reģistra ieraksts|Izvēlētie reģistra ieraksti}}:",
        "revdelete-confirm": "Lūdzu apstiprini, ka Tu zini, ko dari, Tu apzinies sekas, tāpat Tu to dari saskaņā ar vadlīnijām.",
        "revdelete-suppress-text": "Paslēpšanu izmantot vienīgi šādos gadījumos:\n* potenciāli apmelojoša informācija\n* nepiemērotā personīgā informācija\n*: ''mājas adrese, telefona numuri u.c.''",
        "revdelete-legend": "Uzstādīt redzamības ierobežojumus",
        "revdelete-suppress": "Paslēpt datus arī no administratoriem",
        "revdelete-unsuppress": "Atcelt ierobežojumus atjaunotajām versijām",
        "revdelete-log": "Iemesls:",
-       "revdelete-submit": "Piemērot {{PLURAL:$1|izvēlētajai versijai|izvēlētajām versijām}}",
+       "revdelete-submit": "Piemērot {{PLURAL:$1|izvēlētajām versijām|izvēlētajai versijai|izvēlētajām versijām}}",
        "revdelete-success": "'''Versiju redzamība veiksmīgi atjaunināta.'''",
        "revdelete-failure": "'''Versiju redzamību nav iespējams atjaunināt:'''\n$1",
        "logdelete-success": "'''Reģistra ierakstu redzamība veiksmīgi uzstādīta.'''",
        "showhideselectedversions": "Rādīt/slēpt izvēlētās versijas",
        "editundo": "atcelt",
        "diff-empty": "(Nav atšķirību)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko izdarījis viens lietotājs, nav parādīta{{PLURAL:$1||s}})",
-       "diff-multi-otherusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko {{PLURAL:$2|saglabājis|saglabājuši}} {{PLURAL:$2|viens cits lietotājs|$2 lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
-       "diff-multi-manyusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko mainījis viens lietotājs, nav {{PLURAL:$1|parādītas|parādīta|parādītas}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|$1 starpversijas|Viena starpversija|$1 starpversijas}}, ko {{PLURAL:$2|saglabājuši|saglabājis|saglabājuši}} {{PLURAL:$2|$2 lietotāji|viens cits lietotājs|$2 lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotāji|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "searchresults": "Meklēšanas rezultāti",
        "searchresults-title": "Meklēšanas rezultāti \"$1\"",
        "titlematches": "Rezultāti virsrakstos",
        "textmatches": "Rezultāti lapu tekstos",
        "notextmatches": "Neviena rezultāta, meklējot lapas tekstā",
-       "prevn": "iepriekšējās {{PLURAL:$1|$1}}",
-       "nextn": "nākamās {{PLURAL:$1|$1}}",
-       "prevn-title": "{{PLURAL:$1|Iepriekšējais|Iepriekšējie}} $1 {{PLURAL:$1|rezultāts|rezultāti}}",
-       "nextn-title": "{{PLURAL:$1|Nākošais|INākošie}} $1 {{PLURAL:$1|rezultāts|rezultāti}}",
-       "shown-title": "Parādīt $1 {{PLURAL:$1|rezultātu|rezultātus}} vienā lapā",
+       "prevn": "{{PLURAL:$1|iepriekšējās $1|iepriekšējā $1|iepriekšējās $1}}",
+       "nextn": "{{PLURAL:$1|nākamās $1|nākamā $1|nākamās $1}}",
+       "prevn-title": "{{PLURAL:$1|Iepriekšējie|Iepriekšējais|Iepriekšējie}} $1 {{PLURAL:$1|rezultāti|rezultāts|rezultāti}}",
+       "nextn-title": "{{PLURAL:$1|Nākamie|Nākamais|Nākamie}} $1 {{PLURAL:$1|rezultāti|rezultāts|rezultāti}}",
+       "shown-title": "Parādīt $1 {{PLURAL:$1|rezultātus|rezultātu|rezultātus}} vienā lapā",
        "viewprevnext": "Skatīt ($1 {{int:pipe-separator}} $2) ($3 vienā lapā).",
        "searchmenu-exists": "'''Šajā projektā ir raksts ar nosaukumu \"[[:$1]]\"'''",
        "searchmenu-new": "'''Izveido rakstu \"[[:$1]]\" šajā projektā!'''",
        "searchprofile-images-tooltip": "Meklēt attēlus, audio un video failus",
        "searchprofile-everything-tooltip": "Meklēt visur (ieskaitot diskusiju lapas)",
        "searchprofile-advanced-tooltip": "Izvēlēties nosaukumvietas, kurās meklēt",
-       "search-result-size": "$1 ({{PLURAL:$2|1 vārds|$2 vārdi}})",
-       "search-result-category-size": "$1 {{PLURAL:$1|apakšelements|apakšelementi}} ($2 {{PLURAL:$2|apakškategorija|apakškategorijas}}, $3 {{PLURAL:$3|fails|faili}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 vārdi|1 vārds|$2 vārdi}})",
+       "search-result-category-size": "$1 {{PLURAL:$1|apakšelementi|apakšelements|apakšelementi}} ($2 {{PLURAL:$2|apakškategorijas|apakškategorija|apakškategorijas}}, $3 {{PLURAL:$3|faili|fails|faili}})",
        "search-redirect": "(pāradresēts no $1)",
        "search-section": "(sadaļa $1)",
        "search-file-match": "(atbilst faila saturam)",
        "search-relatedarticle": "Saistītais",
        "searchrelated": "saistītais",
        "searchall": "viss",
-       "showingresults": "Šobrīd ir {{PLURAL:$1|redzama|redzamas}} '''$1''' {{PLURAL:$1|lapa|lapas}}, sākot ar #'''$2'''.",
+       "showingresults": "Šobrīd ir {{PLURAL:$1|redzamas|redzama|redzamas}} '''$1''' {{PLURAL:$1|lapas|lapa|lapas}}, sākot ar #'''$2'''.",
        "search-nonefound": "Nav atrasti pieprasījumam atbilstoši rezultāti.",
        "powersearch-legend": "Izvērstā meklēšana",
        "powersearch-ns": "Meklēt šajās lapu grupās:",
        "prefs-rc": "Pēdējās izmaiņas",
        "prefs-watchlist": "Uzraugāmie raksti",
        "prefs-watchlist-days": "Dienu skaits, kuras parādīt uzraugāmo rakstu sarakstā:",
-       "prefs-watchlist-days-max": "Ne vairāk kā $1 {{PLURAL:$1|dienu|dienas}}",
+       "prefs-watchlist-days-max": "Ne vairāk kā $1 {{PLURAL:$1|dienas|dienu|dienas}}",
        "prefs-watchlist-edits": "Izmaiņu skaits, kuras rādīt izvērstajā uzraugāmo rakstu sarakstā:",
        "prefs-watchlist-edits-max": "Ne vairāk kā 1000",
        "prefs-watchlist-token": "Uzraugāmo lapu saraksta marķieris:",
        "stub-threshold": "Slieksnis <a href=\"#\" class=\"stub\">aizmetņa saites</a> formatēšanai (baiti):",
        "stub-threshold-disabled": "Atslēgts",
        "recentchangesdays": "Dienu skaits, kuru rādīt pēdējās izmaiņās:",
-       "recentchangesdays-max": "Ne vairāk kā $1 {{PLURAL:$1|diena|dienas}}",
+       "recentchangesdays-max": "Ne vairāk kā $1 {{PLURAL:$1|dienas|diena|dienas}}",
        "recentchangescount": "Izmaiņu skaits, kuru rāda pēc noklusējuma:",
        "prefs-help-recentchangescount": "Šis parametrs attiecas uz pēdējo izmaiņu un hronoloģijas lapām, kā arī uz sistēmas žurnāliem",
        "prefs-help-watchlist-token2": "Šī ir slepena atslēga tavam uzraugāmo lapu sarakstam.\nIkvienam, kas to zinās, būs iespēja apskatīt tavu uzraugāmo lapu sarakstu, tāpēc nedalies ar to.\n[[Special:ResetTokens|Spied šeit, lai to atjaunotu]].",
        "yournick": "Tava iesauka (parakstam):",
        "prefs-help-signature": "Komentāri diskusiju lapās ir jāparaksta, pievienojot simbolu virkni \"<nowiki>~~~~</nowiki>\", kas tiek automātiski aizstāta ar tavu parakstu un parakstīšanās laiku.",
        "badsig": "Kļūdains ''paraksta'' kods; pārbaudi HTML (ja tāds ir lietots).",
-       "badsiglength": "Paraksts ir pārāk garš.\nTam ir jābūt īsākam par  $1 {{PLURAL:$1|simbolu|simboliem}}.",
+       "badsiglength": "Paraksts ir pārāk garš.\nTam ir jābūt īsākam par  $1 {{PLURAL:$1|simboliem|simbolu|simboliem}}.",
        "yourgender": "Dzimums:",
        "gender-unknown": "Es nevēlos norādīt",
        "gender-male": "Viņš labo viki lapas",
        "action-userrights-interwiki": "mainīt lietotāju tiesības citās Vikipēdijās",
        "action-siteadmin": "bloķēt vai atbloķēt datubāzi",
        "action-sendemail": "sūtīt e-pastus",
-       "nchanges": "$1 {{PLURAL:$1|izmaiņa|izmaiņas}}",
+       "nchanges": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
        "enhancedrc-history": "vēsture",
        "recentchanges": "Pēdējās izmaiņas",
        "recentchanges-legend": "Pēdējo izmaiņu iespējas",
        "minoreditletter": "m",
        "newpageletter": "J",
        "boteditletter": "b",
-       "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|lietotājs|lietotāji}}]",
+       "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|lietotāji|lietotājs|lietotāji}}]",
        "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\")",
        "rc_categories_any": "Jebkas",
-       "rc-change-size-new": "$1 {{PLURAL:$1|baits|baiti}} pēc izmaiņām",
+       "rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām",
        "newsectionsummary": "/* $1 */ jauna sadaļa",
        "rc-enhanced-expand": "Skatīt detaļas",
        "rc-enhanced-hide": "Paslēpt detaļas",
        "filetype-mime-mismatch": "Faila paplašinājums \".$1\" neatbilst noteiktajam MIME tipam ($2).",
        "filetype-badmime": "Šeit nav atļauts augšupielādēt failus ar MIME tipu \"$1\".",
        "filetype-bad-ie-mime": "Nevar augšupielādēt šo failu, jo Internet Explorer to uzskatītu kā \"$1\", kas ir neatļauts un potenciāli bīstams faila tips.",
-       "filetype-unwanted-type": "'''\".$1\"''' ir nevēlams failu tips.  {{PLURAL:$3|Ieteicamais faila tips|Ieteicamie failu tipi}} ir $2.",
+       "filetype-unwanted-type": "'''\".$1\"''' ir nevēlams failu tips.  {{PLURAL:$3|Ieteicamie failu tipi|Ieteicamais faila tips|Ieteicamie failu tipi}} ir $2.",
        "filetype-banned-type": "'''\".$1\"''' nav atļautais failu tips.  {{PLURAL:$3|Atļautais faila tips|Atļautie failu tipi}} ir $2.",
        "filetype-missing": "Failam nav paplašinājuma (piem. tāda kā \".jpg\").",
        "empty-file": "Fails, ko Tu iesniedzi, bija tukšs.",
        "fileexists-extension": "Pastāv fails ar līdzīgu nosaukumu: [[$2|thumb]]\n* Augšupielādējamā faila nosaukums: <strong>[[:$1]]</strong>\n* Esošā faila nosaukums: <strong>[[:$2]]</strong>\nLūdzu, izvēlieties citu nosaukumu.",
        "file-thumbnail-no": "Faila vārds sākas ar <strong>$1</strong>.\nIzskatās, ka šis ir samazināts attēls ''(thumbnail)''.\nJa tev ir šis pats attēls pilnā izmērā, augšuplādē to, ja nav, tad nomaini faila vārdu.",
        "fileexists-forbidden": "Fails ar šādu nosaukumu jau eksistē un to nevar aizvietot ar jaunu.\nJa jūs joprojām gribat augšupielādēt šo failu, tad mēģiniet vēlreiz ar citu faila nosaukumu.\n[[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Fails ir kopija {{PLURAL:$1|šim failam|šiem failiem}}:",
+       "file-exists-duplicate": "Fails ir kopija {{PLURAL:$1|šiem failiem|šim failam|šiem failiem}}:",
        "uploadwarning": "Augšupielādes brīdinājums",
        "uploadwarning-text": "Lūdzu, pārveido zemāk esošo faila aprakstu un mēģini vēlreiz.",
        "savefile": "Saglabāt failu",
        "filehist-filesize": "Faila izmērs",
        "filehist-comment": "Komentārs",
        "imagelinks": "Faila lietojums",
-       "linkstoimage": "{{PLURAL:$1|Šajā lapā ir saite|Šajās $1 lapās ir saites}} uz šo failu:",
+       "linkstoimage": "{{PLURAL:$1|Šajās $1 lapās ir saites|Šajā lapā ir saite|Šajās $1 lapās ir saites}} uz šo failu:",
        "nolinkstoimage": "Nevienā lapā nav norāžu uz šo attēlu.",
        "morelinkstoimage": "Skatīt [[Special:WhatLinksHere/$1|vairāk saites]] uz šo failu.",
        "linkstoimage-redirect": "$1 (faila pāradresācija) $2",
        "statistics-edits-average": "Vidējais izmaiņu skaits uz lapu",
        "statistics-users": "Reģistrēti lietotāji",
        "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ā dienā|iepriekšējās $1 dienās}}",
+       "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:",
        "pageswithprop-submit": "Aiziet",
        "doubleredirects": "Divkāršas pāradresācijas lapas",
        "withoutinterwiki-legend": "Prefikss",
        "withoutinterwiki-submit": "Rādīt",
        "fewestrevisions": "Lapas, kurām ir vismazāk veco versiju",
-       "nbytes": "$1 {{PLURAL:$1|baits|baitu}}",
-       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorijas}}",
-       "nlinks": "$1 {{PLURAL:$1|saite|saites}}",
-       "nmembers": "$1 {{PLURAL:$1|lapa|lapas}}",
-       "nrevisions": "$1 {{PLURAL:$1|versija|versijas}}",
-       "nviews": "skatīta $1 {{PLURAL:$1|reizi|reizes}}",
-       "nimagelinks": "Izmantots $1 {{PLURAL:$1|lapā|lapās}}",
-       "ntransclusions": "izmantots $1 {{PLURAL:$1|lapā|lapās}}",
+       "nbytes": "$1 {{PLURAL:$1|baitu|baits|baitu}}",
+       "ncategories": "$1 {{PLURAL:$1|kategorijas|kategorija|kategorijas}}",
+       "nlinks": "$1 {{PLURAL:$1|saites|saite|saites}}",
+       "nmembers": "$1 {{PLURAL:$1|lapas|lapa|lapas}}",
+       "nrevisions": "$1 {{PLURAL:$1|versijas|versija|versijas}}",
+       "nviews": "skatīta $1 {{PLURAL:$1|reizes|reizi|reizes}}",
+       "nimagelinks": "Izmantots $1 {{PLURAL:$1|lapās|lapā|lapās}}",
+       "ntransclusions": "izmantots $1 {{PLURAL:$1|lapās|lapā|lapās}}",
        "specialpage-empty": "Šim ziņojumam nav rezultātu.",
        "lonelypages": "Lapas bez saitēm uz tām",
        "uncategorizedpages": "Nekategorizētās lapas",
        "listusers": "Lietotāju uzskaitījums",
        "listusers-editsonly": "Rādīt tikai lietotājus, kas ir izdarījuši kādas izmaiņas",
        "listusers-creationsort": "Kārtot pēc izveidošanas datuma",
-       "usereditcount": "$1 {{PLURAL:$1|izmaiņa|izmaiņas}}",
+       "usereditcount": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
        "usercreated": "{{GENDER:$3|Izveidoja}} $1 plkst. $2",
        "newpages": "Jaunas lapas",
        "newpages-username": "Lietotājs:",
        "notargettitle": "Bez mērķa",
        "nopagetitle": "Nav tādas mērķa lapas",
        "nopagetext": "Mērķa lapa, ko Jūs norādījāt, nepastāv.",
-       "pager-newer-n": "{{PLURAL:$1|$1 jaunāku|$1 jaunākas}}",
-       "pager-older-n": "{{PLURAL:$1|$1 vecāku|$1 vecākas}}",
+       "pager-newer-n": "{{PLURAL:$1|$1 jaunākas|$1 jaunāku|$1 jaunākas}}",
+       "pager-older-n": "{{PLURAL:$1|$1 vecākas|$1 vecāku|$1 vecākas}}",
        "querypage-disabled": "Šī īpašā lapā ir atspējota veiktspējas iemeslu dēļ.",
        "booksources": "Grāmatu avoti",
        "booksources-search-legend": "Meklēt grāmatu avotus",
        "allpages-hide-redirects": "Paslēpt pāradresācijas",
        "cachedspecial-refresh-now": "Skatīt jaunāko.",
        "categories": "Kategorijas",
-       "categoriespagetext": "{{PLURAL:$1|Šī kategorija|Šīs kategorijas}} satur lapas vai failus.\nŠeit nav parādītas [[Special:UnusedCategories|neizmantotās kategorijas]].\nSkatīt arī [[Special:WantedCategories|''sarkanās'' kategorijas]].",
+       "categoriespagetext": "{{PLURAL:$1|Šīs kategorijas|Šī kategorija|Šīs kategorijas}} satur lapas vai failus.\nŠeit nav parādītas [[Special:UnusedCategories|neizmantotās kategorijas]].\nSkatīt arī [[Special:WantedCategories|''sarkanās'' kategorijas]].",
        "categoriesfrom": "Parādīt kategorijas sākot ar:",
        "special-categories-sort-count": "kārtot pēc skaita",
        "special-categories-sort-abc": "kārtot alfabētiskā secībā",
        "listusers-blocked": "(bloķēts)",
        "activeusers": "Aktīvo lietotāju saraksts",
        "activeusers-intro": "Šis ir lietotāju saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.",
-       "activeusers-from": "Parādīt lietotājus sākot ar:",
+       "activeusers-count": "$1 {{PLURAL:$1|darbību|darbība|darbības}} {{PLURAL:$3|pēdējās $3 dienās|pēdējā $3 dienā|pēdējās $3 dienās}}",
+       "activeusers-from": "Parādīt lietotājus, sākot ar:",
        "activeusers-hidebots": "Paslēpt botus",
        "activeusers-hidesysops": "Paslēpt administratorus",
        "activeusers-noresult": "Neviens lietotājs nav atrasts.",
        "listgrouprights-rights": "Tiesības",
        "listgrouprights-helppage": "Help:Grupu tiesības",
        "listgrouprights-members": "(dalībnieku saraksts)",
-       "listgrouprights-addgroup": "Pievienot {{PLURAL:$2|grupu|grupas}}: $1",
-       "listgrouprights-removegroup": "Noņemt {{PLURAL:$2|grupu|grupas}}: $1",
+       "listgrouprights-addgroup": "Pievienot {{PLURAL:$2|grupas|grupu|grupas}}: $1",
+       "listgrouprights-removegroup": "Noņemt {{PLURAL:$2|grupas|grupu|grupas}}: $1",
        "listgrouprights-addgroup-all": "Pievienot visas grupas",
        "listgrouprights-removegroup-all": "Noņemt visas grupas",
        "listgrouprights-addgroup-self-all": "Pievienot visas grupas savam kontam",
        "exbeforeblank": "lapas saturs pirms satura dzēšanas bija šāds: '$1'",
        "delete-confirm": "Dzēst \"$1\"",
        "delete-legend": "Dzēšana",
-       "historywarning": "'''Brīdinājums:''' Lapai, ko tu gatavojies dzēst, ir vēsture ar aptuveni $1 {{PLURAL:$1|versiju|versijām}}:",
+       "historywarning": "'''Brīdinājums:''' Lapai, ko tu gatavojies dzēst, ir vēsture ar aptuveni $1 {{PLURAL:$1|versijām|versiju|versijām}}:",
        "confirmdeletetext": "Tu tūlīt no datubāzes dzēsīsi lapu vai attēlu, kā arī to iepriekšējās versijas. Lūdzu, apstiprini, ka tu tiešām to vēlies darīt, ka tu apzinies sekas un ka tu to dari saskaņā ar [[{{MediaWiki:Policy-url}}|vadlīnijām]].",
        "actioncomplete": "Darbība pabeigta",
        "actionfailed": "Darbība neizdevās",
        "deletereasonotherlist": "Cits iemesls",
        "deletereason-dropdown": "* Izplatīti dzēšanas iemesli\n** Spams\n** Vandālisms\n** Autortiesību pārkāpums\n** Autora pieprasījums\n** Nederīga pāradresācija",
        "delete-edit-reasonlist": "Izmainīt dzēšanas iemeslus",
-       "delete-toobig": "Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versija|versijas}}.\nŠādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.",
+       "delete-toobig": "Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versijas|versija|versijas}}.\nŠādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.",
        "deleting-backlinks-warning": "'''Brīdinājums:''' uz lapu, ko grasies izdzēst, ved [[Special:WhatLinksHere/{{FULLPAGENAME}}|saites no citām lapām]].",
        "rollback": "Novērst labojumus",
-       "rollback_short": "Novērst",
        "rollbacklink": "novērst",
-       "rollbacklinkcount": "atcelt $1 {{PLURAL:$1|labojumu|labojumus}}",
-       "rollbacklinkcount-morethan": "atcelt vairāk kā $1 {{PLURAL:$1|labojumu|labojumus}}",
+       "rollbacklinkcount": "atcelt $1 {{PLURAL:$1|labojumus|labojumu|labojumus}}",
+       "rollbacklinkcount-morethan": "atcelt vairāk kā $1 {{PLURAL:$1|labojumus|labojumu|labojumus}}",
        "rollbackfailed": "Novēršana neizdevās",
        "cantrollback": "Nav iespējams novērst labojumu; iepriekšējais labotājs ir vienīgais lapas autors.",
        "alreadyrolled": "Nav iespējams novērst pēdējās izmaiņas, ko lapā [[:$1]] saglabāja [[User:$2|$2]] ([[User talk:$2|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]). Kāds cits jau ir labojis šo lapu vai novērsis izmaiņas.\n\nPēdējās izmaiņas saglabāja [[User:$3|$3]] ([[User talk:$3|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "protect_expiry_old": "Beigu termiņs ir pagātnē.",
        "protect-text": "Šeit var apskatīties un izmainīt lapas '''$1''' aizsardzības līmeni.",
        "protect-locked-access": "Jūsu kontam nav atļaujas mainīt lapas aizsardzības pakāpi.\nPašreizējie lapas '''$1''' iestatījumi ir:",
-       "protect-cascadeon": "Šī lapa pašlaik ir aizsargāta, jo tā ir iekļauta {{PLURAL:$1|šajā lapā|šajās lapās}} (mainot šīs lapas aizsardzības līmeni aizsardzība netiks noņemta):",
+       "protect-cascadeon": "Šī lapa pašlaik ir aizsargāta, jo tā ir iekļauta {{PLURAL:$1|šajās lapās|šajā lapā|šajās lapās}} (mainot šīs lapas aizsardzības līmeni aizsardzība netiks noņemta):",
        "protect-default": "Atļaut visiem lietotājiem",
        "protect-fallback": "Atļaut tikai lietotājiem ar \"$1\" atļauju",
        "protect-level-autoconfirmed": "Atļaut tikai autoapstiprinātiem lietotājiem",
        "undeletepage": "Skatīt un atjaunot dzēstās lapas",
        "undeletepagetitle": "'''Šeit ir [[:$1|$1]] izdzēstās versijas'''.",
        "viewdeletedpage": "Skatīt izdzēstās lapas",
-       "undeletepagetext": "{{PLURAL:$1|Šī lapa ir dzēsta, bet ir saglabāta arhīvā. To ir iespējams atjaunot|Šīs $1 lapas ir dzēstas, bet ir saglabātas arhīvā. Tās ir iespējams atjaunot}}, bet ņemiet vērā, ka arhīvs reizēm tiek tīrīts.",
+       "undeletepagetext": "{{PLURAL:$1|Šīs $1 lapas ir dzēstas, bet ir saglabātas arhīvā. Tās ir iespējams atjaunot|Šī lapa ir dzēsta, bet ir saglabāta arhīvā. To ir iespējams atjaunot|Šīs $1 lapas ir dzēstas, bet ir saglabātas arhīvā. Tās ir iespējams atjaunot}}, bet ņemiet vērā, ka arhīvs reizēm tiek tīrīts.",
        "undelete-fieldset-title": "Atjaunot versijas",
        "undeleteextrahelp": "Lai atjaunotu visu lapu, atstāj visus ķekšus (pie \"Lapas hronoloģija\") neieķeksētus uz uzspied uz '''''Atjaunot!'''''.\nLai atjaunotu tikai noteiktas versijas, ieķeksē vajadzīgās versijas un spied uz '''''Atjaunot!'''''. Uzspiešana uz '''''Notīrīt''''' notīrīs komentāru lauku un visus keķšus.",
-       "undeleterevisions": "$1 {{PLURAL:$1|versija|versijas}} {{PLURAL:$1|arhivēta|arhivētas}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|versijas|versija|versijas}} {{PLURAL:$1|arhivētas|arhivēta|arhivētas}}",
        "undeletehistory": "Ja tu atjauno lapu, visas versijas tiks atjaunotas tās hronoloģijā.\nJa pēc dzēšanas ir izveidota jauna lapa ar tādu pašu nosaukumu, atjaunotās versijas tiks ievietotas lapas hronoloģijā attiecīgā secībā un konkrētās lapas pašreizējā versija netiks automātiski nomainīta.",
        "undeleterevdel": "Atjaunošana nenotiks, ja tas izraisīs jaunākās versijas izdzēšanu.\nŠādos gadījumos ir vai nu jāizņem ķeksis no jaunākās versijas, vai arī jāatslēpj jaunākā versija.",
        "undeletehistorynoadmin": "Šī lapa ir tikusi izdzēsta.\nDzēšanas iemesls ir redzams apakšā, kopsavilkumā, kopā ar informāciju par lietotājiem, kas bija rediģējuši šo lapu pirs tās izdzēšanas.\nŠo izdzēsto versiju teksts ir pieejams tikai administratoriem.",
        "undeleteviewlink": "skatīt",
        "undeleteinvert": "Izvēlēties pretēji",
        "undeletecomment": "Iemesls:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versija|versijas}} {{PLURAL:$1|atjaunota|atjaunotas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versija|$1 versijas}} un {{PLURAL:$2|1 fails|$2 faili}} atjaunoti",
-       "undeletedfiles": "{{PLURAL:$1|1 fails atjaunots|$1 faili atjaunoti}}",
+       "undeletedrevisions": "$1 {{PLURAL:$1|versijas|versija|versijas}} {{PLURAL:$1|atjaunotas|atjaunota|atjaunotas}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|$1 versijas|1 versija|$1 versijas}} un {{PLURAL:$2|$2 faili|1 fails|$2 faili}} atjaunoti",
+       "undeletedfiles": "{{PLURAL:$1|$1 faili atjaunoti|$1 fails atjaunots|$1 faili atjaunoti}}",
        "cannotundelete": "Atjaunošana neizdevās:\n$1",
        "undeletedpage": "'''$1 tika atjaunots'''\n\n[[Special:Log/delete|Dzēšanas reģistrā]] ir informācija par pēdējām dzēšanām un atjaunošanām.",
        "undelete-header": "Nesen dzēstajām lapām skatīt [[Special:Log/delete|dzēšanas reģistru]].",
        "isredirect": "pāradresācijas lapa",
        "istemplate": "izsaukts",
        "isimage": "faila saite",
-       "whatlinkshere-prev": "{{PLURAL:$1|iepriekšējo|iepriekšējos $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|nākamo|nākamos $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|iepriekšējos $1|iepriekšējo|iepriekšējos $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|nākamos $1|nākamo|nākamos $1}}",
        "whatlinkshere-links": "← saites",
        "whatlinkshere-hideredirs": "$1 pāradresācijas",
        "whatlinkshere-hidetrans": "$1 lapas, kurās šī lapa izmantota kā veidne",
        "blocklist-reason": "Iemesls",
        "ipblocklist-submit": "Meklēt",
        "ipblocklist-localblock": "Vietējais bloks",
-       "ipblocklist-otherblocks": " {{PLURAL:$1|Cita|Citas}} {{PLURAL:$1|bloķēšana|bloķēšanas}}",
+       "ipblocklist-otherblocks": " {{PLURAL:$1|Citas|Cita|Citas}} {{PLURAL:$1|bloķēšanas|bloķēšana|bloķēšanas}}",
        "infiniteblock": "bezgalīgs",
        "expiringblock": "beidzas $1 $2",
        "anononlyblock": "tikai anon.",
        "ipb_expiry_temp": "Slēpto lietotājvārdu bloķēšanai jābūt beztermiņa.",
        "ipb_already_blocked": "\"$1\" jau ir bloķēts",
        "ipb-needreblock": "$1 jau ir bloķēts.\nVai tu gribi izmainīt bloka uzstādījumus?",
-       "ipb-otherblocks-header": "{{PLURAL:$1|Cits bloks|Citi bloki}}",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Citi bloki|Cits bloks|Citi bloki}}",
        "unblock-hideuser": "Šo lietotāju nevar atbloķēt, jo tā lietotājvārds ir paslēpts.",
        "ipb_cant_unblock": "Kļūda: Bloka ID $1 nav atrasts.\nTas, iespējams, jau ir atbloķēts.",
        "ipb_blocked_as_range": "Kļūda: IP $1 nav bloķēta tieši, tāpēc to nevar atbloķēt.\nTā ir bloķēta kā daļa no IP adrešu diapazona $2, kuru var atbloķēt.",
        "movepage-page-unmoved": "Lapu $1 nevarēja pārvietot uz $2.",
        "movelogpage": "Pārvietošanas reģistrs",
        "movelogpagetext": "Lapu pārvietošanas (pārdēvēšanas) reģistrs.",
-       "movesubpage": "{{PLURAL:$1|Apakšlapa|Apakšlapas}}",
-       "movesubpagetext": "Šai lapai ir $1 {{PLURAL:$1|apakšlapa|apakšlapas}}, kas redzamas zemāk.",
+       "movesubpage": "{{PLURAL:$1|Apakšlapas|Apakšlapa|Apakšlapas}}",
+       "movesubpagetext": "Šai lapai ir $1 {{PLURAL:$1|apakšlapas|apakšlapa|apakšlapas}}, kas redzamas zemāk.",
        "movenosubpage": "Šai lapai nav apakšlapu.",
        "movereason": "Iemesls:",
        "revertmove": "atcelt",
        "import-upload-filename": "Faila nosaukums:",
        "import-comment": "Komentārs:",
        "importstart": "Importē lapas...",
-       "import-revision-count": "$1 {{PLURAL:$1|versija|versijas}}",
+       "import-revision-count": "$1 {{PLURAL:$1|versijas|versija|versijas}}",
        "importnopages": "Nav lapu, ko importēt.",
-       "imported-log-entries": "{{PLURAL:$1|Importētais|Importētie}} $1 {{PLURAL:$1|reģistra ieraksts|reģistra ieraksti}}.",
+       "imported-log-entries": "{{PLURAL:$1|Importētie|Importētais|Importētie}} $1 {{PLURAL:$1|reģistra ieraksti|reģistra ieraksts|reģistra ieraksti}}.",
        "importfailed": "Importēšana neizdevās: <nowiki>$1</nowiki>",
        "importunknownsource": "Nezināms importēšanas avota veids",
        "importcantopen": "Nevarēja atvērt importējamo failu",
        "importlogpage": "Importēšanas reģistrs",
        "importlogpagetext": "Administratīvās lapu importēšanas no citām Vikipēdijām ar lapas hronoloģiju.",
        "import-logentry-upload": "importēts [[$1]], izmantojot failu augšupielādi",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versija|versijas}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versijas|versija|versijas}}",
        "import-logentry-interwiki": "starpvikizēts $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versija|versijas}} no $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versijas|versija|versijas}} no $2",
        "javascripttest": "JavaScript testēšana",
-       "javascripttest-title": "Darbina $1 testus",
        "tooltip-pt-userpage": "Tava lietotāja lapa",
        "tooltip-pt-anonuserpage": "Manas IP adreses lietotāja lapa",
        "tooltip-pt-mytalk": "Tava diskusiju lapa",
        "tooltip-undo": "\"Atgriezt\" atgriež šīs izmaiņas un atver labošanas formu priekšskatījuma veidā.\nTas atļauj pievienot iemeslu kopsavilkumā.",
        "tooltip-preferences-save": "Saglabāt iestatījumus",
        "tooltip-summary": "Ievadiet īsu kopsavilkumu",
-       "anonymous": "{{PLURAL:$1|Anonīmais {{grammar:ģenitīvs|{{SITENAME}}}} lietotājs|Anonīmie {{grammar:ģenitīvs|{{SITENAME}}}} lietotāji}}",
+       "anonymous": "{{PLURAL:$1|{{SITENAME|Anonīmais {{grammar:ģenitīvs|{{SITENAME}}}} lietotājs|Anonīmie {{grammar:ģenitīvs|{{SITENAME}}}} lietotāji}}",
        "siteuser": "{{grammar:ģenitīvs|{{SITENAME}}}} lietotājs $1",
        "anonuser": "{{SITENAME}} anonīms lietotājs $1",
        "lastmodifiedatby": "Šo lapu pēdējoreiz izmainīja $3, $2, $1.",
        "othercontribs": "Balstototies uz $1 darbu.",
        "others": "citi",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|lietotāja|lietotāju}} $1",
-       "anonusers": "{{SITENAME}} anonīma {{PLURAL:$2|lietotāja|lietotāju}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|lietotāju|lietotāja|lietotāju}} $1",
+       "anonusers": "{{SITENAME}} anonīma {{PLURAL:$2|lietotāju|lietotāja|lietotāju}} $1",
        "creditspage": "Lapas autori",
        "nocredits": "Šai lapa nav pieejama informācija par autoriem.",
        "spamprotectiontitle": "Spama filtrs",
        "mediawarning": "'''Brīdinājums''': Šis faila tips var saturēt ļaunprātīgu kodu, kuru izpildot, tava datora darbība var tikt traucēta.",
        "imagemaxsize": "Attēlu apraksta lapās parādāmo attēlu maksimālais izmērs:",
        "thumbsize": "Sīkbildes izmērs:",
-       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|lapa|lapas}}",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|lapu|lapa|lapas}}",
        "file-info": "faila izmērs: $1, MIME tips: $2",
        "file-info-size": "$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4",
-       "file-info-size-pages": "$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4, $5 {{PLURAL:$5|lapa|lapas}}",
+       "file-info-size-pages": "$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4, $5 {{PLURAL:$5|lapas|lapa|lapas}}",
        "file-nohires": "Augstāka izšķirtspēja nav pieejama.",
        "svg-long-desc": "SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3",
        "svg-long-error": "Nederīgs SVG fails: $1",
        "show-big-image": "Sākotnējais fails",
        "show-big-image-preview": "Šī priekšskata izmērs: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Cits izmērs|Citi izmēri}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Citi izmēri|Cits izmērs|Citi izmēri}}: $1.",
        "show-big-image-size": "$1 × $2 pikseļi",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|kadrs|kadri}}",
-       "file-info-png-repeat": "spēlēts $1 {{PLURAL:$1|reizi|reizes}}",
-       "file-info-png-frames": "$1 {{PLURAL:$1|kadrs|kadri}}",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|kadri|kadrs|kadri}}",
+       "file-info-png-repeat": "spēlēts $1 {{PLURAL:$1|reizes|reizi|reizes}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|kadri|kadrs|kadri}}",
        "newimages": "Jauno attēlu galerija",
-       "imagelisttext": "Šobrīd redzams $1 {{PLURAL:$1|attēla|attēlu}} uzskaitījums, kas sakārtots $2.",
+       "imagelisttext": "Šobrīd redzams $1 {{PLURAL:$1|attēlu|attēla|attēlu}} uzskaitījums, kas sakārtots $2.",
        "newimages-summary": "Šeit var apskatīties pēdējos augšuplādētos failus šajā Vikipēdijā",
        "newimages-legend": "Filtrs",
        "newimages-label": "Faila nosaukums (vai tā daļa):",
        "ilsubmit": "Meklēt",
        "bydate": "<b>pēc datuma</b>",
        "sp-newimages-showfrom": "Rādīt jaunos attēlus sākot no $1, $2",
-       "seconds": "{{PLURAL:$1|$1 sekunde|$1 sekundes}}",
-       "minutes": "{{PLURAL:$1|$1 minūte|$1 minūtes}}",
-       "hours": "{{PLURAL:$1|$1 stunda|$1 stundas}}",
-       "days": "{{PLURAL:$1|$1 diena|$1 dienas}}",
+       "seconds": "{{PLURAL:$1|$1 sekundes|$1 sekunde|$1 sekundes}}",
+       "minutes": "{{PLURAL:$1|$1 minūtes|$1 minūte|$1 minūtes}}",
+       "hours": "{{PLURAL:$1|$1 stundas|$1 stunda|$1 stundas}}",
+       "days": "{{PLURAL:$1|$1 dienas|$1 diena|$1 dienas}}",
        "ago": "pirms $1",
        "bad_image_list": "Formāts:\n\nTiek ņemti vērā tikai ieraksti rindiņā kas sākas ar *\nPirmajai saitei rindiņā ir jābūt uz attiecīgo failu\nJebkuras sekojošas saites tiks uzskatītas par izņēmumiem t.i. lapām kurās fails drīkt tikt izmantots",
        "metadata": "Metadati",
        "exif-gpslatitude-s": "Dienvidu platums",
        "exif-gpslongitude-e": "Austrumu garums",
        "exif-gpslongitude-w": "Rietumu garums",
-       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metrs|metri}} virs jūras līmeņa",
-       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metrs|metri}} zem jūras līmeņa",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metri|metrs|metri}} virs jūras līmeņa",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metri|metrs|metri}} zem jūras līmeņa",
        "exif-gpsmeasuremode-2": "Divdimensionāls mērījums",
        "exif-gpsmeasuremode-3": "Trīsdimensionāls mērījums",
        "exif-gpsspeed-k": "Kilometri stundā",
        "autosumm-replace": "Aizvieto lapas saturu ar '$1'",
        "autoredircomment": "Pāradresē uz [[$1]]",
        "autosumm-new": "Jauna lapa: $1",
-       "lag-warn-normal": "Izmaiņas, kas ir jaunākas par  $1 {{PLURAL:$1|sekundi|sekundēm}}, var neparādīties šajā sarakstā.",
-       "lag-warn-high": "Sakarā ar lielu datubāzes servera lagu, izmaiņas, kas svaigākas par $1 {{PLURAL:$1|sekundi|sekundēm}}, šajā sarakstā var neparādīties.",
+       "autosumm-newblank": "Izveidota tukša lapa",
+       "lag-warn-normal": "Izmaiņas, kas ir jaunākas par  $1 {{PLURAL:$1|sekundēm|sekundi|sekundēm}}, var neparādīties šajā sarakstā.",
+       "lag-warn-high": "Sakarā ar lielu datubāzes servera lagu, izmaiņas, kas svaigākas par $1 {{PLURAL:$1|sekundēm|sekundi|sekundēm}}, šajā sarakstā var neparādīties.",
        "watchlistedit-normal-title": "Izmainīt uzraugāmo rakstu sarakstu",
        "watchlistedit-normal-legend": "Noņemt lapas (virsrakstus) no uzraugāmo rakstu saraksta",
        "watchlistedit-normal-explain": "Tavā uzraugāmo rakstu sarakstā esošās lapas ir redzamas zemāk.\nLai noņemtu lapu, ieķeksē lodziņā pretī lapai un uzspied Noņemt lapas.\nVar arī izmainīt [[Special:EditWatchlist/raw|neapstrādātu sarakstu]] (viens liels teksta lauks).",
        "watchlistedit-normal-submit": "Noņemt lapas",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 lapa tika noņemta|$1 lapas tika noņemtas}} no uzraugāmo rakstu saraksta:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|$1 lapas tika noņemtas|1 lapa tika noņemta|$1 lapas tika noņemtas}} no uzraugāmo rakstu saraksta:",
        "watchlistedit-raw-title": "Izmainīt uzraugāmo rakstu saraksta kodu",
        "watchlistedit-raw-legend": "Izmainīt uzraugāmo rakstu saraksta kodu",
        "watchlistedit-raw-explain": "Uzraugāmo rakstu sarakstā esošās lapas ir redzamas zemāk, un šo sarakstu var izmainīt lapas pievienojot vai izdzēšot no saraksta;\nkatrai rindai te atbilst viena lapa.\nTad, kad pabeigts, uzspied Atjaunot sarakstu.\nVar arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].",
        "watchlistedit-raw-titles": "Lapas:",
        "watchlistedit-raw-submit": "Atjaunot sarakstu",
        "watchlistedit-raw-done": "Tavs uzraugāmo rakstu saraksts tika atjaunots.",
-       "watchlistedit-raw-added": "{{PLURAL:$1|1 lapa tika pievienota|$1 lapas tika pievienotas}}:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|1 lapa tika noņemta|$1 lapas tika noņemtas}}:",
+       "watchlistedit-raw-added": "{{PLURAL:$1|$1 lapas tika pievienotas|$1 lapa tika pievienota|$1 lapas tika pievienotas}}:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|$1 lapas tika noņemtas|1 lapa tika noņemta|$1 lapas tika noņemtas}}:",
        "watchlistedit-clear-titles": "Nosaukumi:",
        "watchlisttools-view": "Skatīt atbilstošās izmaiņas",
        "watchlisttools-edit": "Apskatīt un izmainīt uzraugāmo rakstu sarakstu",
        "watchlisttools-raw": "Izmainīt uzraugāmo rakstu saraksta kodu",
-       "unknown_extension_tag": "Nezināma paplašinājuma iezīme \"$1\"",
        "duplicate-defaultsort": "'''Brīdinājums:''' Noklusējuma kārtošanas atslēga \"$2\" ignorē kārtošanas atslēga \"$1\".",
        "version": "Versija",
        "version-extensions": "Ieinstalētie paplašinājumi",
        "fileduplicatesearch-submit": "Meklēt",
        "fileduplicatesearch-info": "$1 × $2 pikseļi<br />Faila izmērs: $3<br />MIME tips: $4",
        "fileduplicatesearch-result-1": "Failam \"$1\" nav identiskas kopijas.",
-       "fileduplicatesearch-result-n": "Failam \"$1\" ir {{PLURAL:$2|1 identiska kopija|$2 identiskas kopijas}}.",
+       "fileduplicatesearch-result-n": "Failam \"$1\" ir {{PLURAL:$2|$2 identiskas kopijas|1 identiska kopija|$2 identiskas kopijas}}.",
        "specialpages": "Īpašās lapas",
        "specialpages-note-top": "Apzīmējumi",
        "specialpages-note": "* Normālas īpašās lapas.\n* <span class=\"mw-specialpagerestricted\">Ierobežotas pieejas īpašās lapas.</span>\n* <span class=\"mw-specialpagecached\">Iekešotās īpašās lapas.</span>",
        "specialpages-group-wiki": "Dati un rīki",
        "specialpages-group-redirects": "Pāradresējošas īpašās lapas",
        "specialpages-group-spam": "Spama rīki",
+       "specialpages-group-developer": "Izstrādātāju rīki",
        "blankpage": "Tukša lapa",
        "intentionallyblankpage": "Šī lapa ar nodomu ir atstāta tukša.",
        "tags": "Derīgas izmaiņu iezīmes",
        "tag-filter": "[[Special:Tags|Iezīmju]] filtrs:",
        "tag-filter-submit": "Filtrs",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Iezīme|Iezīmes}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Iezīmes|Iezīme|Iezīmes}}]]: $2)",
        "tags-title": "Iezīmes",
        "tags-intro": "Šajā lapā uzskaitītas iezīmes, ar kurām programmatūra var atzīmēt labojumus, un to nozīme.",
        "tags-tag": "Iezīmes nosaukums",
        "tags-active-yes": "Jā",
        "tags-active-no": "Nē",
        "tags-edit": "labot",
-       "tags-hitcount": "$1 {{PLURAL:$1|izmaiņa|izmaiņas}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
        "comparepages": "Salīdzināt lapas",
        "compare-page1": "1. lapa",
        "compare-page2": "2. lapa",
        "api-error-unknownerror": "Nezināma kļūda: \"$1\"",
        "api-error-uploaddisabled": "Augšupielāde šajā wiki  ir atslēgta.",
        "limitreport-title": "Parsētāja profilēšanas dati:",
-       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baits|baiti}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "limitreport-templateargumentsize": "Veidnes argumenta izmērs",
-       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|baits|baiti}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "expand_templates_output": "Rezultāts",
        "expand_templates_ok": "Labi",
        "expand_templates_preview": "Pirmskats"
index 9893e3e..2ad7a06 100644 (file)
        "watchlisttools-view": "察易",
        "watchlisttools-edit": "治哨站",
        "watchlisttools-raw": "治源哨",
-       "unknown_extension_tag": "未明之擴標「$1」",
        "duplicate-defaultsort": "警:預之排鍵「$2」蓋前之排鍵「$1」。",
        "version": "版",
        "version-extensions": "裝展",
index 3a7745a..081238a 100644 (file)
        "watchlisttools-edit": "साकांक्षसूचीकेँ देखू आ सम्पादित करू",
        "watchlisttools-raw": "काँच साकांक्षसूची संपादित करू",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-       "unknown_extension_tag": "अज्ञात बढ़ाएल चेन्ह \"$1\"",
        "duplicate-defaultsort": "'''चेतौनी:''' पूर्वनिर्धारित विन्यास चाभी \"$2\" पहिलुका पूर्वनिर्धारित विन्यास चाभी \"$1\" केँ खतम करैए।",
        "version": "संस्करण",
        "version-extensions": "संस्करणक आगाँ",
index 19a78c3..b2d0dcc 100644 (file)
        "filerenameerror": "Tsy voaova ho \"$2\" ny anaran'ilay rakitra \"$1\".",
        "filedeleteerror": "Tsy voafafa ilay rakitra \"$1\".",
        "directorycreateerror": "Tsy afaka amboarina ny petra-drakitra (''dossier, directory'') « $1 ».",
+       "directoryreadonlyerror": "Vakiana ihany ny lahatahiry \"$1\"",
+       "directorynotreadableerror": "Tsy azo vakiana ny lahatahiry \"$1\".",
        "filenotfound": "Tsy hita ilay rakitra \"$1\".",
        "unexpected": "Tsy nandrasana: \"$1\"=\"$2\".",
        "formerror": "Tsy mety: tsy lasa ny fisy",
        "content-model-text": "soratra tsotra",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Zavatra foana",
+       "content-json-empty-array": "Tabilao foana",
+       "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",
        "post-expand-template-inclusion-warning": "'''Tandremo''' : be loatra ny endrika ampiasain'ity pejy ity, misy endrika tsy ho ampiasaina.",
        "history-feed-empty": "Tsy misy ny pejy notadiavina.\nMety efa voafafa na voafindra angamba izy.\nMitadiava amin'ny '''[[Special:Search|fiasàna fitadiavina]]''' mba hitady ny pejy misy fifandraisana.",
        "rev-deleted-comment": "(ambangovangom-panovana nesorina)",
        "rev-deleted-user": "(solonanarana nesorina)",
-       "rev-deleted-event": "(nesorina ny fampidirana)",
+       "rev-deleted-event": "(nesorina ny antsipirihan'ny laogy)",
        "rev-deleted-user-contribs": "[anaram-pikambana na adiresy IP voafafa - fanovana nasitria teo amin'ny fandraisan'anjara modification]",
        "rev-deleted-text-permission": "<strong>Voafafa</strong> ny santiônan'ity pejy ity.\nMety misy ny antsipirihany angamba ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogim-pamafàna pejy].",
        "rev-deleted-text-unhide": "Ity versionan'ity pejy ity dia '''voafafa'''.\nHita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana] ny antsipirihany.\nAfaka [$1 mijery ilay versiona] ianao raha tianao.",
        "revdelete-show-file-confirm": "Tapa-kevitra hamafa ny ''revision''-n'i rakitra <nowiki>$1</nowiki> tamin'ny $2 tamin'ny $3 ve ianao ?",
        "revdelete-show-file-submit": "Eny",
        "logdelete-selected": "{{PLURAL:$1||}}Laogy voafidy :",
+       "revdelete-text-others": "Ny mpandrindra hafa dia mbola ho afaka nahazo ny votoaty miafina ary mamerina izany, \nraha tsy misy famerana mikasika izany.",
        "revdelete-confirm": "Amafiso eto ny hevitrao raha hanao io ianao, raha azonao sary an-tsaina ny mety ho vokany, ary raha araka ny [[{{MediaWiki:Policy-url}}|fepetra mihatra]] ny zavatra ataonao.",
        "revdelete-suppress-text": "Ny famafàna pejy dia ampiasaina rehefa :\n* Fampahalalana mampiely lainga\n* Misy fampahalalana tsy sarababem-bahoaka tsy metimety\n*: ''Adiresy onenana, laharana antso an-tariby, sns.''",
        "revdelete-legend": "Hametraka ny fe-pahitana",
        "revdelete-hide-text": "Tahirintsoratry ny versiona",
        "revdelete-hide-image": "asitriho ny votoatin'ilay rakitra",
-       "revdelete-hide-name": "Asitriho ny asa sy ny tanjona",
+       "revdelete-hide-name": "Asitriho ny tanjona sy ny parametatra",
        "revdelete-hide-comment": "Ambangovangon'ilay fiovàna",
        "revdelete-hide-user": "Adiresy IPn'ny Mpanova",
        "revdelete-hide-restricted": "Fafao ireo votoatiny ireo amin'ny mpiandrindra sy amin'ny mpikambana hafa",
        "right-protect": "Manova ny lenta fiarovan'ny pejy sy manova ny pejy voaaro miriana",
        "right-editprotected": "Manova pejy voaaro (tsy misy fiarovana en cascade)",
        "right-editsemiprotected": "Hanova ny pejy narovna ho \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Hanova ny modelim-botoatin'ny pejy",
        "right-editinterface": "Manova ny interface ny mpikambana",
        "right-editusercssjs": "Manova ny rakitra CSS sy JS ny mpikambana hafa",
        "right-editusercss": "Manova ny rakitra CSS ny mpikambana hafa",
        "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",
        "nchanges": "{{PLURAL:$1|fanovana|fanovana}} $1",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
-       "unknown_extension_tag": "Balizy mitondra itatra « $1 » tsy fantatra",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
index 139f3c1..3c84e4c 100644 (file)
        "otherlanguages": "На други јазици",
        "redirectedfrom": "(Пренасочено од $1)",
        "redirectpagesub": "Пренасочувачка страница",
-       "redirectto": "Пренасочи кон:",
+       "redirectto": "Пренасочување кон:",
        "lastmodifiedat": "Последната промена на страницава е извршена на $1 г. во $2 ч.",
        "viewcount": "Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.",
        "protectedpage": "Заштитена страница",
        "pool-queuefull": "Редицата на барања е полна",
        "pool-errorunknown": "Непозната грешка",
        "pool-servererror": "Службата на фондовскиот шалтер е недостапна ($1).",
+       "poolcounter-usage-error": "Грешка во употребата: $1",
        "aboutsite": "За {{SITENAME}}",
        "aboutpage": "Project:За {{SITENAME}}",
        "copyright": "Содржината е достапна под условите на $1 освен ако не е поинаку наведено.",
        "anoneditwarning": "<strong>Предупредување:</strong> Не сте најавени. Вашата IP-адреса ќе биде јавно видлива ако уредувате. Ако <strong>[$1 се најавите]</strong> или <strong>[$2 направите сметка]</strong>, тогаш уредувањата ќе се припишуваат на вашето корисничко име, покрај другите погодности.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
-       "selfredirect": "<strong>Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:</strong> Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ\82е Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе ÐºÐ¾Ð½ Ð¸Ñ\81Ñ\82аÑ\82а Ñ\81Ñ\82аÑ\82иÑ\98а.\nÐ\90ко Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c Ð¿Ð¾Ð²Ñ\82оÑ\80но, Ñ\82огаÑ\88 Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aеÑ\82о ќе се создаде.",
+       "selfredirect": "<strong>Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:</strong> Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ\82е Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе ÐºÐ¾Ð½ Ð¸Ñ\81Ñ\82аÑ\82а Ñ\81Ñ\82аÑ\82иÑ\98а.\nÐ\9cоже Ð´Ð° Ñ\81Ñ\82е Ñ\83кажале Ð³Ñ\80еÑ\88на Ñ\86елна Ñ\81Ñ\82Ñ\80аниÑ\86а, Ð¸Ð»Ð¸ Ð¿Ð°Ðº Ñ\83Ñ\80едÑ\83ваÑ\82е Ð¿Ð¾Ð³Ñ\80еÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а.\nÐ\90ко Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c Ð¿Ð¾Ð²Ñ\82оÑ\80но, Ñ\82огаÑ\88 Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aеÑ\82о Ð±ÐµÐ·Ð´Ñ\80Ñ\83Ð³о ќе се создаде.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
        "missingcommentheader": "'''Потсетување:''' Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
        "summary-preview": "Изглед на описот:",
        "content-model-text": "прост текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Празен објект",
+       "content-json-empty-array": "Празна низа",
        "duplicate-args-category": "Страници што користат дуплирани аргументи во повикувања на шаблони",
        "duplicate-args-category-desc": "Страницава содржи повикувања на шаблони кои се дупликати на аргументи, како што се <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Предупредување: Оваа страница користи премногу повикувања на parser функции.\n\nТреба да има помалку од $2 {{PLURAL:$2|повикување|повикувања}} а сега има {{PLURAL:$1|$1 повикување|$1 повикувања}}.",
        "history-feed-empty": "Бараната страница не постои.\nМоже била избришана од викито или преименувана.\nОбидете се да [[Special:Search|пребарате низ викито]] за релевантни нови страници.",
        "rev-deleted-comment": "(избришан опис на промени)",
        "rev-deleted-user": "(избришано корисничко име)",
-       "rev-deleted-event": "(избришан запис на дејство)",
+       "rev-deleted-event": "(избришани податоци од дневникот)",
        "rev-deleted-user-contribs": "[отстрането е корисничкото име или IP-адресата - уредувањето нема да се прикаже на списокот на придонеси]",
        "rev-deleted-text-permission": "Оваа преработка страницата е <strong>избришана</strong>.\nМожеби има подробности во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "rev-suppressed-text-permission": "Оваа преработка на страницата е <strong>притаена</strong>. Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].",
        "revdelete-legend": "Постави ограничувања за видливост",
        "revdelete-hide-text": "Текст на преработката",
        "revdelete-hide-image": "Скриј содржина на податотека",
-       "revdelete-hide-name": "Скриј го дејството и неговата одредница",
+       "revdelete-hide-name": "Скриј ја целта и параметрите",
        "revdelete-hide-comment": "Опис на уредувањето",
        "revdelete-hide-user": "Корисничко име/IP-адреса на уредникот",
        "revdelete-hide-restricted": "Постави ограничувања и за администратори на ист начин како и за останатите",
        "right-autoconfirmed": "Без ограничувања на стапки за IP-адреса",
        "right-bot": "Третиран како автоматски процес",
        "right-nominornewtalk": "Ситните уредувања да не поттикнуваат потсетник за нова порака",
-       "right-apihighlimits": "Ð\9aоÑ\80иÑ\81Ñ\82еÑ\9aе Ð½Ð° Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð³Ñ\80аниÑ\87ени Ð±Ð°Ñ\80аÑ\9aа ÐºÐ¾Ð½ API",
-       "right-writeapi": "Ð\9cожноÑ\81Ñ\82 Ð·Ð° Ð¿Ð¸Ñ\88Ñ\83ваÑ\9aе Ð½Ð° API",
+       "right-apihighlimits": "Ð\9aоÑ\80иÑ\81Ñ\82еÑ\9aе Ð½Ð° Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð³Ñ\80аниÑ\87ени Ð±Ð°Ñ\80аÑ\9aа Ð¾Ð´ Ð¸Ð·Ð²Ñ\80Ñ\88никоÑ\82",
+       "right-writeapi": "Ð\9cожноÑ\81Ñ\82 Ð·Ð° Ð·Ð°Ð¿Ð¸Ñ\88Ñ\83ваÑ\9aе Ð²Ð¾ Ð¸Ð·Ð²Ñ\80Ñ\88никоÑ\82",
        "right-delete": "Бришење страници",
        "right-bigdelete": "Бришење страници со долга историја",
        "right-deletelogentry": "Бришење и враќање на конкретни ставки во дневник",
        "action-reupload": "заменување на оваа постоечка податотека",
        "action-reupload-shared": "заменување на оваа податотека на заедничко складиште",
        "action-upload_by_url": "подигни ја податотекава од URL-адреса",
-       "action-writeapi": "Ñ\83поÑ\82Ñ\80ебеÑ\82е Ð¿Ð¸Ñ\88Ñ\83ваÑ\9aе Ð½Ð° API",
+       "action-writeapi": "Ñ\83поÑ\82Ñ\80ебеÑ\82е Ð·Ð°Ð¿Ð¸Ñ\88Ñ\83ваÑ\9aе Ð²Ð¾ Ð¸Ð·Ð²Ñ\80Ñ\88никоÑ\82",
        "action-delete": "избриши ја страницава",
        "action-deleterevision": "избриши ја ревизијава",
        "action-deletedhistory": "прегледај ја историјата на бришења за оваа страница",
        "deleteprotected": "Не можете да ја избришете страницава бидејќи е заштитена.",
        "deleting-backlinks-warning": "'''Предупредување:''' До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
        "rollback": "Отповикај промени",
-       "rollback_short": "Отповикај",
        "rollbacklink": "отповикај",
        "rollbacklinkcount": "отповикај $1 {{PLURAL:$1|уредување|уредувања}}",
        "rollbacklinkcount-morethan": "отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}",
        "namespace": "Именски простор:",
        "invert": "Обратен избор",
        "tooltip-invert": "Штиклирајте го полево за да ги скриете извршените измени во одбраниот именски простор (и поврзаниот именски простор, ако е штиклиран)",
+       "tooltip-whatlinkshere-invert": "Штиклирајте го кутивчево за да ги скриете врските од страниците во избраниот именски простор.",
        "namespace_association": "Поврзан именски простор",
        "tooltip-namespace_association": "Штиклирајте го полево за  да го вклучите и именскиот простор за разговор (или наслов) поврзан со одбраниот именски простор",
        "blanknamespace": "(Главен)",
        "uctop": "(тековно)",
        "month": "Од месец (и порано):",
        "year": "Од година (и порано):",
-       "sp-contributions-newbies": "Прикажи придонеси само на нови корисници",
+       "sp-contributions-newbies": "Прикажи само придонеси на нови корисници",
        "sp-contributions-newbies-sub": "За нови кориснички сметки",
        "sp-contributions-newbies-title": "Придонеси на нови корисници",
        "sp-contributions-blocklog": "Дневник на блокирања",
        "thumbnail-temp-create": "Не можам да создадам привремена податотека на минијатурата",
        "thumbnail-dest-create": "Не можам да ја зачувам минијатурата во одредницата",
        "thumbnail_invalid_params": "Параметрите на минијатурата се погрешни",
+       "thumbnail_toobigimagearea": "Податотека со димензии поголеми од $1",
        "thumbnail_dest_directory": "Целниот именик не може да се создаде",
        "thumbnail_image-type": "Неподдржан тип на слика",
        "thumbnail_gd-library": "Нецелосни поставки на графичката библиотека: недостасува функцијата $1",
        "import-logentry-interwiki": "трансвикифиран $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}} од $2",
        "javascripttest": "Проба на JavaScript",
-       "javascripttest-title": "Вршам $1 проби",
        "javascripttest-pagetext-noframework": "Оваа страница е резервирана за вршење на проби со JavaScript.",
        "javascripttest-pagetext-unknownframework": "Непозната рамка „$1“.",
+       "javascripttest-pagetext-unknownaction": "Непознато дејство „$1“.",
        "javascripttest-pagetext-frameworks": "Изберете една од следниве рамки: $1",
        "javascripttest-pagetext-skins": "Одберете со кое руво да ја направите пробата:",
        "javascripttest-qunit-intro": "Вид. [$1 документација на испробувањето] на mediawiki.org.",
-       "javascripttest-qunit-heading": "JavaScript-програм за испробување на МедијаВики „QUnit“",
        "tooltip-pt-userpage": "Вашата корисничка страница",
        "tooltip-pt-anonuserpage": "Корисничка страница за IP-адресата од која уредувате",
        "tooltip-pt-mytalk": "Вашата страница за разговор",
        "file-info": "големина: $1, MIME-тип: $2",
        "file-info-size": "$1 × $2 пиксели, големина: $3, MIME-тип: $4",
        "file-info-size-pages": "$1 × $2 пиксели, големина: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страници}}",
-       "file-nohires": "Ð\9dема Ð²ÐµÑ\80зиÑ\98а Ñ\81о Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ñ\80азложеност.",
+       "file-nohires": "Ð\9dема Ð²ÐµÑ\80зиÑ\98а Ñ\81о Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ñ\80азделеност.",
        "svg-long-desc": "SVG податотека, номинално $1 × $2 пиксели, големина: $3",
        "svg-long-desc-animated": "Анимирана SVG-податотека, номинално: $1 × $2 пиксели, големина: $3",
        "svg-long-error": "Неважечка SVG-податотека: $1",
        "show-big-image": "Изворна податотека",
        "show-big-image-preview": "Големина на овој преглед: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азложеноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азложености}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азделеноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азделености}}: $1.",
        "show-big-image-size": "$1 × $2 пиксели",
        "file-info-gif-looped": "кружно",
        "file-info-gif-frames": "$1 {{PLURAL:$1|кадар|кадри}}",
        "file-info-png-repeat": "пуштено {{PLURAL:$1|еднаш|$1 пати}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадар|кадри}}",
        "file-no-thumb-animation": "'''Напомена: Поради технички ограничувања, минијатурите на оваа податотека нема да се анимираат.'''",
-       "file-no-thumb-animation-gif": "'''Ð\9dапомена: Ð\9fоÑ\80ади Ñ\82еÑ\85ниÑ\87ки Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80иÑ\82е Ð½Ð° GIF-Ñ\81лики Ñ\81о Ð²Ð¸Ñ\81ока Ñ\80азложеност како оваа нема да се анимираат.'''",
+       "file-no-thumb-animation-gif": "'''Ð\9dапомена: Ð\9fоÑ\80ади Ñ\82еÑ\85ниÑ\87ки Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80иÑ\82е Ð½Ð° GIF-Ñ\81лики Ñ\81о Ð²Ð¸Ñ\81ока Ñ\80азделеност како оваа нема да се анимираат.'''",
        "newimages": "Галерија на нови податотеки",
        "imagelisttext": "Следи список на '''$1''' {{PLURAL:$1|податотека|податотеки}} подредени $2.",
        "newimages-summary": "Оваа службена страница ги покажува скоро подигнатите податотеки.",
        "exif-planarconfiguration": "Распоред на податоците",
        "exif-ycbcrsubsampling": "Однос на величината на Y спрема C",
        "exif-ycbcrpositioning": "Положби на Y и C",
-       "exif-xresolution": "ХоÑ\80изонÑ\82ална Ñ\80азложеност",
-       "exif-yresolution": "Ð\92еÑ\80Ñ\82икална Ñ\80азложеност",
+       "exif-xresolution": "ХоÑ\80изонÑ\82ална Ñ\80азделеност",
+       "exif-yresolution": "Ð\92еÑ\80Ñ\82икална Ñ\80азделеност",
        "exif-stripoffsets": "Положба на податоците",
        "exif-rowsperstrip": "Број на редови по блок",
        "exif-stripbytecounts": "Бајти по набиен блок",
        "exif-focallength-format": "$1 мм",
        "exif-subjectarea": "Положба и површина на објектот",
        "exif-flashenergy": "Енергија на блицот",
-       "exif-focalplanexresolution": "Разложеност на жаришната рамнина X",
-       "exif-focalplaneyresolution": "Разложеност на жаришната рамнина Y",
-       "exif-focalplaneresolutionunit": "Ð\95диниÑ\86а Ð·Ð° Ñ\80азложеност на жаришната рамнина",
+       "exif-focalplanexresolution": "Разделеност на жаришната рамнина X",
+       "exif-focalplaneyresolution": "Разделеност на жаришната рамнина Y",
+       "exif-focalplaneresolutionunit": "Ð\95диниÑ\86а Ð·Ð° Ñ\80азделеност на жаришната рамнина",
        "exif-subjectlocation": "Положба на субјектот",
        "exif-exposureindex": "Показател на изложувањето",
        "exif-sensingmethod": "Метод на сензорот",
        "hebrew-calendar-m11-gen": "ав",
        "hebrew-calendar-m12-gen": "елул",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])",
-       "unknown_extension_tag": "Непозната ознака на додатокот „$1“",
        "duplicate-defaultsort": "Предупредување: Основниот клуч за подредување „$2“ го поништува претходниот основен клуч за подредување „$1“.",
        "duplicate-displaytitle": "<strong>Предупредување:</strong> Приказниот наслов „$2“ го заменува претходнито приказен наслов „$1“.",
        "invalid-indicator-name": "<strong>Грешка:</strong> Атрибутот <code>name</code> што го покажува статусот на страницата не може да биде празен.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath?uselang=mk Статија]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath?uselang=mk Скрипта]",
+       "version-libraries": "Востановени библиотеки",
+       "version-libraries-library": "Библиотека",
+       "version-libraries-version": "Верзија",
        "redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
        "redirect-legend": "Пренасочување кон податотека или страница",
        "redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Наведената преработка не постои.",
        "dberr-problems": "Жалиме! Ова мрежно место се соочува со технички потешкотии.",
        "dberr-again": "Почекајте неколку минути и обидете се повторно.",
-       "dberr-info": "(Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´Ð¾Ð±Ð¸Ðµ Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87оÑ\82 Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и: $1)",
-       "dberr-info-hidden": "(Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´Ð¾Ð±Ð¸Ðµ Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87оÑ\82 Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и)",
+       "dberr-info": "(Ð\9dе Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ð¿Ñ\80иÑ\81Ñ\82апам ÐºÐ¾Ð½ Ð±Ð°Ð·Ð°Ñ\82а: $1)",
+       "dberr-info-hidden": "(Ð\9dе Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ð¿Ñ\80иÑ\81Ñ\82апам ÐºÐ¾Ð½ Ð±Ð°Ð·Ð°Ñ\82а)",
        "dberr-usegoogle": "Во меѓувреме можете да се обидете да пребарувате со Google.",
        "dberr-outofdate": "Да напоменеме дека нивните индекси на нашата содржина можат да бидат застарени.",
        "dberr-cachederror": "Следнава содржина е меѓускладиран примерок на бараната страница, кој може да е застарен.",
        "feedback-cancel": "Откажи",
        "feedback-submit": "Поднеси мислење",
        "feedback-adding": "Го додавам искажаното мислење во страницата...",
-       "feedback-error1": "Грешка: Непрепознаен резултат од извршникот (API)",
+       "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
        "feedback-thanks": "Благодариме! Вашиот одѕив е објавен на страницата „[$2 $1]“.",
index b7481e9..a8b0177 100644 (file)
        "pool-queuefull": "പൂൾ ക്യൂ നിറഞ്ഞിരിക്കുന്നു",
        "pool-errorunknown": "അപരിചിതമായ പിഴവ്",
        "pool-servererror": "പൂൾ കൗണ്ടർ സേവനം ലഭ്യമല്ല ($1).",
+       "poolcounter-usage-error": "ഉപയോഗ പിഴവ്:  $1",
        "aboutsite": "{{SITENAME}} സം‌രംഭത്തെക്കുറിച്ച്",
        "aboutpage": "Project:വിവരണം",
        "copyright": "പ്രത്യേകം പറയാത്ത പക്ഷം ഉള്ളടക്കം $1 പ്രകാരം ലഭ്യം.",
        "anoneditwarning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കൾ തിരുത്തുകളെന്തെങ്കിലും ചെയ്യുകയാണെങ്കിൽ താങ്കളുടെ ഐ.പി. വിലാസം എല്ലാവർക്കും ലഭ്യമായിരിക്കും. താങ്കൾ <strong>[$1 ലോഗിൻ ചെയ്യുകയോ]</strong>  <strong>[$2 അംഗത്വമെടുക്കുകയോ]</strong> ചെയ്യുന്നതുവഴി മറ്റ് ഗുണങ്ങളോടൊപ്പം താങ്കളുടെ തിരുത്തുകൾ ഉപയോക്തൃനാമത്തിലാവും അറിയപ്പെടുക.",
        "anonpreviewwarning": "''താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. സേവ് ചെയ്യുമ്പോൾ താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ താങ്കളുടെ ഐ.പി. വിലാസം ചേർത്തു സൂക്ഷിക്കപ്പെടും.''",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
-       "selfredirect": "<strong>à´®àµ\81à´¨àµ\8dനറിയിപàµ\8dà´ªàµ\8d:</strong> à´\85à´¤àµ\87 à´²àµ\87à´\96നതàµ\8dതിലàµ\87à´\95àµ\8dà´\95àµ\81à´³àµ\8dà´³ à´¤à´¿à´°à´¿à´\9aàµ\8dà´\9aàµ\81വിà´\9fലാണàµ\8d à´¤à´¾à´\99àµ\8dà´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d.\nവീണ്ടും \"{{int:savearticle}}\" അമർത്തിയാൽ, തിരിച്ചുവിടൽ സൃഷ്ടിക്കപ്പെടുന്നതാണ്.",
+       "selfredirect": "<strong>à´®àµ\81à´¨àµ\8dനറിയിപàµ\8dà´ªàµ\8d:</strong> à´\88 à´¤à´¾à´³à´¿à´²àµ\87à´\95àµ\8dà´\95àµ\8d à´¤à´¨àµ\8dà´¨àµ\86à´¯àµ\81à´³àµ\8dà´³ à´¤à´¿à´°à´¿à´\9aàµ\8dà´\9aàµ\81വിà´\9fലാണàµ\8d à´¤à´¾à´\99àµ\8dà´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d.\nതിരിà´\9aàµ\8dà´\9aàµ\81വിà´\9fലിനàµ\81 à´¤à´¾à´\99àµ\8dà´\95ൾ à´¨àµ½à´\95à´¿à´¯ à´²à´\95àµ\8dà´·àµ\8dà´¯à´\82 à´¤àµ\86à´±àµ\8dറിയിരിà´\95àµ\8dà´\95à´¾à´\82 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¤à´¾à´\99àµ\8dà´\95ൾ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´¨àµ\8dനതàµ\8d à´¤àµ\86à´±àµ\8dറായ à´¤à´¾àµ¾ à´\86യിരിà´\95àµ\8dà´\95à´¾à´\82.\nà´\8eà´¨àµ\8dതായാലàµ\81à´\82വീണ്ടും \"{{int:savearticle}}\" അമർത്തിയാൽ, തിരിച്ചുവിടൽ സൃഷ്ടിക്കപ്പെടുന്നതാണ്.",
        "missingcommenttext": "താങ്കളുടെ അഭിപ്രായം ദയവായി താഴെ രേഖപ്പെടുത്തുക.",
        "missingcommentheader": "'''ഓർമ്മക്കുറിപ്പ്:''' ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
        "summary-preview": "ചുരുക്കരൂപം എങ്ങനെയുണ്ടെന്നു കാണുക:",
        "history-feed-empty": "താങ്കൾ തിരഞ്ഞ താൾ നിലവിലില്ല.\nപ്രസ്തുത താൾ വിക്കിയിൽ നിന്നു ഒഴിവാക്കിയിരിക്കാനോ പുനർനാമകരണം ചെയ്തിരിക്കാനോ സാദ്ധ്യത ഉണ്ട്.\nബന്ധപ്പെട്ട പുതിയ താളുകൾ കണ്ടെത്താൻ [[Special:Search|വിക്കിയിലെ തിരച്ചിൽ]] എന്ന താൾ ഉപയോഗിക്കുക.",
        "rev-deleted-comment": "(തിരുത്തലിന്റെ ചുരുക്കം ഒഴിവാക്കിയിരിക്കുന്നു)",
        "rev-deleted-user": "(ഉപയോക്തൃനാമം ഒഴിവാക്കിയിരിക്കുന്നു)",
-       "rev-deleted-event": "(à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതിയàµ\81à´\9fàµ\86 à´°àµ\87à´\96 ഒഴിവാക്കിയിരിക്കുന്നു)",
+       "rev-deleted-event": "(à´°àµ\87à´\96à´¾ à´µà´¿à´µà´°à´\99àµ\8dà´\99ൾ ഒഴിവാക്കിയിരിക്കുന്നു)",
        "rev-deleted-user-contribs": "[ഉപയോക്തൃനാമം അഥവാ ഐ.പി. വിലാസം ഒഴിവാക്കപ്പെട്ടിരിക്കുന്നു - തിരുത്തൽ സേവനങ്ങളിൽ നിന്നും മറച്ചിരിക്കുന്നു]",
        "rev-deleted-text-permission": "താളിന്റെ ഈ നാൾപ്പതിപ്പ് '''മായ്ച്ചിരിക്കുന്നു'''.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.",
        "rev-suppressed-text-permission": "താളിന്റെ ഈ സംശോധനം <strong>ഒതുക്കിയിരിക്കുന്നു</strong>.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ഒതുക്കൽ രേഖയിൽ] ഉണ്ട്.",
        "revdelete-legend": "നാൾപ്പതിപ്പിന്റെ ദർശനീയത സജ്ജീകരിക്കുക",
        "revdelete-hide-text": "നാൾപ്പതിപ്പിലെ എഴുത്ത്",
        "revdelete-hide-image": "പ്രമാണത്തിന്റെ ഉള്ളടക്കം മറയ്ക്കുക",
-       "revdelete-hide-name": "à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതിയàµ\81à´\82 à´²à´\95àµ\8dà´·àµ\8dയവും മറയ്ക്കുക",
+       "revdelete-hide-name": "à´²à´\95àµ\8dà´·àµ\8dയവàµ\81à´\82 à´\9aà´°à´\99àµ\8dà´\99à´³ും മറയ്ക്കുക",
        "revdelete-hide-comment": "തിരുത്തലിന്റെ ചുരുക്കം",
        "revdelete-hide-user": "തിരുത്തുന്ന ആളുടെ ഉപയോക്തൃനാമം/ഐ.പി. വിലാസം",
        "revdelete-hide-restricted": "വിവരങ്ങളുടെ നിയന്ത്രണം മറ്റുള്ളവരെ പോലെ കാര്യനിർവാഹകർക്കും ബാധകമാക്കുക",
        "uploaderror": "അപ്‌ലോഡ് പിഴവ്",
        "upload-recreate-warning": "'''ശ്രദ്ധിക്കുക: ഇതേ പേരിലുള്ള ഒരു പ്രമാണം മായ്ക്കുകയോ മാറ്റുകയോ ചെയ്തിരിക്കുന്നു.'''\n\nഈ താളിന്റെ മായ്ക്കൽ രേഖയും മാറ്റൽ രേഖയും സ്ഥിരീകരിക്കുന്നതിനായി നൽകിയിരിക്കുന്നു:",
        "uploadtext": "താഴെ കാണുന്ന ഫോം പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുവാൻ വേണ്ടി ഉപയോഗിക്കുക.\nനിലവിൽ അപ്‌ലോഡ് ചെയ്തിരിക്കുന്ന പ്രമാണങ്ങൾ കാണുവാൻ [[Special:FileList|അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങളുടെ പട്ടിക]] സന്ദർശിക്കുക. (പുതുക്കിയ) അപ്‌‌ലോഡുകൾ [[Special:Log/upload|അപ്‌ലോഡ് രേഖ]], മായ്ക്കപ്പെട്ടവ [[Special:Log/delete|മായ്ക്കൽ രേഖയിലും]] കാണാവുന്നതാണ്‌.\n\nപ്രമാണം താളിൽ പ്രദർശിപ്പിക്കുവാൻ താഴെ കാണുന്ന ഒരു വഴി സ്വീകരിക്കുക\n\n*'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''' പൂർണ്ണരൂപത്തിലുള്ള പ്രമാണം ഉപയോഗിക്കാൻ\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 പിക്സൽ ഉള്ള പെട്ടിയിൽ പകരമുള്ള എഴുത്തടക്കം ഉപയോഗിക്കാൻ\n*'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' പ്രമാണം കാട്ടാതെ പ്രമാണത്തെ നേരിട്ടു കണ്ണി ചേർക്കാൻ",
-       "upload-permitted": "അനുവദനീയമായ പ്രമാണ തരങ്ങൾ: $1.",
-       "upload-preferred": "പ്രോത്സാഹിപ്പിക്കുന്ന പ്രമാണ തരങ്ങൾ: $1.",
-       "upload-prohibited": "നിരോധിക്കപ്പെട്ട തരം പ്രമാണങ്ങൾ: $1.",
+       "upload-permitted": "അനുവദനീയമായ പ്രമാണ {{PLURAL:$2|തരം|തരങ്ങൾ}}: $1.",
+       "upload-preferred": "പ്രോത്സാഹിപ്പിക്കുന്ന പ്രമാണ {{PLURAL:$2|തരം|തരങ്ങൾ}}: $1.",
+       "upload-prohibited": "നിരോധിക്കപ്പെട്ട {{PLURAL:$2|തരം|തരങ്ങളിലുള്ള}} പ്രമാണങ്ങൾ: $1.",
        "uploadlogpage": "അപ്‌ലോഡ് രേഖ",
        "uploadlogpagetext": "സമീപകാലത്ത് അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങളുടെ പട്ടിക താഴെ കാണാം.",
        "filename": "പ്രമാണത്തിന്റെ പേര്",
        "deleteprotected": "ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നതിനാൽ താങ്കൾക്കിത് മായ്ക്കാനാവില്ല.",
        "deleting-backlinks-warning": "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും [[Special:WhatLinksHere/{{FULLPAGENAME}}|താളിലേയ്ക്കുള്ള കണ്ണികൾ]] അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
        "rollback": "തിരുത്തുകൾ റോൾബാക്ക് ചെയ്യുക",
-       "rollback_short": "റോൾബാക്ക്",
        "rollbacklink": "റോൾബാക്ക്",
        "rollbacklinkcount": "{{PLURAL:$1|ഒരു തിരുത്ത്|$1 തിരുത്തുകൾ}} മുൻപ്രാപനം ചെയ്യുക",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|ഒന്നിലധികം തിരുത്തുകൾ|$1 എണ്ണത്തിലധികം തിരുത്തുകൾ}} മുൻപ്രാപനം ചെയ്യുക",
        "namespace": "നാമമേഖല:",
        "invert": "വിപരീതം തിരഞ്ഞെടുക്കുക",
        "tooltip-invert": "തിരഞ്ഞെടുക്കുന്ന നാമമേഖലയിലെ (ശരി ചേർത്തിട്ടുണ്ടെങ്കിൽ കൂടെ അനുബന്ധ നാമമേഖലയിലേയും) താളുകളിലെ മാറ്റങ്ങൾ മറയ്ക്കാൻ ഈ പെട്ടിയിൽ ശരി ചേർക്കുക",
+       "tooltip-whatlinkshere-invert": "തിരഞ്ഞെടുത്ത നാമമേഖലയിലെ താളുകളിലേക്കുള്ള കണ്ണികൾ മറയ്ക്കുന്നതിനായി ഇവിടെ ശരി ചേർക്കുക.",
        "namespace_association": "അനുബന്ധനാമമേഖലകൾ",
        "tooltip-namespace_association": "താങ്കൾ തിരഞ്ഞെടുത്ത നാമമേഖലയുടെ കൂടെ സംവാദം അല്ലെങ്കിൽ വിഷയ നാമമേഖലയും കൂടെ ചേർക്കണമെങ്കിൽ ഇവിടെ ശരി ചേർക്കുക",
        "blanknamespace": "(മുഖ്യം)",
        "thumbnail-temp-create": "താത്കാലിക ലഘുചിത്ര പ്രമാണം സൃഷ്ടിക്കാനായില്ല",
        "thumbnail-dest-create": "ലഘുചിത്രം ലക്ഷ്യത്തിൽ സേവ് ചെയ്യാനായില്ല",
        "thumbnail_invalid_params": "ലഘുചിത്രത്തിനാവശ്യമായ ചരങ്ങൾ അസാധുവാണ്",
+       "thumbnail_toobigimagearea": "$1  വലിപ്പത്തിലും കൂടുതലുള്ള പ്രമാണം",
        "thumbnail_dest_directory": "ലക്ഷ്യ ഡയറക്ടറി സൃഷ്ടിക്കുവാൻ സാധിച്ചില്ല",
        "thumbnail_image-type": "ചിത്രത്തിന്റെ തരം പിന്തുണക്കപ്പെട്ടതല്ല",
        "thumbnail_gd-library": "അപൂർണ്ണമായ ജി.ഡി. ലൈബ്രറി ക്രമീകരണം: ഫങ്ഷൻ $1 ലഭ്യമല്ല",
        "import-logentry-interwiki": "$1 അന്തർവിക്കി ഇറക്കുമതി ചെയ്തു",
        "import-logentry-interwiki-detail": "$2 എന്നതിൽ നിന്ന് {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} ഇറക്കുമതി ചെയ്തു",
        "javascripttest": "ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണം",
-       "javascripttest-title": "$1 പരീക്ഷണങ്ങൾ നടക്കുന്നുണ്ട്",
        "javascripttest-pagetext-noframework": "ഈ താൾ ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണങ്ങൾ നടത്താനായി മാറ്റിവെച്ചിരിക്കുന്നതാണ്.",
        "javascripttest-pagetext-unknownframework": "അപരിചിതമായ പരീക്ഷണ ചട്ടക്കൂട് \"$1\".",
+       "javascripttest-pagetext-unknownaction": "അജ്ഞാതമായ പ്രവൃത്തി \"$1\".",
        "javascripttest-pagetext-frameworks": "താഴെക്കൊടുത്തിരിക്കുന്നവയിൽ ഒരു പരീക്ഷണ ചട്ടക്കൂട് തിരഞ്ഞെടുക്കുക: $1",
        "javascripttest-pagetext-skins": "പരീക്ഷണങ്ങൾ നടത്താനുള്ള ദൃശ്യരൂപം തിരഞ്ഞെടുക്കുക:",
        "javascripttest-qunit-intro": "mediawiki.org-ലെ [$1 പരീക്ഷണ സഹായി] കാണുക.",
-       "javascripttest-qunit-heading": "മീഡിയവിക്കി ജാവാസ്ക്രിപ്റ്റ് ക്യൂയൂണിറ്റ് പരീക്ഷണോപാധി",
        "tooltip-pt-userpage": "താങ്കളുടെ ഉപയോക്തൃതാൾ",
        "tooltip-pt-anonuserpage": "താങ്കളുടെ ഐ.പി. വിലാസത്തിന്റെ ഉപയോക്തൃതാൾ",
        "tooltip-pt-mytalk": "താങ്കളുടെ സംവാദം താൾ",
        "watchlisttools-edit": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക കാണുക, തിരുത്തുക",
        "watchlisttools-raw": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ മൂലരൂപം തിരുത്തുക",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|സംവാദം]])",
-       "unknown_extension_tag": "അജ്ഞാതമായ അനുബന്ധ റ്റാഗ് \"$1\"",
        "duplicate-defaultsort": "'''മുന്നറിയിപ്പ്:''' ക്രമപ്പെടുത്താനുള്ള ചാവിയായ \"$2\" മുമ്പ് ക്രമപ്പെടുത്താനുള്ള ചാവിയായിരുന്ന \"$1\" എന്നതിനെ അതിലംഘിക്കുന്നു.",
        "duplicate-displaytitle": "<strong>മുന്നറിയിപ്പ്:</strong> പ്രദർശിപ്പിക്കുന്ന തലക്കെട്ട് \"$2\" മുമ്പ് പ്രദർശിപ്പിച്ചിരുന്ന തലക്കെട്ട് \"$1\" എന്നതിനെ അതിലംഘിക്കുന്നു.",
        "version": "പതിപ്പ്",
        "version-entrypoints-header-url": "യു.ആർ.എൽ.",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath ലേഖനപഥം]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath സ്ക്രിപ്റ്റ് പഥം]",
+       "version-libraries": "ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള ലൈബ്രറികൾ",
+       "version-libraries-library": "ലൈബ്രറി",
+       "version-libraries-version": "പതിപ്പ്",
        "redirect": "പ്രമാണത്താൽ, ഉപയോക്താവിനാൽ, താളിനാൽ അഥവാ നാൾപ്പതിപ്പ് ഐ.ഡി.യാൽ ചെയ്യുന്ന തിരിച്ചുവിടൽ",
        "redirect-legend": "ഒരു പ്രമാണത്തിലോട്ടോ താളിലോട്ടോ ഉള്ള തിരിച്ചുവിടൽ",
        "redirect-summary": "ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിലേയ്ക്കോ (പ്രമാണത്തിന്റെ പേര് തന്നിട്ടുണ്ട്), ഒരു താളിലേയ്ക്കോ (നാൾപ്പതിപ്പിന്റെ ഐ.ഡി. അല്ലെങ്കിൽ താൾ തന്നിട്ടുണ്ട്), അല്ലെങ്കിൽ ഒരു ഉപയോക്തൃതാളിലേയ്ക്കോ (ഉപയോക്താവിന്റെ സംഖ്യാ ഐ.ഡി. തന്നിട്ടുണ്ട്) തിരിച്ചുവിടുന്നു. ഉപയോഗം: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],  [[{{#Special:Redirect}}/revision/328429]], അല്ലെങ്കിൽ [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "താങ്കൾ വ്യക്തമാക്കിയ നാൾപ്പതിപ്പ് നിലവിലില്ല.",
        "dberr-problems": "ക്ഷമിക്കണം! ഈ സൈറ്റിൽ സാങ്കേതിക തകരാറുകൾ അനുഭവപ്പെടുന്നുണ്ട്.",
        "dberr-again": "കുറച്ച് മിനിട്ടുകൾ കാത്തിരുന്ന് വീണ്ടും തുറക്കുവാൻ ശ്രമിക്കുക.",
-       "dberr-info": "(വിവരശേഖര സെർവറുമായി ബന്ധപ്പെടാൻ പറ്റിയില്ല: $1)",
-       "dberr-info-hidden": "(à´¡àµ\87à´±àµ\8dറാബàµ\87à´¸àµ\8d à´¸àµ\86ർവറàµ\81മായി à´¬à´¨àµ\8dധപàµ\8dà´ªàµ\86à´\9fà´°àµ\81à´¤àµ\8d)",
+       "dberr-info": "(വിവരശേഖരം എടുക്കാൻ പറ്റിയില്ല: $1)",
+       "dberr-info-hidden": "(വിവരശàµ\87à´\96à´°à´\82 à´\8eà´\9fàµ\81à´\95àµ\8dà´\95ാനാവിലàµ\8dà´²)",
        "dberr-usegoogle": "അതേസമയം താങ്കൾക്ക് ഗൂഗിൾ വഴി തിരയുവാൻ ശ്രമിക്കാവുന്നതാണ്.",
        "dberr-outofdate": "അവരുടെ പക്കലുള്ള നമ്മുടെ ഉള്ളടക്കത്തിന്റെ സൂചികകൾ കാലഹരണപ്പെട്ടതാകാമെന്ന് ഓർക്കുക.",
        "dberr-cachederror": "ആവശ്യപ്പെട്ട താളിന്റെ കാഷ് ചെയ്യപ്പെട്ട പകർപ്പാണിത്, ഇത് ഇപ്പോഴുള്ളതാകണമെന്നില്ല.",
index e584443..1c24015 100644 (file)
        "watchlisttools-edit": "पहाऱ्याची  सूची पहा आणि संपादित करा",
        "watchlisttools-raw": "नित्य पहाण्याची कच्ची-सूची संपादित करा",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|चर्चा]])",
-       "unknown_extension_tag": "अज्ञात विस्तार खूण \"$1\"",
        "duplicate-defaultsort": "'''ताकिद:''' डिफॉल्ट सॉर्ट की \"$2\" ओवर्राइड्स अर्लीयर डिफॉल्ट सॉर्ट की \"$1\".",
        "version": "आवृत्ती",
        "version-extensions": "स्थापित विस्तार",
index e9504f5..f7a6aeb 100644 (file)
@@ -46,7 +46,7 @@
        "tog-shownumberswatching": "Tunjukkan bilangan pemantau",
        "tog-oldsig": "Tanda tangan yang sedia ada:",
        "tog-fancysig": "Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)",
-       "tog-uselivepreview": "Gunakan pralihat langsung (dalam percubaan)",
+       "tog-uselivepreview": "Gunakan prebiu langsung",
        "tog-forceeditsummary": "Tanya saya jika ringkasan suntingan kosong",
        "tog-watchlisthideown": "Sembunyikan suntingan saya daripada senarai pantau",
        "tog-watchlisthidebots": "Sembunyikan suntingan bot daripada senarai pantau",
        "pool-queuefull": "Giliran kolam telah penuh",
        "pool-errorunknown": "Ralat tak diketahui",
        "pool-servererror": "Perkhidmatan kaunter tabung tidak disediakan ($1).",
+       "poolcounter-usage-error": "Ralat penggunaan: $1",
        "aboutsite": "Perihal {{SITENAME}}",
        "aboutpage": "Project:Perihal",
        "copyright": "Kandungan disediakan di bawah $1 melainkan dinyatakan sebaliknya.",
        "filerenameerror": "Nama fail \"$1\" tidak dapat ditukarkan kepada \"$2\".",
        "filedeleteerror": "Fail \"$1\" tidak dapat dihapuskan.",
        "directorycreateerror": "Direktori \"$1\" gagal diciptakan.",
+       "directoryreadonlyerror": "Direktori \"$1\" boleh dibaca sahaja.",
+       "directorynotreadableerror": "Direktori \"$1\" tidak boleh dibaca.",
        "filenotfound": "Fail \"$1\" tidak dijumpai.",
        "unexpected": "Nilai tanpa diduga: \"$1\"=\"$2\".",
        "formerror": "Ralat: Borang tidak dapat dikirim.",
        "anoneditwarning": "<strong>Amaran:</strong> Anda tidak log masuk. Alamat IP anda akan disiarkan kepada umum jika anda membuat sebarang suntingan. Jika anda <strong>[$1 log masuk]</strong> atau <strong>[$2 membuka akaun]</strong>, suntingan anda akan diatribusikan kepada nama pengguna anda di samping manfaat-manfaat lain.",
        "anonpreviewwarning": "''Anda belum log masuk. Jika anda menyimpan laman ini, alamat IP anda akan direkodkan dalam sejarah penyuntingan laman ini.''",
        "missingsummary": "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
+       "selfredirect": "<strong>Amaran:</strong> Anda sedang melencongkan laman ini kepada dirinya sendiri.\nMungkin anda telah menyatakan sasaran yang salah untuk lencongan ini ataupun sedang tersalah menyunting halaman.\nJika anda mengklik \"{{int:savearticle}}\" semula, maka lencongan tetap akan dihasilkan.",
        "missingcommenttext": "Sila masukkan komen dalam ruangan di bawah.",
        "missingcommentheader": "'''Peringatan:''' Anda tidak menyatakan tajuk bagi komen ini. Klik '''{{int:savearticle}}''' sekali lagi untuk menyimpan suntingan ini tanpa tajuk.",
        "summary-preview": "Pralihat ringkasan:",
        "content-model-text": "teks biasa",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objek kosong",
+       "content-json-empty-array": "Tatasusunan kosong",
        "duplicate-args-category": "Laman yang menggunakan argumen pendua dalam panggilan templat",
        "duplicate-args-category-desc": "Laman ini mengandungi panggilan templat yang menggunakan pendua argumen seperti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.",
        "history-feed-empty": "Laman yang diminta tidak wujud.\nMungkin ia telah dihapuskan atau namanya telah ditukar.\nCuba [[Special:Search|cari]] laman lain yang mungkin berkaitan.",
        "rev-deleted-comment": "(ringkasan suntingan dibuang)",
        "rev-deleted-user": "(nama pengguna dibuang)",
-       "rev-deleted-event": "(entri dibuang)",
+       "rev-deleted-event": "(butiran log terpadam)",
        "rev-deleted-user-contribs": "[nama pengguna atau alamat IP dibuang - suntingan disembunyikan daripada sumbangan]",
        "rev-deleted-text-permission": "Semakan laman ini telah '''dihapuskan'''.\nPerinciannya mungkin ada di dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "rev-suppressed-text-permission": "Semakan bagi laman ini telah <strong>diselindungkan</strong>.\nButiran boleh didapati dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log penyelindungan].",
        "revdelete-legend": "Tetapkan batasan:",
        "revdelete-hide-text": "Teks semakan",
        "revdelete-hide-image": "Sembunyikan kandungan fail",
-       "revdelete-hide-name": "Sembunyikan tindakan dan sasaran",
+       "revdelete-hide-name": "Sembunyikan sasaran dan parameter",
        "revdelete-hide-comment": "Ringkasan suntingan",
        "revdelete-hide-user": "Nama pengguna/IP penyunting",
        "revdelete-hide-restricted": "Sekat data daripada penyelia dan pengguna lain",
        "right-protect": "Mengubah tahap perlindungan serta menyunting halaman yang dilindungi lata",
        "right-editprotected": "Menyunting halaman-halaman yang dilindungi sebagai \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Menyunting halaman-halaman yang dilindungi sebagai \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Menyunting model kandungan laman",
        "right-editinterface": "Menyunting antara muka pengguna",
        "right-editusercssjs": "Menyunting fail CSS dan JavaScript pengguna lain",
        "right-editusercss": "Menyunting fail CSS pengguna lain",
        "action-viewmywatchlist": "melihat senarai pantau sendiri",
        "action-viewmyprivateinfo": "melihat maklumat peribadi sendiri",
        "action-editmyprivateinfo": "menyunting maklumat peribadi sendiri",
+       "action-editcontentmodel": "menyunting model kandungan laman",
        "nchanges": "$1 perubahan",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak lawatan terakhir}}",
        "enhancedrc-history": "sejarah",
        "deleteprotected": "Anda tidak boleh menghapuskan laman ini kerana ia telah dilindungi.",
        "deleting-backlinks-warning": "'''Amaran:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Terdapat laman lain]] yang berpaut atau bertransklusi dengan laman yang hendak anda hapus ini.",
        "rollback": "Undurkan suntingan.",
-       "rollback_short": "Undur",
        "rollbacklink": "undur",
        "rollbacklinkcount": "mengundurkan $1 {{PLURAL:$1|suntingan}}",
        "rollbacklinkcount-morethan": "mengundurkan lebih daripada $1 {{PLURAL:$1|suntingan}}",
        "thumbnail-temp-create": "Fail gambar kenit sementara tidak dapat dibuat",
        "thumbnail-dest-create": "Gambar kenit tidak dapat disimpan dalam destinasi",
        "thumbnail_invalid_params": "Parameter gambar kenit tidak sah",
+       "thumbnail_toobigimagearea": "Fail dengan dimensi melebihi $1",
        "thumbnail_dest_directory": "Direktori destinasi gagal diwujudkan",
        "thumbnail_image-type": "Jenis imej tidak disokong",
        "thumbnail_gd-library": "Tatarajah perpustakaan GD tidak lengkap: kehilangan fungsi $1",
        "import-logentry-interwiki": "$1 dipindahkan ke wiki lain",
        "import-logentry-interwiki-detail": "$1 semakan diimportkan daripada $2",
        "javascripttest": "Ujian JavaScript",
-       "javascripttest-title": "Ujian $1 sedang dijalankan",
        "javascripttest-pagetext-noframework": "Laman ini ditempah untuk menjalankan ujian JavaScript.",
        "javascripttest-pagetext-unknownframework": "Kerangka \"$1\" tidak dikenali.",
+       "javascripttest-pagetext-unknownaction": "Tindakan \"$1\" tidak dikenali.",
        "javascripttest-pagetext-frameworks": "Sila pilih salah satu kerangka yang berikut: $1",
        "javascripttest-pagetext-skins": "Sila pilih satu kulit untuk menjalankan ujian:",
        "javascripttest-qunit-intro": "Lihat [$1 pendokumenan ujian] di mediawiki.org.",
-       "javascripttest-qunit-heading": "Suit ujian MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Laman pengguna anda",
        "tooltip-pt-anonuserpage": "Laman pengguna bagi alamat IP anda",
        "tooltip-pt-mytalk": "Laman perbincangan anda",
        "hijri-calendar-m11": "Zulkaedah",
        "hijri-calendar-m12": "Zulhijah",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bincang]])",
-       "unknown_extension_tag": "Tag penyambung \"$1\" tidak dikenali",
        "duplicate-defaultsort": "'''Amaran''': Kunci susunan asali \"$2\" membatalkan kunci susunan asali \"$1\" yang sebelumnya.",
        "duplicate-displaytitle": "<strong>Amaran:</strong> Tajuk paparan \"$2\" mengatasi tajuk paparan awal \"$1\".",
        "invalid-indicator-name": "<strong>Ramat:</strong> Atribut <code>name</code> penanda status halaman tidak boleh dibiarkan kosong.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Laluan rencana]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Laluan skrip]",
+       "version-libraries": "Perpustakaan terpasang",
+       "version-libraries-library": "Perpustakaan",
+       "version-libraries-version": "Versi",
        "redirect": "Lencongkan mengikut ID fail, pengguna, halaman atau semakan",
        "redirect-legend": "Lencongkan ke fail atau halaman",
        "redirect-summary": "Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan atau ID halaman) atau halaman pengguna (dengan ID pengguna berangka). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
        "specialpages-group-wiki": "Data dan peralatan",
        "specialpages-group-redirects": "Laman khas yang melencong",
        "specialpages-group-spam": "Alatan spam",
+       "specialpages-group-developer": "Alatan pembangun",
        "blankpage": "Laman kosong",
        "intentionallyblankpage": "Laman ini sengaja dibiarkan kosong dan digunakan untuk kerja-kerja ujian dan sebagainya.",
        "external_image_whitelist": " #Jangan ubah baris ini<pre>\n#Letakkan senarai ungkapan nalar (tidak termasuk apitan //) di baris kosong di bawah\n#Setiap ungkapan akan dipadankan dengan pautan imej luar\n#Pautan yang sepadan sahaja akan dijadikan imej, jika tidak hanya pautan kepada imej akan muncul\n#Baris yang bermula dengan aksara # diabaikan\n#Ini sensitif kepada atur huruf\n\n#Jangan letak ungkapan nalar di bawah baris ini dan jangan ubah baris ini</pre>",
        "compare-revision-not-exists": "Semakan yang anda nyatakan tidak wujud.",
        "dberr-problems": "Harap maaf. Tapak web ini dilanda masalah teknikal.",
        "dberr-again": "Cuba tunggu selama beberapa minit dan muat semula.",
-       "dberr-info": "(Tidak dapat menghubungi pelayan pangkalan data: $1)",
-       "dberr-info-hidden": "(Pelayan pangkalan data tidak dapat dihubungi)",
+       "dberr-info": "(Tidak dapat mengakses pangkalan data: $1)",
+       "dberr-info-hidden": "(Tidak dapat mengakses pangkalan data)",
        "dberr-usegoogle": "Buat masa ini, anda boleh cuba mencari melalui Google.",
        "dberr-outofdate": "Sila ambil perhatian bahawa indeks mereka bagi kandungan kami mungkin sudah ketinggalan zaman.",
        "dberr-cachederror": "Yang berikut ialah salinan bagi laman yang diminta yang diambil daripada cache, dan mungkin bukan yang terkini.",
index 545b7bb..4215b6b 100644 (file)
        "iranian-calendar-m9": "Azar",
        "iranian-calendar-m10": "Dey",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussjoni]])",
-       "unknown_extension_tag": "Estensjoni tat-tag mhux magħrufa \"$1\"",
        "duplicate-defaultsort": "'''Twissija:''' iċ-ċavetta tal-issortjar oriġinali \"$2\" tissostitwixxi dik preċedenti \"$1\".",
        "version": "Verżjoni",
        "version-extensions": "Estensjonijiet installati",
index d5ea8f7..b59fb15 100644 (file)
@@ -21,7 +21,7 @@
        "tog-watchdefault": "Kā goá pian-chi̍p kòe ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
        "tog-watchmoves": "Kā goá soá ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
        "tog-watchdeletion": "Kā goá thâi tiāu ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
-       "tog-minordefault": "Chiām-tēng bī-lâi ê siu-kái lóng sī sió-siu-ká",
+       "tog-minordefault": "Chiām-tēng bī-lâi ê siu-kái lóng sī sió siu-kái",
        "tog-previewontop": "Sûn-khoàⁿ ê lōe-iông tī pian-chi̍p keh-á thâu-chêng",
        "tog-previewonfirst": "Thâu-pái pian-chi̍p seng khoàⁿ-māi",
        "tog-enotifwatchlistpages": "Kam-sī-tuann ū ē bûn-tsiunn nā ū kái-piàn, kià tiān-tsú-phue hōo guá.",
@@ -83,7 +83,7 @@
        "february-gen": "Jī-goe̍h",
        "march-gen": "Saⁿ-goe̍h",
        "april-gen": "Sì-goe̍h",
-       "may-gen": "Gō·-goe̍h",
+       "may-gen": "Gō͘-goe̍h",
        "june-gen": "La̍k-goe̍h",
        "july-gen": "Chhit-goe̍h",
        "august-gen": "Peh-goe̍h",
        "category-media-header": "Tī lūi-pia̍t \"$1\" ê mûi-thé",
        "category-empty": "''Chit-má chit ê lūi-pia̍t  bô ia̍h ia̍h-sī mûi-thé.''",
        "hidden-categories": "{{PLURAL:$1|Hidden category|Chhàng khí-lâi ê lūi-pia̍t}}",
-       "hidden-category-category": "Chhàng khí--lâi ê lūi piat",
+       "hidden-category-category": "Chhàng--khí-lâi ê lūi piat",
        "category-subcat-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê ē-lūi-pia̍t.|Chit ê lūi-piat ū ē-bīn {{PLURAL:$1| ê ē-lūi-piat|$1 ê ē-lūi-piat}}, choân-pō͘ $2 ê.}}",
        "category-subcat-count-limited": "Chit ê lūi-piat ū ē-bīn ê {{PLURAL:$1| ē-lūi-pia̍t|$1 ē-lūi-pia̍t}}.",
        "category-article-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê ia̍h.|Ē-bīn {{PLURAL:$1|bīn ia̍h sī|$1bīn ia̍h sī}} tī chit lūi-pia̍t, choân-pō͘ $2 bīn ia̍h}}",
        "category-file-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê tóng-àn.|Ē-bīn {{PLURAL:$1| ê tóng-àn sī|$1 ê tóng-àn sī}} tī chit lūi-pia̍t, choân-pō͘ $2 ê tóng-àn}}",
        "category-file-count-limited": "Chit-má chit-ê lūi-pia̍t ū {{PLURAL:$1| ê tóng-àn}}",
        "listingcontinuesabbrev": "(chiap-sòa thâu-chêng)",
-       "index-category": "Ū sik-ín ê ia̍h",
+       "index-category": "Ū sek-ín ê ia̍h",
        "noindex-category": "Bī sik-ín ê ia̍h.",
        "broken-file-category": "Sit-khì tóng-àn liân-kiat ê ia̍h.",
        "about": "Koan-hē",
        "anontalk": "Chit ê IP ê thó-lūn-ia̍h",
        "navigation": "Se̍h chām",
        "and": "&#32;kap",
-       "qbfind": "Chh",
+       "qbfind": "Chhōe",
        "qbbrowse": "Liū-lám",
        "qbedit": "Siu-kái",
        "qbpageoptions": "Chit ia̍h",
index bbe6a1c..525b388 100644 (file)
        "pool-queuefull": "A córa 'e fatiche è chiena",
        "pool-errorunknown": "Errore scanusciuto",
        "pool-servererror": "'O servizio contatore d''e fatiche nun è a disposizióne ($1).",
+       "poolcounter-usage-error": "Errore d'uso: $1",
        "aboutsite": "'Nfrummazione ncòpp'a {{SITENAME}}",
        "aboutpage": "Project:'Nfrummazione",
        "copyright": "Cuntenute suggiette a licienza 'e auso $1 se nun fuje ritto atro.",
        "anoneditwarning": "'''Attenzione:''' Nun avite fatto l'acciesso. 'A cronologgia d' 'a vosta sarrà visibbele pubbrecamente si facite cocche cagnamiento. Si <strong>[$1 tràse]</strong> o <strong>[$2 crìe nu cunto]</strong>, 'e cagnamiente vuoste ve sarranno attribbuite a vvuje, nzieme a n'ati migliuramente.",
        "anonpreviewwarning": "''Nun avite fatto 'o login. Sarvann' 'a paggena, l'indirizzo IP d' 'o vuosto sarrà riggistrato dint'a cronologgia.''",
        "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
-       "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
+       "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nPuò darse c'avites specificato 'o pizzo sbagliato p' 'o redirect, o ca stavate cagnanno 'o pizzo sbagliato.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
        "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
        "missingcommentheader": "'''Attenziò:''' nun s'è specificato l'oggetto/titolo 'e stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo abbacante.",
        "summary-preview": "Anteprimma'e l'oggetto:",
        "content-model-text": "testo nurmale",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Oggetto abbacante",
+       "content-json-empty-array": "Array abbacante",
        "duplicate-args-category": "Paggene c'ausano argomiente dupprecate dint' 'e chiammate a 'e mudelle",
        "duplicate-args-category-desc": "'A paggena tene chiammate a mudelle c'ausassero argomiente dupprecate, comme p'esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenziò:''' Sta paggena cuntene troppe chiammate a 'e funzione parser.\n\nN'avesse 'a tené meno 'e $2, p' 'o mumento ce ne {{PLURAL:$1|stà $1|stanno $1}}.",
        "history-feed-empty": "'A paggena addimannata nun esiste.\nPuò darsi ca è stata scancellata d' 'a wiki, o s'è cagnato 'o nomme.\nProva a vedé [[Special:Search|dint' 'a wiki]] si ce stanno nnove paggene.",
        "rev-deleted-comment": "(Oggetto d' 'o cagnamiento luvato)",
        "rev-deleted-user": "(nomme utente luvato)",
-       "rev-deleted-event": "(azione d' 'o log luvata)",
+       "rev-deleted-event": "(dettaglie d' 'o log luvate)",
        "rev-deleted-user-contribs": "[nomme utente o indirizzo IP luvato - cagnamiento annascunnuto d' 'a cronologgia]",
        "rev-deleted-text-permission": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nAscìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} riggistro d' 'e scancellamiente] pe ne sapé 'e cchiù.",
        "rev-suppressed-text-permission": "Sta verziona d' 'a paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
        "revdelete-legend": "Miette 'e limmete 'e visibilità",
        "revdelete-hide-text": "Testo d' 'a verziona",
        "revdelete-hide-image": "Annascunne 'e cuntenute d' 'o file",
-       "revdelete-hide-name": "Annascunne aziona e l'oggetto 'e cchesta",
+       "revdelete-hide-name": "Annascunne l'oggetto e parametre",
        "revdelete-hide-comment": "Modifeca oggetto",
        "revdelete-hide-user": "Nomme o indirizzo IP 'e ll'autore",
        "revdelete-hide-restricted": "Annascunne 'e nfurmaziune 'nnecate pure a l'ammenistrature",
        "right-viewmyprivateinfo": "Vide 'e proprie date private (e.g. e-mail, nomme overo)",
        "right-editmyprivateinfo": "Cagna 'e date perzunale proprie (p'esempio: e-mail, nomme overo)",
        "right-editmyoptions": "Cagna 'e preferenze proprie",
-       "right-rollback": "Annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particolare",
+       "right-rollback": "Annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particulare",
        "right-markbotedits": "Nzégna 'e cagnamiente suggette a rollback comme affettuate 'a nu bot",
        "right-noratelimit": "Nun suggetto a lemmeto d'aziune",
        "right-import": "Carreca paggene 'a n'ati wiki",
        "action-suppressionlog": "vide stu riggistro privato",
        "action-block": "blocca 'e cagnamiente 'a parte 'e st'utente",
        "action-protect": "cagna 'e livelle 'e prutezione pe' sta paggena",
-       "action-rollback": "annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particolare",
+       "action-rollback": "annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particulare",
        "action-import": "carreca paggene 'a n'ata wiki",
        "action-importupload": "carreca paggene 'a n'upload 'e file",
        "action-patrol": "nzegna 'e cagnamiente 'e l'ati utente comme cuntrullate",
        "uploaderror": "Errore a carrecà",
        "upload-recreate-warning": "'Attenziò'': nu file cu stu nomme è stato scancellato o spustato.'''\n'O riggistro d' 'e scancellamiente e d' 'e spustamiente 'e sta paggena è stato scritto ccà abbascio pe' ffà comodo:",
        "uploadtext": "Ausà 'o modulo ccà sotto pe' carrecà file nuove. Pe' vedé o ascià 'e file carrecate già, vide 'o [[Special:FileList|riggistro 'e file carrecate]]. Càrreche 'e file e virzione nove d' 'e file songo riggistrate dint' 'o [[Special:Log/upload|riggistro d'upload]], 'e scancellamiente dint' 'o [[Special:Log/delete|riggistro ccà]].\n\nPe' nzertà nu file dint'a na paggena, allora facite nu cullegamento 'e stu tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' p'ausà a verziona cumpleta d' 'o file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' p'ausà na verziona luonga 200 pixel nzertata dint'a na cascia, allineata a manca e cu nu 'testo alternativo' comme didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe' crià nu cullegamento diretto a 'o file senza 'o fà vedé",
-       "upload-permitted": "Tipe 'e file permesse: $1.",
-       "upload-preferred": "Tipe 'e file cunzigliate: $1.",
-       "upload-prohibited": "Tipe 'e file nun permesse: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipo 'e file permesso|Tipe 'e file permesse}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo 'e file cunzigliato|Tipe 'e file cunzigliate}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo 'e file nun permesso|Tipe 'e file nun permesse}}: $1.",
        "uploadlogpage": "Riggistro 'e carreche",
        "uploadlogpagetext": "Ccà abbascio song'alencate l'urdeme file carrecate.\nCuntrullate 'a [[Special:NewFiles|gallaria d' 'e file nuove]] pe' ve ffà na guardata cchiù visuale 'e tutto.",
        "filename": "Nomme d' 'o file",
        "statistics-users-active-desc": "Utente c'hanno fatto coccosa dint' 'a {{PLURAL:$1|l'urdemo juorno|l'urdeme $1 juorne}}",
        "pageswithprop": "Paggene cu na prupietà 'e paggena",
        "pageswithprop-legend": "Paggene cu na prupietà 'e paggena",
-       "pageswithprop-text": "Sta paggena alenca 'e paggene c'ausano na prupietà particolare 'e paggena.",
+       "pageswithprop-text": "Sta paggena alenca 'e paggene c'ausano na prupietà particulare 'e paggena.",
        "pageswithprop-prop": "Nomme d' 'a prupietà:",
        "pageswithprop-submit": "Vàje",
        "pageswithprop-prophidden-long": "valore d' 'a prupietà d' 'o testo luongo annascunnuto ($1)",
        "deleteprotected": "Nun putite scancellà sta paggena pecché è stata prutetta.",
        "deleting-backlinks-warning": "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|ati paggene]] cunteneno cullegamiente o paggene appennute â n'ata paggena ca state pe' scancellà.",
        "rollback": "Ausa na revizione 'e primma",
-       "rollback_short": "Annulla",
        "rollbacklink": "a vascio",
        "rollbacklinkcount": "annulla {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
        "rollbacklinkcount-morethan": "annulla cchiù 'e {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
        "namespace": "Namespace:",
        "invert": "abbarruca 'a sceveta",
        "tooltip-invert": "Nzegna sta casciulella p'annaconnere 'e cagnamiente a 'e paggene ca stanno dint' 'o namespace c'avite scigliuto (e 'o namespace stesso si l'avite scigliuto)",
+       "tooltip-whatlinkshere-invert": "Nzignate sta casciulella pe' putè annaconnere 'e link 'e paggene dint' 'o namespace scigliuto.",
        "namespace_association": "Namespace associate",
        "tooltip-namespace_association": "Nzegna sta casciulella pe ncludere 'e cchiacchiere o l'oggetto d' 'o namespace associato c' 'o namespace scigliuto",
        "blanknamespace": "(Prencepale)",
        "move-over-sharedrepo": "== 'O file esiste ==\n[[:$1]] esiste ncopp'a l'archivio spartuto. Spustanno 'o file ncopp'a stu titolo sovrascreverrà 'o file spartuto.",
        "file-exists-sharedrepo": "'O nomme d' 'o file c'avite scigliuto se sta ausanno dint'a l'archivio spartuto.\nPe' piacere, scigliete n'atu nomme.",
        "export": "Spurta 'e ppaggene",
-       "exporttext": "Vuje putite espurtà 'e teste e cagnà 'a cronologgia 'e na paggena particolare o n'inzieme 'e paggena ca stessero dint' 'a cocche XML.\nChisto po' essere 'mpurtato int'a n'ata wiki ausanno [[Special:Import|mporta pàggene]] 'e MediaWiki.\n\nPe' spurtà paggene, mettite 'o titolo dint' 'e casciulelle ccà abbascio, nu titolo pe' linea e sciglite si vulite 'a verziona 'e mò cu tutt' 'e verziun' 'assieme, o pùre sulamente 'a verziona 'e mò c' 'a nfurmaziona ncopp' 'a ll'urdemo cagnamiento.\n\nComme urtema possibbiletà, putite pure ausà nu cullegamento, p'esempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] p' 'a pàggena \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "Vuje putite espurtà 'e teste e cagnà 'a cronologgia 'e na paggena particulare o n'inzieme 'e paggena ca stessero dint' 'a cocche XML.\nChisto po' essere 'mpurtato int'a n'ata wiki ausanno [[Special:Import|mporta pàggene]] 'e MediaWiki.\n\nPe' spurtà paggene, mettite 'o titolo dint' 'e casciulelle ccà abbascio, nu titolo pe' linea e sciglite si vulite 'a verziona 'e mò cu tutt' 'e verziun' 'assieme, o pùre sulamente 'a verziona 'e mò c' 'a nfurmaziona ncopp' 'a ll'urdemo cagnamiento.\n\nComme urtema possibbiletà, putite pure ausà nu cullegamento, p'esempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] p' 'a pàggena \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Spurta tutt' 'e paggene",
        "exportcuronly": "Appenne sulamente 'a verziona 'e mo, e nun tutt' 'a cronologgia",
        "exportnohistory": "----\n'''Vedite bbuono:''' 'A funzione 'esportazione d' 'a storia sana d' 'e paggene, ausanno stu modulo, è stata stutata pe' mutive 'e prestaziune.",
        "thumbnail-temp-create": "Nun se può crià na miniatura temporanea d' 'o file",
        "thumbnail-dest-create": "Nun se può astipà 'a miniatura dint' 'a destinazione",
        "thumbnail_invalid_params": "Parametre 'e miniatura invalide",
+       "thumbnail_toobigimagearea": "Diminziona d' 'o File cchiù grossa d'$1",
        "thumbnail_dest_directory": "Nun se può crià 'a cartella 'e destinazione",
        "thumbnail_image-type": "'O tipo d'immaggene nun è suppurtato",
        "thumbnail_gd-library": "Configurazione d' 'a libbreria GD incompleta: funziona perza $1",
        "import-logentry-interwiki": "trasferito 'a n'ata wiki 'a paggena $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|verzione|verziune}} mpurtate 'a $2",
        "javascripttest": "Test JavaScript",
-       "javascripttest-title": "Secutanno test pe' $1",
        "javascripttest-pagetext-noframework": "Sta paggena è riservata pe' l'esecuziune d' 'e test 'e Javascript.",
        "javascripttest-pagetext-unknownframework": "Ambiente 'e test scanusciuto \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Azione scanusciuta \"$1\".",
        "javascripttest-pagetext-frameworks": "Pe' piacere sciglite uno 'e ll'ambiente 'e test ccà abbascio: $1",
        "javascripttest-pagetext-skins": "Sciglite nu skin pe' ne fà 'e test:",
        "javascripttest-qunit-intro": "Vedite 'a [$1 documentaziona d' 'o test] ncopp'a mediawiki.org.",
-       "javascripttest-qunit-heading": "Ambiente 'e test MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "A toja paggena utente",
        "tooltip-pt-anonuserpage": "'A paggena utente pe l'IP ca vuje state cagnanno cumme",
        "tooltip-pt-mytalk": "A toja paggena 'e discussione",
        "watchlisttools-edit": "Vide e cagna l'elenco 'e paggene cuntrullate",
        "watchlisttools-raw": "Cagna l'elenco 'e paggene cuntrullate ncruro",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|chiacchiere]])",
-       "unknown_extension_tag": "Tag 'e stensione scanusciuto \"$1\"",
        "duplicate-defaultsort": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se miette ncuollo a nu valore 'e primma \"$1\".",
        "duplicate-displaytitle": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se scagna p' 'o valore 'e primma \"$1\".",
        "invalid-indicator-name": "<strong>Errore:</strong> attribbuto <code>name</code> 'e ll'innecature d' 'o stato d' 'a paggena nu può rummanè abbacante.",
        "version-poweredby-others": "ati",
        "version-poweredby-translators": "tradutture 'e translatewiki.net",
        "version-credits-summary": "Nuje vulessemo tené a mmente 'e perzune ccà abbascio pe' purtà rispetto a 'e cuntribbute 'e lloro ncopp'a [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nMediaWiki è destribbuita c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICOLARE. Iate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nAvísseve 'a ricevere [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggite sta paggena ncopp' 'a l'Internet].",
+       "version-license-info": "MediaWiki è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nMediaWiki è destribbuita c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICULARE. Iate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nAvísseve 'a ricevere [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggite sta paggena ncopp' 'a l'Internet].",
        "version-software": "Software installato",
        "version-software-product": "Prodotto",
        "version-software-version": "Verziona",
        "version-entrypoints": "Punte 'e trasuta 'e l'URL",
        "version-entrypoints-header-entrypoint": "Punto 'e trasuta",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Bibblioteche installate",
+       "version-libraries-library": "Bibblioteca",
+       "version-libraries-version": "Verziona",
        "redirect": "Rediretto 'a nu file, n'utente, na paggena o n'ID 'e na verziona",
        "redirect-legend": "Rediretto ca spuntasse a nu file o na paggena",
        "redirect-summary": "Sta pàggena speciale redireziona a nu file (dato 'o nomme d' 'o file), na pàggene (dato n'ID 'e verziona), o 'na pàggene utente (dato n'ID nummereca 'e l'utende). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "'A verziona c'avite specificato nun esiste.",
        "dberr-problems": "Scusatece! Stu sito sta passanno nu mumento tecnico malamente.",
        "dberr-again": "Aspettate cocche minuto e po' recarrecate.",
-       "dberr-info": "(Nun se può cuntattà 'o server d' 'o database: $1)",
-       "dberr-info-hidden": "(Nun se può cuntattà 'o server d' 'o database)",
+       "dberr-info": "(Nun se può trasì 'o database: $1)",
+       "dberr-info-hidden": "(Nun se può trasì 'o database)",
        "dberr-usegoogle": "Pe' tramente putite pruvà 'ascianno ncoppa Google.",
        "dberr-outofdate": "Vedite ca l'indice lloro d' 'e cuntenute nuoste ponno nun essere agghiurnate mò mò.",
        "dberr-cachederror": "Chest'è na copia \"cache\" d' 'a paggena c'avite asciato, e putesse nun essere agghiurnata.",
index cb69bd2..1176b6a 100644 (file)
@@ -41,7 +41,8 @@
                        "Wouterkoch",
                        "לערי ריינהארט",
                        "아라",
-                       "Chameleon222"
+                       "Chameleon222",
+                       "Helland"
                ]
        },
        "tog-underline": "Strek under lenker:",
@@ -69,7 +70,7 @@
        "tog-shownumberswatching": "Vis antall brukere som overvåker",
        "tog-oldsig": "Nåværende signatur:",
        "tog-fancysig": "Behandle signaturen som wikitekst (uten automatisk lenke)",
-       "tog-uselivepreview": "Bruk levende forhåndsvisning (eksperimentelt)",
+       "tog-uselivepreview": "Bruk levende forhåndsvisning",
        "tog-forceeditsummary": "Advar meg når jeg ikke gir noen redigeringsforklaring",
        "tog-watchlisthideown": "Skjul mine endringer fra overvåkningslisten",
        "tog-watchlisthidebots": "Skjul robotendringer fra overvåkningslisten",
        "pool-queuefull": "Prosesskøen er full",
        "pool-errorunknown": "Ukjent feil",
        "pool-servererror": "'Pool counter'-tjenesten er ikke tilgjengelig ($1).",
+       "poolcounter-usage-error": "Bruksfeil: $1",
        "aboutsite": "Om {{SITENAME}}",
        "aboutpage": "Project:Om",
        "copyright": "Innholdet er tilgjengelig under $1 med mindre annet er spesifikt angitt.",
        "anoneditwarning": "<strong>Advarsel:</strong> Du er ikke innlogget. IP-adressen din vil bli vist offentlig om du redigerer. Hvis du <strong>[$1 logger inn]</strong> eller <strong>[$2 oppretter en konto]</strong> vil redigeringene dine tilskrives brukernavnet ditt, og du vil få flere andre fordeler.",
        "anonpreviewwarning": "<em>Du er ikke logget inn. Ved lagring vil IP-adressen din lagres i sidens redigeringshistorikk.</em>",
        "missingsummary": "'''Påminnelse:''' Du har ikke lagt inn en redigeringsforklaring.\nVelger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
+       "selfredirect": "<strong>Advarsel:</strong> Du omdirigerer denne siden til seg selv. Du kan ha oppgitt feil mål for omdirigeringen, eller kanskje du redigerer feil side. Om du klikker «{{int:savearticle}}» igjen vil omdirigeringen bli opprettet uansett.",
        "missingcommenttext": "Vennligst legg inn en kommentar under.",
        "missingcommentheader": "'''Påminnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
        "summary-preview": "Forhåndsvisning av redigeringsforklaring:",
        "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": "logge inn",
+       "loginreqlink": "logg 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.",
        "content-model-text": "Ren tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tomt objekt",
+       "content-json-empty-array": "Tom matrise",
        "duplicate-args-category": "Sider med like argumenter i malkall",
        "duplicate-args-category-desc": "Denne siden inneholder malkall med duplikate parametre, slik som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.\n\nDet burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..",
        "history-feed-empty": "Den etterspurte siden finnes ikke.\nDen kan ha blitt slettet fra wikien, eller fått et nytt navn.\nPrøv å [[Special:Search|søke]] etter beslektede sider.",
        "rev-deleted-comment": "(redigeringskommentar fjernet)",
        "rev-deleted-user": "(brukernavn fjernet)",
-       "rev-deleted-event": "(fjernet loggoppføring)",
+       "rev-deleted-event": "(loggoppføring fjernet)",
        "rev-deleted-user-contribs": "[brukernavn eller IP-adresse fjernet – redigeringen vises ikke blant bidragene]",
        "rev-deleted-text-permission": "Denne revisjonen har blitt '''slettet'''.\nDet kan være detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
        "rev-suppressed-text-permission": "Denne siderevisjonen har blitt <strong>skjult</strong>.\nDetaljer finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
        "revdelete-legend": "Fastsett synlighetsbegrensninger",
        "revdelete-hide-text": "Skjul revisjonstekst",
        "revdelete-hide-image": "Skjul filinnhold",
-       "revdelete-hide-name": "Skjul handling og mål",
+       "revdelete-hide-name": "Skjul handling og parametre",
        "revdelete-hide-comment": "Skjul redigeringsforklaring",
        "revdelete-hide-user": "Skjul bidragsyters brukernavn eller IP-adresse",
        "revdelete-hide-restricted": "La disse begrensningene gjelde for administratorer også",
        "right-protect": "Endre beskyttelsesnivåer og redigere beskyttete sider",
        "right-editprotected": "Redigere beskyttede sider som «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "Redigere beskyttede sider som «{{int:protect-level-autoconfirmed}}»",
+       "right-editcontentmodel": "Rediger innholdsmodellen til en side",
        "right-editinterface": "Redigere brukergrensesnittet",
        "right-editusercssjs": "Redigere andre brukeres CSS- og JS-filer",
        "right-editusercss": "Redigere andre brukeres CSS-filer",
        "action-viewmywatchlist": "Vis din overvåkningsliste",
        "action-viewmyprivateinfo": "vise din private informasjon",
        "action-editmyprivateinfo": "rediger din private informasjon",
+       "action-editcontentmodel": "rediger innholdsmodellen til en side",
        "nchanges": "$1 {{PLURAL:$1|endring|endringer}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|siden forrige besøk}}",
        "enhancedrc-history": "historikk",
        "deleteprotected": "Du kan ikke slette denne siden fordi den er beskyttet.",
        "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
        "rollback": "Fjern redigeringer",
-       "rollback_short": "Tilbakestill",
        "rollbacklink": "tilbakestill",
        "rollbacklinkcount": "tilbakestill {{PLURAL:$1|én endring|$1 endringer}}",
        "rollbacklinkcount-morethan": "tilbakestill mer enn $1 {{PLURAL:$1|endring|endringer}}",
        "namespace": "Navnerom:",
        "invert": "Inverter valg",
        "tooltip-invert": "Kryss av denne boksen for å skjule endringer på sider i det valgte navnerommet (og tilhørende navnerom hvis de er avkrysset også)",
+       "tooltip-whatlinkshere-invert": "Merk av denne boksen for å skjule lenker fra sider i valgte navnerom.",
        "namespace_association": "Tilknyttet navnerom",
        "tooltip-namespace_association": "Kryss av denne boksen for å også inkludere diskusjons- eller emnenavnerommet som er tilknyttet det valgte navnerommet",
        "blanknamespace": "(Hoved)",
        "thumbnail-temp-create": "Kan ikke opprette midlertidig miniatyrbildefil",
        "thumbnail-dest-create": "Kan ikke lagre miniatyrbilde til målbanen",
        "thumbnail_invalid_params": "Ugyldige miniatyrparametere, eller PNG-fil med flere piksler enn 12,5 millioner.",
+       "thumbnail_toobigimagearea": "Fil med dimensjoner større enn $1",
        "thumbnail_dest_directory": "Klarte ikke å opprette målmappe",
        "thumbnail_image-type": "Bildetypen støttes ikke",
        "thumbnail_gd-library": "Ufullstendig konfigurering av GD library: mangler funksjonen $1",
        "import-logentry-interwiki": "transwikiimporterte $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} er importert fra $2",
        "javascripttest": "JavaScript-testing",
-       "javascripttest-title": "Kjører $1 tester",
        "javascripttest-pagetext-noframework": "Denne siden er reservert for å kjøre JavaScript-tester.",
        "javascripttest-pagetext-unknownframework": "Ukjent testerammeverk \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Ukjent handling «$1».",
        "javascripttest-pagetext-frameworks": "Vennligst velg en av følgende testerammeverk: $1",
        "javascripttest-pagetext-skins": "Velg et utseende for testene:",
        "javascripttest-qunit-intro": "Se [$1 testedokumentasjonen] på mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit testsuite",
        "tooltip-pt-userpage": "Din brukerside",
        "tooltip-pt-anonuserpage": "Brukersiden for IP-adressen du redigerer fra",
        "tooltip-pt-mytalk": "Din diskusjonsside",
        "hebrew-calendar-m11-gen": "Ab",
        "hebrew-calendar-m12-gen": "Elúl",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])",
-       "unknown_extension_tag": "Ukjent tilleggsmerking «$1»",
        "duplicate-defaultsort": "Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».",
        "duplicate-displaytitle": "<strong>Advarsel:</strong> Visningstittel \"$2\" erstatter tidligere visningstittel \"$1\".",
        "invalid-indicator-name": "<p>Feil:</strong> Sidestatus-indikatornes <code>navn</code>-attributt kan ikke være tomt.",
        "version-entrypoints": "Inngangspunkts-URL-er",
        "version-entrypoints-header-entrypoint": "Inngangspunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Installerte biblioteker",
+       "version-libraries-library": "Bibliotek",
+       "version-libraries-version": "Versjon",
        "redirect": "Omdiriger via filnavn, bruker eller versjonsid",
        "redirect-legend": "Omdiriger til en fil eller side",
        "redirect-summary": "Denne spesialsiden omdirigerer til en fil (hvis et filnavn angis), en side (hvis et redigeringsnummer angis) eller en brukerside (hvis en numerisk brukeridentifikator angis).\nEksempler:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "api-error-stashfilestorage": "Det oppsto en feil når filen skulle lastes opp til lageret.",
        "api-error-stashzerolength": "Tjenermaskinen kunne i lagre den temporære filen fordi den hadde null lengde.",
        "api-error-stashnotloggedin": "Du må være innlogget for å lagre filene i opplastingslageret.",
+       "api-error-stashwrongowner": "Filen du prøvde å få tilgang til tilhører ikke deg.",
+       "api-error-stashnosuchfilekey": "Filnøkkelen du prøvde å få tilgang til finnes ikke.",
        "api-error-timeout": "Serveren svarte ikke innenfor forventet tid.",
        "api-error-unclassified": "En ukjent feil har oppstått",
        "api-error-unknown-code": "Ukjent feil: \"$1\"",
        "expand_templates_generate_xml": "Vis parsetre som XML",
        "expand_templates_generate_rawhtml": "Vis ubehandlet HTML",
        "expand_templates_preview": "Forhåndsvisning",
+       "expand_templates_preview_fail_html": "<em>Fordi {{SITENAME}} har slått på rå HTML og sesjonsdata ble tapt er forhåndsvisningen skjult for å beskytte mot JavaScript-angrep.</em>\n\n<strong>Om dette er et legitimt forsøk på å forhåndsvise, prøv igjen.</strong> Om det fortsatt ikke fungerer, prøv å [[Special:UserLogout|logge ut]] og logge inn igjen.",
+       "expand_templates_preview_fail_html_anon": "<em>Fordi {{SITENAME}} har slått på rå HTML og du ikke er logget inn er forhåndsvisningen skjult for å beskytte mot JavaScript-angrep.</em>\n\n<strong>Om dette er et legitimt forsøk på å forhåndsvise, [[Special:UserLogin|logg inn]] og prøv igjen.</strong>",
        "pagelanguage": "Valg av sidespråk",
        "pagelang-name": "Side",
        "pagelang-language": "Språk",
        "log-name-pagelang": "Endre språklogg",
        "log-description-pagelang": "Dette er en logg som viser endringer i sidespråk",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|endret}} sidespråk for $3 fra $4 til $5.",
-       "default-skin-not-found": "Ops! Standarddrakten for wikien din (<code>$wgDefaultSkin</code>), <code>$1</code>, er ikke tilgjengelig.\n\nInstallasjonen din ser ut til å inneholde følgende drakter. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for informasjon om hvordan du kan slå disse på eller heller velge en standarddrakt.\n\n$2\n\n; Om du nettopp har installert MediaWiki:\n: Du har trolig installert fra git, eller direkte fra kildekoden med en annen metode. Dette er forventet. Prøv å installere noen drakter fra [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org sin draktbase] ved å\n:* laste ned [https://www.mediawiki.org/wiki/Download tarball-installereren], som kommer med flere drakter og utvidelser. Du kan kopiere og lime inn <code>skins/</code>-mappen fra denne.\n:* klone en av <code>mediawiki/skins/*</code>-lagrene via git inn i <code>skins/</code> -mappen av din MediaWiki-installasjon.\n: Å gjøre dette skal ikke forstyrre git-mappen din om du er en MediaWiki-utvikler.\n\n; Om du nettopp har oppgradert MediaWiki:\n: MediaWiki 1.24 og nyere slår ikke lenger på automatisk installerte drakter (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Du kan lime inn følgende linjer i <code>LocalSettings.php</code> for å slå på alle installerte drakter:\n\n<pre>$3</pre>\n\n; Om du nettopp har endret <code>LocalSettings.php</code>:\n: Dobbelsjekk draktnavnene for skrivefeil.",
+       "default-skin-not-found": "Ops! Standarddrakten for wikien din, definert i <code dir=\"ltr\">$wgDefaultSkin</code> som <code>$1</code>, er ikke tilgjengelig.\n\nInstallasjonen din ser ut til å inneholde følgende drakter. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for informasjon om hvordan du kan slå disse på eller heller velge en standarddrakt.\n\n$2\n\n; Om du nettopp har installert MediaWiki:\n: Du har trolig installert fra git, eller direkte fra kildekoden med en annen metode. Dette er forventet. Prøv å installere noen drakter fra [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org sin draktbase] ved å\n:* laste ned [https://www.mediawiki.org/wiki/Download tarball-installereren], som kommer med flere drakter og utvidelser. Du kan kopiere og lime inn <code>skins/</code>-mappen fra denne.\n:* laste ned individuelle drakter fra [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* klone en av <code>mediawiki/skins/*</code>-lagrene via git inn i <code>skins/</code> -mappen av din MediaWiki-installasjon.\n: Å gjøre dette skal ikke forstyrre git-mappen din om du er en MediaWiki-utvikler.\n\n; Om du nettopp har oppgradert MediaWiki:\n: MediaWiki 1.24 og nyere slår ikke lenger på automatisk installerte drakter (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Du kan lime inn følgende linjer i <code>LocalSettings.php</code> for å slå på alle installerte drakter:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Om du nettopp har endret <code>LocalSettings.php</code>:\n: Dobbelsjekk draktnavnene for skrivefeil.",
+       "default-skin-not-found-no-skins": "Ops! Standarddrakten for wikien din, definert i <code>$wgDefaultSkin</code> som <code>$1</code>, er ikke tilgjengelig.\n\nDu har ingen installerte drakter.\n\n;Om du nettopp har installert eller oppgradert MediaWiki:\n: Du installerte trolig fra git, eller direkte fra kildekoden med en annen metode. Dette er forventet. MediaWiki 1.24 og nyere inkluderer ingen drakter i hovedarkivet. Prøv å installere noen drakter fra [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.orgs draktmappe], ved å:\n:* laste ned [https://www.mediawiki.org/wiki/Download tarball-installereren], som kommer med mange drakter og tillegg. Du kan kopiere og lime inn <code>skins/</code>-mappen fra denne.\n:* laste ned individuelle drakt-tarballer fra [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* klone en av <code>mediawiki/skins/*</code>-arkivene via git til <code dir=\"ltr\">skins/</code>-mappa i din MediaWiki-installasjon.\n: Å gjøre dette vil ikke forstyrre ditt git-arkiv om du er en MediaWiki-utvikler. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] for informasjon om hvordan du slår på drakter og velger en standarddrakt.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (slått på)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''slått av''')",
        "mediastatistics": "Mediestatistikk",
index 3f9f991..d86512b 100644 (file)
@@ -32,6 +32,7 @@
        "tog-watchdefault": "Spul wa'k bewarke op mien volglieste zetten",
        "tog-watchmoves": "Spul wa'k herneume op mien volglieste zetten",
        "tog-watchdeletion": "Spul wa'k vortdo op mien volglieste zetten",
+       "tog-watchrollback": "Ziejen waorvan ik bewarkingen weerummedreid hebbe automaties volgen",
        "tog-minordefault": "Markeer alle veraanderingen as 'kleine wieziging'",
        "tog-previewontop": "De naokiekzied boven t bewarkingsveld zetten",
        "tog-previewonfirst": "Naokieken bie eerste wieziging",
@@ -42,7 +43,7 @@
        "tog-shownumberswatching": "t Antal gebrukers bekieken die disse zied volgt",
        "tog-oldsig": "Bestaonde haandtekening:",
        "tog-fancysig": "Ondertekening zien as wikitekste (zonder automatiese verwiezing)",
-       "tog-uselivepreview": "Gebruuk \"rechtstreeks naokieken\" (experimenteel)",
+       "tog-uselivepreview": "Gebruuk \"rechtstreeks naokieken\"",
        "tog-forceeditsummary": "Geef n melding bie n lege samenvatting",
        "tog-watchlisthideown": "Verbarg mien eigen bewarkingen",
        "tog-watchlisthidebots": "Verbarg botgebrukers",
        "view": "Lezen",
        "view-foreign": "Bekieken op $1",
        "edit": "Bewarken",
+       "edit-local": "Lokale beschrieving bewarken",
        "create": "Anmaken",
+       "create-local": "Lokale beschrieving derbie doon",
        "editthispage": "Disse zied bewarken",
        "create-this-page": "Disse zied anmaken",
        "delete": "Vortdoon",
        "otherlanguages": "Aandere talen",
        "redirectedfrom": "(deurestuurd vanaof \"$1\")",
        "redirectpagesub": "Deurverwieszied",
+       "redirectto": "Deurverwiezen naor:",
        "lastmodifiedat": "Disse zied is t lest ewiezigd op $1 um $2.",
        "viewcount": "Disse zied is $1 {{PLURAL:$1|keer|keer}} bekeken.",
        "protectedpage": "Beveiligden zied",
        "jumptonavigation": "navigasie",
        "jumptosearch": "zeuk",
        "view-pool-error": "De servers bin op heden overbelast.\nTe veule gebrukers proberen disse zied te bekieken.\nWacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.\n\n$1",
+       "generic-pool-error": "De servers bin op heden overbelast.\nTe veule gebrukers proberen disse zied te bekieken.\nWacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.",
        "pool-timeout": "De maximumwachttied veur databankvergrendeling is verleupen.",
        "pool-queuefull": "De wachtrie van de poel is vol",
        "pool-errorunknown": "Onbekende fout",
+       "pool-servererror": "De dienst \"pool counter\" is niet beschikbaor ($1).",
        "aboutsite": "Over {{SITENAME}}",
        "aboutpage": "Project:Info",
        "copyright": "De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.",
        "filerenameerror": "Bestaandsnaamwieziging \"$1\" naor \"$2\" niet meugelik.",
        "filedeleteerror": "Kon bestaand \"$1\" niet vortdoon.",
        "directorycreateerror": "Map \"$1\" kon niet an-emaakt wörden.",
+       "directoryreadonlyerror": "De map \"$1\" is allinnig-lezen.",
+       "directorynotreadableerror": "De map \"$1\" kan niet elezen wörden.",
        "filenotfound": "Kon bestaand \"$1\" niet vienen.",
        "unexpected": "Onverwachten weerde: \"$1\"=\"$2\".",
        "formerror": "Fout: kon formulier niet versturen",
        "badarticleerror": "Disse haandeling kan op disse zied niet uutevoerd wörden.",
        "cannotdelete": "De zied of t bestaand \"$1\" kon niet vortedaon wörden.\nt Kan ween dat n aander t al vortedaon hef.",
        "cannotdelete-title": "Zied \"$1\" kan niet vortedaon wörden",
-       "delete-hook-aborted": "t Vortdoon wörden in t wiere eschopt deur n MediaWiki-programmatuuruutbreiding.\nDer is gien veerdere informasie beschikbaor.",
+       "delete-hook-aborted": "t Vortdoon wördt in t wiere eschopt deur n toepassige van MediaWiki.\nDer is gien veerdere informasie beschikbaor.",
        "no-null-revision": "Kon gien lege nieje versie maken veur de zied \"$1\"",
        "badtitle": "Ongeldige naam",
        "badtitletext": "De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.",
        "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken:",
        "viewyourtext": "Je kunnen '''joew bewarkingen''' an de brontekste van disse zied bekieken en kopiëren:",
        "protectedinterface": "Op disse zied steet tekste die gebruukt wörden veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.\nUm vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [//translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
-       "editinginterface": "'''Waorschuwing:''' je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Um vertalingen derbie te zetten of te wiezigen veur alle wiki's, gebruuk [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net], t vertalingsprojekt veur MediaWiki.",
+       "editinginterface": "<strong>Waorschuwing:</strong> je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Um vertalingen derbie te zetten of te wiezigen veur alle wiki's, gebruuk [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net], t vertalingsprojekt veur MediaWiki.",
        "cascadeprotected": "Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de \"kaskade\"-opsie:\n$2",
        "namespaceprotected": "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
        "customcssprotected": "Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.",
        "passwordreset-username": "Gebruker:",
        "passwordreset-domain": "Domein:",
        "passwordreset-capture": "De resulterende netpost bekieken?",
-       "passwordreset-capture-help": "A'j dit vakjen anvinken, dan krie'j t netpostbericht (mit t tiedelike wachtwoord) te zien en t wörden naor de gebruker estuurd.",
+       "passwordreset-capture-help": "A'j dit vakjen anvinken, dan krie'j t netpostbericht te zien (mit t tiejelike wachtwoord) en t wördt naor de gebruker estuurd.",
        "passwordreset-email": "Netpostadres:",
        "passwordreset-emailtitle": "Gebrukersgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Der hef der ene, waorschienlik jie zelf vanaof t IP-adres $1, n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen.\nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
        "subject-preview": "Onderwarp/kop naokieken:",
        "blockedtitle": "Gebruker is eblokkeerd",
        "blockedtext": "'''Joew gebrukersnaam of IP-adres is eblokkeerd.'''\n\nJe bin eblokkeerd deur: $1.\nDe op-egeven reden is: ''$2''.\n\n* Eblokkeerd vanaof: $8\n* Eblokkeerd tot: $6\n* Bedoeld um te blokkeren: $7\n\nJe kunnen kontakt opnemen mit $1 of n aandere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] um de blokkering te bepraoten.\nJe kunnen gien gebruukmaken van de funksie 'een bericht sturen', behalven a'j n geldig netpostadres op-egeven hebben in joew [[Special:Preferences|veurkeuren]] en t gebruuk van disse funksie niet eblokkeerd is.\nt IP-adres da'j noen gebruken is $3 en t blokkeringsnummer is #$5.\nVermeld t allebeie a'j argens op disse blokkering reageren.",
-       "autoblockedtext": "Joew IP-adres is automaties eblokkeerd umdat t gebruukt wörden deur n aandere gebruker, die eblokkeerd wörden deur $1.\nDe reden hierveur was:\n\n:''$2''\n\n* Begint: $8\n* Löp of nao: $6\n* Wee eblokkeerd wörden: $7\n\nJe kunnen kontakt opnemen mit $1 of n van de aandere\n[[{{MediaWiki:Grouppage-sysop}}|beheerders]] um de blokkering te bepraoten.\n\nNB: je kunnen de opsie \"n bericht sturen\" niet gebruken, behalven a'j n geldig netpostadres op-egeven hebben in de [[Special:Preferences|gebrukersveurkeuren]] en je niet eblokkeerd bin.\n\nJoew IP-adres is $3 en joew blokkeernummer is $5.\nGeef disse nummers deur a'j kontakt mit ene opnemen over de blokkering.",
+       "autoblockedtext": "Joew IP-adres is automaties eblokkeerd umdat t gebruukt wördt deur n aandere gebruker, die eblokkeerd wördt deur $1.\nDe reden hierveur was:\n\n:''$2''\n\n* Begint: $8\n* Löp of nao: $6\n* Wee eblokkeerd wördt: $7\n\nJe kunnen kontakt opnemen mit $1 of n van de aandere\n[[{{MediaWiki:Grouppage-sysop}}|beheerders]] um de blokkering te bepraoten.\n\nNB: je kunnen de opsie \"n bericht sturen\" niet gebruken, behalven a'j n geldig netpostadres op-egeven hebben in de [[Special:Preferences|gebrukersveurkeuren]] en je niet eblokkeerd bin.\n\nJoew IP-adres is $3 en joew blokkeernummer is $5.\nGeef disse nummers deur a'j kontakt mit ene opnemen over de blokkering.",
        "blockednoreason": "gien reden op-egeven",
        "whitelistedittext": "Um ziejen te kunnen wiezigen, mu'j $1 ween",
        "confirmedittext": "Je mutten je netpostadres bevestigen veurda'j bewarken kunnen. Vul je adres in en bevestig t via [[Special:Preferences|mien veurkeuren]].",
        "moveddeleted-notice": "Disse zied is vortedaon.\nHieronder steet de informasie uut t vortdologboek en t herneumlogboek.",
        "log-fulllog": "t Hele logboek bekieken",
        "edit-hook-aborted": "De bewarking is aofebreuken deur n hook.\nDer is gien reden op-egeven.",
-       "edit-gone-missing": "De zied kon niet bie-ewörken wörden.\nt Schient dat t vortedaon is.",
+       "edit-gone-missing": "De zied kon niet bie-ewörken wörden.\nt Lik derop as of t vortedaon is.",
        "edit-conflict": "Tegelieke bewörken.",
        "edit-no-change": "Joew bewarking is enegeerd, umdat der gien wieziging an de tekste edaon is.",
        "postedit-confirmation-saved": "Joew bewarking is op-esleugen",
        "expensive-parserfunction-category": "Ziejen die te veule kostbaore parserfunksies gebruken",
        "post-expand-template-inclusion-warning": "Waorschuwing: de grootte van de in-evoegden mal is te groot.\nSommigen mallen wörden niet in-evoegd.",
        "post-expand-template-inclusion-category": "Ziejen die over de maximumgrootte veur in-evoegden mallen hinne gaon",
-       "post-expand-template-argument-warning": "Waorschuwing: disse zied gebruuk tenminsten één parameter in n mal, die te groot is as t uuteklap wörden. Disse parameters wörden vorteleuten.",
+       "post-expand-template-argument-warning": "Waorschuwing: disse zied gebruukt tenminsten een parameter in n mal, die te groot is as t uuteklapt wördt. Disse parameters wörden vorteleuten.",
        "post-expand-template-argument-category": "Ziejen mit ontbrekende malelementen",
        "parser-template-loop-warning": "Der is n kringloop in mallen waoreneumen: [[$1]]",
        "parser-template-recursion-depth-warning": "Der is over de rekursiediepte veur mallen is hinne gaon ($1)",
        "upload_directory_read_only": "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
        "uploaderror": "Fout bie t inlaojen van t bestaand",
        "upload-recreate-warning": "'''Waorschuwing: der is n bestaand mit disse naam vortedaon of herneumd.'''\n\nHieronder steet t vortdologboek en t herneumlogboek veur disse zied:",
-       "uploadtext": "Gebruuk t formulier hieronder um bestaanden op te sturen.\nUm bestaanden te bekieken of te zeuken die eerder al op-estuurd bin, ku'j naor de [[Special:FileList|bestaandslieste]] gaon.\nBestaanden en media die nao t vortdoon opniej op-estuurd wörden ku'j in de smiezen houwen in t [[Special:Log/upload|logboek mit nieje bestaanden]] en t [[Special:Log/delete|vortdologboek]].\n\nUm t bestaand in te voegen in n zied ku'j één van de volgende kodes gebruken:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bestaand.jpg]]</nowiki>'''\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bestaand.png|alternatieve tekste]]</nowiki>'''\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Bestaand.ogg]]</nowiki>''' drekte verwiezing naor n bestaand.",
+       "uploadtext": "Gebruuk t formulier hieronder um bestaanden op te sturen.\nUm bestaanden te bekieken of te zeuken die eerder al op-estuurd bin, ku'j naor de [[Special:FileList|bestaandslieste]] gaon.\nBestaanden en media die nao t vortdoon opniej op-estuurd wörden ku'j in de smiezen houwen in t [[Special:Log/upload|logboek mit nieje bestaanden]] en t [[Special:Log/delete|vortdologboek]].\n\nUm t bestaand in te voegen in n zied ku'j een van de volgende kodes gebruken:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bestaand.jpg]]</nowiki>'''\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bestaand.png|alternatieve tekste]]</nowiki>'''\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Bestaand.ogg]]</nowiki>''' drekte verwiezing naor n bestaand.",
        "upload-permitted": "Toe-estaone bestaandstypes: $1.",
        "upload-preferred": "An-ewezen bestaandstypes: $1.",
        "upload-prohibited": "Verbeujen bestaandstypes: $1.",
        "php-uploaddisabledtext": "t Opsturen van PHP-bestaanden is uutezet. Kiek de instellingen veur t opsturen van bestaanden effen nao.",
        "uploadscripted": "In dit bestaand steet HTML- of skriptkode die verkeerd elezen kan wörden deur de webkieker.",
        "uploadvirus": "In dit bestaand zit n virus! Gegevens: $1",
-       "uploadjava": "t Bestaand is n ZIP-bestaand waor n Java .class-bestaand in zit.\nt Inlaojen van Java-bestaanden is niet toe-estaon umdat hiermee beveiligingsinstellingen ummezeild kunnen wörden.",
+       "uploadjava": "t Bestaand is n ZIP-bestaand waor n Java .class-bestaand in zit.\nt Inlaojen van Java-bestaanden is niet toe-estaon umdat hiermee beveiligingsinstellingen umzeild kunnen wörden.",
        "upload-source": "Bronbestaand",
        "sourcefilename": "Bestaandsnaam op de hardeschieve:",
        "sourceurl": "Bronwebadres:",
        "wantedfiletext-cat": "De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>. Ziejen die niet-bestaonde bestaanden insluten staon op de zied [[:$1]].",
        "wantedfiletext-nocat": "De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>.",
        "wantedtemplates": "Gewunste mallen",
-       "mostlinked": "Ziejen waor t meest naor verwezen wörden",
+       "mostlinked": "Ziejen waor t meest naor verwezen wördt",
        "mostlinkedcategories": "Meestgebruukten kategorieën",
        "mostlinkedtemplates": "Meestgebruukten mallen",
        "mostcategories": "Artikels mit de meeste kategorieën",
        "delete-toobig": "Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.\nt Vortdoon van dit soort ziejen is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.",
        "delete-warning-toobig": "Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.\nWoart je: t vortdoon van disse zied kan de warking van de databanke van {{SITENAME}} versteuren.\nWees veurzichtig",
        "rollback": "Wiezigingen herstellen",
-       "rollback_short": "Weerummedreien",
        "rollbacklink": "Weerummedreien",
        "rollbacklinkcount": "{{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "rollbacklinkcount-morethan": "Meer as {{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "protect-locked-blocked": "Je kunnen beveiligingsnivo's niet wiezigen terwiel je eblokkeerd bin. Hier bin de instellingen zo as ze noen bin veur de zied '''$1''':",
        "protect-locked-dblock": "Beveiligingsnivo's kunnen effen niet ewiezigd wörden umdat de databanke noen beveiligd is.\nHier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
        "protect-locked-access": "Je hebben gien rechten um t beveilingsnivo van ziejen te wiezigen.\nHier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
-       "protect-cascadeon": "Disse zied wörden beveiligd, umdat t op-eneumen is in de volgende {{PLURAL:$1|zied|ziejen}} die beveiligd {{PLURAL:$1|is|bin}} mit de kaskadeopsie. Wiezigingen in t beveiligingsnivo van disse zied hebben gien invleud op de kaskadebeveiliging.",
+       "protect-cascadeon": "Disse zied wördt beveiligd, umdat t op-eneumen is in de volgende {{PLURAL:$1|zied|ziejen}} die beveiligd {{PLURAL:$1|is|bin}} mit de kaskadeopsie. Wiezigingen in t beveiligingsnivo van disse zied hebben gien invleud op de kaskadebeveiliging.",
        "protect-default": "Veur alle gebrukers",
        "protect-fallback": "Allinnig gebrukers mit t recht \"$1\" toestaon",
        "protect-level-autoconfirmed": "Allinnig automaties bevestigden gebrukers toestaon",
        "undelete-search-submit": "Zeuk",
        "undelete-no-results": "Gien ziejen evunnen in t archief mit vortedaone ziejen.",
        "undelete-filename-mismatch": "Bestaandsversie van t tiedstip $1 kon niet hersteld wörden: bestaandsnaam kloppen niet",
-       "undelete-bad-store-key": "Bestaandsversie van t tiedstip $1 kon niet hersteld wörden: t bestaand was der al niet meer veurdat t vortedaon wörden.",
+       "undelete-bad-store-key": "Bestaandsversie van t tiedstip $1 kon niet hersteld wörden: t bestaand was der al niet meer veurdat t vortedaon wördden.",
        "undelete-cleanup-error": "Fout bie t herstellen van t ongebruukten archiefbestaand \"$1\".",
        "undelete-missing-filearchive": "t Lokten niet um ID $1 weerumme te plaotsen umdat t niet in de databanke is.\nMisschien is t al weerummeplaotst.",
        "undelete-error": "Der is wat fout egaon bie t vortdoon van de zied",
        "movereason": "Reden:",
        "revertmove": "Weerummedreien",
        "delete_and_move": "Vortdoon en herneumen",
-       "delete_and_move_text": "==Mut vortedaon wörden==\n<div style=\"color: red\"> Onder de nieje naam \"[[:$1]]\" besteet al n artikel. Wi'j t vortdoon um plaotse te maken veur t herneumen?</div>",
+       "delete_and_move_text": "==Mut vortedaon wörden==\n<div style=\"color: red\"> De zied \"[[:$1]]\" besteet al. Wi'j t vortdoon um te kunnen herneumen?</div>",
        "delete_and_move_confirm": "Ja, disse zied vortdoon",
        "delete_and_move_reason": "Vortedaon vanwegen de herneuming van \"[[$1]]\"",
        "selfmove": "De naam kan niet ewiezigd wörden naor de naam die t al hef.",
        "import": "Ziejen invoeren",
        "importinterwiki": "Transwiki-invoer",
        "import-interwiki-text": "Kies n wiki en ziednaam um in te voeren.\nVersie- en auteursgegevens blieven hierbie beweerd.\nAlle transwiki-invoerhaandelingen wörden op-esleugen in t [[Special:Log/import|invoerlogboek]].",
+       "import-interwiki-sourcewiki": "Bronwiki:",
+       "import-interwiki-sourcepage": "Bronzied:",
        "import-interwiki-history": "Kopieer de hele geschiedenisse veur disse zied",
        "import-interwiki-templates": "Alle mallen opnemen",
        "import-interwiki-submit": "Invoeren",
        "import-logentry-interwiki": "transwiki $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} van $2",
        "javascripttest": "JavaScript testen",
-       "javascripttest-title": "Tests uutvoeren veur $1",
        "javascripttest-pagetext-noframework": "Disse zied is ereserveerd veur t uutvoeren van JavaScript-testen.",
        "javascripttest-pagetext-unknownframework": "Onbekend testraamwark \"$1\".",
        "javascripttest-pagetext-frameworks": "Kies een van de volgende testraamwarken: $1",
        "javascripttest-pagetext-skins": "Kies n vormgeving um de tests mee uut te voeren:",
        "javascripttest-qunit-intro": "Zie de [$1 testdokumentasie] op mediawiki.org.",
-       "javascripttest-qunit-heading": "QUnit testsuite veur MediaWiki JavaScript",
        "tooltip-pt-userpage": "Oew gebroekersbladziede",
        "tooltip-pt-anonuserpage": "Gebroekersbladziede vuur t IP-adres da'j broekt",
        "tooltip-pt-mytalk": "Oew oaverlegbladziede",
        "watchlisttools-edit": "Volglieste bekieken en bewarken",
        "watchlisttools-raw": "Roewe volglieste bewarken",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
-       "unknown_extension_tag": "Onbekende tag \"$1\"",
        "duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
        "version": "Versie",
        "version-extensions": "Uutbreidingen die installeerd bin",
        "version-hook-subscribedby": "In-eschreven deur",
        "version-version": "(Versie $1)",
        "version-license": "MediaWiki-lisensie",
+       "version-ext-colheader-version": "Versie",
+       "version-ext-colheader-license": "Lisensie",
+       "version-ext-colheader-description": "Beschrieving",
+       "version-ext-colheader-credits": "Auteurs",
        "version-poweredby-credits": "Disse wiki wörden an-estuurd deur '''[https://www.mediawiki.org/ MediaWiki]''', auteursrecht © 2001-$1 $2.",
        "version-poweredby-others": "aanderen",
        "version-poweredby-translators": "vertalers van translatewiki.net",
        "version-entrypoints-header-url": "Webadres",
        "redirect": "Deurverwiezen op bestaandsnaam, gebrukersnummer, ziednummer of versienummer",
        "redirect-legend": "Deurverwiezen naor n bestaand of zied",
-       "redirect-summary": "Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wörden), n zied (as n zied- of versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wördt), n zied (as n zied- of versienummer op-egeven wördt) of n gebrukerszied (as t gebrukersnummer op-egeven wördt). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Zeuk",
        "redirect-lookup": "Opzeuken:",
        "redirect-value": "Weerde:",
        "fileduplicatesearch-result-n": "Der {{PLURAL:$2|is één bestaand|bin $2 bestaanden}} die liek alleens bin as \"$1\".",
        "fileduplicatesearch-noresults": "Der is gien bestaand mit de naam \"$1\" evunnen.",
        "specialpages": "Spesiale ziejen",
+       "specialpages-note-top": "Legenda",
        "specialpages-note": "* Normale spesiale ziejen.\n* <span class=\"mw-specialpagerestricted\">Beparkt toegankelike spesiale ziejen.</span>",
        "specialpages-group-maintenance": "Onderhoudsliesten",
        "specialpages-group-other": "Aandere spesiale ziejen",
        "specialpages-group-spam": "Spam-hulpmiddels",
        "blankpage": "Lege zied",
        "intentionallyblankpage": "Disse zied is bewust leeg eleuten.",
-       "external_image_whitelist": " #Laot disse regel onveraanderd<pre>\n#Hieronder kunnen delen van reguliere uutdrokkingen (t deel tussen //) an-egeven wörden.\n#t Wörden mit de webadressen van aofbeeldingen uut bronnen van butenof vergeleken\n#n Positief vergeliekingsresultaot zörgt derveur dat de aofbeelding weeregeven wörden, aanders wörden de aofbeelding allinnig as verwiezing weeregeven\n#Regels die mit n # beginnen, wörden as kommentaar behaandeld\n#De regels in de lieste bin niet heufdlettergeveulig\n\n#Delen van reguliere uutdrokkingen boven disse regel plaotsen. Laot disse regel onveraanderd</pre>",
+       "external_image_whitelist": " #Laot disse regel onveraanderd<pre>\n#Hieronder kunnen delen van reguliere uutdrokkingen (t deel tussen //) an-egeven wörden.\n#t Wördt mit de webadressen van aofbeeldingen uut bronnen van butenof vergeleken\n#n Positief vergeliekingsresultaot zörgt derveur dat de aofbeelding weeregeven wördt, aanders wördt de aofbeelding allinnig as verwiezing weeregeven\n#Regels die mit n # beginnen, wörden as kommentaar behaandeld\n#De regels in de lieste bin niet heufdlettergeveulig\n\n#Delen van reguliere uutdrokkingen boven disse regel plaotsen. Laot disse regel onveraanderd</pre>",
        "tags": "Geldige wiezigingsetiketten",
        "tag-filter": "[[Special:Tags|Etiketfilter]]:",
        "tag-filter-submit": "Filtreren",
        "expand_templates_remove_comments": "Opmarking vorthaolen",
        "expand_templates_remove_nowiki": "Etiketten <nowiki> in resultaot onderdrokken",
        "expand_templates_generate_xml": "XML-parserboom bekieken",
-       "expand_templates_preview": "Naokieken"
+       "expand_templates_preview": "Naokieken",
+       "pagelang-language": "Taal",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video's",
+       "mediastatistics-header-multimedia": "Interaktieve media"
 }
index fa7a9d3..350d73e 100644 (file)
                        "Arg",
                        "NCoppens",
                        "Josse.Cottenier",
-                       "Macofe"
+                       "Macofe",
+                       "Mirolith",
+                       "Akoopal",
+                       "Sikjes",
+                       "Robin0van0der0vliet"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "pool-queuefull": "De wachtrij van de poel is vol",
        "pool-errorunknown": "Er is een onbekende fout opgetreden",
        "pool-servererror": "De dienst \"pool counter\" is niet beschikbaar ($1).",
+       "poolcounter-usage-error": "Gebruiksfout: $1",
        "aboutsite": "Over {{SITENAME}}",
        "aboutpage": "Project:Info",
        "copyright": "De inhoud is beschikbaar onder de $1 tenzij anders aangegeven.",
        "virus-unknownscanner": "onbekend antivirusprogramma:",
        "logouttext": "'''U bent nu afgemeld.'''\n\nSommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u uw browsercache leegt.",
        "welcomeuser": "Welkom, $1!",
-       "welcomecreation-msg": "Uw gebruiker is aangemaakt.\nIndien gewenst kunt u uw [[Special:Preferences|voorkeuren]] voor {{SITENAME}} aanpassen.",
+       "welcomecreation-msg": "Uw account is aangemaakt.\nIndien gewenst kunt u uw [[Special:Preferences|voorkeuren]] voor {{SITENAME}} aanpassen.",
        "yourname": "Gebruikersnaam:",
        "userlogin-yourname": "Gebruikersnaam",
        "userlogin-yourname-ph": "Geef uw gebruikersnaam op",
        "logout": "Afmelden",
        "userlogout": "Afmelden",
        "notloggedin": "Niet aangemeld",
-       "userlogin-noaccount": "Hebt u geen gebruiker?",
+       "userlogin-noaccount": "Hebt u geen account?",
        "userlogin-joinproject": "Word lid van {{SITENAME}}",
-       "nologin": "Hebt u geen gebruiker? $1.",
+       "nologin": "Hebt u geen account? $1.",
        "nologinlink": "Registreren",
        "createaccount": "Registreren",
        "gotaccount": "Hebt u al een gebruiker? $1.",
        "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
+       "selfredirect": "<strong>Waarschuwing:</strong>U heeft een doorverwijzing gemaakt naar dezelfde pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door alsnog op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
        "missingcommentheader": "'''Let op:''' 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:",
        "content-model-text": "tekst zonder opmaak",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leeg object",
+       "content-json-empty-array": "Lege reeks",
        "duplicate-args-category": "Pagina's met dubbele sjabloonparameters",
        "duplicate-args-category-desc": "De pagina bevat aanroepen van sjablonen waarin hetzelfde argument meerdere keren wordt gebruikt, bijvoorbeeld <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Waarschuwing:''' deze pagina gebruikt te veel kostbare parserfuncties.\n\nNu {{PLURAL:$1|is|zijn}} het er $1, terwijl het er minder dan $2 {{PLURAL:$2|moet|moeten}} zijn.",
        "deleteprotected": "U kunt deze pagina niet verwijderen omdat hij is beveiligd.",
        "deleting-backlinks-warning": "'''Waarschuwing:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere pagina's]] gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
        "rollback": "Wijzigingen ongedaan maken",
-       "rollback_short": "Terugdraaien",
        "rollbacklink": "terugdraaien",
        "rollbacklinkcount": "{{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien",
        "rollbacklinkcount-morethan": "Meer dan {{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien",
        "import-logentry-interwiki": "importeerde $1 via transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} geïmporteerd uit $2",
        "javascripttest": "JavaScript testen",
-       "javascripttest-title": "Tests uitvoeren voor $1",
        "javascripttest-pagetext-noframework": "Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.",
        "javascripttest-pagetext-unknownframework": "Onbekend testframework \"$1\".",
        "javascripttest-pagetext-frameworks": "Kies een van de volgende testframeworks: $1",
        "javascripttest-pagetext-skins": "Kies een vormgeving om de tests mee uit te voeren:",
        "javascripttest-qunit-intro": "Zie de [$1 testdocumentatie] op mediawiki.org.",
-       "javascripttest-qunit-heading": "QUnit testsuite voor MediaWiki JavaScript",
        "tooltip-pt-userpage": "Uw gebruikerspagina",
        "tooltip-pt-anonuserpage": "Gebruikerspagina voor uw IP-adres",
        "tooltip-pt-mytalk": "Uw overlegpagina",
        "spam_reverting": "Teruggedraaid naar de laatste versie die geen koppeling bevat naar $1",
        "spam_blanking": "Alle versies bevatten een koppeling naar $1. Pagina leeggemaakt",
        "spam_deleting": "Alle versies bevatten koppelingen naar $1. Pagina verwijderd",
-       "simpleantispam-label": "Antispamcontrole.\nVul dit veld '''NIET''' in!",
+       "simpleantispam-label": "Antispamcontrole.\nVul dit veld <strong>niet</strong> in!",
        "pageinfo-title": "Informatie over \"$1\"",
        "pageinfo-not-current": "Deze gegevens zijn alleen beschikbaar voor de huidige versie.",
        "pageinfo-header-basic": "Basisgegevens",
        "iranian-calendar-m11": "Elfde Perzische maand",
        "iranian-calendar-m12": "Twaalfde Perzische maand",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
-       "unknown_extension_tag": "Onbekende tag \"$1\"",
        "duplicate-defaultsort": "'''Waarschuwing:''' de standaardsortering \"$2\" krijgt voorrang voor de sortering \"$1\".",
        "duplicate-displaytitle": "<strong>Waarschuwing:</strong>Titelweergave \"$2\" overschrijft eerdere titelweergave \"$1\".",
        "invalid-indicator-name": "<strong>Fout:</strong> de eigenschap <code>name</code> van de paginastatusindicators mag niet leeg zijn.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Paginapad]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Scriptpad]",
+       "version-libraries": "Geïnstalleerde bibliotheken",
+       "version-libraries-library": "Bibliotheek",
+       "version-libraries-version": "Versie",
        "redirect": "Doorverwijzen op bestandsnaam, gebruikersnummer, paginanummer, of versienummer",
        "redirect-legend": "Doorverwijzen naar een bestand of pagina",
        "redirect-summary": "Deze speciale pagina verwijst door naar een bestand (als een bestandsnaam wordt opgegeven), een pagina (als een paginanummer of versienummer wordt opgegeven) of een gebruikerspagina (als een gebruikersnummer wordt opgegeven). Gebruik: [[{{#Special:Redirect}}/file/Voorbeeld.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/user/101]].",
index 16ff0e2..b667237 100644 (file)
@@ -20,7 +20,8 @@
                        "Pcoombe",
                        "Ranveig",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Gaute"
                ]
        },
        "tog-underline": "Strek under lenkjer:",
@@ -47,7 +48,7 @@
        "tog-shownumberswatching": "Vis kor mange som overvakar sida",
        "tog-oldsig": "Noverande signatur:",
        "tog-fancysig": "Handsam signaturar som wikitekst (utan automatisk lenking)",
-       "tog-uselivepreview": "Bruk levande førehandsvising (eksperimentelt)",
+       "tog-uselivepreview": "Bruk levande førehandsvising",
        "tog-forceeditsummary": "Spør meg når eg ikkje har skrive noko i endringssamandraget",
        "tog-watchlisthideown": "Gøym endringane mine i overvakingslista",
        "tog-watchlisthidebots": "Gøym endringar gjorde av robotar i overvakingslista",
        "otherlanguages": "På andre språk",
        "redirectedfrom": "(Omdirigert frå $1)",
        "redirectpagesub": "Omdirigeringsside",
+       "redirectto": "Omdirigering til:",
        "lastmodifiedat": "Sida vart sist endra $1 kl. $2.",
        "viewcount": "Sida er vist {{PLURAL:$1|éin gong|$1 gonger}}.",
        "protectedpage": "Verna side",
        "toc": "Innhaldsliste",
        "showtoc": "vis",
        "hidetoc": "gøym",
-       "collapsible-collapse": "Slå saman.",
+       "collapsible-collapse": "Slå saman",
        "collapsible-expand": "Vid ut",
        "confirmable-confirm": "Er {{GENDER:$1|du}} viss på dette?",
        "confirmable-yes": "Ja",
        "error": "Feil",
        "databaseerror": "Databasefeil",
        "databaseerror-text": "Ein spørjefeil mot databasen har oppstått.\nDette kan indikere ein feil i programvara.",
+       "databaseerror-query": "Spørjing: $1",
+       "databaseerror-function": "Funksjon: $1",
        "databaseerror-error": "Feil: $1",
        "laggedslavemode": "Åtvaring: Det er mogleg at sida ikkje er heilt oppdatert.",
        "readonly": "Databasen er skriveverna",
        "filerenameerror": "Kunne ikkje døype om fila frå «$1» til «$2».",
        "filedeleteerror": "Kunne ikkje slette fila «$1».",
        "directorycreateerror": "Kunne ikkje opprette mappa «$1».",
+       "directoryreadonlyerror": "Mappa «$1» er skriveverna.",
+       "directorynotreadableerror": "Mappa «$1» kan ikkje lesast.",
        "filenotfound": "Kunne ikkje finne fila «$1».",
        "unexpected": "Uventa verdi: «$1»=«$2».",
        "formerror": "Feil: Kunne ikkje sende skjema",
        "gotaccountlink": "Logg inn",
        "userlogin-resetlink": "Har du gløymd påloggingsopplysingane dine?",
        "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-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 e-postadressa som er oppgjeven under",
+       "createaccountmail": "Bruk eit mellombels tilfeldig passord og send det til den oppgjevne e-postadressa",
        "createacct-realname": "Sant namn (valfritt)",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "passwordreset-emailtext-ip": "Nokon (sannsynlegvis deg, frå IP-adressa $1) bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "passwordreset-emailtext-user": "Brukaren $1 på {{SITENAME}} bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "passwordreset-emailelement": "↓Brukarnamn: $1\nMellombels passord: $2",
-       "passwordreset-emailsent": "↓Ei påminning har vorte sendt på e-post.",
-       "passwordreset-emailsent-capture": "Eposten under er sendt ut som ei påminning.",
-       "passwordreset-emailerror-capture": "Ein påminnings-e-post vart oppretta, og er vist nedanfor; men det lukkast ikkje å senda han til brukaren: $1",
+       "passwordreset-emailsent": "Ein e-post for attendestilling av passord er vorten send",
+       "passwordreset-emailsent-capture": "Ein e-post om attendestilling av passord - vist under - er vorten send",
+       "passwordreset-emailerror-capture": "Ein e-post om attendestilling av passord vart oppretta, og er vist nedanfor; men det lukkast ikkje å senda han til {{GENDER:$2|brukaren}}: $1",
        "changeemail": "↓Endre e-postadresse",
        "changeemail-text": "↓Fyll ut dette skjemaet for å endra di e-postadresse. Du må oppgje passordet ditt for å stadfesta endringa.",
        "changeemail-no-info": "↓Du må vera pålogga for å få tilgang direkte til denne sida.",
        "changeemail-none": "↓(ingen)",
        "changeemail-password": "{{SITENAME}}-passordet ditt:",
        "changeemail-submit": "↓Endre e-post",
+       "changeemail-throttled": "Du har freista for mange gonger å logga inn. Du lyt venta $1 før du kan freista på nytt.",
        "bold_sample": "Halvfeit skrift",
        "bold_tip": "Halvfeit skrift",
        "italic_sample": "Kursivskrift",
        "content-model-text": "Rein tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tomt objekt",
        "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",
        "post-expand-template-inclusion-warning": "Åtvaring: Storleiken på malar som er inkluderte er for stor.\nNokre malar vert ikkje inkluderte.",
        "revdelete-confirm": "Stadfest at du ynskjer å gjera dette, at du skjønar konsekvensane, og at du gjer det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinene]].",
        "revdelete-suppress-text": "Løyning av sideversjonar bør '''berre''' nyttast i desse tilfella:\n* Mogeleg ærekrenkjande informasjon\n* Upassanda personleg informasjon\n*: ''heimeadresser og -telefonnummer,  personnummer, osb.''",
        "revdelete-legend": "Vel avgrensing for synlegdom",
-       "revdelete-hide-text": "Gøym versjonsteksten",
+       "revdelete-hide-text": "Versjonstekst",
        "revdelete-hide-image": "Skjul filinnhald",
        "revdelete-hide-name": "Gøym handling og sidenamn",
        "revdelete-hide-comment": "Gøym endringssamandraga",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategoriar}}, {{PLURAL:$3|1 fil|$3 filer}})",
        "search-redirect": "(omdirigering $1)",
        "search-section": "(bolken $1)",
+       "search-category": "(kategorien $1)",
        "search-suggest": "Meinte du: «$1»",
        "search-interwiki-caption": "Systerprosjekt",
        "search-interwiki-default": "Resultat frå $1:",
        "right-move": "Flytte sider",
        "right-move-subpages": "Flytte sider med undersider",
        "right-move-rootuserpages": "Flytte hovudbrukarsider",
+       "right-move-categorypages": "Flytta kategorisider",
        "right-movefile": "Flytta filer",
        "right-suppressredirect": "Treng ikkje lage omdirigering frå det gamle namnet når sida vert flytta",
        "right-upload": "Laste opp filer",
        "action-createpage": "opprette sider",
        "action-createtalk": "opprette diskusjonssider",
        "action-createaccount": "opprette denne brukarkontoen",
+       "action-history": "sjå historikken til denne sida",
        "action-minoredit": "merke denne endringa som småplukk",
        "action-move": "flytte denne sida",
        "action-move-subpages": "flytte denne sida og undersidene hennar",
        "action-move-rootuserpages": "flytte hovudbrukarsider",
+       "action-move-categorypages": "flytta kategorisider",
        "action-movefile": "flytta denne fila",
        "action-upload": "laste opp denne fila",
        "action-reupload": "skrive over den noverande fila",
        "action-block": "blokkere denne brukaren frå å gjere endringar",
        "action-protect": "endre vernenivået til sida",
        "action-rollback": "snøgt rulla attende endringane til den siste brukaren som endra ei viss side",
-       "action-import": "importere denne sida frå ein annan wiki",
-       "action-importupload": "importere denne sida frå ei opplasta fil",
+       "action-import": "importera sider frå ein annan wiki",
+       "action-importupload": "importera sider frå ei filopplasting",
        "action-patrol": "merke andre endringar av andre brukar som patruljert",
        "action-autopatrol": "merke endringane dine som partuljert",
        "action-unwatchedpages": "vise lista over uovervaka sider",
        "action-sendemail": "senda e-postar",
        "action-editmywatchlist": "endra overvakingslista di",
        "action-viewmywatchlist": "sjå overvakingslista di",
+       "action-viewmyprivateinfo": "sjå den private informasjonen din",
+       "action-editmyprivateinfo": "endra den private informasjonen din",
        "nchanges": "{{PLURAL:$1|Éi endring|$1 endringar}}",
+       "enhancedrc-history": "historikk",
        "recentchanges": "Siste endringar",
        "recentchanges-legend": "Alternativ for siste endringar",
        "recentchanges-summary": "På denne sida ser du dei sist endra sidene i {{SITENAME}}.",
        "license-nopreview": "(Førehandsvising er ikkje tilgjengeleg)",
        "upload_source_url": " (ei gyldig, offentleg tilgjengeleg nettadresse)",
        "upload_source_file": " (ei fil på datamaskina di)",
+       "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:",
        "imgfile": "fil",
        "listfiles_size": "Storleik",
        "listfiles_description": "Skildring",
        "listfiles_count": "Versjonar",
+       "listfiles-latestversion": "Gjeldande versjon",
+       "listfiles-latestversion-yes": "Ja",
+       "listfiles-latestversion-no": "Nei",
        "file-anchor-link": "Fil",
        "filehist": "Filhistorikk",
        "filehist-help": "Klikk på dato/klokkeslett for å sjå fila slik ho var på det tidspunktet.",
        "randomincategory": "Tilfeldig side frå kategori",
        "randomincategory-invalidcategory": "«$1» er ikkje eit gildt kategorinamn.",
        "randomincategory-nopages": "Det er ingen sider i kategorien [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Tilfeldig side frå kategori",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det finst ingen omdirigeringar i namnerommet «$1».",
        "statistics": "Statistikk",
        "wantedfiles": "Etterspurde filer",
        "wantedfiletext-cat": "Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>. Sider som nyttar filer som ikkje finst vert lista opp i [[:$1]].",
        "wantedfiletext-nocat": "Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>.",
+       "wantedfiletext-nocat-noforeign": "Desse filene vert nytta, men finst ikkje.",
        "wantedtemplates": "Etterspurde malar",
        "mostlinked": "Sidene med flest lenkjer til seg",
        "mostlinkedcategories": "Mest brukte kategoriar",
-       "mostlinkedtemplates": "Mest brukte malar",
+       "mostlinkedtemplates": "Mest inkluderte sider",
        "mostcategories": "Sidene med flest kategoriar",
        "mostimages": "Mest brukte filer",
        "mostinterwikis": "Sidene med flest interwikiar",
        "mostrevisions": "Sidene med flest endringar",
        "prefixindex": "Alle sider med forstaving",
        "prefixindex-namespace": "Alle sider med førefeste ($1-namnerommet)",
+       "prefixindex-strip": "Fjern førefestet i lista",
        "shortpages": "Korte sider",
        "longpages": "Lange sider",
        "deadendpages": "Blindvegsider",
        "deadendpagestext": "Desse sidene har ikkje lenkjer til andre sider på {{SITENAME}}.",
        "protectedpages": "Verna sider",
        "protectedpages-indef": "Berre vern på uavgrensa tid",
+       "protectedpages-summary": "Sida listar opp sider som finst og er verna. For ei liste over titlar som er verna mot oppretting, sjå [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Berre djupvern",
+       "protectedpages-noredirect": "Gøym omdirigeringar",
        "protectedpagesempty": "Ingen sider er verna på den valde måten akkurat no.",
+       "protectedpages-timestamp": "Tidsmerke",
+       "protectedpages-page": "Side",
+       "protectedpages-expiry": "Endar",
+       "protectedpages-performer": "Brukar som verna",
+       "protectedpages-params": "Vernestode",
+       "protectedpages-reason": "Årsak",
+       "protectedpages-unknown-timestamp": "Ukjent",
+       "protectedpages-unknown-performer": "Ukjend brukar",
        "protectedtitles": "Verna sidenamn",
+       "protectedtitles-summary": "Sida listar opp titlar som er verna mot oppretting. For ei liste over sider som finst og er verna, sjå [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Ingen sider er verna på den valde måten akkurat no.",
        "listusers": "Brukarliste",
        "listusers-editsonly": "Vis berre brukarar med endringar",
        "querypage-disabled": "Spesialsida er slegen av for skuld yting.",
        "booksources": "Bokkjelder",
        "booksources-search-legend": "Søk etter bokkjelder",
+       "booksources-search": "Søk",
        "booksources-text": "Nedanfor finn du ei liste over lenkjer til andre nettstader som sel nye og brukte bøker, og desse kan ha meir informasjon om bøker du leitar etter:",
        "booksources-invalid-isbn": "Det oppgjevne ISBN-nummeret er ugyldig; sjekk med kjelda di om du har oppgjeve det rett.",
        "specialloguserlabel": "Utøvar:",
        "trackingcategories-name": "Meldingsnamn",
        "trackingcategories-desc": "Inkluderingsgrunnlag",
        "noindex-category-desc": "Sida vert ikkje indeksert av robotar av di ho inneheld trylleordet <code><nowiki>__NOINDEX__</nowiki></code> og er i eit namnerom der dette flagget er tillate.",
+       "trackingcategories-nodesc": "Inga skilding er tilgjengeleg.",
        "trackingcategories-disabled": "Kategorien er avslegen",
        "mailnologin": "Inga avsendaradresse",
        "mailnologintext": "Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for å sende e-post åt andre brukarar.",
        "delete-warning-toobig": "Denne sida har ein lang endringshistorikk, med meir enn {{PLURAL:$1|$1&nbsp;endring|$1&nbsp;endringar}}. Dersom du slettar henne kan det forstyrre handlingar i databasen til {{SITENAME}}, ver varsam.",
        "deleting-backlinks-warning": "'''Åtvaring''': Andre sider lenkjer til eller inkluderer sida du er i ferd med å sletta.",
        "rollback": "Rull attende endringar",
-       "rollback_short": "Rull attende",
        "rollbacklink": "rull attende",
        "rollbacklinkcount": "rull attende {{PLURAL:$1|éi endring|$1 endringar}}",
        "rollbacklinkcount-morethan": "rull attende meir enn {{PLURAL:$1|éi endring|$1 endringar}}",
        "allmessages-prefix": "Filtrer etter prefiks:",
        "allmessages-language": "Språk:",
        "allmessages-filter-submit": "Gå",
+       "allmessages-filter-translate": "Set om",
        "thumbnail-more": "Forstørr",
        "filemissing": "Fila manglar",
        "thumbnail_error": "Feil ved oppretting av miniatyrbilete: $1",
        "import": "Importer sider",
        "importinterwiki": "Transwikiimport",
        "import-interwiki-text": "Vel ei wiki og ei side å importere. Endringssdatoer og brukarar som har medverka vert bevart. Alle transwiki-importeringar vert vist i [[Special:Log/import|importloggen]].",
+       "import-interwiki-sourcewiki": "Kjeldewiki:",
+       "import-interwiki-sourcepage": "Kjeldeside:",
        "import-interwiki-history": "Kopier all historikken for denne sida",
        "import-interwiki-templates": "Inkluder alle malar",
        "import-interwiki-submit": "Importer",
        "import-logentry-interwiki": "overførte $1 mellom wikiar",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Éin versjon|$1 versjonar}} frå $2",
        "javascripttest": "JavaScript-utrøyning",
-       "javascripttest-title": "Køyrer $1-utrøyningar",
        "javascripttest-pagetext-noframework": "Sida er reservert for køyring av JavaScript-utrøyningar.",
        "javascripttest-pagetext-unknownframework": "Ukjent utrøyningsrammeverk: «$1».",
+       "javascripttest-pagetext-unknownaction": "Ukjend handling \"$1\".",
        "javascripttest-pagetext-frameworks": "Vel eitt av dei fylgjande utrøyningsrammeverka: $1",
        "javascripttest-pagetext-skins": "Vel ei drakt som utrøyningane skal køyrast med:",
        "javascripttest-qunit-intro": "Sjå [$1 utrøyningsdokumentasjon] på mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit testsuite",
        "tooltip-pt-userpage": "Brukarsida di",
        "tooltip-pt-anonuserpage": "Brukarsida for ip-adressa du endrar under",
        "tooltip-pt-mytalk": "Diskusjonssida di",
        "confirm-watch-top": "Legg denne sida til i overvakingslista di?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Fjern denne sida frå overvakingslista di?",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← førre sida",
        "imgmultipagenext": "neste side →",
        "imgmultigo": "Gå!",
        "imgmultigoto": "Gå til sida $1",
+       "img-lang-default": "(standardspråk)",
+       "img-lang-info": "Teikn biletet på $1. $2",
+       "img-lang-go": "Gjer det",
        "ascending_abbrev": "stigande",
        "descending_abbrev": "synkande",
        "table_pager_next": "Neste side",
        "autosumm-replace": "Erstattar innhaldet på sida med «$1»",
        "autoredircomment": "Omdirigerer til [[$1]]",
        "autosumm-new": "Oppretta sida med «$1»",
+       "autosumm-newblank": "Oppretta tom side",
        "lag-warn-normal": "Endringar som er nyare enn {{PLURAL:$1|sekund|sekund}} er ikkje viste på denne lista.",
        "lag-warn-high": "På grunn av stor databaseforseinking, er ikkje endringar som er nyare enn {{PLURAL:$1|sekund|sekund}} viste på denne lista.",
        "watchlistedit-normal-title": "Endre overvakingslista",
        "watchlisttools-edit": "Vis og endre overvakingslista",
        "watchlisttools-raw": "Endre på overvakingslista i råformat",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])",
-       "unknown_extension_tag": "Ukjend tilleggsmerking «$1»",
        "duplicate-defaultsort": "Åtvaring: Standardsorteringa «$2» tar over for den tidlegare sorteringa «$1».",
        "version": "Versjon",
        "version-extensions": "Installerte utvidingar",
-       "version-skins": "Draktar",
+       "version-skins": "Installerte drakter",
        "version-specialpages": "Spesialsider",
        "version-parserhooks": "Parsertillegg",
        "version-variables": "Variablar",
        "version-hook-name": "Namn på tillegg",
        "version-hook-subscribedby": "Brukt av",
        "version-version": "(versjon $1)",
-       "version-license": "Lisens",
+       "version-no-ext-name": "[utan namn]",
+       "version-license": "MediaWiki-lisens",
+       "version-ext-license": "Lisens",
+       "version-ext-colheader-name": "Utviding",
+       "version-skin-colheader-name": "Drakt",
+       "version-ext-colheader-version": "Versjon",
+       "version-ext-colheader-license": "Lisens",
+       "version-ext-colheader-description": "Skildring",
        "version-ext-colheader-credits": "Forfattarar",
+       "version-license-title": "Lisens for $1",
        "version-poweredby-credits": "Denne wikien er driven av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "andre",
        "version-poweredby-translators": "translatewiki.net-omsetjarar",
        "version-entrypoints": "URL-ar til inngangspunkt",
        "version-entrypoints-header-entrypoint": "Inngangspunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Installerte bibliotek",
+       "version-libraries-library": "Bibliotek",
+       "version-libraries-version": "Versjon",
        "redirect": "Omdiriger etter filnamn, brukar- eller versjons-ID",
        "redirect-legend": "Omdiriger til ei fil eller ei side",
        "redirect-summary": "Denne spesialsida omdirigerer til ei fil (med eit filnamn), ei side (med ein versjons-ID) eller ei brukarside (med eit brukartal).",
        "specialpages-group-wiki": "Data og verktøy",
        "specialpages-group-redirects": "Omdirigerande spesialsider",
        "specialpages-group-spam": "Spamverktøy",
+       "specialpages-group-developer": "Utviklarverktøy",
        "blankpage": "Tom side",
        "intentionallyblankpage": "Denne sida er tom med vilje",
        "external_image_whitelist": " #La denne linja vere som ho er<pre>\n#Skriv fragment av regulære uttrykk (delen som går mellom //) nedanfor\n#Desse vil verte sjekka mot adresser til bilete frå eksterne sider\n#Dei som vert godkjend vil visast, elles vil det verte gjeve ei lenkje til bilete\n#Linjer som byrjar med # vert rekna som kommentarar\n#Det vert ikkje skilt mellom små og store bokstavar\n\n#Skriv alle fragment av regulære uttrykk over denne lina. La denne linja vere som ho er</pre>",
        "dberr-usegoogle": "Du kan søkja gjennom Google i mellomtida.",
        "dberr-outofdate": "Merk at versjonane deira av innhaldet vårt kan vera forelda.",
        "dberr-cachederror": "Dette er ein mellomlagra kopi av den etterspurde sida og er mogelegvis ikkje den gjeldande versjonen av henne.",
-       "htmlform-invalid-input": "Det finst problem med innskrivinga di",
+       "htmlform-invalid-input": "Det er problem med nokre av inndataa dine.",
        "htmlform-select-badoption": "Verdien du valde er ikkje eit gyldig alternativ.",
        "htmlform-int-invalid": "Verdien du valde er ikkje eit heiltal.",
        "htmlform-float-invalid": "Verdien du valde er ikkje eit tal.",
        "expand_templates_remove_nowiki": "Ikkje vis <nowiki>-merke i resultatet",
        "expand_templates_generate_xml": "Vis parsertre som XML",
        "expand_templates_generate_rawhtml": "Vis rå HTML",
-       "expand_templates_preview": "Førehandsvising"
+       "expand_templates_preview": "Førehandsvising",
+       "pagelang-name": "Side",
+       "pagelang-language": "Språk",
+       "pagelang-use-default": "Bruk standardspråk",
+       "pagelang-select-lang": "Vel språk",
+       "right-pagelang": "Endra sidespråk",
+       "action-pagelang": "endra sidespråket",
+       "log-name-pagelang": "Språkendringslogg",
+       "log-description-pagelang": "Dette er ein logg over endringar i sidespråk.",
+       "mediastatistics-table-mimetype": "MIME-type",
+       "mediastatistics-table-extensions": "Mogelege filendingar",
+       "mediastatistics-table-count": "Tal filer",
+       "mediastatistics-header-unknown": "Ukjende",
+       "mediastatistics-header-audio": "Lyd",
+       "mediastatistics-header-video": "Videoar",
+       "mediastatistics-header-multimedia": "Rike media",
+       "mediastatistics-header-office": "Kontor",
+       "mediastatistics-header-text": "Tekstformat",
+       "mediastatistics-header-executable": "Kan køyrast",
+       "mediastatistics-header-archive": "Komprimerte format",
+       "json-error-syntax": "Syntaksfeil"
 }
index ab817bb..cce25e5 100644 (file)
        "watchlisttools-edit": "ଦେଖିବା ତାଲିକାଟିକୁ ଦେଖିବେ ଓ ବଦଳାଇବେ",
        "watchlisttools-raw": "ଫାଙ୍କା ଦେଖଣା ତାଲିକାଟିର ସମ୍ପାଦନା କରିବେ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ମୋ ଆଲୋଚନା]])",
-       "unknown_extension_tag": "ଅଜଣା ଏକ୍ସଟେନସନ ଚିହ୍ନ \"$1\"",
        "duplicate-defaultsort": "'''ସୂଚନା:''' ଆପେଆପେ କାମକରୁଥିବା \"$2\" ଆଗରୁ ଆପେ ଆପେ ସଜାଡୁଥିବା \"$1\"କୁ ବନ୍ଦ କରିଦେଇଛି ।",
        "duplicate-displaytitle": "<strong>ଚେତାବନୀ:</strong> \"$2\" ନାମଟି \"$1\" ନାମ ଉପରେ ଚଢ଼ାଇ ଦେଖାନ୍ତୁ ।",
        "version": "ସଂସ୍କରଣ",
        "specialpages-group-wiki": "ତଥ୍ୟ ଓ ଉପକରଣ",
        "specialpages-group-redirects": "ବିଶେଷ ପୃଷ୍ଠାକୁ ପୁନପ୍ରେରଣ କରିବା",
        "specialpages-group-spam": "ଅଯଥା ଉପକରଣ",
+       "specialpages-group-developer": "ଡେଭେଲପର ଟୁଲ",
        "blankpage": "ଖାଲି ପୃଷ୍ଠା",
        "intentionallyblankpage": "ଏହି ପୃଷ୍ଠାଟିକୁ ଜାଣିଶୁଣି ଫାଙ୍କା ଛଡା ଯାଇଛି ।",
        "external_image_whitelist": " #ଏହି ଧାଡ଼ିଟି ଯେମିତି ଅଛି ସେମିତି ରଖିଦିଅନ୍ତୁ<pre>\n#ସାଧାରଣ ଖଣ୍ଡିତ ଲେଖାସମୂହ (କେବଳ // ଧାଡ଼ି ତଳେ ଥିବା ଭାଗ) ତଳେ ରଖିବେ\n#ଏହା ବାହାରେ ଥିବା ଛବି (hotlinked) ସହ ଏହାକୁ ମେଳାଯିବ\n#ଯେଉଁସବୁ ମେଳଖାଇବ ତାହା ଛବି ଭାବରେ ଦେଖାଯିବ, ନହେଲେ ଛବିପାଇଁ କେବଳ ଲିଙ୍କଟିଏ ଦେଖାଯିବ\n#ଯେଉଁ ଧାଡ଼ିର ଆଗରେ  # ଚିହ୍ନ ଥିବ ତାହାକୁ ମତାମତ ବୋଲି ଗଣାଯିବ\n#ଏସବୁ ଇଂରାଜୀ ବଡ଼ ଓ ସାନ ଅକ୍ଷର ପାଇଁ ଅଲଗା\n\n#ସବୁଯାକ ସାଧାରଣ ବିବରଣୀ ଖଣ୍ଡ (regex fragments)ଏହି ରେଖା ଉପରେ ରଖିବେ । ସେସବୁ ଯେମିତି ଅଛି ସେମିତି ହିଁ ରଖିବେ</pre>",
index 1a5e64e..afd652b 100644 (file)
@@ -72,7 +72,8 @@
                        "Py64",
                        "Nanaki",
                        "Alan ffm",
-                       "Macofe"
+                       "Macofe",
+                       "Devwebtel"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "pool-queuefull": "Kolejka zadań jest pełna",
        "pool-errorunknown": "Błąd nieznany",
        "pool-servererror": "Usługa licznika nie jest dostępna ($1).",
+       "poolcounter-usage-error": "Błąd użycia: $1",
        "aboutsite": "O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "aboutpage": "Project:O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "copyright": "Treść udostępniana na licencji $1, jeśli nie podano inaczej.",
        "filerenameerror": "Nie można zmienić nazwy pliku „$1” na „$2”.",
        "filedeleteerror": "Nie można usunąć pliku „$1”.",
        "directorycreateerror": "Nie udało się utworzyć katalogu „$1”.",
+       "directoryreadonlyerror": "Ścieżka \"$1\" jest tylko do odczytu.",
+       "directorynotreadableerror": "Ścieżka \"$1\" nie jest odczytywalna.",
        "filenotfound": "Nie można znaleźć pliku „$1”.",
        "unexpected": "Nieoczekiwana wartość „$1”=„$2”.",
        "formerror": "Błąd – nie można wysłać formularza",
        "content-model-text": "zwykły tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "duplicate-args-category": "Strony zawierające duplikaty parametrów w wywołaniach szablonów",
+       "content-json-empty-object": "Pusty obiekt",
+       "content-json-empty-array": "Pusta tablica",
+       "duplicate-args-category": "Strony zawierające wywołania szablonów z parametrami o takich samych nazwach",
        "duplicate-args-category-desc": "Strona zawiera szablony, które używają duplikatów argumentów, jak <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> lub <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.\n\nPowinno być mniej niż $2 {{PLURAL:$2|wywołanie|wywołania|wywołań}}, a obecnie {{PLURAL:$1|jest $1 wywołanie|są $1 wywołania|jest $1 wywołań}}.",
        "expensive-parserfunction-category": "Strony ze zbyt dużą liczbą wywołań kosztownych funkcji parsera",
        "history-feed-empty": "Wybrana strona nie istnieje.\nMogła zostać usunięta lub jej nazwa została zmieniona.\nSpróbuj [[Special:Search|poszukać]] tej strony.",
        "rev-deleted-comment": "(usunięto opis zmian)",
        "rev-deleted-user": "(nazwa użytkownika usunięta)",
-       "rev-deleted-event": "(wpis usunięty)",
+       "rev-deleted-event": "(szczegóły usunięte)",
        "rev-deleted-user-contribs": "[nazwa użytkownika lub adres IP usunięte – edycja ukryta we wkładzie]",
        "rev-deleted-text-permission": "Ta wersja strony została '''usunięta'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
        "rev-suppressed-text-permission": "Ta wersja strony została <strong>ukryta</strong>.\nSzczegóły można odnaleźć w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze ukryć].",
        "revdelete-legend": "Ustaw ograniczenia widoczności",
        "revdelete-hide-text": "Tekst wersji",
        "revdelete-hide-image": "Ukryj zawartość pliku",
-       "revdelete-hide-name": "Ukryj akcję i cel",
+       "revdelete-hide-name": "Ukryj cel i parametry",
        "revdelete-hide-comment": "Opis zmian",
        "revdelete-hide-user": "Nazwa użytkownika/adres IP",
        "revdelete-hide-restricted": "Ukryj informacje przed administratorami tak samo jak przed innymi",
        "uploaderror": "Błąd wysyłania",
        "upload-recreate-warning": "'''Uwaga: plik o tej nazwie został wcześniej usunięty lub przeniesiony.''' \n\nPoniżej znajduje się rejestr usunięć i zmian nazwy tej strony:",
        "uploadtext": "Użyj poniższego formularza do przesłania plików.\nJeśli chcesz przejrzeć lub przeszukać dotychczas przesłane pliki, przejdź do [[Special:FileList|listy plików]]. Każde przesłanie zostaje odnotowane w [[Special:Log/upload|rejestrze przesyłanych plików]], a usunięcie w [[Special:Log/delete|rejestrze usuniętych]].\n\nPlik pojawi się na stronie, jeśli użyjesz linku według jednego z następujących wzorów:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></code>''' pokaże plik w pełnej postaci\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|podpis grafiki]]</nowiki></code>''' pokaże szeroką na 200 pikseli miniaturkę umieszczoną przy lewym marginesie, otoczoną ramką, z podpisem „podpis grafiki”\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></code>''' utworzy bezpośredni link do pliku bez wyświetlania samego pliku",
-       "upload-permitted": "Dopuszczalne formaty plików: $1.",
-       "upload-preferred": "Zalecane formaty plików: $1.",
-       "upload-prohibited": "Zabronione formaty plików: $1.",
+       "upload-permitted": "{{PLURAL:$2|Dopuszczalny format|Dopuszczalne formaty}} plików: $1.",
+       "upload-preferred": "{{PLURAL:$2|Zalecany format|Zalecane formaty}} plików: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Zabroniony format|Zabronione formaty}} plików: $1.",
        "uploadlogpage": "Przesłane",
        "uploadlogpagetext": "Lista ostatnio przesłanych plików.\nPrzejdź na stronę [[Special:NewFiles|galerii nowych plików]], by zobaczyć pliki jako miniaturki.",
        "filename": "Nazwa pliku",
        "nimagelinks": "Używane na $1 {{PLURAL:$1|stronie|stronach}}",
        "ntransclusions": "używany na $1 {{PLURAL:$1|stronie|stronach}}",
        "specialpage-empty": "Ta strona raportu jest pusta.",
-       "lonelypages": "Porzucone strony",
+       "lonelypages": "Osierocone strony",
        "lonelypagestext": "Do poniższych stron nie linkuje żadna inna strona lub nie są one dołączone do innych stron w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "uncategorizedpages": "Nieskategoryzowane strony",
        "uncategorizedcategories": "Nieskategoryzowane kategorie",
        "deleteprotected": "Nie możesz usunąć tej strony, ponieważ została zabezpieczona.",
        "deleting-backlinks-warning": "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].",
        "rollback": "Cofnij edycję",
-       "rollback_short": "Cofnij",
        "rollbacklink": "cofnij",
        "rollbacklinkcount": "cofnij $1 {{PLURAL:$1|edycję|edycje|edycji}}",
        "rollbacklinkcount-morethan": "cofnij więcej niż $1 {{PLURAL:$1|edycję|edycje|edycji}}",
        "import-logentry-interwiki": "zaimportował(a) $1 używając transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersja|wersje|wersji}} z $2",
        "javascripttest": "Testowanie JavaScript",
-       "javascripttest-title": "Uruchamianie testów $1",
        "javascripttest-pagetext-noframework": "Ta strona jest zarezerwowana dla wykonywania testów JavaScript.",
        "javascripttest-pagetext-unknownframework": "Nieznany framework testowania „$1”.",
+       "javascripttest-pagetext-unknownaction": "Nieznana akcja \"$1\".",
        "javascripttest-pagetext-frameworks": "Wybierz jeden z następujących frameworków testowania: $1",
        "javascripttest-pagetext-skins": "Wybierz skórkę, na której chcesz uruchomić testy:",
        "javascripttest-qunit-intro": "Zobacz [$1 dokumentację testów] na mediawiki.org.",
-       "javascripttest-qunit-heading": "Pakiet testów JavaScriptu MediaWiki QUnit",
        "tooltip-pt-userpage": "Moja osobista strona",
        "tooltip-pt-anonuserpage": "Strona użytkownika dla adresu IP, spod którego edytujesz",
        "tooltip-pt-mytalk": "Moja strona dyskusji",
        "hebrew-calendar-m9-gen": "Siwan",
        "hebrew-calendar-m11-gen": "Aw",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|dyskusja]])",
-       "unknown_extension_tag": "Nieznany znacznik rozszerzenia „$1”",
        "duplicate-defaultsort": "Uwaga: Domyślnym kluczem sortowania będzie „$2” i zastąpi on wcześniej wykorzystywany klucz „$1”.",
        "duplicate-displaytitle": "<strong>Uwaga:</strong> Wyświetlenie tytułu „$2” powoduje nadpisanie wcześniej wyświetlanego tytułu „$1”.",
        "version": "Wersja oprogramowania",
        "version-entrypoints": "Adres URL punktu wejścia",
        "version-entrypoints-header-entrypoint": "Punkt wejścia",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Zainstalowane biblioteki",
+       "version-libraries-library": "Biblioteka",
+       "version-libraries-version": "Wersja",
        "redirect": "Przekierowanie według pliku, użytkownika, strony lub identyfikatora wersji",
        "redirect-legend": "Przekieruj do pliku lub strony",
        "redirect-summary": "Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji lub identyfikatorze strony) albo do strony użytkownika (o podanym identyfikatorze numerycznym). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] albo [[{{#Special:Redirect}}/user/101]].",
        "specialpages-group-spam": "Narzędzia do walki ze spamem",
        "specialpages-group-developer": "Narzędzia dewelopera",
        "blankpage": "Pusta strona",
-       "intentionallyblankpage": "Ta strona umyślnie pozostała pusta",
+       "intentionallyblankpage": "Tę stronę umyślnie pozostawiono pustą.",
        "external_image_whitelist": " #Pozostaw tę linię dokładnie tak, jak jest.<pre>\n#Wstaw poniżej fragmenty wyrażeń regularnych (tylko to, co znajduje się między //).\n#Wyrażenia te zostaną dopasowane do adresów URL zewnętrznych (bezpośrednio linkowanych) grafik.\n#Dopasowane adresy URL zostaną wyświetlone jako grafiki, w przeciwnym wypadku będzie pokazany jedynie link do grafiki.\n#Linie zaczynające się od # są traktowane jako komentarze.\n#We wpisach ma znaczenie wielkość znaków.\n\n#Wstaw wszystkie deklaracje wyrażeniami regularnymi poniżej tej linii. Pozostaw tę linię dokładnie tak, jak jest.</pre>",
        "tags": "Sprawdź zmiany w oparciu o wzorce tekstu",
        "tag-filter": "Filtr [[Special:Tags|wzorców tekstu]]",
        "compare-revision-not-exists": "Wybrana wersja nie istnieje.",
        "dberr-problems": "Przepraszamy! Witryna ma problemy techniczne.",
        "dberr-again": "Spróbuj przeładować stronę za kilka minut.",
-       "dberr-info": "(Brak komunikacji z serwerem bazy danych – $1)",
-       "dberr-info-hidden": "(Nie można skontaktować się z serwerem bazy danych)",
+       "dberr-info": "(Błąd łączności z bazą danych: $1)",
+       "dberr-info-hidden": "(Błąd łączności z bazą danych)",
        "dberr-usegoogle": "Możesz spróbować wyszukać w międzyczasie za pomocą Google.",
        "dberr-outofdate": "Uwaga – indeksy zawartości serwisu mogą być nieaktualne.",
        "dberr-cachederror": "Strona została pobrana z pamięci podręcznej i może być nieaktualna.",
index 05afab3..e089ec9 100644 (file)
        "pool-queuefull": "La coa ëd travaj a l'é pien-a",
        "pool-errorunknown": "Eror pa conossù",
        "pool-servererror": "Ël servissi ëd conteur dl'arzerva a l'é nen disponìbil ($1).",
+       "poolcounter-usage-error": "Eror d'utilisassion: $1",
        "aboutsite": "A propòsit ëd {{SITENAME}}",
        "aboutpage": "Project:A propòsit",
        "copyright": "Ël contnù a resta disponìbil sota $1 gavà ch'a sia marcà an n'àutra manera.",
        "anoneditwarning": "<strong>Atension:<strong> A l'é nen rintrà ant ël sistema. Soa adrëssa IP a së sc-iairërà s'a fà dle modìfiche. Si chiel a <strong>[$1 rintra ant ël sistema]</strong> o <strong>[$2 a crea an cont]</strong>, soe modìfiche a saran atribuìe a sò stranòm, ansema a d'àutri vantagg.",
        "anonpreviewwarning": "''A l'é nen rintrà ant ël sistema. An salvand a sarà memorisà soa adrëssa IP ant la stòria dle modìfiche ëd sa pàgina.''",
        "missingsummary": "'''Nòta:''' a l'ha butà gnun resumé dla modìfica. Se a sgnaca «{{int:savearticle}}» n'àutra vira, soa modìfica a resterà salvà sensa resumé.",
-       "selfredirect": "<strong>Atension:</strong> A l'é an camin ch'a crea na ridiriression a l'istess artìcol.\nS'a sgnaca torna ansima a «{{int:savearticle}}», la ridiression a sarà creà.",
+       "selfredirect": "<strong>Atension:</strong> A l'é an camin ch'a ridiression-a sa pàgina a chila-midema.\nMiraco a l'ha spessificà ël bërsaj sbalià për la ridiression, opura a l'é an camin ch'a modìfica la pàgina sbalià.\nS'a sgnaca torna ansima a «{{int:savearticle}}», la ridiression a sarà creà istess.",
        "missingcommenttext": "Për piasì, che a buta un coment sì-sota.",
        "missingcommentheader": "'''Ch'a arcòrda:''' A l'ha pa dàit ëd soget o d'intestassion për cost coment.\nSe a sgnaca torna «{{int:savearticle}}», soa modìfica a sarà salvà sensa gnun-a intestassion.",
        "summary-preview": "Preuva dël resumé:",
        "content-model-text": "mach test",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Oget veuid",
+       "content-json-empty-array": "Tàula veuida",
        "duplicate-args-category": "Pàgine ch'a deuvro d'argoment dobi ant j'arceste dë stamp",
        "duplicate-args-category-desc": "La pàgina a conten cj'arceste dë stamp che deuvro ëd duplicà d'argoment, tanme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions d'anàlisi sintàtica.\n\nA dovrìa essnie men che {{PLURAL:$2|$2}}, adess a-i na j'é {{PLURAL:$1|$1}}.",
        "history-feed-empty": "La pàgina che a l'ha ciamà a-i é pa; a podrìa esse stàita scancelà da 'nt ël sit, ò pura tramudà a n'àutr nòm.\n\nChe a verìfica con la [[Special:Search|pàgina d'arserca]] se a-i fusso mai dj'àutre pàgine che a podèisso andeje bin.",
        "rev-deleted-comment": "(resumé dla modìfica gavà)",
        "rev-deleted-user": "(stranòm gavà)",
-       "rev-deleted-event": "(assion dël registr gavà)",
+       "rev-deleted-event": "(detaj dël registr gavà)",
        "rev-deleted-user-contribs": "[nòm utent o adrëssa IP gavà - modìfica stërmà ai contributor]",
        "rev-deleted-text-permission": "Sta revision-sì dla pàgina a l'é staita '''scancelà'''.\nA-i peulo essnie dle marche ant ël [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registr ëd jë scancelament].",
        "rev-suppressed-text-permission": "Costa revision dla pàgina-sì a l'é stàita <stong>gavà via<strong>.\nIj detaj as treuvo ant ël [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registr ëd jë scancelament].",
        "revdelete-legend": "But-je coste limitassion-sì a le version scancelà:",
        "revdelete-hide-text": "Test dla revision",
        "revdelete-hide-image": "Stërma ël contnù dl'archivi",
-       "revdelete-hide-name": "Stërma assion e oget",
+       "revdelete-hide-name": "Stërmé ël bërsaj e ij paràmeter",
        "revdelete-hide-comment": "Resumé dla modìfica",
        "revdelete-hide-user": "Stranòm/adrëssa IP dl'utent",
        "revdelete-hide-restricted": "Stërmé j'anformassion a j'aministrator tan-me a j'àutri",
        "deleteprotected": "A peul nen ëscancelé costa pàgina përchè a l'é proteta.",
        "deleting-backlinks-warning": "'''Avis:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D'àutre pàgine]] a l'han na liura o a transcludo la pàgina che chiel a veul ëscancelé.",
        "rollback": "Gavé via le modìfiche",
-       "rollback_short": "Ripristiné",
        "rollbacklink": "ripristiné j'archivi",
        "rollbacklinkcount": "tiré andré $1 {{PLURAL:$1|modìfica|modìfiche}}",
        "rollbacklinkcount-morethan": "tiré andré pi che $1 {{PLURAL:$1|modìfica|modìfiche}}",
        "thumbnail-temp-create": "Pa bon a creé l'archivi ëd miniadura temporania",
        "thumbnail-dest-create": "Pa bon a salvé na miniadura sla destinassion",
        "thumbnail_invalid_params": "Paràmetro dla figurin-a pa giust",
+       "thumbnail_toobigimagearea": "Archivi con dimension pi granda che $1",
        "thumbnail_dest_directory": "As peul pa fesse ël dossié ëd destinassion",
        "thumbnail_image-type": "Sòrt ëd figura nen gestì",
        "thumbnail_gd-library": "Configurassion incompleta dla biblioteca GD: Fonsion $1 mancanta",
        "import-logentry-interwiki": "Amportà da n'àutra wiki $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision}} amportà da $2",
        "javascripttest": "Preuva ëd JavaScript",
-       "javascripttest-title": "Fé dle preuve $1",
        "javascripttest-pagetext-noframework": "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
        "javascripttest-pagetext-unknownframework": "Strutura ëd preuva pa conossùa «$1».",
+       "javascripttest-pagetext-unknownaction": "Assion nen conossùa «$1».",
        "javascripttest-pagetext-frameworks": "Për piasì, ch'a serna un-a dle struture ëd preuva sì-dapress: $1",
        "javascripttest-pagetext-skins": "Ch'a serna na pel për fé le preuve:",
        "javascripttest-qunit-intro": "Vëdde [$1 la documentassion dle preuve] dzora a mediawiki.org.",
-       "javascripttest-qunit-heading": "Sequensa ëd preuve QUnit ëd JavaScript su MediaWiki",
        "tooltip-pt-userpage": "Soa pàgina utent",
        "tooltip-pt-anonuserpage": "La pàgina utent për l'IP con ël qual chiel a contribuiss",
        "tooltip-pt-mytalk": "Soa pàgina ëd discussion e ciaciarade",
        "iranian-calendar-m11": "Mèis Jalāli ch'a fa óndes",
        "iranian-calendar-m12": "Meis Jalāli ch'a fa dódes",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciaciarade]])",
-       "unknown_extension_tag": "Tichëtta d'estension «$1» pa conossùa",
        "duplicate-defaultsort": "'''Atension:''' La ciav d'ordinament ëstàndard «$2» a pija ël pòst ëd cola ëd prima «$1».",
        "duplicate-displaytitle": "<strong>Warning:</strong> ël tìtol ëd visualisassion «$2» a rampiassa ëd vej tìtol ëd visualisassion «$1».",
        "invalid-indicator-name": "<strong>Eror:</strong> l'atribù <code>name</code> dj'andicator dlë statù dla pàgina a peul nen esse veuid.",
        "version-entrypoints-header-entrypoint": "Pont d'intrada",
        "version-entrypoints-header-url": "Adrëssa an sl'aragnà",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Senté d'artìcol]",
+       "version-libraries": "Biblioteche anstalà",
+       "version-libraries-library": "Biblioteca",
+       "version-libraries-version": "Version",
        "redirect": "Ridirigiù da archivi, utent, pàgina o ID ëd revision",
        "redirect-legend": "Ridirige a n'archivi o na pàgina",
        "redirect-summary": "Costa pàgina special a ponta a n'archivi (dàit ël nòm dl'archivi), na pàgina (dàit n'ID ëd revision o n'ID ëd pàgina) o na pàgina d'utent (dàit n'identificativ numérich a l'utent). Usagi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "La revision che a l'ha spessificà a esist pa.",
        "dberr-problems": "An dëspias! Ës sit a l'ha dle dificoltà técniche.",
        "dberr-again": "Ch'a speta chèiche minute e ch'a preuva torna a carié.",
-       "dberr-info": "(Conession al servent ëd base ëd dàit impossìbil: $1)",
-       "dberr-info-hidden": "(Conession al servent ëd base ëd dàit impossìbil)",
+       "dberr-info": "(Acess a la base ëd dàit impossìbil: $1)",
+       "dberr-info-hidden": "(Acess a la base ëd dàit impossìbil)",
        "dberr-usegoogle": "Antratant a peul prové a sërché con Google.",
        "dberr-outofdate": "Ch'a ten-a da ment che soe indesassion dij nòstri contnù a podrìo esse nen agiornà.",
        "dberr-cachederror": "Costa-sì a l'é na còpia an memòria local ëd la pàgina ciamà, e a peul esse nen agiornà.",
index 229f422..3c36073 100644 (file)
        "watchlisttools-view": "Waidinnais kitawīdinsnans en listin stēisan nadirītan",
        "watchlisttools-edit": "Wīdais be redigīs listin stēisan nadirītan",
        "watchlisttools-raw": "Redigīs listis appun sen tekstas ēnrankin",
-       "unknown_extension_tag": "NIwaīsts plattinsenes zentlitajs \"$1\"",
        "version": "Wersiōni",
        "version-extensions": "Instalītai plattinsenei",
        "version-specialpages": "Speciālai pāusai",
index 375c69e..c687639 100644 (file)
@@ -75,7 +75,8 @@
                        "Jefersonmoraes",
                        "Marcos dias de oliveira",
                        "He7d3r",
-                       "PauloEduardo"
+                       "PauloEduardo",
+                       "Webysther"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "tog-shownumberswatching": "Mostrar o número de usuários que estão vigiando",
        "tog-oldsig": "Assinatura existente:",
        "tog-fancysig": "Tratar assinatura como wikitexto (sem link automático)",
-       "tog-uselivepreview": "Utilizar pré-visualização em tempo real (experimental)",
+       "tog-uselivepreview": "Utilizar pré-visualização em tempo real",
        "tog-forceeditsummary": "Avisar-me ao introduzir um sumário de edição vazio",
        "tog-watchlisthideown": "Ocultar as minhas edições da lista de páginas vigiadas",
        "tog-watchlisthidebots": "Ocultar edições de bots da lista de páginas vigiadas",
        "pool-queuefull": "A fila de processos está cheia",
        "pool-errorunknown": "Erro desconhecido",
        "pool-servererror": "O servidor de contador do pool não está disponível ($1).",
+       "poolcounter-usage-error": "Erro de uso: $1",
        "aboutsite": "Sobre {{SITENAME}}",
        "aboutpage": "Project:Sobre",
        "copyright": "Conteúdo disponível sob $1, salvo indicação em contrário.",
        "filerenameerror": "Não foi possível renomear o arquivo \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o arquivo \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
+       "directoryreadonlyerror": "Diretorio \"$1\" é somente leitura.",
+       "directorynotreadableerror": "O diretório \"$1\" não é legível.",
        "filenotfound": "Não foi possível encontrar o arquivo \"$1\".",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
        "viewyourtext": "Pode ver e copiar o código fonte '''das suas edições''' nesta página:",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [//translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
        "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
+       "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [//translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
        "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de \"proteção progressiva\" ativada):\n$2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
        "anoneditwarning": "'''Atenção''': Você não se encontra autenticado.\nO seu endereço de IP será registrado no histórico de edições desta página.",
        "anonpreviewwarning": "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
        "missingsummary": "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
+       "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 de sumário:",
        "content-model-text": "texto simples",
        "content-model-javascript": "Javascript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objeto vazio",
+       "content-json-empty-array": "Array vazia",
        "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições",
+       "duplicate-args-category-desc": "A pagina contem modelos que usam argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Aviso: Esta página contém muitas chamadas a funções do analisador \"parser\".\n\nDeveria ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento {{PLURAL:$1|há $1 chamada|existem $1 chamadas}}.",
        "expensive-parserfunction-category": "Páginas com muitas chamadas a funções do analisador \"parser\"",
        "post-expand-template-inclusion-warning": "'''Aviso''': a soma do tamanho de inclusão de predefinições é muito grande.\nAlgumas predefinições não serão processadas.",
        "history-feed-empty": "A página requisitada não existe.\nPoderá ter sido eliminada do wiki ou renomeada.\nTente [[Special:Search|pesquisar no wiki]] por páginas relevantes.",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de usuário removido)",
-       "rev-deleted-event": "(entrada removida)",
+       "rev-deleted-event": "(registros de detalhes eliminados)",
        "rev-deleted-user-contribs": "[nome de usuário ou endereço de IP eliminado - edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão desta página foi '''eliminada'''.\nPodem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
        "rev-suppressed-text-permission": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "revdelete-legend": "Definir restrições de visualização",
        "revdelete-hide-text": "Texto de revisão",
        "revdelete-hide-image": "Ocultar conteúdos do arquivo",
-       "revdelete-hide-name": "Ocultar ação e alvo",
+       "revdelete-hide-name": "Ocultar destino e parâmetros",
        "revdelete-hide-comment": "Sumário de edição",
        "revdelete-hide-user": "Nome de usuário/endereço IP",
        "revdelete-hide-restricted": "Suprimir dados de administradores assim como de outros",
        "mergehistory-empty": "Não existem edições habilitadas a serem fundidas.",
        "mergehistory-success": "$3 {{PLURAL:$3|revisão|revisões}} de [[:$1]] fundidas em [[:$2]] com sucesso.",
        "mergehistory-fail": "Não foi possível fundir os históricos; por gentileza, verifique a página e os parâmetros de tempo.",
+       "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem ($1) não existe.",
        "mergehistory-no-destination": "A página de destino ($1) não existe.",
        "mergehistory-invalid-source": "A página de origem precisa ser um título válido.",
        "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 arquivo|$3 arquivos}})",
        "search-redirect": "(redirecionamento de $1)",
        "search-section": "(seção $1)",
+       "search-category": "(categoria $1)",
        "search-file-match": "(coincide com o conteúdo do arquivo)",
        "search-suggest": "Você quis dizer: $1",
        "search-interwiki-caption": "Projetos irmãos",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
+       "showingresultsinrange": "Apresenta-se abaixo {{PLURAL:$1|<strong>1</strong> resultado|até <strong>$1</strong> resultados}} no intervalo #<strong>$2</strong> a #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Não há resultados que correspondam à consulta.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos espaços nominais:",
        "right-browsearchive": "Buscar páginas eliminadas",
        "right-undelete": "Restaurar páginas",
        "right-suppressrevision": "Rever e restaurar edições indisponíveis a administradores",
+       "right-viewsuppressed": "Ver revisões escondidas de qualquer usuário",
        "right-suppressionlog": "Ver registros privados",
        "right-block": "Impedir outros usuários de editarem",
        "right-blockemail": "Impedir um usuário de enviar email",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
        "right-editprotected": "Editar páginas protegidas como \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Editar páginas protegidas como \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Editar o modelo de uma pagina",
        "right-editinterface": "Editar a interface de usuário",
        "right-editusercssjs": "Editar os arquivos CSS e JS de outros usuários",
        "right-editusercss": "Editar os arquivos CSS de outros usuários",
        "action-viewmywatchlist": "veja sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "veja suas informações privadas",
        "action-editmyprivateinfo": "modifique suas informações privadas",
+       "action-editcontentmodel": "editar o conteudo do modelo de uma pagina",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "recentchanges-legend-heading": "'''Legenda''':",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Abaixo estão mostradas as alterações desde <strong>$2</strong> (até <strong>$1</strong>).",
+       "rcnotefrom": "Abaixo {{PLURAL:$5|é a mudança|são as mudanças}} desde <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Mostrar as novas alterações a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Exibir",
        "uploaderror": "Erro ao enviar arquivo",
        "upload-recreate-warning": "'''Aviso: Um arquivo com este nome foi eliminado ou movido.'''\n\nPara sua conveniência, segue o registro de eliminação e de movimentação:",
        "uploadtext": "Use o formulário abaixo para enviar arquivos.\nPara ver ou pesquisar arquivos já enviados, consulte a [[Special:FileList|lista de arquivos enviados]]. Re-envios também são registrados no [[Special:Log/upload|registro de uploads]]; eliminações no [[Special:Log/delete|registro de eliminações]]\n\nPara incluir o arquivo em uma página, use um link em um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Arquivo.jpg]]</nowiki></code>''' para utilizar a versão completa do arquivo;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Arquivo.png|200px|thumb|left|texto]]</nowiki></code>''' para utilizar uma renderização de 200 pixels dentro de uma caixa posicionada à margem esquerda, contendo 'texto' como descrição;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Arquivo.ogg]]</nowiki></code>''' para um link direto ao arquivo sem que ele seja exibido.",
-       "upload-permitted": "Tipos de arquivos permitidos: $1.",
-       "upload-preferred": "Tipos de arquivos preferidos: $1.",
-       "upload-prohibited": "Tipos de arquivo proibidos: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipo|Tipos}} de {{PLURAL:$2|arquivo|arquivos}} {{PLURAL:$2|permitido|permitidos}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo|Tipos}} de {{PLURAL:$2|arquivo|arquivos}} {{PLURAL:$2|preferido|preferidos}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo|Tipos}} de {{PLURAL:$2|arquivo|arquivos}} {{PLURAL:$2|proibido|proibidos}}: $1.",
        "uploadlogpage": "Registro de uploads",
        "uploadlogpagetext": "Segue listagem dos uploads de arquivos mais recentes.\nA [[Special:NewFiles|galeria de arquivos novos]] oferece uma listagem mais visual.",
        "filename": "Nome do arquivo",
        "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1",
        "wantedfiles": "Arquivos pedidos",
        "wantedfiletext-cat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Os arquivos seguintes são usados mas não existem. Além disso, as paginas que incorporam arquivos que não existem estão listadas em [[:$1]].",
        "wantedfiletext-nocat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>.",
+       "wantedfiletext-nocat-noforeign": "Os seguintes arquivos são usados, mas não existem.",
        "wantedtemplates": "Predefinições pedidas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
-       "mostlinkedtemplates": "Páginas com mais transclusões",
+       "mostlinkedtemplates": "Páginas mais transcluídas",
        "mostcategories": "Páginas de conteúdo com mais categorias",
        "mostimages": "Imagens com mais afluentes",
        "mostinterwikis": "Páginas com mais interwikis",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
        "suppress": "Supervisor",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
+       "apihelp": "Ajuda de API",
+       "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão de categoria",
        "noindex-category-desc": "A página não é indexada por robôs, porque possui a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está em um namespace onde a flag é permitida.",
+       "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.",
        "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.",
+       "post-expand-template-argument-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de um argumento de predefinição (algo em chavetas triplas, como <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "A página contém uma ligação quebrada para um arquivo(uma ligação para incorporar um arquivo que não existe).",
+       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de ligações de categoria nas páginas, por omissão.",
        "trackingcategories-nodesc": "Nenhuma descrição disponível.",
        "trackingcategories-disabled": "A categoria está desabilitada",
        "mailnologin": "Nenhum endereço de envio",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
-       "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} a partir de $3, $4.",
+       "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
        "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "Vigiando...",
        "exbeforeblank": "o conteúdo antes de esvaziar era: '$1'",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
-       "historywarning": "'''Atenção:''' A página que você está prestes a eliminar possui um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
+       "historywarning": "<strong>Aviso:</strong> A página que está prestes a eliminar tem um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
        "confirmdeletetext": "Encontra-se prestes a eliminar permanentemente uma página ou uma imagem e todo o seu histórico.\nPor favor, confirme que possui a intenção de fazer isto, que compreende as consequências e que encontra-se a fazer isto de acordo com as [[{{MediaWiki:Policy-url}}|políticas]] do projeto.",
        "actioncomplete": "Ação concluída",
        "actionfailed": "Falha na ação",
        "delete-edit-reasonlist": "Editar motivos de eliminação",
        "delete-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.",
        "delete-warning-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados de {{SITENAME}};\nprossiga com cuidado.",
+       "deleteprotected": "Não é possível eliminar esta página porque foi protegida.",
        "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páginas]] se ligam ou redirecionam para a página que você está prestes a deletar.",
        "rollback": "Reverter edições",
-       "rollback_short": "Reverter",
        "rollbacklink": "reverter",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "rollbacklinkcount-morethan": "reverter mais de $1 {{PLURAL:$1|edição|edições}}",
        "protect-othertime": "Outra duração:",
        "protect-othertime-op": "outra duração",
        "protect-existing-expiry": "A proteção atual expirará às $3 de $2",
+       "protect-existing-expiry-infinity": "Existente tempo de expiração: infinito",
        "protect-otherreason": "Outro motivo/motivo adicional:",
        "protect-otherreason-op": "Outro motivo",
        "protect-dropdown": "*Motivos comuns para proteção\n** Vandalismo excessivo\n** Inserção excessiva de ''spams''\n** Guerra de edições improdutiva\n** Página bastante acessada",
        "namespace": "Espaço nominal:",
        "invert": "Inverter seleção",
        "tooltip-invert": "Marque esta caixa para esconder as alterações a páginas no espaço nominal selecionado (e no espaço nominal associado, se escolheu fazê-lo)",
+       "tooltip-whatlinkshere-invert": "Marque esta caixa de seleção para ocultar ligações de páginas dentro do domínio selecionado.",
        "namespace_association": "Espaço nominal associado",
        "tooltip-namespace_association": "Marque esta caixa para incluir também o espaço nominal de conteúdo ou de discussão associado à sua seleção",
        "blanknamespace": "(Principal)",
        "unblocked": "[[User:$1|$1]] foi desbloqueado",
        "unblocked-range": "$1 foi desbloqueado",
        "unblocked-id": "O bloqueio de $1 foi removido com sucesso",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] foi desbloqueado.",
        "blocklist": "Usuários bloqueados",
        "ipblocklist": "Usuários bloqueados",
        "ipblocklist-legend": "Procurar por um usuário bloqueado",
        "import-logentry-interwiki": "transwiki $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|$1 edição|$1 edições}} de $2",
        "javascripttest": "Teste de JavaScript",
-       "javascripttest-title": "Executando testes para $1",
        "javascripttest-pagetext-noframework": "Esta página é exclusiva para testes de JavaScript.",
        "javascripttest-pagetext-unknownframework": "A estrutura de testes \"$1\" é desconhecida.",
        "javascripttest-pagetext-frameworks": "Escolha uma das seguintes estruturas de teste: $1",
        "javascripttest-pagetext-skins": "Escolha o tema para executar os testes:",
        "javascripttest-qunit-intro": "Veja a [$1 documentação de testes] no mediawiki.org.",
-       "javascripttest-qunit-heading": "Suíte de ferramentas de teste JavaScript QUnit para MediaWiki",
        "tooltip-pt-userpage": "Sua página de usuário",
        "tooltip-pt-anonuserpage": "A página de usuário para o ip com o qual você está editando",
        "tooltip-pt-mytalk": "Sua página de discussão",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Edição crua da lista de páginas vigiadas",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
-       "unknown_extension_tag": "\"$1\" é uma tag de extensão desconhecida",
        "duplicate-defaultsort": "Aviso: A chave de ordenação padrão \"$2\" sobrepõe-se à anterior chave de ordenação padrão \"$1\".",
        "version": "Versão",
        "version-extensions": "Extensões instaladas",
index 21a976a..996565d 100644 (file)
@@ -63,7 +63,8 @@
                        "아라",
                        "Leon saudanha",
                        "Macofe",
-                       "He7d3r"
+                       "He7d3r",
+                       "Ti4goc"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
        "pool-queuefull": "A fila de processos está cheia",
        "pool-errorunknown": "Erro desconhecido",
        "pool-servererror": "O serviço ''pool counter'' não está disponível ($1).",
+       "poolcounter-usage-error": "Erro de uso: $1",
        "aboutsite": "Sobre a {{SITENAME}}",
        "aboutpage": "Project:Sobre",
        "copyright": "Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.",
        "anoneditwarning": "<strong>Aviso</strong>: Não iniciou sessão. O seu endereço IP será registado no histórico de edições desta página. Se <strong>[$1 iniciar sessão]</strong> ou <strong>[$2 criar uma conta]</strong>, as suas edições serão registadas com o seu nome de utilizador(a), bem como usufruir de outros benefícios.",
        "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
+       "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": "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto ou cabeçalho.",
        "summary-preview": "Antevisão do resumo:",
        "content-model-text": "texto simples",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objeto vazio",
+       "content-json-empty-array": "Matriz vazia",
        "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições",
+       "duplicate-args-category-desc": "A página contém campos de predefinições que utilizam duplicatas de argumentos, tais como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Aviso:''' Esta página contém demasiadas chamadas de funções exigentes do analisador sintático.\n\nDevia ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento tem $1 {{PLURAL:$1|chamada|chamadas}}.",
        "expensive-parserfunction-category": "Páginas com demasiadas chamadas a funções exigentes",
        "post-expand-template-inclusion-warning": "Aviso: O tamanho de inclusão de predefinições é demasiado grande, algumas predefinições não serão incluídas.",
        "history-feed-empty": "A página solicitada não existe.\nPode ter sido eliminada da wiki ou o nome sido alterado.\nTente [[Special:Search|pesquisar na wiki]] novas páginas relevantes.",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de utilizador removido)",
-       "rev-deleted-event": "(entrada removida)",
+       "rev-deleted-event": "(registos de detalhes eliminados)",
        "rev-deleted-user-contribs": "[nome de utilizador ou IP removido - edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "revdelete-legend": "Definir restrições de visibilidade",
        "revdelete-hide-text": "Revisão do texto",
        "revdelete-hide-image": "Ocultar conteúdo do ficheiro",
-       "revdelete-hide-name": "Ocultar operação e destino",
+       "revdelete-hide-name": "Ocultar destino e parâmetros",
        "revdelete-hide-comment": "Resumo da edição",
        "revdelete-hide-user": "Nome de utilizador/endereço de IP",
        "revdelete-hide-restricted": "Ocultar dados dos administradores e de todos os outros",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
        "right-editprotected": "Editar páginas protegidas como \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Editar páginas protegidas como \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Editar o modelo de conteúdo de uma página",
        "right-editinterface": "Editar a interface de utilizador",
        "right-editusercssjs": "Editar os ficheiros CSS e JS de outros utilizadores",
        "right-editusercss": "Editar os ficheiros CSS de outros utilizadores",
        "action-viewmywatchlist": "ver a sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "ver a sua informação privada",
        "action-editmyprivateinfo": "editar a sua informação privada",
+       "action-editcontentmodel": "editar o modelo de conteúdo de uma página",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "uploaderror": "Erro ao carregar",
        "upload-recreate-warning": "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''\n\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o carregamento, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
-       "upload-permitted": "Tipos de ficheiro permitidos: $1.",
-       "upload-preferred": "Tipos de ficheiro preferidos: $1.",
-       "upload-prohibited": "Tipos de ficheiro proibidos: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|permitido|permitidos}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|preferido|preferidos}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|proibido|proibidos}}: $1.",
        "uploadlogpage": "Registo de carregamento",
        "uploadlogpagetext": "Segue-se uma lista dos carregamentos mais recentes.\nConsulte a [[Special:NewFiles|galeria de novos ficheiros]] para visioná-los.",
        "filename": "Nome do ficheiro",
        "wantedtemplates": "Predefinições desejadas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
-       "mostlinkedtemplates": "Páginas com mais afluentes",
+       "mostlinkedtemplates": "Páginas mais transcluídas",
        "mostcategories": "Páginas com mais categorias",
        "mostimages": "Ficheiros com mais afluentes",
        "mostinterwikis": "Páginas com mais interlínguas",
        "deleteprotected": "Não é possível eliminar esta página porque foi protegida.",
        "deleting-backlinks-warning": "'''Aviso:''' Existem [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.",
        "rollback": "Reverter edições",
-       "rollback_short": "Reverter",
        "rollbacklink": "reverter",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "rollbacklinkcount-morethan": "reverter mais do que $1 {{PLURAL:$1|edição|edições}}",
        "protect-othertime": "Outra duração:",
        "protect-othertime-op": "outra duração",
        "protect-existing-expiry": "A proteção atual expirará às $3 de $2",
+       "protect-existing-expiry-infinity": "Existente tempo de expiração: infinito",
        "protect-otherreason": "Outro motivo/motivo adicional:",
        "protect-otherreason-op": "Outro motivo",
        "protect-dropdown": "*Motivos comuns para proteção\n** Vandalismo excessivo\n** ''Spam'' excessivo\n** Guerra de edições improdutiva\n** Página muito visitada",
        "namespace": "Domínio:",
        "invert": "Inverter seleção",
        "tooltip-invert": "Marque esta caixa para esconder as alterações a páginas no domínio selecionado (e no domínio associado, se escolheu fazê-lo)",
+       "tooltip-whatlinkshere-invert": "Marque esta caixa de seleção para ocultar ligações de páginas dentro do domínio selecionado.",
        "namespace_association": "Domínio associado",
        "tooltip-namespace_association": "Marque esta caixa para incluir também o domínio de conteúdo ou de discussão associado à sua seleção",
        "blanknamespace": "(Principal)",
        "thumbnail-temp-create": "Não foi possível criar o ficheiro temporário da miniatura",
        "thumbnail-dest-create": "Não é possível gravar a miniatura no destino",
        "thumbnail_invalid_params": "Parâmetros de miniatura inválidos",
+       "thumbnail_toobigimagearea": "Ficheiro com dimensões superiores a $1",
        "thumbnail_dest_directory": "Não foi possível criar o diretório de destino",
        "thumbnail_image-type": "Tipo de imagem não suportado",
        "thumbnail_gd-library": "Configuração da biblioteca GD incompleta: função $1 em falta",
        "import-logentry-interwiki": "transwikis $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|edição importada|edições importadas}} de $2",
        "javascripttest": "Teste de JavaScript",
-       "javascripttest-title": "A executar os testes $1",
        "javascripttest-pagetext-noframework": "Esta página é reservada para a execução de testes de JavaScript.",
        "javascripttest-pagetext-unknownframework": "Estrutura de testes \"$1\" desconhecida.",
+       "javascripttest-pagetext-unknownaction": "Ação \"$1\" desconhecida.",
        "javascripttest-pagetext-frameworks": "Escolha, por favor, uma das seguintes estruturas de teste: $1",
        "javascripttest-pagetext-skins": "Escolher um tema para executar os testes com:",
        "javascripttest-qunit-intro": "Consulte a [ $1 documentação de testes] no mediawiki.org.",
-       "javascripttest-qunit-heading": "Pacote de ferramentas de teste de JavaScript QUnit do MediaWiki",
        "tooltip-pt-userpage": "A sua página de utilizador",
        "tooltip-pt-anonuserpage": "A página de utilizador para o endereço IP que está a usar",
        "tooltip-pt-mytalk": "A sua página de discussão",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Editar a lista de páginas vigiadas em forma de texto",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
-       "unknown_extension_tag": "\"$1\" é uma marca de extensão desconhecida",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A chave de ordenação padrão \"$2\" sobrepõe-se à anterior \"$1\".",
        "duplicate-displaytitle": "<strong>Aviso:</strong> Exibir título \"$2\" substituindo o título anteriormente em exibição \"$1\".",
+       "invalid-indicator-name": "<strong>Erro:</strong> O atributo <code>name</code>, da página de estados, não deve estar em branco.",
        "version": "Versão",
        "version-extensions": "Extensões instaladas",
        "version-skins": "Temas instalados",
        "version-entrypoints": "URL de ponto de entrada",
        "version-entrypoints-header-entrypoint": "Ponto de entrada",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Bibliotecas instaladas",
+       "version-libraries-library": "Biblioteca",
+       "version-libraries-version": "Versão",
        "redirect": "Redireccionar pelo ID do ficheiro, do utilizador ou da revisão",
        "redirect-legend": "Redirecionar para um ficheiro ou página",
        "redirect-summary": "Esta página especial redirecciona para um ficheiro (dado o nome do ficheiro), para uma página (dado um ID de revisão ou página) ou para uma página de utilizador (dado um ID numérico do utilizador). Utilização: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "A revisão que especificou não existe.",
        "dberr-problems": "Desculpe! Este sítio está com dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
-       "dberr-info": "(Não foi possível contactar o servidor da base de dados: $1)",
-       "dberr-info-hidden": "(Não foi possível contactar o servidor de base de dados)",
+       "dberr-info": "(Não foi possível aceder ao servidor da base de dados: $1)",
+       "dberr-info-hidden": "(Não foi possível aceder ao servidor da base de dados)",
        "dberr-usegoogle": "Pode tentar pesquisar no Google entretanto.",
        "dberr-outofdate": "Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.",
        "dberr-cachederror": "A seguinte página é uma cópia em cache da página pedida e pode não estar atualizada.",
        "revdelete-uname-unhid": "utilizador desocultado",
        "revdelete-restricted": "restrições a administradores aplicadas",
        "revdelete-unrestricted": "restrições a administradores removidas",
+       "logentry-merge-merge": "$1 {{GENDER:$2|fundiu}} $3 com $4 (edições até $5)",
        "logentry-move-move": "$1 moveu a página $3 para $4",
        "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
        "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para $4 sobre um redirecionamento",
        "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-publishfailed": "Erro interno: Servidor não conseguiu publicar ficheiro temporário.",
        "api-error-stasherror": "Ocorreu um erro no carregamento do ficheiro escondido.",
+       "api-error-stashedfilenotfound": "O escondido ficheiro não foi encontrado ao tentar carregar a pasta do stash.",
+       "api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
+       "api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
+       "api-error-stashzerolength": "O servidor não pôde esconder o ficheiro, porque ele tinha de comprimento zero.",
+       "api-error-stashnotloggedin": "Você deve estar com sessão iniciaca para gravar ficheiros no carregamento do stash.",
+       "api-error-stashwrongowner": "O ficheiro que estava a tentar aceder o stash não pertence a você.",
+       "api-error-stashnosuchfilekey": "O ficheiro de chave que está a tentar aceder no stash não existe.",
        "api-error-timeout": "O servidor não respondeu no prazo esperado.",
        "api-error-unclassified": "Ocorreu um erro desconhecido",
        "api-error-unknown-code": "Erro desconhecido: \"$1\"",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong> Se não resultar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
+       "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
        "pagelanguage": "Seletor de idioma da página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "mediastatistics-header-text": "Textuais",
        "mediastatistics-header-executable": "Executáveis",
        "mediastatistics-header-archive": "Formatos compactados",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|vírgula desnecessária foi removida|vírgulas desnecessárias foram removidas}} do código JSON",
        "json-error-unknown": "Houve um problema com o JSON. Erro: $1",
        "json-error-depth": "A profundidade máxima da pilha foi excedida",
        "json-error-state-mismatch": "Código JSON inválido ou mal formatado",
+       "json-error-ctrl-char": "Erro de carácter de controlo, possivelmente codificado incorretamente",
        "json-error-syntax": "Erro de sintaxe",
+       "json-error-utf8": "Caracteres UTF-8 mal formatados, possivelmente codificado incorretamente",
        "json-error-unsupported-type": "Foi dado um valor de um tipo que não pode ser codificado"
 }
index 2082104..4fc6ee0 100644 (file)
        "pool-queuefull": "Part of {{msg-mw|view-pool-error}}\n\n\"Pool\" refers to a pool of processes.",
        "pool-errorunknown": "Part of {{msg-mw|view-pool-error}}.\n{{Identical|Unknown error}}",
        "pool-servererror": "Error message. Parameters:\n* $1 - list of server addresses\n\nSee e.g. {{msg-mw|Poolcounter-desc}} (and the Pool Counter extension in general) for translation hints for “pool counter service”.",
+       "poolcounter-usage-error": "Used as error message. Parameters:\n* $1 - non-localized string describing usage mistake.",
        "aboutsite": "Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.\n\n[[mw:Manual:Interface/Aboutsite|MediaWiki manual]].\n\n{{doc-important|Do not change <nowiki>{{SITENAME}}</nowiki>.}}\n\n{{Identical|About}}",
        "aboutpage": "Used as the target of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. Therefore the content should be the same with the page name of the site description page. Only the message in the [[mw:Manual:$wgLanguageCode|site language]]  ([[MediaWiki:Aboutpage]]) is used. The link label is {{msg-mw|aboutsite}}.\n\n{{doc-important|Do not translate \"Project:\" part, for this is the namespace prefix.}}",
        "copyright": "Parameters:\n* $1 - license name\n'''See also'''\n* {{msg-mw|Mobile-frontend-copyright}}",
        "image_sample": "{{optional}}\nUsed in text generated by Picture button in toolbar.\n{{Identical|Example}}",
        "image_tip": "This is the text that appears when you hover the mouse over the sixth (middle) button on the edit toolbar.\n\n{{Identical|Embedded file}}",
        "media_sample": "{{optional}}",
-       "media_tip": "This is the text that appears when you hover the mouse over the fifth button from the right in the edit toolbar.",
+       "media_tip": "This is the text that appears when you hover the mouse over the fifth button from the right in the edit toolbar.\n{{Identical|File link}}",
        "sig_tip": "This is the text that appears when you hover the mouse over the second key from the right on the edit toolbar.\n{{Identical|Signature with timestamp}}",
        "hr_tip": "This is the text that appears when you hover the mouse over the first button on the right on the edit toolbar.",
        "summary": "The Summary text beside the edit summary field\n\nSee also:\n* {{msg-mw|Subject}}\nSee also:\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}\n{{Identical|Summary}}",
        "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
+       "content-model-json": "Name for the JSON content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
+       "content-json-empty-object": "Used to represent an object with no properties on a JSON content model page.",
+       "content-json-empty-array": "Used to represent an array with no values on a JSON content model page.",
        "duplicate-args-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "duplicate-args-category-desc": "Duplicate arguments category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Duplicate-args-category}}",
        "expensive-parserfunction-warning": "On some (expensive) [[MetaWikipedia:Help:ParserFunctions|parser functions]] (e.g. <code><nowiki>{{#ifexist:}}</nowiki></code>) there is a limit of how many times it may be used. This is an error message shown when the limit is exceeded.\n\nParameters:\n* $1 - the current number of parser function calls\n* $2 - the allowed number of parser function calls\nSee also [[:mw:Manual:$wgExpensiveParserFunctionLimit|$wgExpensiveParserFunctionLimit in the MediaWiki manual]].\n\nSee also:\n* {{msg-mw|Expensive-parserfunction-category}}",
        "upload-summary": "{{doc-specialpagesummary|upload}}",
        "upload-recreate-warning": "Used as warning in [[Special:Upload]].",
        "uploadtext": "{{doc-important|<code>thumb</code> and <code>left</code> are magic words. Leave them untranslated!}}\nText displayed when uploading a file using [[Special:Upload]].",
-       "upload-permitted": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]\nSee also:\n* {{msg-mw|Upload-preferred}}\n* {{msg-mw|Upload-prohibited}}",
-       "upload-preferred": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]\nSee also:\n* {{msg-mw|Upload-permitted}}\n* {{msg-mw|Upload-prohibited}}",
-       "upload-prohibited": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileBlacklist|$wgFileBlacklist]]\nSee also:\n* {{msg-mw|Upload-permitted}}\n* {{msg-mw|Upload-preferred}}",
+       "upload-permitted": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]\n* $2 - count of items in $1 - for use in plural\nSee also:\n* {{msg-mw|Upload-preferred}}\n* {{msg-mw|Upload-prohibited}}",
+       "upload-preferred": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]\n* $2 - count of items in $1 - for use in plural\nSee also:\n* {{msg-mw|Upload-permitted}}\n* {{msg-mw|Upload-prohibited}}",
+       "upload-prohibited": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileBlacklist|$wgFileBlacklist]]\n* $2 - count of items in $1 - for use in plural\nSee also:\n* {{msg-mw|Upload-permitted}}\n* {{msg-mw|Upload-preferred}}",
        "uploadfooter": "{{notranslate}}",
        "upload-default-description": "{{ignored}}Custom default upload description. The contents of this message be will inserted in the field \"Summary\" on [[Special:Upload]].",
        "uploadlogpage": "{{doc-logpage}}\n\nPage title of [[Special:Log/upload]].",
        "deleteprotected": "Used as error message when deleting the page.\n\n\"If protection keeps them from editing, they shouldn't be able to delete.\"",
        "deleting-backlinks-warning": "A warning shown when a page that is being deleted has at least one link to it or is transcluded in at least one page.",
        "rollback": "{{Identical|Rollback}}",
-       "rollback_short": "{{Identical|Rollback}}",
        "rollbacklink": "{{Doc-actionlink}}\nThis link text appears on the recent changes page to users who have the \"rollback\" right.\nThis message has a tooltip {{msg-mw|tooltip-rollback}}\n{{Identical|Rollback}}",
        "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
        "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
        "namespace": "This message is located at [[Special:Contributions]].\n{{Identical|Namespace}}",
        "invert": "Displayed in [[Special:RecentChanges|RecentChanges]], [[Special:RecentChangesLinked|RecentChangesLinked]] and [[Special:Watchlist|Watchlist]].\n\nThis message means \"Invert selection of namespace\".\n\nThis message has a tooltip {{msg-mw|tooltip-invert}}\n{{Identical|Invert selection}}",
        "tooltip-invert": "Used in [[Special:Recentchanges]] as a tooltip for the invert checkbox. See also the message {{msg-mw|invert}}",
+       "tooltip-whatlinkshere-invert": "Used in [[Special:Whatlinkshere]] as a tooltip for the invert checkbox.\n\nSee also:\n* {{msg-mw|tooltip-invert}}\n* {{msg-mw|invert}}",
        "namespace_association": "Used in [[Special:Recentchanges]] with a checkbox which selects the associated namespace to be added to the selected namespace, so that both are searched (or excluded depending on another checkbox selection). The association is between a namespace and its talk namespace.\n\nThis message has a tooltip {{msg-mw|tooltip-namespace association}}",
        "tooltip-namespace_association": "Used in [[Special:Recentchanges]] as a tooltip for the associated namespace checkbox.\n\nSee also:\n* {{msg-mw|Namespace association}}",
        "blanknamespace": "Name for main namespace (blank namespace) in drop-down menus at [[Special:RecentChanges]] and other special pages.\n{{Identical|Main}}",
        "thumbnail-temp-create": "Used as thumbnail error message.\n\nSee also:\n* {{msg-mw|Thumbnail-dest-create}}\n* {{msg-mw|Thumbnail invalid params}}\n* {{msg-mw|Thumbnail dest directory}}",
        "thumbnail-dest-create": "Used as thumbnail error message.\n\nSee also:\n* {{msg-mw|Thumbnail error}}\n* {{msg-mw|Thumbnail-temp-create}}\n* {{msg-mw|Thumbnail invalid params}}\n* {{msg-mw|Thumbnail dest directory}}",
        "thumbnail_invalid_params": "Used as thumbnail error message.\n\nSee also:\n* {{msg-mw|Thumbnail-temp-create}}\n* {{msg-mw|Thumbnail-dest-create}}\n* {{msg-mw|Thumbnail dest directory}}",
+       "thumbnail_toobigimagearea": "Used as thumbnail error message.\n\n* $1 - Size in pixel (see {{msg-mw|size-megapixel}} and friends)",
        "thumbnail_dest_directory": "Used as thumbnail error message.\n\nSee also:\n* {{msg-mw|Thumbnail error}}\n* {{msg-mw|Thumbnail-temp-create}}\n* {{msg-mw|Thumbnail-dest-create}}\n* {{msg-mw|Thumbnail invalid params}}",
        "thumbnail_image-type": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}",
        "thumbnail_gd-library": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is a function name of the GD library",
        "import-logentry-interwiki-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
        "javascripttest": "Title of the special page [[Special:JavaScriptTest]].\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
        "javascripttest-backlink": "{{optional}}\nUsed as subtitle in [[Special:JavaScriptTest]]. Parameters:\n* $1 - page title",
-       "javascripttest-title": "Title of the special page when running a test suite. Parameters:\n* $1 is the name of the framework, for example QUnit.",
+       "javascripttest-title": "{{Ignore}}",
        "javascripttest-pagetext-noframework": "Used as summary when no framework specified.\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
        "javascripttest-pagetext-unknownframework": "Error message when given framework ID is not found. Parameters:\n* $1 - the ID of the framework\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
+       "javascripttest-pagetext-unknownaction": "Error message when url specifies an unknown action. Parameters:\n* $1 - the action specified in the url.",
        "javascripttest-pagetext-frameworks": "Parameters:\n* $1 - frameworks list which contain a link text {{msg-mw|Javascripttest-qunit-name}}",
        "javascripttest-pagetext-skins": "Used as label in [[Special:JavaScriptTest]].",
        "javascripttest-qunit-name": "{{Ignore}}",
        "javascripttest-qunit-intro": "Used as summary. Parameters:\n* $1 - the configured URL to the documentation\nSee also:\n* {{msg-mw|Javascripttest-qunit-heading}}",
-       "javascripttest-qunit-heading": "See also:\n* {{msg-mw|Javascripttest-qunit-intro}}",
        "accesskey-pt-userpage": "{{doc-accesskey}}\nSee also:\n<!--* username-->\n* {{msg-mw|Accesskey-pt-userpage}}\n* {{msg-mw|Tooltip-pt-userpage}}",
        "accesskey-pt-anonuserpage": "{{doc-accesskey}}",
        "accesskey-pt-mytalk": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}",
        "exif-sublocationdest": "Sub-location of city shown. This could be an address, a street, an area of town, etc.",
        "exif-objectname": "This is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's dc:title property ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), PNG's title keyword ( http://www.w3.org/TR/PNG/#11keywords ), or IPTC-iim 2:05 Object name property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).",
        "exif-specialinstructions": "Special instructions for how to use the image/media. This might include embargo notices, or other warnings.\n\nThis is IPTC-iim property 2:40. See http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf for details.",
-       "exif-headline": "A short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from XMP's photoshop:headline ( http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf ) and IPTC-iim: 2:105 Headline tag ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).",
+       "exif-headline": "A short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from XMP's photoshop:headline ( http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf ) and IPTC-iim: 2:105 Headline tag ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n{{Identical|Headline}}",
        "exif-credit": "Provider/credit.\n\nWho gave us the image. This might be different from the creator of the image. This is IPTC-iim property 2:110",
        "exif-source": "See IPTC-iim standard 2:115 - http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf.\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n{{Identical|Source}}",
        "exif-editstatus": "Editorial status of image. This is more intended for use with people making news papers. This denotes whether the image is on the main page, is part of a correction, etc. See 2:07 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "size-exabytes": "{{optional}}\nSize (of a file, typically) in exbibytes (1 exbibytes = 1024×1024×1024×1024×1024×1024 bytes).",
        "size-zetabytes": "{{optional}}\nSize (of a file, typically) in zebibytes (1 zebibytes = 1024×1024×1024×1024×1024×1024×1024 bytes).",
        "size-yottabytes": "{{optional}}\nSize (of a file, typically) in yobibytes (1 yobibytes = 1024×1024×1024×1024×1024×1024×1024×1024 bytes).",
+       "size-pixel": "{{optional}}\nSize (of a file, typically) in pixel.",
+       "size-kilopixel": "{{optional}}\nSize (of a file, typically) in kilopixel (1 kilopixel = 1000 pixel).",
+       "size-megapixel": "{{optional}}\nSize (of a file, typically) in megapixel (1 megapixel = 1000×1000 pixel).",
+       "size-gigapixel": "{{optional}}\nSize (of a file, typically) in gigapixel (1 gigapixel = 1000×1000×1000 pixel).",
+       "size-terapixel": "{{optional}}\nSize (of a file, typically) in terapixel (1 terapixel = 1000×1000×1000×1000 pixel).",
+       "size-petapixel": "{{optional}}\nSize (of a file, typically) in petapixel (1 petapixel = 1000×1000×1000×1000×1000 pixel).",
+       "size-exapixel": "{{optional}}\nSize (of a file, typically) in exapixel (1 exapixel = 1000×1000×1000×1000×1000×1000 pixel).",
+       "size-zetapixel": "{{optional}}\nSize (of a file, typically) in zetapixel (1 zetapixel = 1000×1000×1000×1000×1000×1000×1000 pixel).",
+       "size-yottapixel": "{{optional}}\nSize (of a file, typically) in yottapixel (1 yottapixel = 1000×1000×1000×1000×1000×1000×1000×1000 pixel).",
        "bitrate-bits": "{{optional}}\nBitrate (of a file, typically) in bits.",
        "bitrate-kilobits": "{{optional}}\nBitrate (of a file, typically) in kilobits (1 kilobit = 1000 bits).",
        "bitrate-megabits": "{{optional}}\nBitrate (of a file, typically) in megabits (1 megabits = 1000×1000 bits).",
        "signature": "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp).\n\nParameters:\n* $1 - the username that is currently login\n* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw\nUse your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.\n\nSee also:\n* {{msg-mw|Signature-anon}} - signature for anonymous user",
        "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user",
        "timezone-utc": "{{optional}}",
-       "unknown_extension_tag": "This is an error shown when you use an unknown extension tag name.\n\nThis feature allows tags like <code><nowiki><pre></nowiki></code> to be called with a parser like <code><nowiki>{{#tag:pre}}</nowiki></code>.\n\nParameters:\n* $1 - the unknown extension tag name",
        "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
        "duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title",
        "invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators &lt;indicator name=\"''unique-identifier''\">''content''&lt;/indicator>] parser tag is used incorrectly.",
        "version-entrypoints-index-php": "A short description of the index.php entry point. Links to the mediawiki.org documentation page for index.php.",
        "version-entrypoints-api-php": "A short description of the api.php entry point. Links to the mediawiki.org documentation page for api.php.",
        "version-entrypoints-load-php": "A short description of the load.php entry point. Links to the mediawiki.org documentation page for load.php.",
+       "version-libraries": "Header on [[Special:Version]] above a table that lists installed external libraries and their version numbers.",
+       "version-libraries-library": "Column header for the library's name\n{{Identical|Library}}",
+       "version-libraries-version": "Column header for the library's version number\n{{Identical|Version}}",
        "redirect": "{{doc-special|Redirect}}\nThis means \"Redirect by file'''name''', user '''ID''', page '''ID''', or revision ID\".",
        "redirect-legend": "Legend of fieldset around input box in [[Special:Redirect]]",
        "redirect-text": "Inside fieldset for [[Special:Redirect]]",
index ff387d9..fdfea4d 100644 (file)
        "pool-queuefull": "Coada de așteptare este plină",
        "pool-errorunknown": "Eroare necunoscută",
        "pool-servererror": "Serviciul de contorizare a rezervei nu este disponibil ($1).",
+       "poolcounter-usage-error": "Eroare de utilizare: $1",
        "aboutsite": "Despre {{SITENAME}}",
        "aboutpage": "Project:Despre",
        "copyright": "Conținutul este disponibil sub $1, exceptând cazurile în care se specifică altfel.",
        "anoneditwarning": "<strong>Atenție:</strong> Nu v-ați autentificat. Adresa dumneavoastră IP va fi vizibilă în mod public dacă efectuați modificări. Dacă vă <strong>[$1 autentificați]</strong> sau vă <strong>[$2 creați un cont]</strong>, modificările dumneavoastră vor fi asociate numelui de utilizator, pe lângă alte beneficii.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
-       "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să creați o redirecționare către același articol.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată.",
+       "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să redirecționați această pagină către ea însăși.\nProbabil ați greșit ținta redirecționării sau ați modificat pagina greșită.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată oricum.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
        "missingcommentheader": "'''Atenție,''' nu ați pus titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
        "summary-preview": "Previzualizare descriere:",
        "content-model-text": "text simplu",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Obiect vid",
+       "content-json-empty-array": "Matrice vidă",
        "duplicate-args-category": "Pagini care folosesc argumente duplicate în apelarea formatelor",
        "duplicate-args-category-desc": "Pagina conține apelări ale formatelor care folosesc argumente duplicate, cum ar fi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> sau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Atenție: Această pagină conține prea multe apelări costisitoare ale funcțiilor parser.\n\nAr trebui să existe mai puțin de $2 {{PLURAL:$2|apelare|apelări}}, acolo există {{PLURAL:$1|$1 apelare|$1 apelări}}.",
        "history-feed-empty": "Pagina solicitată nu există.\nE posibil să fi fost ștearsă sau redenumită.\nÎncearcă să [[Special:Search|cauți]] pe wiki pentru pagini noi semnificative.",
        "rev-deleted-comment": "(descrierea modificării ștearsă)",
        "rev-deleted-user": "(nume de utilizator șters)",
-       "rev-deleted-event": "(intrare ștearsă)",
+       "rev-deleted-event": "(detaliile din jurnalul șterse)",
        "rev-deleted-user-contribs": "[nume de utilizator sau adresă IP ștearsă - modificare ascunsă din contribuții]",
        "rev-deleted-text-permission": "Această versiune a paginii a fost '''ștearsă'''.\nMai multe detalii în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "rev-suppressed-text-permission": "Această versiune a paginii a fost <strong>suprimată</strong>.\nDetalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
        "revdelete-text-text": "Versiunile șterse vor continua să fie vizibile în istoricul paginii, însă anumite părți ale conținutului acestora vor fi inaccesibile publicului.",
        "revdelete-text-file": "Versiunile șterse ale fișierului vor continua să fie vizibile în istoricul fișierului, însă anumite părți ale conținutului acestora vor fi inaccesibile publicului.",
        "logdelete-text": "Evenimentele șterse ale jurnalului vor continua să fie vizibile în jurnale, însă anumite părți ale conținutului acestora vor fi inaccesibile publicului.",
-       "revdelete-text-others": "Alți administratori vor avea acces în continuare la conținutul ascuns și îl vor restaurarea acestuia, cu excepția cazurilor în care nu sunt activate și restricții suplimentare.",
+       "revdelete-text-others": "Alți administratori vor avea acces în continuare la conținutul ascuns și îl vor putea restaura, cu excepția cazurilor în care sunt activate restricții suplimentare.",
        "revdelete-confirm": "Vă rugăm să confirmați că intenționați să faceți acest lucru, că înțelegeți consecințele și că faceți asta în conformitate cu [[{{MediaWiki:Policy-url}}|politica]].",
        "revdelete-suppress-text": "Suprimarea trebuie folosită '''doar''' în următoarele cazuri:\n* Informații potențial calomnioase\n* Informații personale inadecvate\n*: ''adrese și numere de telefon personale, CNP, numere de securitate socială etc.''",
        "revdelete-legend": "Restricții de afișare",
        "revdelete-hide-text": "Textul versiunii",
        "revdelete-hide-image": "Șterge conținutul fișierului",
-       "revdelete-hide-name": "Șterge operația și obiectul",
+       "revdelete-hide-name": "Ascunde ținta și parametrii",
        "revdelete-hide-comment": "Descrierea modificării",
        "revdelete-hide-user": "Numele de utilizator sau adresa IP",
        "revdelete-hide-restricted": "Ascunde informațiile față de administratori și față de alți utilizatori",
        "uploaderror": "Eroare la trimitere fișier",
        "upload-recreate-warning": "'''Atenție, un fișier cu același nume a fost șters sau redenumit.'''\nIată aici înregistrările relevante din jurnalul de ștergeri și redenumiri:",
        "uploadtext": "Utilizați formularul de mai jos pentru a trimite fișiere.\nPentru a vizualiza sau căuta imagini deja trimise, mergeți la [[Special:FileList|lista cu imagini]]; (re)încărcările și ștergerile sunt de asemenea înregistrate în [[Special:Log/upload|jurnalul fișierelor trimise]], respectiv [[Special:Log/delete|jurnalul fișierelor șterse]].\n\nPentru a insera un fișier într-o pagină, folosiți o legătură de forma:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fișier.jpg]]</nowiki></code>''' pentru a include versiunea integrală a unui fișier\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fișier.png|200px|thumb|left|informații]]</nowiki></code>''' pentru a introduce o imagine cu o lățime de 200 de pixeli într-un chenar plasat în partea stângă, având ca descriere textul „informații”\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fișier.ogg]]</nowiki></code>''' pentru o legătură directă către fișier, fără a-l afișa",
-       "upload-permitted": "Tipuri de fișiere permise: $1.",
-       "upload-preferred": "Tipuri de fișiere preferate: $1.",
-       "upload-prohibited": "Tipuri de fișiere interzise: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tip|Tipuri}} de fișiere permise: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tip|Tipuri}} de fișiere preferate: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tip|Tipuri}} de fișiere interzise: $1.",
        "uploadlogpage": "Jurnal fișiere trimise",
        "uploadlogpagetext": "Mai jos este afișată lista ultimelor fișiere trimise.\nVezi [[Special:NewFiles|galeria fișierelor noi]] pentru o mai bună vizualizare.",
        "filename": "Nume fișier",
        "deleteprotected": "Nu puteți șterge această pagină, deoarece este protejată.",
        "deleting-backlinks-warning": "'''Atenție:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Alte pagini]] se leagă sau transclud pagina pe care doriți să o ștergeți.",
        "rollback": "Editări de revenire",
-       "rollback_short": "Revenire",
        "rollbacklink": "revenire",
        "rollbacklinkcount": "revenire asupra {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}",
        "rollbacklinkcount-morethan": "revenire asupra a mai mult de {{PLURAL:$1|o modificare|$1 modificări|$1 de modificări}}",
        "namespace": "Spațiu de nume:",
        "invert": "Inversează selecția",
        "tooltip-invert": "Bifați această căsuță pentru a ascunde modificările efectuate asupra paginilor din spațiul de nume selectat (și din spațiile de nume asociate, dacă s-a bifat și această opțiune)",
+       "tooltip-whatlinkshere-invert": "Bifați această casetă pentru a ascunde legăturile din paginile aparținând spațiilor de nume selectate.",
        "namespace_association": "Spații de nume asociate",
        "tooltip-namespace_association": "Bifați această căsuță pentru a include și spațiul de nume destinat discuțiilor care este asociat cu spațiul de nume deja selectat",
        "blanknamespace": "Articole",
        "thumbnail-temp-create": "Imposibil de creat miniatura temporară",
        "thumbnail-dest-create": "Imposibil de salvat miniatura la destinație",
        "thumbnail_invalid_params": "Parametrii invalizi ai imaginii miniatură",
+       "thumbnail_toobigimagearea": "Fișier cu dimensiuni mai mari de $1",
        "thumbnail_dest_directory": "Nu poate fi creat directorul destinație",
        "thumbnail_image-type": "Acest tip de imagine nu este suportat",
        "thumbnail_gd-library": "Configurație incompletă a bibliotecii GD: lipsește funcția $1",
        "import-logentry-interwiki": "transwikificat $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versiune|versiuni|de versiuni}} importate de la $2",
        "javascripttest": "Testare JavaScript",
-       "javascripttest-title": "Rulare teste pentru $1",
        "javascripttest-pagetext-noframework": "Această pagină este rezervată rulării testelor JavaScript.",
        "javascripttest-pagetext-unknownframework": "Cadru de testare „$1” necunoscut.",
+       "javascripttest-pagetext-unknownaction": "Acțiunea „$1” necunoscută.",
        "javascripttest-pagetext-frameworks": "Alegeți unul din următoarele cadre de testare: $1",
        "javascripttest-pagetext-skins": "Alegeți un aspect pentru care să rulați teste:",
        "javascripttest-qunit-intro": "A se vedea [$1 documentația de testare] pe mediawiki.org.",
-       "javascripttest-qunit-heading": "Suita de test MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Pagina dumneavoastră de utilizator",
        "tooltip-pt-anonuserpage": "Pagina de utilizator pentru adresa IP curentă",
        "tooltip-pt-mytalk": "Pagina dumneavoastră de discuții",
        "watchlisttools-edit": "Vezi și modifică lista paginilor urmărite",
        "watchlisttools-raw": "Modifică lista brută a paginilor urmărite",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discuție]])",
-       "unknown_extension_tag": "Extensie etichetă necunoscută „$1”",
        "duplicate-defaultsort": "'''Atenție:''' Cheia de sortare implicită („$2”) o înlocuiește pe precedenta („$1”).",
        "duplicate-displaytitle": "<strong>Atenție:</strong> Titlul afișat „$2” înlocuieşte titlul afișat anterior, „$1”.",
        "invalid-indicator-name": "<strong>Eroare:</strong> Parametrul <code>nume</code> al indicatorilor de stare a paginii nu trebuie să fie gol.",
        "version-entrypoints": "URL-uri pentru puncte de intrare",
        "version-entrypoints-header-entrypoint": "Punct de intrare",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Biblioteci instalate",
+       "version-libraries-library": "Bibliotecă",
+       "version-libraries-version": "Versiune",
        "redirect": "Redirecționare după fișier, utilizator, ID-ul paginii sau al versiunii",
        "redirect-legend": "Redirecționare către un fișier sau o pagină",
        "redirect-summary": "Această pagină specială vă redirecționează către un fișier (dat fiind un nume de fișier), o pagină (dat fiind ID-ul unei versiuni sau ID-ul unei pagini) sau o pagină de utilizator (dat fiind un ID numeric al utilizatorului). Utilizare: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] sau [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Versiunea specificată nu există.",
        "dberr-problems": "Ne cerem scuze! Acest site întâmpină dificultăți tehnice.",
        "dberr-again": "Așteptați câteva minute și încercați din nou.",
-       "dberr-info": "(Nu se poate contacta serverul bazei de date: $1)",
-       "dberr-info-hidden": "(Nu se poate contacta serverul bazei de date)",
+       "dberr-info": "(Nu se poate accesa baza de date: $1)",
+       "dberr-info-hidden": "(Nu se poate accesa baza de date)",
        "dberr-usegoogle": "Între timp puteți efectua căutarea folosind Google.",
        "dberr-outofdate": "De reținut că indexarea conținutului nostru de către ei poate să nu fie actualizată.",
        "dberr-cachederror": "Următoarea pagină este o copie în cache a paginii cerute, care s-ar putea să nu fie actualizată.",
index 3e851b8..876012d 100644 (file)
@@ -33,7 +33,7 @@
        "tog-shownumberswatching": "Fa vedè 'u numere de le utinde ca uardene",
        "tog-oldsig": "Firme esistende:",
        "tog-fancysig": "Firma grezze cumme a 'nu teste de Uicchi (senza collegamende automatiche)",
-       "tog-uselivepreview": "Ause l'andeprime da 'u vive (Sperimendale)",
+       "tog-uselivepreview": "Ause l'andeprime da 'u vive",
        "tog-forceeditsummary": "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
        "tog-watchlisthideown": "Scunne le cangiaminde mije da l'elenghe de le pàggene condrollate",
        "tog-watchlisthidebots": "Scunne le cangiaminde de le bot da l'elenghe de le pàggene condrollate",
        "permalink": "Collegamende ca remane pe sembre",
        "print": "Stambe",
        "view": "Vide",
+       "view-foreign": "'Ndruche sus a $1",
        "edit": "Cange",
+       "edit-local": "Cange 'a descrizione locale",
        "create": "Ccreje",
+       "create-local": "Aggiunge 'a descrizione locale",
        "editthispage": "Cange sta pàgene",
        "create-this-page": "Ccreje 'a pàgene",
        "delete": "Scangìlle",
        "otherlanguages": "Jndr'à l'otre lènghe",
        "redirectedfrom": "(Riderette da $1)",
        "redirectpagesub": "Pàgene de redirezione",
+       "redirectto": "Redirezione sus a:",
        "lastmodifiedat": "Sta pàgene a state cangete l'urtema vote da $1, alle $2.",
        "viewcount": "Sta pàggene ha state viste {{PLURAL:$1|'na vote|$1 vote}}.",
        "protectedpage": "Pàgene prutette",
        "hidetoc": "scunne",
        "collapsible-collapse": "Scunne",
        "collapsible-expand": "Spanne",
+       "confirmable-yes": "Sìne",
+       "confirmable-no": "None",
        "thisisdeleted": "Vide o ripristine $1?",
        "viewdeleted": "Vue ccu vide $1?",
        "restorelink": "{{PLURAL:$1|'nu cangiamende scangellete|$1 cangiaminde scangellete}}",
        "viewsourcetext": "Tu puè vedè e cupià 'a sorgente de sta pàgene:",
        "viewyourtext": "Tu puè vedè e copià 'a sorgende de '''le cangiaminde tune''' a sta pàgene:",
        "protectedinterface": "Sta pàgene dèje 'nu teste de l'inderfacce pu software de sta uicchi, e jè prutette pe prevenìe l'abbuse.\nPe aggiungere o cangià le traduziune pe tutte le uicchi, pe piacere ause [//translatewiki.net/ translatewiki.net], 'u proggette de localizzazzione de MediaUicchi.",
-       "editinginterface": "'''Fà attenziò:'''  Tu ste cange 'na pàgene ca jè ausate pe dà 'n'inderfacce de teste p'u software.\nLe cangiaminde de sta pàgene vonne a mettene mane sus a l'inderfacce utende pe l'otre utinde de sta Uicchi.\nPe aggiungere o cangià le traduziune, pe piacere vide ce ause [//translatewiki.net/ translatewiki.net], 'u pruggette de localizzazione de MediaUicchi.",
+       "editinginterface": "<strong>Fà attenziò:</strong> Tu ste cange 'na pàgene ca jè ausate pe dà 'n'inderfacce de teste p'u software.\nLe cangiaminde de sta pàgene vonne a mettene mane sus a l'inderfacce utende pe l'otre utinde de sta Uicchi.",
        "cascadeprotected": "Sta pàgene ha state prutette da le cangiaminde, purcè jè ingluse jndr'à {{PLURAL:$1|seguende pàgene, ca jè|le seguende pàggene, ca sonde}} prutette cu l'opzione \"a caschete\":\n$2",
        "namespaceprotected": "Non ge tine 'u permesse pe cangià pàggene d'u neimspeise '''$1'''.",
        "customcssprotected": "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
        "invalidtitle-knownnamespace": "Titole invalide cu 'u namespace \"$2\" e teste \"$3\"",
        "invalidtitle-unknownnamespace": "Titele invalide cu numere de namespace scanusciute $1 e teste \"$2\"",
        "exception-nologin": "Non ge sì collegate",
-       "exception-nologin-text": "Pe piacere [[Special:Userlogin|tràse]] pe avè l'accesse a sta pàgene o a sta azione.",
+       "exception-nologin-text": "Pe piacere tràse pe avè l'accesse a sta pàgene o a sta azione.",
        "virus-badscanner": "Configurazione ca fece schife: Virus scanner scanusciute: ''$1''",
        "virus-scanfailed": "condrolle fallite (codece $1)",
        "virus-unknownscanner": "antivirus scanusciute:",
        "loginlanguagelabel": "Lénga: $1",
        "suspicious-userlogout": "'A richiesta toje de assè ha state bloccate purcè pare ca ha state mannate da 'nu browser scuasciate o da 'a cache de 'nu proxy.",
        "createacct-another-realname-tip": "'U nome vere jè facoltative.\nCe tu scacchie de metterle, quiste avène ausate pe dà 'u giuste merite a 'a fatìe de l'utende.",
+       "pt-login": "Tràse",
+       "pt-login-button": "Tràse",
+       "pt-createaccount": "Ccreje 'nu cunde utende",
+       "pt-userlogout": "Isse",
        "php-mail-error-unknown": "Errore scanusciute jndr'à funzione PHP mail()",
        "user-mail-no-addy": "E' pruvate a mannà 'na mail senze 'u 'ndirizze mail",
        "user-mail-no-body": "Pruvate a mannà 'na mail cu 'nu cuèrpe vacande o troppe curte.",
        "preview": "Andeprime",
        "showpreview": "Vide l'andeprime",
        "showdiff": "Fa vedè le cangiaminde",
-       "anoneditwarning": "'''Attenziò:''' Tu non ge sinde colleghete..\nL'indirizze IP tue avène reggistrete jndr'à le cangiaminde de sta pàgene.",
+       "anoneditwarning": "<strong>Attenziò:</strong> Tu non ge sì collegate..\nL'indirizze IP tune avène fatte vedè ce te face de le cangiaminde. Ce tu <strong>[$1 trase]</strong> o <strong>[$2 ccreje 'nu cunde utende]</strong>, le cangiaminde tune avènene attribbuite a 'u nome utende tune, 'nzieme a otre beneficie.",
        "anonpreviewwarning": "''Tu non ge sì collegate. Reggistranne le cangiaminde jndr'à sta pàgene iesse l'indirizze IP tune jndr'à storie.''",
        "missingsummary": "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu riepileghe de le cangiaminde.\nCe tu cazze Reggistre 'n'otra vote, 'u cangiamende tue avène memorizzete senze une.",
        "missingcommenttext": "Pe piacere mitte 'nu commende aqquà sotte.",
        "parser-template-recursion-depth-warning": "Ha state supranete 'u limite di ricorsione de le template ($1)",
        "language-converter-depth-warning": "'U convertitore de lènghe ha subranate 'u limite de profonnetà ($1)",
        "node-count-exceeded-category": "Pàggene addò 'u cunde de le node ha sbunnate",
-       "node-count-exceeded-warning": "Pagene ha sbunnate 'u condegge de le node",
+       "node-count-exceeded-warning": "'A pàgene ha sbunnate 'u condegge de le node",
        "expansion-depth-exceeded-category": "Pàggene addò 'a profonnetà de l'espanzione jè supranate",
        "expansion-depth-exceeded-warning": "Pàggene ca sbonnane 'a profonnetà de espanzione",
        "parser-unstrip-loop-warning": "Cicle infinite acchiate",
        "history-feed-empty": "'A vosce ca è cerchete non g'esiste.\nPò essere ca ha state scangellete da Uicchi o ha state renomenate..\nPruève a [[Special:Search|cercò sus a Uicchi]] 'mbrà le vosce cchiù rilevande.",
        "rev-deleted-comment": "(cangiamnde d'u riepileghe scangellate)",
        "rev-deleted-user": "(nome utende scangillete)",
-       "rev-deleted-event": "(azione de l'archivie scangillete)",
+       "rev-deleted-event": "(dettaglie de l'archivije scangellate)",
        "rev-deleted-user-contribs": "[nome utende o indirizze IP luate - cangiamende scunnute da le condrebbute]",
        "rev-deleted-text-permission": "Sta revisione d'a pàgene ha state '''scangellate'''.\nPuè acchijà cchiù 'mbormaziune sus a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} l'archivije de le scangellaminde].",
        "rev-deleted-text-unhide": "Sta revisione d'a pàgene ha state '''scangellate'''.\nPuè acchijà cchiù 'mbormaziune sus a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} l'archivije de le scangellaminde].\nTu puè angore [$1 vedè sta revisiona] ce tu avveramende a vuè ccù vide.",
        "revdelete-no-file": "'U file specificate non g'esiste.",
        "revdelete-show-file-confirm": "Si secure ca vuè ccu vide 'a revisione scangellate d'u file \"<nowiki>$1</nowiki>\" 'u $2 a le $3?",
        "revdelete-show-file-submit": "Sìne",
-       "logdelete-selected": "{{PLURAL:$1|Fatte de l'archivije selezionete|Fatte de l'archivije selezionete}}:",
+       "logdelete-selected": "{{PLURAL:$1|Fatte de l'archivije scacchiate}}:",
        "revdelete-confirm": "Pe piacere conferme ca tu vuè ccu face sta cose, ce tu è capite le conseguenze e ce quidde ca ste face jè in accorde cu le [[{{MediaWiki:Policy-url}}|reghele]] de Uicchipèdie.",
        "revdelete-suppress-text": "'A soppressione adda essere ausate '''sulamende''' jndr'à le case seguende:\n* 'Mbormaziune potenzialmende offenzive\n* Date personale inopportune\n*: ''indirizze, numere de telefono, codece fiscale, ecc.''",
        "revdelete-legend": "'Mboste le restriziune sus 'a visibbilità",
        "revdelete-hide-text": "Teste d'a revisione",
        "revdelete-hide-image": "Scunne 'u codenute d'u fail",
-       "revdelete-hide-name": "Scunne azione e obbiettive",
+       "revdelete-hide-name": "Scunne obbiettive e parametre",
        "revdelete-hide-comment": "Cange 'u riepiloghe",
        "revdelete-hide-user": "Nome utende/IP de quidde ca ha fatte 'u cangiamende",
        "revdelete-hide-restricted": "Live le date da l'amministratore cumme pe l'otre utinde",
        "search-section": "(sezione $1)",
        "search-suggest": "Ce signifeche: $1",
        "search-interwiki-caption": "Pruggette sorelle",
-       "search-interwiki-default": "$1 resultete:",
+       "search-interwiki-default": "Resultate da $1:",
        "search-interwiki-more": "(de cchiù)",
        "search-relatedarticle": "Colleghete",
        "searchrelated": "colleghete",
        "gender-female": "Femmene",
        "prefs-help-gender": "Opzionale: ausate pe l'indirizzamende corrette d'u sesse jndr'à 'u softwer. Sta 'mbormazione jè pubbleche.",
        "email": "Poste",
-       "prefs-help-realname": "'U nome vere (quidde d'u munne reale) jè facoltative.\nCe tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
+       "prefs-help-realname": "'U nome vere jè facoltative.\nCe tu 'u mitte, a fatje ca è fatte t'avène recanusciute.",
        "prefs-help-email": "L'indirizze e-mail jè facoltative ma te dè 'a possibbilità de mannarte 'na password nova nove ce tu te scuèrde quedde ca tenive.",
        "prefs-help-email-others": "Tu puè pure scacchià de lassà a l'otre de condattarte ausanne 'a pàgene utende toje o quedde de le 'ngazzaminde senze ca onne abbesogne de dicere ce si tu.",
        "prefs-help-email-required": "L'indirizze e-mail jè obbligatorie.",
        "right-deletedtext": "Vide 'u teste scangellate e le cangiaminde 'mbrà le versiune scangellate",
        "right-browsearchive": "Cirche le pàggene scangellate",
        "right-undelete": "Repristine 'na pàgene",
-       "right-suppressrevision": "Revide e repristine le revisiune scunnete da l'amministrature",
+       "right-suppressrevision": "'Ndruche, scunne e fà assè le revisiune specifiche de le pàggene da l'otre utinde",
        "right-suppressionlog": "Vide l'archivije privete",
        "right-block": "Blocche otre utinde a fà le cangiaminde",
        "right-blockemail": "Blocche l'utente a fà mannà le email",
        "recentchanges-label-unpatrolled": "Stu cangiamende non g'à state angore condrollate",
        "recentchanges-legend-heading": "'''Leggende:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
-       "rcnotefrom": "Sotte stonne le cangiaminde da '''$2''' ('nzigne a '''$1''' fatte vedè).",
+       "rcnotefrom": "Sotte {{PLURAL:$5|ste 'u cangiamende|stonne le cangiaminde}} da <strong>$3, $4</strong> ('nzigne a <strong>$1</strong> fatte vedè).",
        "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
        "rcshowhideminor": "$1 cangiaminde stuèdeche",
        "rcshowhidebots": "$1 bot",
        "uploaderror": "Errore de carecamende",
        "upload-recreate-warning": "'''Attenziò: 'Nu file cu stu nome ha state scangellate o spustate.'''\n\nL'archivije de de scangellaminde e de le spustaminde pe sta pàgene le puè acchià aqquà:",
        "uploadtext": "Ause 'u module aqquà sotte pe carecà le file.\nPe vedè o cercà le file carecate precedendemende veje a 'a [[Special:FileList|liste de le file carecate]], le carecaminde sonde pure reggistrate jndr'à l'[[Special:Log/upload|archivije de le carecaminde]], le scangellazziune jndr'à l'[[Special:Log/delete|archivije de le scangellaminde]].\n\nPe ingludere 'nu file jndr'à 'na pàgene, ause 'u collegamende jndr'à une de le forme seguende:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pe ausà 'a versiona comblete d'u file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' pe ausà 'nu file cu 'a dimenziona massime de 200 pixel jndr'à 'na scatele ca se iacchie sus a 'u margine sinistre cu 'u teste 'alt text' cumme didascalìe.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe appundà direttamende a 'u file senze ca face vedè 'u file",
-       "upload-permitted": "Tipe de file permesse: $1.",
-       "upload-preferred": "Tipe de file preferite: $1.",
-       "upload-prohibited": "Tipe de file proibbite: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipe}} de file permesse: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipe}} de file preferite: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipe}} de file proibbite: $1.",
        "uploadlogpage": "Archivije de le carecaminde",
        "uploadlogpagetext": "Sotte ste 'na liste de le cchiù recende file carechete.\nVide 'a [[Special:NewFiles|gallerie de le file nuève]] pe vedè l'otre andeprime.",
        "filename": "Nome d'u fail",
        "largefileserver": "Stu file jè troppe gruesse pe quidde ca 'a configurazione d'u server permette.",
        "emptyfile": "'U file ca tu è carecate pare ca è vacande.\nPò essere ca è scritte male 'u nome d'u file e n'à carecate 'n'otre.\nPe piacere condrolle ce tu avveramende vuè cu careche stu file.",
        "windows-nonascii-filename": "Sta Uicchi non ge supporte le nome de le file cu le carattere speciale.",
-       "fileexists": "'Nu file cu stu nome esiste già, pe piacere verifiche <strong>[[:$1]]</strong> ce tu non ge sì secure no 'u sce cangianne.\n[[$1|thumb]]",
+       "fileexists": "'Nu file cu stu nome esiste già, pe piacere verifiche <strong>[[:$1]]</strong> ce {{GENDER:|tu}} non ge sì secure no 'u sce cangianne.\n[[$1|thumb]]",
        "filepageexists": "'A pàgene de descrizione pe stu file ha state già ccreiate 'u <strong>[[:$1]]</strong>, ma nisciune file cu stu nome osce a die esiste.\n'U riepileghe ca tu è mise non ge iesse sus 'a pàgene de descrizione.\nPe fà assè 'u riepileghe tu tìne abbesogne de cangiarle a mane.\n[[$1|thumb]]",
-       "fileexists-extension": "'Nu file cu 'nu nome simile esiste già: [[$2|thumb]]\n* Nome d'u file ca vuè cu careche: <strong>[[:$1]]</strong>\n* Nome d'u file ca già esiste: <strong>[[:$2]]</strong>\nPe piacere vide ce scacchie 'nu nome differende.",
+       "fileexists-extension": "'Nu file cu 'nu nome simile esiste già: [[$2|thumb]]\n* Nome d'u file ca vuè cu careche: <strong>[[:$1]]</strong>\n* Nome d'u file ca già esiste: <strong>[[:$2]]</strong>\nPe piacere vide ce scacchie 'nu nome 'nu picca diverse?",
        "fileexists-thumbnail-yes": "'U file pare ca jè 'n'immaggine de dimenzione ridotte ''(miniature)''. [[$1|thumb]]\nPe piacere condrolle 'u file <strong>[[:$1]]</strong>.\nCe 'u file condrollete jè d'a stesse dimenzione de quedda originale allore non ge stè abbesogne de carecà 'na miniatura de cchiù.",
        "file-thumbnail-no": "'U nome d'u file accumenze pe <strong>$1</strong>.\nPare ca jè 'n'immaggine piccenne ''(miniature)''.\nCe tu tìne sulamende st'immaggine da carecà apposte, ce nò vide ce cange 'u file.",
        "fileexists-forbidden": "'U file cu stu nome già esiste e non ge pò essere sovrascritte.<br />\nCe tu vuè angore carecà 'u file tue, pe piacere tuèrne rrete e ause 'nu nome nuève. [[File:$1|thumb|center|$1]]",
        "license-header": "Licenziate da",
        "nolicense": "Ninde selezionete",
        "license-nopreview": "(L'andeprime non g'è disponibbile)",
-       "upload_source_url": " ('na URL, valide e accessibbile pubblicamende)",
-       "upload_source_file": " ('nu fail sus a 'u combiuter tue)",
+       "upload_source_url": " ('u file tune scacchiate da 'na URL, valide e accessibbile pubblicamende)",
+       "upload_source_file": " ('nu fail sus a 'u combiuter tune)",
        "listfiles-summary": "Sta pàgena speciale face vedè tutte le file carecate.<br />\nQuanne jè filtrate da l'utende, sulamende le file addò quidde utende ave carecate le versiune cchiù recende, avènene fatte vedè.",
        "listfiles_search_for": "Cirche pe nome de le media:",
        "imgfile": "file",
        "filedelete-maintenance": "Scangellaminde e repristinaminde de le file jè temboraneamende disabbilitate duranne 'a manutenzione.",
        "filedelete-maintenance-title": "Non ge se pò scangellà 'u file",
        "mimesearch": "Ricerca jndr'à 'u MIME",
-       "mimesearch-summary": "Sta pàgene abbilitesce 'u filtre sus a le file pu tipe de MIME.\nInput: contenttype/subtype, pe esembie <code>image/jpeg</code>.",
+       "mimesearch-summary": "Sta pàgene abbilitesce 'u filtre sus a le file pu tipe de MIME.\nInput: contenttype/subtype o contenttype/*, pe esembie <code>image/jpeg</code>.",
        "mimetype": "Tipe de MIME:",
        "download": "scareche",
        "unwatchedpages": "Pàggene ca non ge ste condrolle",
        "pageswithprop-prophidden-binary": "valore probbietà binarie scunnute ($1)",
        "doubleredirects": "Ridirezionaminde a doppie",
        "doubleredirectstext": "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.\nOgne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.\nLe situaziune de <del>ingrocie</del> onne state resolte.",
-       "double-redirect-fixed-move": "[[$1]] ha state spustate.\nMò s'avène redirette a [[$2]].",
-       "double-redirect-fixed-maintenance": "Aggiuste le doppie redirezionaminde da [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] ha state spustate.\nAvène aggiornate automaticamende e mò s'avène redirette a [[$2]].",
+       "double-redirect-fixed-maintenance": "Aggiuste le doppie redirezionaminde da [[$1]] a [[$2]] jndr'à 'na fatije de manutenzione.",
        "double-redirect-fixer": "Correttore de redirezionaminde",
        "brokenredirects": "Redirezionamninde scuasciete",
        "brokenredirectstext": "Le ridirezionaminde ca seguene appondene a pàggene ca non g'esistene:",
        "wantedtemplates": "Template cchiù ausete",
        "mostlinked": "Pàggene cchiù appundete",
        "mostlinkedcategories": "Categorije cchiù appundete",
-       "mostlinkedtemplates": "Template cchiù appundete",
+       "mostlinkedtemplates": "Pàggene cchiù appundate",
        "mostcategories": "Pàggene cu 'nu sacche de categorije",
        "mostimages": "Fail cchiù appundete",
        "mostinterwikis": "Pàggene cu cchiù interuicchi de tutte",
        "unwatchthispage": "No condrollà cchiù 'a pàgene",
        "notanarticle": "Non g'è 'na vosce",
        "notvisiblerev": "'A revisione ha state scangellete",
-       "watchlist-details": "{{PLURAL:$1|$1 pàgene|$1 pàggene}} jndr'à liste de le pàggene condrollete, scartanne le pàggene de le 'ngazzaminde.",
+       "watchlist-details": "{{PLURAL:$1|$1 pàgene|$1 pàggene}} jndr'à l'elenghe de le pàggene condrollate, scartanne le pàggene de le 'ngazzaminde.",
        "wlheader-enotif": "* Notifiche pe email abbilitate.",
        "wlheader-showupdated": "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
-       "wlnote": "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme '''$1''' cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme '''$2''' ore}}, jndr'à $3, $4.",
+       "wlnote": "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme <strong>$1</strong> cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme <strong>$2</strong> ore}}, jndr'à $3, $4.",
        "wlshowlast": "Vide l'urteme $1 ore $2 sciurne",
        "watchlist-options": "Opzione d'a liste de le pàggene condrollete",
        "watching": "Fà vedè...",
        "exbeforeblank": "'u condenute apprime d'a pulizie ere: '$1'",
        "delete-confirm": "Scangille \"$1\"",
        "delete-legend": "Scangille",
-       "historywarning": "'''Vide Bbuene:''' 'a pàgene ca ste scangille tène 'na storie de cangiaminde cu cchiù o mene $1 {{PLURAL:$1|revisione|revisiune}}:",
+       "historywarning": "<strong>Vide Bbuene:</strong> 'A pàgene ca ste scangille tène 'na storie de cangiaminde cu cchiù o mene $1 {{PLURAL:$1|revisione|revisiune}}:",
        "confirmdeletetext": "Vide Bbuene, vide ca ste scangille 'na pàgene ca tène pure nu sbuenne de cangiaminde.\nConferme quidde ca ste face, ce si sicure ca è capite quidde ca ste cumbine e ce è corrette rispette a [[{{MediaWiki:Policy-url}}|le regole de scangellazione]], ce no statte quiete.",
        "actioncomplete": "Aziona Combletete",
        "actionfailed": "Aziona fallite",
        "delete-toobig": "Sta pàgene tène 'na storie de cangiaminde troppe longhe, sus a $1 {{PLURAL:$1|revisione|revisiune}}.\n'U scangellamende de stuèzze de pàgene avène ristrette pe prevenì 'ngasinaminde accidentale de {{SITENAME}}.",
        "delete-warning-toobig": "Sta pàgene tène 'na storie troppo longhe, sus a $1 {{PLURAL:$1|revisione|revisiune}}.\nScangellanne pò ccreja casine sus a le operazione d'u database de {{SITENAME}};\nvà cunge cunge!",
        "rollback": "Annulle le cangiaminde",
-       "rollback_short": "Annulle",
        "rollbacklink": "annulle 'u cangiaminde",
        "rollbacklinkcount": "annulle $1 {{PLURAL:$1|cangiamende|cangiaminde}}",
        "rollbacklinkcount-morethan": "annulle cchiù de $1 {{PLURAL:$1|cangiamende|cangiaminde}}",
        "protect-locked-blocked": "Tu non ge puè cangià le levèlle de protezzione quanne si bloccate.\nAqquà stonne le 'mbostaziune corrende pa pàgene '''$1''':",
        "protect-locked-dblock": "Le levèlle de protezzione non ge ponne essere cangete purcè stè 'nu blocche d'u database.\nAqquà stonne le 'mbostaziune corrende pa pàgene '''$1''':",
        "protect-locked-access": "Tu non ge tine le permesse pe putè cangià le levèlle de protezione de le pàggene.\nChiste sonde le configuraziune corrende p'a pàgene '''$1''':",
-       "protect-cascadeon": "Sta pàgene mò jè  prutette purcè jè ingluse jndr'à {{PLURAL:$1|'a seguende pàgene, ca tène|le seguende pàggene, ca tènene}} a protezione a cascata appizzechete.\nTu puè cangià 'u levèlle de protezione de sta pàgene ma stu cangiamende non ge tène effette a cascata.",
+       "protect-cascadeon": "Sta pàgene mò jè  prutette purcè jè 'ngluse jndr'à {{PLURAL:$1|'a seguende pàgene, ca tène|le seguende pàggene, ca tènene}} a protezione a cascata appizzecate.\nTu puè cangià 'u levèlle de protezione de sta pàgene ma stu cangiamende non ge tène effette a cascata.",
        "protect-default": "Permitte a tutte l'utinde",
        "protect-fallback": "Richieste d'u permesse \"$1\"",
        "protect-level-autoconfirmed": "Blocche l'utinde nuève e chidde non reggistrate",
        "autoblockid": "Autoblocche #$1",
        "block": "Bluècche l'utende",
        "unblock": "Sbluècche l'utende",
-       "blockip": "Blocche l'utende",
+       "blockip": "Blocche {{GENDER:$1|l'utende}}",
        "blockip-legend": "Bluecche l'utende",
        "blockiptext": "Ause 'a schermata de sotte pe bloccà l'accesse in scritture de 'nu specifiche indirizze IP o utende.\nQuiste avessa essere fatte sulamende pe prevenìe 'u vandalisme e in accorde cu [[{{MediaWiki:Policy-url}}|le reghele]].\nMitte pure 'nu mutive specifiche aqquà sotte (pe esembije, nnomene 'a pàgene addò è acchiate 'u vandalisme).",
        "ipaddressorusername": "Indirizze IP o nome de l'utende:",
        "ipb-unblock-addr": "Sblocche $1",
        "ipb-unblock": "Sblocche nome utende o indirizze IP",
        "ipb-blocklist": "Vide le blocche ca esistene",
-       "ipb-blocklist-contribs": "Condrebbute pe $1",
+       "ipb-blocklist-contribs": "Condrebbute pe {{GENDER:$1|$1}}",
        "unblockip": "Sblocche l'utende",
        "unblockiptext": "Ause 'a maschera aqquà sotte pe repristinà l'accesse in scritture a le indirizze IP o a le cunde utinde ca apprime avèrene state bloccate.",
        "ipusubmit": "Live stu blocche",
        "import-upload": "Careche le date in XML",
        "import-token-mismatch": "S'à perse 'a sessione de le date. Pruève 'n'otra vote.",
        "import-invalid-interwiki": "Non ge pozze 'mbortà da 'a Uicchi specificate.",
-       "import-error-edit": "Pàgene \"$1\" non g' 'mbortate purcé tu non ge tìne le permesse pe cangiarle.",
-       "import-error-create": "Pàgene \"$1\" non g' 'mbortate purcé tu non ge tìne le permesse pe ccrejarle.",
-       "import-error-interwiki": "Pagene \"$1\" non g'ha state 'mbortate purcé 'u nome sue jè riservate pe collegaminde esterne (interuicchi).",
+       "import-error-edit": "Pàgene \"$1\" non g'ha state 'mbortate purcé tu non ge tìne le permesse pe cangiarle.",
+       "import-error-create": "Pàgene \"$1\" non g'ha state 'mbortate purcé tu non ge tìne le permesse pe ccrejarle.",
+       "import-error-interwiki": "Pagene \"$1\" non g'ha state 'mbortate purcé 'u nome sue jè riservate pe collegaminde de fore (interuicchi).",
        "import-error-special": "'A pagena \"$1\" non g'ha state 'mbortate purcé apponde a 'nu namespace speciale ca non g'è permesse a le pàggene normale.",
-       "import-error-invalid": "'A pàgene \"$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
+       "import-error-invalid": "'A pàgene \"$1\" non g'ha state 'mbortate purcé 'u nome sus a 'u quale avessa essere 'mborate non g'è valide sus a sta uicchi.",
        "import-error-unserialize": "'A revisione $2 d'a pàgene \"$1\" non ge pò essere deserializzate. 'A revisione ha state reportate pe ausà 'u modelle d'u condenute $3 serializzate cumme $4.",
        "import-options-wrong": "{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "'A pàgene radice date tène 'nu titole invalide.",
        "importlogpage": "Archivie de le 'mbortaziune",
        "importlogpagetext": "'Mbortaziune amministrative de pàggene cu 'a storie de le cangiaminde da otre Uicchi.",
        "import-logentry-upload": "'mbortete [[$1]] da 'u fail carechete",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisione|revisiune}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisione|revisiune}} 'mbortate",
        "import-logentry-interwiki": "transuicchied $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisione|revisiune}} da $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisione|revisiune}} 'mbortate da $2",
        "javascripttest": "Test de JavaScript",
-       "javascripttest-title": "Stoche a esegue $1 test",
        "javascripttest-pagetext-noframework": "Sta pàgene jè riservate pe le esecuziune de le test de Javascript.",
        "javascripttest-pagetext-unknownframework": "Ambiende de teste scanusciute \"$1\".",
        "javascripttest-pagetext-frameworks": "Pe piacere scacchie une de le seguende ambiende de test: $1",
        "javascripttest-pagetext-skins": "Scacchie 'n'aspette pe eseguì le test cu:",
        "javascripttest-qunit-intro": "Vide 'a [$1 documendazione d'u test] sus a mediawiki.org.",
-       "javascripttest-qunit-heading": "Ambiende de test MediaUicchi JavaScript QUnit",
        "tooltip-pt-userpage": "'A pàgene utende meje",
        "tooltip-pt-anonuserpage": "'A pàgene utende pe l'IP ca tu ste cange cumme",
        "tooltip-pt-mytalk": "'Ngazzaminde mie",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|'ngazzaminde]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Estenzione d'u tag scanuscite \"$1\"",
        "duplicate-defaultsort": "'''Attenziò:''' 'A chiave de arrangamende de default \"$2\" sovrascrive quedda precedende \"$1\".",
        "version": "Versione",
        "version-extensions": "Estenziune installete",
-       "version-skins": "Skin",
+       "version-skins": "Skin installate",
        "version-specialpages": "Pàggene speciele",
        "version-parserhooks": "Hook analizzature",
        "version-variables": "Variabbele",
        "specialpages-group-wiki": "Date e struminde",
        "specialpages-group-redirects": "Redirezionaminde de le pàggene speciele",
        "specialpages-group-spam": "Struminde p'u spam",
+       "specialpages-group-developer": "Struminde pe le sviluppature",
        "blankpage": "Pàgene vacande",
        "intentionallyblankpage": "Sta pàgene ha state lassete vianghe apposte",
        "external_image_whitelist": "  #Lasse sta linèe satte satte a cumme ste<pre>\n#Mitte le frammende de l'espressione regolare (proprie 'a parte ca vè 'mbrà le //) sotte\n#Chidde ca se combrondene cu successe cu le immaggine de le URL esterne (collegaminde cavede)\n#Chidde ca cu 'u combronde avènene visualizzate cumme immaggine, oppure sulamende 'nu collegamende a l'immaggine avènene visualizzate\n#Linèe ca accumenzane pe # sonde trattate cumme commende\n#Quiste ète insenzitive pe le maiuscole e le minuscole\n\n#Mitte tutte le frammende regex sus a sta linèe. Lasse sta linèe satte satte a cumme ste</pre>",
        "compare-revision-not-exists": "'A revisione ca è specificate non g'esiste.",
        "dberr-problems": "Sime spiacende! Stu site stè 'ngondre de le difficoltà tecniche.",
        "dberr-again": "Aspitte quacche minute e pò recareche.",
-       "dberr-info": "(Non ge riuscime a condattà 'u server d'u database: $1)",
-       "dberr-info-hidden": "(Non ge pozze condattà 'u server d'u database)",
+       "dberr-info": "(Non ge riuscime a trasè sus a'u server d'u database: $1)",
+       "dberr-info-hidden": "(Non ge pozze trasè sus a'u server d'u database)",
        "dberr-usegoogle": "Pu mumende tu puè pruvà a cercà cu Google.",
        "dberr-outofdate": "Vide ca le indice lore de le condenute nuèstre ponne essere non aggiornate.",
        "dberr-cachederror": "Queste jè 'na copie ''cache'' d'a pàgene ca è cercate e allore non g'à puè cangià.",
index 6f83e8e..82044e2 100644 (file)
@@ -74,7 +74,9 @@
                        "Fitoschido",
                        "MaxBioHazard",
                        "Tourorist",
-                       "Purodha"
+                       "Purodha",
+                       "Максим777",
+                       "Sealle"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "pool-queuefull": "Накопитель запросов полон",
        "pool-errorunknown": "Неизвестная ошибка",
        "pool-servererror": "Служба счётчика пула недоступна ($1).",
+       "poolcounter-usage-error": "Ошибка использования: $1",
        "aboutsite": "Описание {{grammar:genitive|{{SITENAME}}}}",
        "aboutpage": "Project:Описание",
        "copyright": "Содержимое доступно по лицензии $1 (если не указано иное).",
        "passwordreset-capture-help": "Если вы установите данную отметку, то вам будет показано письмо с временным паролем, отправляемое участнику.",
        "passwordreset-email": "Адрес электронной почты:",
        "passwordreset-emailtitle": "Сведения об учётной записи {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дней|$5 дня|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
+       "passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailtext-user": "Участник $1 из проекта {{SITENAME}} запросил сброс пароля для вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дней|$5 дня|1=один день}}.\nВы должны представиться системе и выбрать новый пароль.\nЕсли вы не делали этого запроса или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailelement": "Имя участника: $1\nВременный пароль: $2",
        "passwordreset-emailsent": "Отправлено электронное письмо с информацией о сбросе пароля.",
        "anoneditwarning": "<strong>Внимание!</strong> Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы <strong>[$1 войдёте]</strong> или <strong>[$2 создадите учётную запись]</strong>, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}», ваши изменения будут сохранены без комментария.",
+       "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
        "missingcommentheader": "'''Напоминание.''' Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
        "summary-preview": "Описание будет:",
        "content-model-text": "обычный текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Пустой объект",
+       "content-json-empty-array": "Пустой массив",
        "duplicate-args-category": "Страницы, использующие повторяющиеся аргументы в вызовах шаблонов",
        "duplicate-args-category-desc": "Страницы, содержащие вызовы шаблонов, использующие повторяющиеся аргументы, такие как <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Внимание!''' Эта страница содержит слишком много вызовов ресурсоёмких функций.\n\nДолжно быть не более {{PLURAL:$2|$2 вызова|$2 вызовов|1=одного вызова}}, в то время как сейчас здесь $1 {{PLURAL:$1|вызов|вызовов|вызова}}.",
        "history-feed-empty": "Запрашиваемой страницы не существует.\nОна могла быть удалена или переименована.\nПопробуйте [[Special:Search|найти в вики]] похожие страницы.",
        "rev-deleted-comment": "(описание правки удалено)",
        "rev-deleted-user": "(имя автора стёрто)",
-       "rev-deleted-event": "(запиÑ\81Ñ\8c Ñ\83далена)",
+       "rev-deleted-event": "(деÑ\82али Ð¶Ñ\83Ñ\80нала Ñ\83даленÑ\8b)",
        "rev-deleted-user-contribs": "[имя участника или IP-адрес удалены — правка скрыта со страницы вклада]",
        "rev-deleted-text-permission": "Эта версия страницы была '''удалена'''.\nВозможно, объяснения даны в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "rev-suppressed-text-permission": "Эта версия страницы была <strong>скрыта</strong>.\nОбъяснения удаления приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
        "revdelete-legend": "Установить ограничения:",
        "revdelete-hide-text": "Текст правки",
        "revdelete-hide-image": "Скрыть содержимое файла",
-       "revdelete-hide-name": "Скрыть действие и его объект",
+       "revdelete-hide-name": "Скрыть цель и параметры",
        "revdelete-hide-comment": "Описание изменений",
        "revdelete-hide-user": "Имя участника/IP-адрес",
        "revdelete-hide-restricted": "Скрыть данные также и от администраторов",
        "right-protect": "изменение уровня защиты страниц и правка каскадно защищённых страниц",
        "right-editprotected": "правка страниц, защищённых как «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
+       "right-editcontentmodel": "Редактирование контентной модели страницы",
        "right-editinterface": "изменение пользовательского интерфейса",
        "right-editusercssjs": "правка CSS- и JS-файлов других участников",
        "right-editusercss": "правка CSS-файлов других участников",
        "action-viewmywatchlist": "просмотр вашего списка наблюдения",
        "action-viewmyprivateinfo": "просмотр вашей частной информации",
        "action-editmyprivateinfo": "редактирование вашей частной информации",
+       "action-editcontentmodel": "редактирование контентной модели страницы",
        "nchanges": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|с последнего посещения}}",
        "enhancedrc-history": "история",
        "uploaderror": "Ошибка загрузки файла",
        "upload-recreate-warning": "'''Внимание: файл с таким именем был удален или переименован.'''\n\nНиже представлены журналы удалений и переименований этой страницы:",
        "uploadtext": "Воспользуйтесь этой формой для загрузки файлов на сервер.\nЧтобы просмотреть ранее загруженные файлы, обратитесь к [[Special:FileList|списку загруженных файлов]]. Загрузка файлов также записывается в [[Special:Log/upload|журнал загрузок]], данные об удалённых файлах можно найти в [[Special:Log/delete|журнале удалений]].\n\nДля включения файла в статью вы можете использовать строки вида:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' для вставки полной версии файла;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|описание]]</nowiki></code>''' для вставки слева от текста уменьшенной до 200 пикселей по ширине версии файла с выводом под ним указанного описания;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' для вставки ссылки на файл, без отображения его содержимого на странице.",
-       "upload-permitted": "Разрешённые типы файлов: $1.",
-       "upload-preferred": "Предпочтительные типы файлов: $1.",
-       "upload-prohibited": "Запрещённые типы файлов: $1.",
+       "upload-permitted": "{{PLURAL:$2|Разрешённый тип|Разрешённые типы}} файлов: $1.",
+       "upload-preferred": "{{PLURAL:$2|Предпочтительный тип|Предпочтительные типы}} файлов: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Запрещённый тип|Запрещённые типы}} файлов: $1.",
        "uploadlogpage": "Журнал загрузок",
        "uploadlogpagetext": "Ниже представлен список последних загрузок файлов.\nСм. также [[Special:NewFiles|галерею новых файлов]], где сведения о новых загрузках представлены в более наглядном виде, и [[Special:ListFiles|все загруженные файлы]].",
        "filename": "Имя файла",
        "filehist-comment": "Примечание",
        "imagelinks": "Использование файла",
        "linkstoimage": "{{PLURAL:$1|Следующая $1 страница ссылается|Следующие $1 страницы ссылаются|Следующие $1 страниц ссылаются}} на данный файл:",
-       "linkstoimage-more": "Ð\91олее $1 {{PLURAL:$1|Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b\81Ñ\82Ñ\80аниÑ\86}} Ñ\81Ñ\81Ñ\8bлаÑ\8eÑ\82Ñ\81Ñ\8f Ð½Ð° Ñ\8dÑ\82оÑ\82 Ñ\84айл.\nÐ\92 Ð´Ð°Ð½Ð½Ð¾Ð¼ Ñ\81пиÑ\81ке {{PLURAL:$1|пÑ\80едÑ\81Ñ\82авлена Ñ\82олÑ\8cко $1 Ñ\81Ñ\81Ñ\8bлка|пÑ\80едÑ\81Ñ\82авленÑ\8b Ñ\82олÑ\8cко $1 Ñ\81Ñ\81Ñ\8bлок|пÑ\80едÑ\81Ñ\82авленÑ\8b Ñ\82олÑ\8cко $1 Ñ\81Ñ\81Ñ\8bлки}} на этот файл.\nДоступен также [[Special:WhatLinksHere/$2|полный список]].",
+       "linkstoimage-more": "Ð\91олее $1 {{PLURAL:$1|Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b\81Ñ\82Ñ\80аниÑ\86}} Ñ\81Ñ\81Ñ\8bлаÑ\8eÑ\82Ñ\81Ñ\8f Ð½Ð° Ñ\8dÑ\82оÑ\82 Ñ\84айл.\nÐ\92 Ð´Ð°Ð½Ð½Ð¾Ð¼ Ñ\81пиÑ\81ке {{PLURAL:$1|пÑ\80едÑ\81Ñ\82авлена Ñ\82олÑ\8cко $1 Ñ\81Ñ\81Ñ\8bлка|пÑ\80едÑ\81Ñ\82авленÑ\8b Ñ\82олÑ\8cко $1 Ñ\81Ñ\81Ñ\8bлки|пÑ\80едÑ\81Ñ\82авленÑ\8b Ñ\82олÑ\8cко $1 Ñ\81Ñ\81Ñ\8bлок}} на этот файл.\nДоступен также [[Special:WhatLinksHere/$2|полный список]].",
        "nolinkstoimage": "Нет страниц, ссылающихся на данный файл.",
        "morelinkstoimage": "Просмотреть [[Special:WhatLinksHere/$1|остальные ссылки]] на этот файл.",
        "linkstoimage-redirect": "$1 (файловое перенаправление) $2",
        "deleteprotected": "Вы не можете удалить эту страницу, поскольку она защищена.",
        "deleting-backlinks-warning": "'''Предупреждение.''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Другие страницы]] ссылаются на страницу, которую вы собираетесь удалить, или содержат её.",
        "rollback": "Откатить изменения",
-       "rollback_short": "Откат",
        "rollbacklink": "откатить",
        "rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
        "namespace": "Пространство имён:",
        "invert": "Обратить выбранное",
        "tooltip-invert": "Установите эту отметку, чтобы скрыть изменения на страницах, в пределах выбранного пространства имён (и связанных пространств имён, если указано)",
+       "tooltip-whatlinkshere-invert": "Установите этот флажок, чтобы Скрыть ссылки от страниц в выбранном пространстве имен.",
        "namespace_association": "Связанное пространство",
        "tooltip-namespace_association": "Установите эту отметку, чтобы также включить пространство имён обсуждения (или предметное), связанное с выбранным пространством имён",
        "blanknamespace": "(основное)",
        "thumbnail-temp-create": "Не удаётся создать временный файл эскиза",
        "thumbnail-dest-create": "Не удаётся сохранить эскиз по месту назначения",
        "thumbnail_invalid_params": "Ошибочный параметр миниатюры",
+       "thumbnail_toobigimagearea": "Файл с размерами больше $1",
        "thumbnail_dest_directory": "Невозможно создать целевую директорию",
        "thumbnail_image-type": "Данный тип изображения не поддерживается",
        "thumbnail_gd-library": "Неполная конфигурация библиотеки GD, отсутствует функция $1",
        "import-logentry-interwiki": "«$1» — межвики импорт",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версия импортирована|версии импортировано|версий  импортировано}} из $2",
        "javascripttest": "Проверка JavaScript",
-       "javascripttest-title": "Проводится проверка $1",
        "javascripttest-pagetext-noframework": "Эта страница зарезервирована для запуска JavaScript-тестов.",
        "javascripttest-pagetext-unknownframework": "Неизвестная среда тестирования «$1».",
+       "javascripttest-pagetext-unknownaction": "Неизвестное действие «$1».",
        "javascripttest-pagetext-frameworks": "Пожалуйста, выберите одну из следующих сред тестирования: $1",
        "javascripttest-pagetext-skins": "Выберите тему оформления для запуска тестов:",
        "javascripttest-qunit-intro": "См. [$1 документацию по тестированию] на mediawiki.org.",
-       "javascripttest-qunit-heading": "Набор тестов MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Ваша страница участника",
        "tooltip-pt-anonuserpage": "Страница участника для моего IP",
        "tooltip-pt-mytalk": "Ваша страница обсуждения",
        "hebrew-calendar-m11-gen": "Ава",
        "hebrew-calendar-m12-gen": "Элула",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обсуждение]])",
-       "unknown_extension_tag": "Неизвестный тег расширения «$1»",
        "duplicate-defaultsort": "Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».",
        "duplicate-displaytitle": "<strong>Внимание:</strong> Отображаемое название «$2» переопределяет ранее заданное отображаемое название «$1».",
        "invalid-indicator-name": "<strong>Ошибка:</strong> Атрибут <code>name</code> индикаторов состояния страницы не должен быть пустым.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Путь к статье]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Путь к скрипту]",
+       "version-libraries": "Установленные библиотеки",
+       "version-libraries-library": "Библиотека",
+       "version-libraries-version": "Версия",
        "redirect": "Перенаправление с файла, участника, страницы или идентификатора версии",
        "redirect-legend": "Перенаправление на файл или страницу",
        "redirect-summary": "Эта служебная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии или страницы) или страницу участника (с числового идентификатора участника). Использование: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Указанной вами версии не существует.",
        "dberr-problems": "Извините! На данном сайте возникли технические трудности.",
        "dberr-again": "Попробуйте обновить страницу через несколько минут.",
-       "dberr-info": "(невозможно Ñ\81оединиÑ\82Ñ\8cÑ\81Ñ\8f Ñ\81 Ñ\81еÑ\80веÑ\80ом Ð±Ð°Ð· данных: $1)",
-       "dberr-info-hidden": "(Невозможно соединиться с сервером баз данных)",
+       "dberr-info": "(Ð\9dеÑ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ðº Ð±Ð°Ð·Ðµ данных: $1)",
+       "dberr-info-hidden": "(Нет доступа к базе данных)",
        "dberr-usegoogle": "Пока вы можете попробовать поискать с помощью Google.",
        "dberr-outofdate": "Но имейте в виду, что его индекс может оказаться устаревшим.",
        "dberr-cachederror": "Ниже представлена закэшированная версия запрашиваемой страницы, возможно, она не отражает последних изменений.",
index c723ae6..df4600a 100644 (file)
        "watchlisttools-edit": "Нагляд і едітованя списку",
        "watchlisttools-raw": "Едітовати як текст",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|діскузія]])",
-       "unknown_extension_tag": "Незнама значка росшырїня: „$1“",
        "duplicate-defaultsort": "Увага: Імпліцітный ключ сортованя (DEFAULTSORTKEY) „$2“ переписує скоре наставлену годноту „$1“.",
        "version": "Верзія",
        "version-extensions": "Наіншталованы росшырїня",
        "specialpages-group-wiki": "Даны і інштрументы",
        "specialpages-group-redirects": "Напрямлїня",
        "specialpages-group-spam": "Протиспамовы інштрументы",
+       "specialpages-group-developer": "Інштрументы вывоя",
        "blankpage": "Порожня сторінка",
        "intentionallyblankpage": "Тота сторінка є порожня нароком.",
        "external_image_whitelist": " #Тот рядок зохабте без зміны.<pre>\n#Ниже уведьте фраґменты реґуларных выразів (лем часть міджі //).\n#Тоты выразы ся аплікують на URL вкладаных екстерный образків.\n#Тоты, котры згодны, ся зобразять як образок; другы лем як екстерный одказ.\n#Рядкы зачінаючі знаком # ся поважують за коментарї.\n#На великости букв не залежыть.\n\n#Вшыткы реґуларны выразы зазначте над тым рядком. Тотрядок зохабте без зміны.</pre>",
index 783665a..d9bc166 100644 (file)
@@ -37,6 +37,7 @@
        "tog-watchdefault": "मया सम्पादितानि पृष्ठानि मम अवेक्षणाऽऽवल्यां योज्यन्ताम्।",
        "tog-watchmoves": "मया चालितानि पृष्ठानि मम अवेक्षणाऽऽवल्यां योज्यन्ताम्।",
        "tog-watchdeletion": "मया अपाकृतानि पृष्ठानि मम अवेक्षणाऽऽवल्यां योज्यन्ताम्।",
+       "tog-watchrollback": "मया प्रत्यापन्नानि (rollback) पृष्ठानि मम अवेक्षणाऽऽवल्यां योज्यताम् ।",
        "tog-minordefault": "मम सर्वाणि सम्पादनानि लघुत्वेन प्रदर्श्यन्ताम् ।",
        "tog-previewontop": "सम्पादनात् पूर्वं प्राग्दृश्यं दर्श्यताम् ।",
        "tog-previewonfirst": "प्रथमसम्पादनस्य प्राग्दृश्यं दर्श्यताम् ।",
        "import-logentry-interwiki": "ट्रान्स्विकिकृतम् ।$1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|पुनरावृत्तिः}} $2 इत्येतस्मात् ।",
        "javascripttest": "जावालिपिपरीक्षणम् ।",
-       "javascripttest-title": "$1 परीक्षाप्रचलति ।",
        "javascripttest-pagetext-noframework": "जावलिपिचालनपरीक्षार्थम् एतत्पुटम् आरक्षितम् ।",
        "javascripttest-pagetext-unknownframework": "अज्ञातपरीक्षाप्रक्रिया  $1",
        "javascripttest-pagetext-frameworks": "अधो दत्तेषु कञ्चिदेकां परीक्षाप्रक्रियां चिनोतु : $1",
        "javascripttest-pagetext-skins": "अनेन सह परीक्षां सञ्चालयितुं  काचित् त्वक् चिनोतु ।",
        "javascripttest-qunit-intro": "mediawiki.org. [$1 अभिलेखपरीक्षा] इत्यत्र पश्यतु ।",
-       "javascripttest-qunit-heading": "मिडियाविक्याः जवालिपेः Qघटकस्य परीक्षाप्रणाली ।",
        "tooltip-pt-userpage": "भवतः/भवत्याः योजकपृष्ठम्",
        "tooltip-pt-anonuserpage": "ऐपिसङ्केतार्थं योजकपुटं भवान् सम्पादयति एवम्..",
        "tooltip-pt-mytalk": "भवतः/भवत्याः सम्भाषणपृष्ठम्",
        "watchlisttools-edit": "अवेक्षणाऽऽवलिः दृश्यतां, सम्पाद्यतां च",
        "watchlisttools-raw": "विवरणरहिता अवलोकनावलिः सम्पाद्यताम्",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|सम्भाषणम्]])",
-       "unknown_extension_tag": "अज्ञातं वर्तमानसूत्रम् $1",
        "duplicate-defaultsort": "'''पूर्वसूचना''' \"$1\" इति पुरातनं मूलक्रमाङ्कनकुड्मलं विहाय  \"$2\" इति नवीनं मूलक्रमाङ्कनकुण्डलत्वेन स्वयमेव नयति एतत् ।",
        "version": "आवृत्तिः",
        "version-extensions": "अनुस्थापितानि विस्तरणानि ।",
index 6f7735c..75874f7 100644 (file)
        "watchlisttools-edit": "Кэтэбил испииһэгин көрүү/уларытыы",
        "watchlisttools-raw": "\"Сиикэй\" испииһэги уларытыы",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ырытыы]])",
-       "unknown_extension_tag": "Биллибэт тиэг \"$1\"",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
        "version": "MediaWiki барыла (биэрсийэтэ)",
        "version-extensions": "Туруоруллубут расширениялар",
index a03a4cb..e2566eb 100644 (file)
                        "Tonyfroio",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Pippinu"
                ]
        },
-       "tog-underline": "Suttalìnia li culligamenti:",
+       "tog-underline": "Suttalinia li culligamenti:",
        "tog-hideminor": "Ammuccia li canciamenti nichi nta l'ùrtimi canciamenti",
-       "tog-hidepatrolled": "Ammuccia li mudìfichi fatti ntâ l'ùrtimi canciamenti",
-       "tog-newpageshidepatrolled": "Ammuccia li pàggini virificati di l'alencu dî pàgging cchiù novi",
-       "tog-extendwatchlist": "Attiva tutti li funzioni avanzati pi l'ossirvati spiciali, nun sulu l'ultima",
-       "tog-usenewrc": "Raggruppa li canci pi pàggina ntê canciamenti ricenti e ntâ lista dî taliati spiciali",
-       "tog-numberheadings": "Nummirazzioni automàtica dî tìtuli di paràgrafu",
-       "tog-showtoolbar": "Ammustra la barra dî strumenta pi lu canciamentu",
+       "tog-hidepatrolled": "Ammuccia li mudìfichi battugghiati nta l'ùrtimi canciamenti",
+       "tog-newpageshidepatrolled": "Ammuccia li pàggini battugghiati di l'alencu dî pàggini cchiu' novi",
+       "tog-extendwatchlist": "Ammustra tutti i canciamenti ntâ lista talïata, nun sulu u cchiu' ricenti",
+       "tog-usenewrc": "Raggruppa li canciamenti pi' pàggina ntâ lista dî canciamenti ricenti e ntâ lista talïata",
+       "tog-numberheadings": "Nummirazzioni autumàtica dî tìtuli di paràgrafu",
+       "tog-showtoolbar": "Ammustra la barra dî strumenta pû canciamentu",
        "tog-editondblclick": "Duppiu click pi canciari l'artìculu",
-       "tog-editsectiononrightclick": "Abbìlita lu canciamentu dî sizzioni tràmiti duppiu click a manu dritta supra lu tìtulu dâ sezzioni",
-       "tog-watchcreations": "Agghiunci li pàggini criati e li files â lista dî taliati",
-       "tog-watchdefault": "Agghiunci li pàggini canciati a l'ossirvati spiciali",
-       "tog-watchmoves": "Agghiunci li pàggini spustati a l'ossirvati spiciali",
-       "tog-watchdeletion": "Agghiunci li pàggini di mìa cancillati a l'ossirvati spiciali",
-       "tog-minordefault": "Ìndica ogni canciamentu comu nicu (sulu comu pridifinitu)",
-       "tog-previewontop": "Ammustra l'antiprima prima dâ casella di canciamentu e nun doppu",
-       "tog-previewonfirst": "Ammustra l'antiprima supra lu primu canciamentu",
-       "tog-enotifwatchlistpages": "Mànnami na e-mail siddu la pàggina subbisci canciamenti",
-       "tog-enotifusertalkpages": "Mànnimi nu missaggiu email quannu la mè pàggina di discussioni è canciata",
-       "tog-enotifminoredits": "Mànnami na e-mail macari pi li canciamenti nichi di sta pàggina",
-       "tog-enotifrevealaddr": "Rivela lu mè ndirizzu e-mail ntê mail di nutificazzioni",
-       "tog-shownumberswatching": "Ammustra lu nùmmiru di utenti ca sèquinu la pàggina",
+       "tog-editsectiononrightclick": "Attiva lu canciamentu di na sizzioni quannu si clicca cu' buttuni drittu supra a lu so tìtulu",
+       "tog-watchcreations": "Agghiunci li pàggini chi' creu e li file chi' càrricu â me lista talïata",
+       "tog-watchdefault": "Agghiunci li pàggini e li file chi' canciu â me lista talïata",
+       "tog-watchmoves": "Agghiunci li pàggini e li file chi' spostu â me lista talïata",
+       "tog-watchdeletion": "Agghiunci li pàggini e li file chi' cancellu â me lista talïata",
+       "tog-watchrollback": "Agghiunci li pàggini unni fici nu canciu n'arreri â me lista talïata",
+       "tog-minordefault": "Marca ogni' canciamentu comu nicu pi' mpustazzioni pridifinuta",
+       "tog-previewontop": "Ammustra l'antiprima avanti dâ casedda di canciamentu",
+       "tog-previewonfirst": "Ammustra l'antiprima ô primu canciamentu",
+       "tog-enotifwatchlistpages": "Mànnami nu missàggiu di posta elittrònica quannu na pàggina o nu file dâ me lista talïata subbìsciunu canciamenti",
+       "tog-enotifusertalkpages": "Mànnami nu missaggiu di posta elettrònica quannu la me pàggina di discussioni veni canciata",
+       "tog-enotifminoredits": "Mànnami nu missaggiu di posta elittrònica macari pi li canciamenti nichi di pàggini e file",
+       "tog-enotifrevealaddr": "Ammustra lu me nnirizzu di posta elittrònica ntê missaggi di nutifica",
+       "tog-shownumberswatching": "Ammustra lu nùmmiru di utenti ca talìunu la pàggina",
        "tog-oldsig": "Firma attuali:",
-       "tog-fancysig": "Interpitra li cumanna wiki nâ firma (senza liami automaticu)",
-       "tog-uselivepreview": "Attiva la funzioni ''Live preview'' (richiedi JavaScript; spirimintali)",
-       "tog-forceeditsummary": "Chiedi cunferma siddu l'uggettu dû canciamentu è vacanti",
-       "tog-watchlisthideown": "Ammuccia li mè canciamenti nta l'ossirvati spiciali",
-       "tog-watchlisthidebots": "Ammuccia li canciamenti dî bot nta l'ossirvati spiciali",
-       "tog-watchlisthideminor": "Ammuccia li canciamenti nichi nta l'ossirvati spiciali",
-       "tog-watchlisthideliu": "Ammuccia li canciamenti di l'utilizzatura riggistrati nti l'ussirvati spiciali",
-       "tog-watchlisthideanons": "Ammuccia li canciamenti di l'utilizzatura anònimi nti l'ussirvati spiciali",
-       "tog-watchlisthidepatrolled": "Ammuccia li mudìfichi virificati nta l'ussirvati spiciali",
-       "tog-ccmeonemails": "Mànnami na copia dî missaggi spiditi a l'àutri utenti",
-       "tog-diffonly": "Nun visualizzari lu cuntinutu dâ pàggina quannu s'esequi na ''diff'' tra dui virsioni",
-       "tog-showhiddencats": "Ammustra li catigurìi ammucciati.",
-       "tog-norollbackdiff": "Umettiri li ''diff'' doppu aviri fattu nu ''rollback''",
-       "tog-useeditwarning": "Avvisa quannu si lasaa na paggina di canci cu canci nu sarbati",
-       "tog-prefershttps": "Usa sempri na cunnissioni sicura quannu trasi",
-       "underline-always": "sempri",
-       "underline-never": "mai",
-       "underline-default": "manteni li mpustazzioni dû browser o dû tema",
-       "editfont-style": "Stili da casedda di canciamentu:",
-       "editfont-default": "Pridifinitu dô Browser",
-       "editfont-monospace": "Font monospaziu",
-       "editfont-sansserif": "Font sans-serif",
-       "editfont-serif": "Font serif",
+       "tog-fancysig": "Intèrpitra la firma comu wikitestu (senza liami automaticu)",
+       "tog-uselivepreview": "Attiva l'antiprima in diretta",
+       "tog-forceeditsummary": "Dumanna cunfirma siddu lu riassuntu dûn canciamentu è vacanti",
+       "tog-watchlisthideown": "Ammuccia li me canciamenti ntâ lista talïata",
+       "tog-watchlisthidebots": "Ammuccia li canciamenti dî bot ntâ lista talïata",
+       "tog-watchlisthideminor": "Ammuccia li canciamenti nichi ntâ lista talïata",
+       "tog-watchlisthideliu": "Ammuccia li canciamenti di l'utilizzatura riggistrati ntâ lista talïata",
+       "tog-watchlisthideanons": "Ammuccia li canciamenti di l'utilizzatura anònimi ntâ lista talïata",
+       "tog-watchlisthidepatrolled": "Ammuccia li mudìfichi battugghiati ntâ lista talïata",
+       "tog-ccmeonemails": "Mànnami na copia dî missaggi spiduti a l'àutri utenti",
+       "tog-diffonly": "Nun ammustrari lu cuntinutu dî pàggini sutta dî cunfrunti tra virsioni",
+       "tog-showhiddencats": "Ammustra li catigurìi ammucciati",
+       "tog-norollbackdiff": "Nun ammustrari u cunfruntu tra virsioni doppu aviri fattu nu canciu n'arreri",
+       "tog-useeditwarning": "Avvèrtimi quannu mi nni vaju di na pàggina cu' canciamenti nun sarvati",
+       "tog-prefershttps": "Adòpira sempri na cunnissioni sicura quannu si' trasutu",
+       "underline-always": "Sempri",
+       "underline-never": "Mai",
+       "underline-default": "Mpustazzioni pridifinuta dâ peddi o dû browser",
+       "editfont-style": "Stili dû caràttiri dâ casedda di canciamentu:",
+       "editfont-default": "Pridifinutu dô browser",
+       "editfont-monospace": "Tipu di caràttiri a' larghizza fissa",
+       "editfont-sansserif": "Tipu di caràttiri senza grazzî",
+       "editfont-serif": "Tipu di caràttiri cu' grazzî",
        "sunday": "Duminicadìa",
        "monday": "Lunidìa",
        "tuesday": "Martidìa",
        "tue": "mar",
        "wed": "mer",
        "thu": "jov",
-       "fri": "vènn",
-       "sat": "sabb",
-       "january": "jinnaru",
+       "fri": "ven",
+       "sat": "sab",
+       "january": "Jinnaru",
        "february": "Frivaru",
        "march": "Marzu",
        "april": "Aprili",
        "may_long": "Maiu",
        "june": "Giugnu",
        "july": "Giugnettu",
-       "august": "Austu",
+       "august": "Aùstu",
        "september": "Sittèmmiru",
        "october": "Uttùviru",
        "november": "Nuvèmmiru",
        "january-gen": "jinnaru",
        "february-gen": "frivaru",
        "march-gen": "marzu",
-       "april-gen": "Aprili",
-       "may-gen": "Maiu",
+       "april-gen": "aprili",
+       "may-gen": "maiu",
        "june-gen": "giugnu",
        "july-gen": "giugnettu",
-       "august-gen": "Austu",
+       "august-gen": "austu",
        "september-gen": "sittèmmiru",
        "october-gen": "uttùviru",
        "november-gen": "nuvèmmiru",
-       "december-gen": "Dicèmmiru",
+       "december-gen": "dicèmmiru",
        "jan": "jin",
-       "feb": "Friv",
+       "feb": "friv",
        "mar": "mar",
        "apr": "apr",
-       "may": "Maiu",
+       "may": "maiu",
        "jun": "giu",
        "jul": "giugn",
-       "aug": "Au",
-       "sep": "Sitt",
+       "aug": "aus",
+       "sep": "sit",
        "oct": "utt",
        "nov": "nuv",
-       "dec": "Dic",
-       "january-date": "$1 jinnaru",
-       "february-date": "$1 frivaru",
+       "dec": "dic",
+       "january-date": "$1 di jinnaru",
+       "february-date": "$1 di frivaru",
        "march-date": "$1 di marzu",
        "april-date": "$1 di aprili",
        "may-date": "$1 di maiu",
        "june-date": "$1 di giugnu",
        "july-date": "$1 di giugnettu",
-       "august-date": "$1 di austu",
+       "august-date": "$1 di aùstu",
        "september-date": "$1 di sittèmmiru",
        "october-date": "$1 di uttùviru",
        "november-date": "$1 di nuvèmmiru",
        "december-date": "$1 di dicèmmiru",
        "pagecategories": "{{PLURAL:$1|Catigurìa|Catigurìi}}",
-       "category_header": "Artìculi ntâ catigurìa \"$1\"",
+       "category_header": "Pàggini ntâ catigurìa \"$1\"",
        "subcategories": "Suttacatigurìi",
        "category-media-header": "File multimidiali ntâ catigurìa \"$1\"",
-       "category-empty": "''Sta catigurìa attuarmenti nun havi artìculi o \"media\".''",
+       "category-empty": "<em>Sta catigurìa pi' com'ora nun cunteni nudda pàggina e nuddu file multimidiali.</em>",
        "hidden-categories": "{{PLURAL:$1|Catigurìa ammucciata|Catigurìi ammuciati}}",
        "hidden-category-category": "Catigurìi ammucciati",
        "category-subcat-count": "{{PLURAL:$2|Sta catigurìa cunteni na sula suttacatigurìa, nnicata ccà sutta.|Sta catigurìa cunteni {{PLURAL:$1|la suttacatigurìa|li $1 suttacatigurìi nnicati}} ccà sutta, sùpira nu tutali di $2.}}",
        "index-category": "Pàggini nnicizzati",
        "noindex-category": "Pàggini nun nnicizzati",
        "broken-file-category": "Pàggini ca nclùdunu file inesistenti",
-       "about": "pàggina",
-       "article": "artìculu",
+       "about": "Nfurmazzioni",
+       "article": "Pàggina di cuntinutu",
        "newwindow": "(grapi na finestra nova)",
-       "cancel": "annulla",
+       "cancel": "Annulla",
        "moredotdotdot": "Àutru...",
        "morenotlisted": "Sta lista è ncumpreta",
        "mypage": "Pàggina",
-       "mytalk": "la mè pàggina di discussioni",
-       "anontalk": "Discussione pi stu IP",
+       "mytalk": "La me pàggina di discussioni",
+       "anontalk": "Discussioni di stu nnirizzu IP",
        "navigation": "Navigazzioni",
        "and": "&#32;e",
        "qbfind": "Attrova",
        "qbbrowse": "Sfogghia",
        "qbedit": "Cancia",
        "qbpageoptions": "Opzioni pàggina",
-       "qbmyoptions": "Li mè pàggini",
+       "qbmyoptions": "Li me pàggini",
        "faq": "Dumanni cumuni",
        "faqpage": "Project:Dumanni comuni",
        "actions": "Azzioni",
        "variants": "Varianti",
        "navigation-heading": "Menù di navigazzioni",
        "errorpagetitle": "Erruri",
-       "returnto": "Ritorna a $1.",
+       "returnto": "Ritorna a' $1.",
        "tagline": "Di {{SITENAME}}",
-       "help": "Aiutu",
+       "help": "Guida",
        "search": "Arriscedi",
-       "searchbutton": "Va' cerca",
+       "searchbutton": "Va cerca",
        "go": "Trova",
        "searcharticle": "Vai",
-       "history": "cronuluggìa",
-       "history_short": "storia",
+       "history": "Crunuluggìa dâ pàggina",
+       "history_short": "Crunuluggìa",
        "updatedmarker": "canciata dâ mè ùrtima vìsita",
        "printableversion": "Virsioni stampàbbili",
        "permalink": "Liami pirmanenti",
        "print": "Stampa",
        "view": "Talìa",
-       "view-foreign": "Talìa supra $1",
-       "edit": "cancia",
+       "view-foreign": "Talìa supra a' $1",
+       "edit": "Cancia",
        "edit-local": "Cancia la discrizzioni lucali",
        "create": "Crea",
-       "create-local": "Junci na discrizzioni lucali",
+       "create-local": "Agghiunci na discrizzioni lucali",
        "editthispage": "Cancia sta pàggina",
        "create-this-page": "Crea sta pàggina",
-       "delete": "elìmina",
-       "deletethispage": "Elìmina sta pàggina",
-       "undeletethispage": "Annulla la scancillazzioni di sta pàggina",
-       "undelete_short": "Ricùpira {{PLURAL:$1|na rivisioni|$1 rivisioni}}",
+       "delete": "Cancella",
+       "deletethispage": "Cancella sta pàggina",
+       "undeletethispage": "Annulla la cancillazzioni di sta pàggina",
+       "undelete_short": "Annulla la cancillazzioni di {{PLURAL:$1|na virsioni|$1 virsioni}}",
        "viewdeleted_short": "Talìa {{PLURAL:$1|nu canciamentu scancillatu|$1 canciamenti scancillati}}",
        "protect": "Pruteggi",
        "protect_change": "cancia",
        "protectthispage": "Pruteggi sta pàggina",
        "unprotect": "Cancia la prutizzioni",
-       "unprotectthispage": "Cancia la prutizzioni a sta pàggina",
-       "newpage": "pàggina nova",
-       "talkpage": "Pàggina di discussioni",
+       "unprotectthispage": "Cancia la prutizzioni di sta pàggina",
+       "newpage": "Pàggina nova",
+       "talkpage": "Discussioni supra a' sta pàggina",
        "talkpagelinktext": "Discussioni",
        "specialpage": "Pàggina spiciali",
        "personaltools": "Strumenta pirsunali",
-       "articlepage": "artìculu",
-       "talk": "discussioni",
+       "articlepage": "Vidi l'artìculu",
+       "talk": "Discussioni",
        "views": "Vìsiti",
-       "toolbox": "Strummenta",
-       "userpage": "Visualizza la pàggina utenti",
-       "projectpage": "Visualizza la pàggina di sirvizziu",
-       "imagepage": "Visualizza la pàggina dô file",
-       "mediawikipage": "Visualizza lu missaggiu",
-       "templatepage": "Visualizza lu template",
-       "viewhelppage": "Visualizza la pàggina d'aiutu",
-       "categorypage": "Visualizza la catigurìa",
-       "viewtalkpage": "Vidi discussioni",
-       "otherlanguages": "Àutri lingui",
-       "redirectedfrom": "(Rinnirizzata di $1)",
-       "redirectpagesub": "Pàggina di rinnirizzamentu",
-       "lastmodifiedat": "Sta pàggina fu canciata a $2 di lu $1.",
-       "viewcount": "Sta pàggina hà statu liggiuta {{PLURAL:$1|una vota|$1 voti}}.",
-       "protectedpage": "Pàggina bluccata",
-       "jumpto": "Va' a:",
+       "toolbox": "Strumenta",
+       "userpage": "Talìa la pàggina di l'utenti",
+       "projectpage": "Talìa la pàggina di sirvizziu",
+       "imagepage": "Talìa la pàggina dû file",
+       "mediawikipage": "Talìa lu missaggiu",
+       "templatepage": "Talìa lu template",
+       "viewhelppage": "Talìa la pàggina dâ guida",
+       "categorypage": "Talìa la catigurìa",
+       "viewtalkpage": "Talìa la discussioni",
+       "otherlanguages": "Nta autri lingui",
+       "redirectedfrom": "(Rimannu a' pàrtiri di $1)",
+       "redirectpagesub": "Pàggina di rimannu",
+       "redirectto": "Rimanna a:",
+       "lastmodifiedat": "Sta pàggina fu' canciata l'ùltima vota a li $2 di lu $1.",
+       "viewcount": "Sta pàggina hâ statu liggiuta {{PLURAL:$1|na vota|$1 voti}}.",
+       "protectedpage": "Pàggina prutetta",
+       "jumpto": "Vai a':",
        "jumptonavigation": "navigazzioni",
-       "jumptosearch": "Va' cerca",
-       "view-pool-error": "Ci spiaci, li server ni stu mumentu sunu troppu carichi. Troppi utenti stannu circannu di taliari sta pàggina. Aspetta n'anticchia prima di pruvari a ritaliari sta pàggina.\n\n$1",
-       "generic-pool-error": "Ni spiaci, li server ni stu mumentu sunu troppu carrichi. Troppi utenti stannu circannu di taliari sta pàggina. Aspetta n'anticchia prima di pruvari a ritaliari sta pàggina.",
+       "jumptosearch": "cerca",
+       "view-pool-error": "Nni dispiaci, ma li server nta stu mumentu sunnu troppu carrichi.\nTroppi utenti stannu circannu di talïari sta pàggina.\nPi' favuri spetta n'anticchia prima di pruvari n'autra vota a talïari sta pàggina.\n\n$1",
+       "generic-pool-error": "Nni dispiaci, ma li server nta stu mumentu sunnu troppu càrrichi.\nTroppi utenti stannu circannu di talïari sta risorsa.\nPi' favuri spetta n'anticchia prima di pruvari n'autra vota a talïari sta risorsa.",
        "pool-timeout": "Tempu scadutu aspittannu lu sbloccu",
        "pool-queuefull": "La cuda dû pool è china",
        "pool-errorunknown": "Erruri scanusciutu",
-       "pool-servererror": "Lu sirivzzu di cuntaturi dâ riserva nun è dispunìbbili ($1)",
-       "aboutsite": "Àutri nfurmazzioni supra {{SITENAME}}",
+       "pool-servererror": "Lu sirvizziu di cuntaturi dî pool nun è dispunìbbili ($1)",
+       "poolcounter-usage-error": "Erruri d'utilizzu: $1",
+       "aboutsite": "Nfurmazzioni supra a' {{SITENAME}}",
        "aboutpage": "Project:Àutri nformazzioni",
        "copyright": "Lu cuntinutu è utilizzàbbili secunnu la $1, sarvu minzioni cuntraria.",
        "copyrightpage": "{{ns:project}}:Copyright",
        "currentevents-url": "Project:Nutizzî",
        "disclaimers": "Avvirtenzi",
        "disclaimerpage": "Project:Avvirtenzi ginirali",
-       "edithelp": "Guida",
+       "edithelp": "Guida pî canciamenti",
        "mainpage": "Pàggina principali",
        "mainpage-description": "Pàggina principali",
        "policy-url": "Project:Policy",
        "portal-url": "Project:Porta dâ cumunitati",
        "privacy": "Pulìtica supra la privacy",
        "privacypage": "Project:Pulìtica rilativa â privacy",
-       "badaccess": "Pirmessi nun sufficienti",
-       "badaccess-group0": "Nun hai li pirmessi nicissari p'esèquiri l'azzioni addumannata.",
+       "badaccess": "Erruri di pirmissu",
+       "badaccess-group0": "Nun hai lu pirmissu p'esèquiri l'azzioni chi' hai addumannatu.",
        "badaccess-groups": "La funzioni addumannata è risirvata a l'utenti ca appartèninu {{PLURAL:$2|ô gruppu|a unu dî gruppi siquenti}}: $1.",
        "versionrequired": "È nicissaria la virsioni $1 dû software MediaWiki",
        "versionrequiredtext": "P'usari sta pàggina ci voli la virsioni $1 dû software MediaWiki. Talìa [[Special:Version|sta pàggina]]",
-       "ok": "OK",
+       "ok": "Va' bonu",
        "retrievedfrom": "Estrattu di \"$1\"",
-       "youhavenewmessages": "Ricivìsti $1 ($2).",
-       "youhavenewmessagesfromusers": "Hai $1 di {{PLURAL:$3|n'àutru utenti|$3 utenti}} ($2).",
-       "youhavenewmessagesmanyusers": "Hai $1 di na pocu di utenti ($2).",
+       "youhavenewmessages": "Ricivisti $1 ($2).",
+       "youhavenewmessagesfromusers": "Ricivisti $1 di {{PLURAL:$3|n'autru utenti|$3 utenti}} ($2).",
+       "youhavenewmessagesmanyusers": "Ricivisti $1 di tanti utenti ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|nu missaggiu novu|999=missaggi novi}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtimu canciamenti|999=ùrtimi canciamenti}}",
-       "youhavenewmessagesmulti": "Hai missaggi novi supra $1",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtimu canciamentu|999=ùrtimi canciamenti}}",
+       "youhavenewmessagesmulti": "Ricivisti missaggi novi supra a' $1",
        "editsection": "cancia",
        "editold": "cancia",
-       "viewsourceold": "talìa la fonti",
+       "viewsourceold": "talìa u surgenti",
        "editlink": "cancia",
-       "viewsourcelink": "Talìa la funti",
-       "editsectionhint": "Cancia la sezzioni $1",
-       "toc": "Ìndici",
+       "viewsourcelink": "talìa u surgenti",
+       "editsectionhint": "Cancia la sizzioni $1",
+       "toc": "Ìnnici",
        "showtoc": "ammustra",
        "hidetoc": "ammuccia",
-       "collapsible-collapse": "Cumprimi",
-       "collapsible-expand": "Spanni",
+       "collapsible-collapse": "Strinci",
+       "collapsible-expand": "Llarga",
+       "confirmable-confirm": "Si' {{GENDER:$1|sicuru|sicura}}?",
+       "confirmable-yes": "Sì",
+       "confirmable-no": "No",
        "thisisdeleted": "Vidi e/o riprìstina $1?",
        "viewdeleted": "Vidi $1?",
        "restorelink": "{{PLURAL:$1|nu canciamentu annullatu|$1 canciamenti annullati}}",
        "feed-unavailable": "Nun sunnu dispunìbbili li feed",
        "site-rss-feed": "Feed RSS di $1",
        "site-atom-feed": "Feed Atom di $1",
-       "page-rss-feed": "Feed RSS pi \"$1\"",
-       "page-atom-feed": "Feed Atom pi \"$1\"",
-       "red-link-title": "$1 (ancora nun scrivutu)",
-       "sort-descending": "Urdinamenti dicriscenti",
-       "sort-ascending": "Urdinamenti criscenti",
-       "nstab-main": "artìculu",
-       "nstab-user": "Pàggina d'utenti",
-       "nstab-media": "File multimidiali",
-       "nstab-special": "Spiciali",
-       "nstab-project": "pàggina",
-       "nstab-image": "mmàggini",
-       "nstab-mediawiki": "missagiu",
-       "nstab-template": "template",
-       "nstab-help": "aiutu",
+       "page-rss-feed": "Feed RSS di \"$1\"",
+       "page-atom-feed": "Feed Atom di \"$1\"",
+       "red-link-title": "$1 (la pàggina nun esisti)",
+       "sort-descending": "Òrdina a' scìnniri",
+       "sort-ascending": "Òrdina a' nchianari",
+       "nstab-main": "Pàggina",
+       "nstab-user": "Pàggina di l'utenti",
+       "nstab-media": "Pàggina dû file multimidiali",
+       "nstab-special": "Pàggina spiciali",
+       "nstab-project": "Pàggina di sirvizziu",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Missaggiu",
+       "nstab-template": "Template",
+       "nstab-help": "Pàggina di guida",
        "nstab-category": "Catigurìa",
        "nosuchaction": "Opirazzioni nun ricanusciuta",
        "nosuchactiontext": "L'azzioni spicificata nâ URL nun è vailida.\nPoi aviri sbagghiatu a digitari â URL, o cliccatu supra nu link sbagghiatu.\nChistu putissi ndicari nu bug nô software usatu da {{SITENAME}}.",
        "databaseerror": "Erruri dû database",
        "databaseerror-text": "Si virificau n'erruri nti na dimanna dû databbasi.\nPutissi siri ca c'è nu bacu ntô prugramma.",
        "databaseerror-textcl": "Si virificau n'erruri ntâ dimanna dû databasi",
-       "databaseerror-query": "Dumannaä $1",
+       "databaseerror-query": "Query: $1",
        "databaseerror-function": "Funzioni: $1",
        "databaseerror-error": "Erruri: $1",
        "laggedslavemode": "Accura: La pàggina putissi nun ripurtari l'aggiurnamenti cchiù ricenti.",
-       "readonly": "Database bluccatu",
-       "enterlockreason": "Ìnnica lu mutivu dû bloccu, spicificannu lu mumentu 'n cui è prisumìbbili ca veni rimossu.",
-       "readonlytext": "Nta stu mumentu lu database è bluccatu e nun sunnu pussìbbili junti o canciamenti a li pàggini. Lu bloccu è di sòlitu lijatu a upirazzioni di manutinzioni urdinària, a lu tèrmini di lu quali lu database è di novu accissìbbili. L'amministraturi di sistema ca fici lu bloccu desi sta spiecazzioni: $1",
-       "missing-article": "Lu database nun attruvau lu testu di na pàggina c'avìa attruvari sutta lu nomu di \"$1\" $2.\n\nChistu di sòlitu avveni quannu s'arrichiama, a partiri di la crunuluggìa o di lu cunfruntu tra rivisioni, nu cullicamentu a na pàggina scancillata, a nu cunfrontu tra rivisioni ca nun asìstunu o a nu cunfrontu tra rivisioni pulizziati di la crunuluggìa.\n\nNta lu casu ca non fussi accuddì, è fàcili ca si scuprìu nu sbagghiu di lu software MediaWiki.\nV'arringrazziamu si signaliati zoccu succidìu a nu [[Special:ListUsers/sysop|amministraturi]] spicificannu la URL 'n chistioni.",
-       "missingarticle-rev": "(rivisioni#: $1)",
+       "readonly": "Basi di dati bluccata",
+       "enterlockreason": "Spiega lu mutivu dû bloccu, spicificannu na stima di quannu veniravi livatu.",
+       "readonlytext": "Com'ad ora la basi di dati è bluccata e nun sunnu pussìbbili junti o canciamenti; lu mutivu prubbabbili è la manutinzioni ordinària, finuta la quali la basi di dati turniravi normali.\n\nL'amministraturi chi la bluccau desi sta spiegazzioni: $1",
+       "missing-article": "La basi di dati nun attruvau lu testu di na pàggina ch'avìssi avutu a' attruvari, cu' nomu \"$1\" $2.\n\nSta cosa di sòlitu succedi quannu s'arrichiama, a' pàrtiri di na crunuluggìa o di nu cunfruntu tra virsioni, nu culligamentu a na pàggina chi' fu' cancillata.\n\nSi' nun è accussì, po' èssiri ca scupristi nu bug ntô software.\nPi' favuri signala stu fattu a' n'[[Special:ListUsers/sysop|amministraturi]], spicificannu l'URL.",
+       "missingarticle-rev": "(№ di virsioni: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
-       "readonly_lag": "Lu database hà statu bluccatu automaticamenti, mentri li server cu li database slave si sincrunìzzanu cu lu master",
+       "readonly_lag": "La basi di dati fu' bluccata autumaticamenti nta mentri ca li server di basi di dati slave si sincrunìzzanu cu' chiddu master",
        "internalerror": "Erruri nternu",
        "internalerror_info": "Erruri nternu: $1",
-       "filecopyerror": "Mpussìbbili cupiari lu file \"$1\" n \"$2\".",
-       "filerenameerror": "Mpussìbbili rinuminari lu file \"$1\" 'n \"$2\".",
-       "filedeleteerror": "Mpussìbbili cancillari lu file \"$1\".",
-       "directorycreateerror": "Mpussìbbili criari la directory \"$1\".",
-       "filenotfound": "File \"$1\" nun attruvatu.",
-       "unexpected": "Valuri mpruvistu: \"$1\"=\"$2\".",
-       "formerror": "Erruri: mpussìbbili mannari lu mòdulu",
-       "badarticleerror": "Opirazzioni nun cunzintita pi sta pàggina.",
-       "cannotdelete": "Mpussìbbili cancillari la pàggina o lu file \"$1\" addumannatu. Putissi siri già cancillatu di quarcun'àutru.",
-       "cannotdelete-title": "Mpussibbili eliminari la pàggina \"$1\"",
-       "delete-hook-aborted": "Canciamentu nun arsciuttiattu di l'hook.\nNun desi nudda spiecazzioni.",
-       "badtitle": "Tìtulu nun currettu",
-       "badtitletext": "Lu tìtulu dâ pàggina addumannata è vacanti, erratu o cu caràttiri nun ammessi oppuru diriva di n'erruri ntê culligamenti tra siti wiki diversi o virsioni n lingui diversi dû stissu situ.",
-       "perfcached": "'''Nota:''' li dati ca sèquinu sunnu stratti di na copia ''cache'' dû database, nun aggiurnati n tempu riali. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "Li dati ccà sutta foru attruvati e sunnu aggiurnati ô $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "filecopyerror": "Nun fu' pussìbbili cupiari lu file \"$1\" nta \"$2\".",
+       "filerenameerror": "Nun fu' pussìbbili canciari lu nomu dû file di \"$1\" a' \"$2\".",
+       "filedeleteerror": "Nun fu' pussìbbili cancillari lu file \"$1\".",
+       "directorycreateerror": "Nun fu' pussìbbili crïari la cartella \"$1\".",
+       "directoryreadonlyerror": "La cartella \"$1\" è a' sula littura.",
+       "directorynotreadableerror": "La cartella \"$1\" nun è liggìbbili.",
+       "filenotfound": "Nun fu' pussìbbili truvari lu file \"$1\".",
+       "unexpected": "Valuri nun privistu: \"$1\"=\"$2\".",
+       "formerror": "Erruri: Nun fu' pussìbbili mannari lu mòdulu.",
+       "badarticleerror": "St'opirazzioni nun è cunsintuta nta sta pàggina.",
+       "cannotdelete": "Nun fu' pussìbbili cancillari la pàggina o lu file \"$1\".\nPutissi aviri statu già cancillatu di quarchidun'autru.",
+       "cannotdelete-title": "Nun è pussìbbili cancillari la pàggina \"$1\"",
+       "delete-hook-aborted": "Cancillazzioni annullata di n'hook.\nNun desi nudda spiegazzioni.",
+       "no-null-revision": "Non fu' pussibbili crïari na virsioni nulla pâ paggina \"$1\"",
+       "badtitle": "Tìtulu nun bonu",
+       "badtitletext": "Lu tìtulu di pàggina addumannatu nun era vàlidu, era vacanti, o vinìa dûn culligamentu intir-linguìsticu o intir-wiki malu fattu.\nPutissi cuntèniri unu o cchiu' ssai caràttiri chi' nun su' cunsintuti ntê tìtula.",
+       "perfcached": "Li dati ca sèquinu sunnu stratti di na ''cache'' e putissiru nun èssiri aggiurnati. Ntâ ''cache'' {{PLURAL:$1|capi un risultatu|càpunu $1 risultati}} massimu.",
+       "perfcachedts": "Li dati ca sèquinu sunnu stratti di na ''cache'', e furu aggiurnati l'ultima vota ô $1. Ntâ ''cache'' {{PLURAL:$4|capi un risultatu|capunu $4 risultati}} massimu.",
        "querypage-no-updates": "L'aggiurnamenti dâ pàggina sunnu timpuraniamenti suspisi. Li dati 'n chidda cuntinuti nun vèninu aggiurnati.",
-       "viewsource": "Talìa la fonti",
-       "viewsource-title": "Visualizza la surgenti di $1",
+       "viewsource": "Talìa lu surgenti",
+       "viewsource-title": "Talìa lu surgenti di $1",
        "actionthrottled": "Azzioni ritardata",
        "actionthrottledtext": "Comu misura di sicurezza contru lu spam, l'esecuzioni di alcuni azzionu è limitata a nu nùmmuru massimu di voti ni nu determinatu piriudu du tempu, limiti ca ni stu casu fu supiratu. Si prega di ripruvari tra qualchi minutu.",
-       "protectedpagetext": "Sta pàggina fu bluccata pi privèniri li canciamenti.",
+       "protectedpagetext": "Sta pàggina fu bluccata pi privèniri canciamenti o autri opirazzioni.",
        "viewsourcetext": "È pussìbbili visualizzari e cupiari lu còdici surgenti di sta pàggina:",
        "viewyourtext": "È pussibbili visualizzarei cupiari lu còdici surgenti dî '''tò canciamenti''' nti sta pàggina:",
        "protectedinterface": "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
-       "editinginterface": "'''Accura:''' Lu testu di sta pàggina fà parti dî interfaccia utenti dû situ. Tutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti. Pi li traduzioni, cunsidira â pussibilità di usari [//translatewiki.net/wiki/Main_Page?setlang=scn translatewiki.net], u prugettu di localizzazioni MediaWiki.",
+       "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fà parti di l'interfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
+       "translateinterface": "Pi' agghiunciri o canciari traduzzioni pi' tutti i wiki, pi' favuri adupirati [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
        "cascadeprotected": "Supra sta pàggina nun è pussìbbili effittuari canciamenti pirchì veni nclusa nt{{PLURAL:$1|â pàggina siquenti, ca fu prutetta|ê pàggini siquenti, ca foru prutetti}} silizziunannu la prutizzioni \"ricursiva\":\n$2",
        "namespaceprotected": "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
+       "customcssprotected": "Nun hai lu pirmissu pi' canciari sta pàggina CSS picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
+       "customjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
+       "mycustomcssprotected": "Nun hai lu pirmissu pi' canciari sta paggina CSS.",
+       "mycustomjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript.",
+       "myprivateinfoprotected": "Nun hai lu pirmissu pi' canciari li to nfurmazzioni risirvati.",
+       "mypreferencesprotected": "Nun hai lu pirmissu pi' canciari li to prifirenzi.",
        "ns-specialprotected": "Li pàggini ntô namespace {{ns:special}} non ponnu èssiri canciati.",
        "titleprotected": "La criazzioni di sta pàggina cu stu tìtulu fu bluccata da [[User:$1|$1]].\nLa mutivazzioni è chista: ''$2''.",
-       "filereadonlyerror": "Nun fu pussìbbili canciari lu file \"$1\" pirchì lu repository di file \"$2\" è 'n mudalitati di sula littura.La mutivazzioni è \"''$3''\".",
+       "filereadonlyerror": "Nun fu pussìbbili canciari lu file \"$1\" pirchì lu repository di file \"$2\" è 'n mudalitati di sula littura.\n\nL'amministraturi chi' lu bluccau desi sta spiegazzioni: \"$3\".",
+       "invalidtitle-knownnamespace": "Tìtulu nun vàlidu cu' spazziu dî nomi \"$2\" e testu \"$3\"",
+       "invalidtitle-unknownnamespace": "Tìtulu nun vàlidu cu' nùmmiru di spazziu dî nomi scanusciutu $1 e testu \"$2\"",
        "exception-nologin": "Nun trasutu",
-       "exception-nologin-text": "Sta pàggina o stâzzioni havi abbisognu ca tu si cunnittutu a sta wiki",
+       "exception-nologin-text": "Pi' favuri trasi pi' putiri accèdiri a' sta pàggina o a' st'azzioni.",
+       "exception-nologin-text-manual": "Pi' favuri $1 pi' putiri accèdiri a' sta pàggina o a' st'azziòni.",
        "virus-badscanner": "Sbagghiu di cunfigurazzioni: antivirus scanusciutu: ''$1''",
        "virus-scanfailed": "scanzioni nun arrinisciuta (còdici $1)",
        "virus-unknownscanner": "antivirus scanusciutu:",
-       "logouttext": "'''Nisciuta. Ora siti fora.'''\n\nPoi cuntinuari a usari {{SITENAME}} di manera anònima, o poi <span class='plainlinks'>[$1 tràsiri n'àutra vota]</span> cu lu stissu o cu n'àutru nomu d'utenti.\nAccura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
+       "logouttext": "<strong>Nisciuta. Ora siti fora.</strong>\n\nAccura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
        "welcomeuser": "Bommegna, $1!",
-       "welcomecreation-msg": "Lu cuntu fu criatu. Nun ascurdàriti di pirsunalizzari li prifirenzi pi {{SITENAME}}",
-       "yourname": "Lu tò nomu d'utenti (''user name'')",
+       "welcomecreation-msg": "U to cuntu fu' criatu.\nPoi canciari li to [[Special:Preferences|prifirenzi]] di {{SITENAME}} si' voi.",
+       "yourname": "Nomu utenti:",
        "userlogin-yourname": "Nomu utenti",
        "userlogin-yourname-ph": "Nzirìsci lu tò nomu utenti",
-       "yourpassword": "La tò ''password''",
+       "createacct-another-username-ph": "Nzirisci lu nomu utenti",
+       "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Nzirisci la tò password",
        "createacct-yourpassword-ph": "Nzirisci na password",
        "createacct-yourpasswordagain-ph": "Nzirisci la password attorna",
        "remembermypassword": "Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})",
        "userlogin-remembermypassword": "Mantènimi culligatu",
-       "userlogin-signwithsecure": "Usa na cunnissioni sicura",
-       "yourdomainname": "Lu tò dominiu",
-       "password-change-forbidden": "Nun putiti canciari la password nti sta wiki",
+       "userlogin-signwithsecure": "Adopira na cunnissioni sicura",
+       "yourdomainname": "Lu to duminiu:",
+       "password-change-forbidden": "Nun poi canciari li password nta sta wiki.",
        "externaldberror": "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
        "login": "Trasi",
-       "nav-login-createaccount": "Riggìstrati o trasi",
-       "userlogin": "Riggìstrati o trasi",
+       "nav-login-createaccount": "Trasi / crea nu cuntu",
+       "userlogin": "Trasi / crea nu cuntu",
        "userloginnocreate": "Trasi",
        "logout": "Nesci",
        "userlogout": "Nesci",
-       "notloggedin": "Nun v'aviti riggistratu",
-       "userlogin-noaccount": "Nun ci l'hai nu cuntu?",
-       "userlogin-joinproject": "Scrìviti a {{SITENAME}}",
-       "nologin": "Nun nn'aviti nu cuntu pi ccà? '''$1'''.",
-       "nologinlink": "Arriggistràtivi",
-       "createaccount": "Criati un cuntu novu",
-       "gotaccount": "Hai già nu cuntu? '''$1'''.",
+       "notloggedin": "Nun trasutu",
+       "userlogin-noaccount": "Nun hai nu cuntu?",
+       "userlogin-joinproject": "Scrìviti a' {{SITENAME}}",
+       "nologin": "Nun hai nu cuntu? $1.",
+       "nologinlink": "Crea nu cuntu",
+       "createaccount": "Crïazzioni dûn cuntu",
+       "gotaccount": "Già hai nu cuntu? $1.",
        "gotaccountlink": "Trasi",
-       "userlogin-resetlink": "T'ascurdasti li dittagli pâ trasuta?",
-       "userlogin-resetpassword-link": "Reinizzializza la tò password",
-       "userlogin-helplink2": "Aiutu pâ trasuta",
-       "userlogin-loggedin": "Vossia già trasìu comu {{GENDER:$1|$1}}.\nUsassi lu mòdulu ccassutta pi tràsiri comu autru utenti.",
-       "userlogin-createanother": "Crèa n'autru cuntu",
-       "createacct-emailrequired": "Nnirizzu e-mail",
-       "createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
-       "createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
-       "createaccountmail": "Utilizzari na password timpurania casuali e mannàrila ô nnirizzu e-mail spicificatu ccàssutta",
-       "createacct-realname": "Nomu riali (facurtativu)",
+       "userlogin-resetlink": "Ti scurdasti li dittagghî pâ trasuta?",
+       "userlogin-resetpassword-link": "Ti scurdasti la password?",
+       "userlogin-helplink2": "Ajutu pâ trasuta",
+       "userlogin-loggedin": "Già trasìsti comu {{GENDER:$1|$1}}.\nAdòpira lu mòdulu ccassutta pi' tràsiri comu n'autru utenti.",
+       "userlogin-createanother": "Crea n'autru cuntu",
+       "createacct-emailrequired": "Nnirizzu di posta elittrònica",
+       "createacct-emailoptional": "Nnirizzu di posta elittrònica (facurtativu)",
+       "createacct-email-ph": "Nzirisci lu to nnirizzu di posta elittrònica",
+       "createacct-another-email-ph": "Nzirisci u nnirizzu di posta elittrònica",
+       "createaccountmail": "Adòpira na password timpurania casuali e mànnila ô nnirizzu di posta elittrònica spicificatu",
+       "createacct-realname": "Nomu veru (facurtativu)",
        "createaccountreason": "Mutivu:",
        "createacct-reason": "Mutivu",
-       "createacct-reason-ph": "Pirchì stai criannu n'àutru cuntu?",
-       "createacct-captcha": "Cuntrollu di sicurezza",
+       "createacct-reason-ph": "Pirchì stai crïannu n'àutru cuntu",
+       "createacct-captcha": "Cuntrollu di sicurizza",
        "createacct-imgcaptcha-ph": "Nzirìsci lu testu ca vidi ccassupra",
-       "createacct-submit": "Crèa nu cuntu",
-       "createacct-another-submit": "Crèa n'autru cuntu",
-       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
+       "createacct-submit": "Crea lu to cuntu",
+       "createacct-another-submit": "Crea n'autru cuntu",
+       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a' tìa.",
        "createacct-benefit-body1": "{{PLURAL:$1|cuntribbutu|cuntribbuti}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|cuntribbutuori ricenti|cuntribbutura ricenti}}",
-       "badretype": "La ''password'' chi mittisti nun è bona.",
-       "userexists": "Lu nomu utenti nzeritu è già usatu. Ti prijamu pirciò di vuliri scègghiri nu nomu utenti diversu.",
-       "loginerror": "Erruri nta l'accessu",
-       "createacct-error": "Erruri ntâ criazzioni di l'utenza",
-       "createaccounterror": "Mpussibbili di criari l'account $1",
-       "nocookiesnew": "Lu nomu utenti pi tràsiri fu criatu, ma nun hai effittuatu lu log in. {{SITENAME}} usa li cookies pi gistiri li log in. Lu tò browser havi li cookies disabbilitati. Abbìlita li cookies, appoi effèttua lu login cu li tò username e password novi.",
-       "nocookieslogin": "{{SITENAME}} usa li cookies pi gistiri lu log in. Lu tò browser havi li cookies disabbilitati. Abbìlita li cookies, appoi effèttua lu login cu li tò username e password.",
-       "noname": "Lu nomu utenti innicatu nun è vàlidu, nun è pussìbbili criari un account a stu nomu.",
+       "createacct-benefit-body3": "{{PLURAL:$1|cuntribbuturi ricenti|cuntribbutura ricenti}}",
+       "badretype": "Li password chi' mittisti nun currispùnnunu tra d'iddi.",
+       "userexists": "Lu nomu utenti nziritu è già usatu.\nTi prijamu pirciò di vuliri scègghîri nu nomu utenti diffirenti.",
+       "loginerror": "Erruri ntâ trasuta",
+       "createacct-error": "Erruri ntâ crïazzioni dû cuntu",
+       "createaccounterror": "Nun fu' pussìbbili crïari u cuntu: $1",
+       "nocookiesnew": "Lu cuntu utenti fu' crïatu, ma nun si' trasutu.\n{{SITENAME}} adòpira li cookie pi' gistiri li trasuti.\nTu hai i cookie disattivati.\nPi' favuri attìvili, e appoi trasi chî to nomu utenti e password novi.",
+       "nocookieslogin": "{{SITENAME}} adòpira li cookie pi' gistiri li trasuti.\nTu hai i cookie disattivati.\nPi' favuri attìvili e prova n'autra vota.",
+       "nocookiesfornew": "Lu cuntu utenti nun fu' crïatu, picchì nun pòttimu cunfirmari la so orìggini.\nAssicuriti chi' hai i ''cookie'' attivati, ricarrica sta pàggina e prova n'autra vota.",
+       "noname": "Nun spicificasti nu nomu utenti vàlidu.",
        "loginsuccesstitle": "Trasuta rinisciuta",
-       "loginsuccess": "'''Ora trasisti nta {{SITENAME}} comu \"$1\".'''",
-       "nosuchuser": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nLi nnomi utenti sunu sinsitivi ê maiusculi.\nVirificari lu nomu nziritu o [[Special:UserLogin/signup|criari un novu accessu]].",
-       "nosuchusershort": "Nun c'è nuddu utenti di nomu \"$1\". Cuntrolla l'ortugrafìa.",
-       "nouserspecified": "È nicissariu spicificari un nomu utenti.",
-       "login-userblocked": "St'utilizzaturi è bluccatu. Nun è pussibbili di tràsiri",
-       "wrongpassword": "La ''password'' chi mittisti nun è giusta. Prova n'àutra vota.",
-       "wrongpasswordempty": "Nun hà statu nzirita arcuna password. Ripruvari.",
-       "passwordtooshort": "La tò password è troppu curta. Havi a cuntèniri armenu {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
-       "password-name-match": "La tò password havi a essiri diversa dû tò nomu d'utilizzaturi.",
-       "mailmypassword": "Mànnimi n'àutra password",
-       "passwordremindertitle": "Sirvizziu Password Reminder di {{SITENAME}}",
+       "loginsuccess": "<strong>Ora si' trasutu nta {{SITENAME}} comu \"$1\".</strong>",
+       "nosuchuser": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nLi nomi di l'utenti fannu diffirenza tra majusculi e minusculi.\nCuntrolla chi' scrivisti lu nomu bonu, o puru [[Special:UserLogin/signup|crea un cuntu novu]].",
+       "nosuchusershort": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nCuntrolla chi' scrivisti u nomu bonu.",
+       "nouserspecified": "Hâ' spicificari un nomu utenti.",
+       "login-userblocked": "St'utenti è bluccatu. Nun è pussìbbili di tràsiri.",
+       "wrongpassword": "La password chi' mittisti nun è giusta.\nPi' favuri prova n'àutra vota.",
+       "wrongpasswordempty": "La password chi' mittisti era vacanti.\nPi' favuri prova n'àutra vota.",
+       "passwordtooshort": "I password hannu a' èssiri longhi almenu {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
+       "password-name-match": "La tò password havi a' èssiri diversa dû tò nomu utenti.",
+       "password-login-forbidden": "L'usu di stu nomu utenti e password fu' pruibbitu.",
+       "mailmypassword": "Azzera la password",
+       "passwordremindertitle": "Password nova timpurania pi' {{SITENAME}}",
        "passwordremindertext": "Quarchidunu (prubbabbirmenti tu, cu nnirizzu IP $1) addumannau d'aviri mannata na password d'accessu nova a {{SITENAME}} ($4). La password pi l'utenti \"$2\" vinni mpustata a \"$3\".\nTi cummeni fari n'accessu quantu prima e canciari la password pi sùbbitu. La tò password timpuranea scadrà dopu {{PLURAL:$5|nu jornu|$5 jorna}}.\nSiddu nun fusti tu a fari la dumanna, oppuru arrittruvasti la password e nun addisìi cchiù canciàrila, poi non tèniri cuntu di stu missaggiu e cuntinuari a usari la password vecchia.",
        "noemail": "Nuddu ndirizzu e-mail riggistratu pi l'utenti \"$1\".",
        "noemailcreate": "Aviti a dari nu nnirizzu e-mail validu",
        "passwordsent": "Na password nova hà statu mannata a lu ndirizzu e-mail riggistratu pi l'utenti \"$1\". Pi favuri, effèttua un accessu nun appena l'arricevi.",
        "blocked-mailpassword": "Pi privèniri abbusi, nun è cunzititu usari la funzioni \"Nvia nova password\" d'un ndirizzu IP bluccatu.",
-       "eauthentsent": "Un missaggiu e-mail di cunferma hà statu spiditu a lu ndirizzu ndicatu. Pi abbilitari la mannata di missaggi e-mail pi st'accessu è nicissariu sèquiri li istruzzioni ca vi sunnu ndicati, 'n modu di cunfirmari ca s'è li liggìttimi prupitari di lu ndirizzu",
-       "throttled-mailpassword": "Na password nova hà già statu mannata di menu di {{PLURAL:$1|1 ura|$1 uri}}. Pi privèniri abbusi, la funzioni \"Manna password nova\" pò èssiri usata sulu una vota ogni {{PLURAL:$1|1 ura|$1 uri}}.",
+       "eauthentsent": "Nu missaggiu e-mail di cunfirma fu' spidutu a lu nnirizzu nnicatu.\nPrima chi' ponnu èssiri mannati autri missaggi e-mail a' stu cuntu, è nicissariu sèquiri li struzzioni ca vi sunnu scritti, 'n modu di cunfirmari di èssiri li liggìttimi prupietarî di lu cuntu.",
+       "throttled-mailpassword": "Nu missaggiu e-mail di azziramentu dâ password già havi statu mannatu nta {{PLURAL:$1|l'ultima ura|l'ultimi $1 uri}}. Pi' privèniri abbusi, si po' mannari nu missaggiu e-mail di azziramentu dâ password na vota sula ogni {{PLURAL:$1|ura|$1 uri}}.",
        "mailerror": "Erruri nta lu mannu dû missaggiu: $1",
-       "acct_creation_throttle_hit": "L'utenti di sta wiki ca utilizzanu stu ndirizzu IP hanu criatu {{PLURAL:$1|1 account|$1 account}} ni l'ultimu iornu, lu massimu pirmessu ni stu piriudu di tempu.\nPirciò, li utenti ca usunu stu ndirizzu IP nun ponu pi lu mumentu criari novi account.",
-       "emailauthenticated": "Lu nnirizzu e-mail fu cunfirmatu lu $2 ê $3.",
-       "emailnotauthenticated": "Lu tò ndrizzu imeil nun hà statu ancora autinticatu. Nun vannu a èssiri mannati missaggi imeil pi sti funzioni.",
-       "noemailprefs": "Innicari un ndirizzu e-mail p'attivari sti funzioni.",
-       "emailconfirmlink": "Cunfirmari lu tò ndrizzu imeil",
-       "invalidemailaddress": "Lu nnirizzu email nun pò èssiri accittatu ca ci hà un furmatu nun vàlidu.\nPi favuri nziriti nu nnirizzu vàlidu o svacantati la casella.",
-       "cannotchangeemail": "Li nnirizzi e-mail nun ponnu essiri canciati nti stu wiki.",
-       "accountcreated": "Cuntu criatu",
-       "accountcreatedtext": "Fu criatu n'accessu pi l'utenti $1.",
-       "createaccount-title": "Criazzioni di n'accessu a {{SITENAME}}",
+       "acct_creation_throttle_hit": "Visitaturi di sta wiki cû to stissu nnirizzu IP già hannu crïatu {{PLURAL:$1|un cuntu|$1 cunti}} nta sta jurnata, chi' è lu massimu pirmissu pi' stu pirìudu di tempu.\nPi' ciò, com'ad ora li visitaturi ca usunu stu nnirizzu IP nun ponnu crïari autri cunti.",
+       "emailauthenticated": "Lu to nnirizzu di posta elittrònica fu' cunfirmatu lu $2 ê $3.",
+       "emailnotauthenticated": "Lu to nnirizzu di posta elittrònica ancora nun havi statu cunfirmatu.\nNun ti sarrannu mannati missaggi di posta elittrònica pi' sti funzioni.",
+       "noemailprefs": "Innicari nu nnirizzu di posta elittrònica p'attivari sti funzioni.",
+       "emailconfirmlink": "Cunfirmari lu to nnirizzu di posta elittrònica",
+       "invalidemailaddress": "Lu nnirizzu di posta elittrònica nun pò èssiri accittatu picchì pari chi havi un furmatu nun vàlidu.\nPi favuri nzirisci nu nnirizzu vàlidu o puru svacanta la casedda.",
+       "cannotchangeemail": "Li nnirizzi di posta elittrònica nun ponnu èssiri canciati nta sta wiki.",
+       "emaildisabled": "Stu situ nun po' mannari missaggi di posta elittrònica.",
+       "accountcreated": "Cuntu crïatu",
+       "accountcreatedtext": "Fu' crïatu un cuntu novu pi' l'utenti [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
+       "createaccount-title": "Crïazzioni di nu cuntu pi' {{SITENAME}}",
        "createaccount-text": "Qualcuno criau n'accessu a {{SITENAME}} ($4) a nomu di $2, associatu cu stu ndirizzu di posta elettronica. La password pi l'utenti \"$2\" è mpustata a \"$3\". È opportunu trasiri quantu prima e canciari la password subbutu.\n\nSi l'accessu fu criatu pi sbagghiu, si può gnurari stu missaggiu.",
-       "login-throttled": "Facisti troppi tintativi.\nAspetta tanticchia prima di pruvari  n'àutra vota.",
+       "login-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
        "login-abort-generic": "La trasuta nun arriniscìu - Annullata",
+       "login-migrated-generic": "Lu to cuntu fu' migratu, e lu to nomu utenti nun esisti cchiù' nta sta wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "La tò dumanna di discunnissioni fu niàta prichì pari ca veni di nu browser nun funziunanti o nu proxy di caching.",
+       "createacct-another-realname-tip": "U nomu veru è opziunali.\nSi scegghî di furnìrilu, veni adupiratu pi' dari crèditu a' l'utenti pû so travagghiu.",
        "pt-login": "Trasi",
        "pt-login-button": "Trasi",
-       "pt-createaccount": "Criati un cuntu novu",
+       "pt-createaccount": "Crea un cuntu novu",
        "pt-userlogout": "Nesci",
+       "php-mail-error-unknown": "Erruri scanusciutu ntâ funzioni mail() dû PHP.",
+       "user-mail-no-addy": "Si pruvàu a' mannari nu missaggiu di posta elittrònica senza nu nnirizzu di posta elittrònica.",
+       "user-mail-no-body": "Si pruvàu a' mannari nu missaggiu di posta elittrònica cûn corpu vacanti o troppu curtu p'aviri significatu.",
        "changepassword": "Cancia la password",
-       "resetpass_announce": "Pi tirminari l'accessu, hai a nziriri na password nova ccà:",
+       "resetpass_announce": "Pi' cumplitari la trasuta, hâ' mpustari na password nova.",
        "resetpass_text": "<!-- Agghiunci lu testu ccà -->",
-       "resetpass_header": "Rimposta la password",
+       "resetpass_header": "Canciamentu dâ password",
        "oldpassword": "Password vecchia:",
        "newpassword": "Password nova:",
-       "retypenew": "Scrivi n'àutra vota la password",
-       "resetpass_submit": "Mposta la password e accedi",
-       "changepassword-success": "Lu canciu password hà statu effittuatu cu successu!",
-       "changepassword-throttled": "Facisti troppi tintativi.\nAspetta $1 prima d'arripruvari n'àutra vota.",
-       "resetpass_forbidden": "Li password nun ponnu èssiri canciati sùpira sta wiki",
-       "resetpass-no-info": "Pi tràsiri nta sta pàggina hà èssiri riggistratu",
+       "retypenew": "Scrivi n'àutra vota la password:",
+       "resetpass_submit": "Mposta la password e trasi",
+       "changepassword-success": "La to password fu' canciata!",
+       "changepassword-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "resetpass_forbidden": "Li password nun si ponnu canciari",
+       "resetpass-no-info": "Pi tràsiri nta sta pàggina hà' èssiri riggistratu.",
        "resetpass-submit-loggedin": "Cancia la password",
        "resetpass-submit-cancel": "Annulla",
-       "resetpass-wrong-oldpass": "La password timpurrània nun è giusta.\nPò èssiri ca ggià canciasti cu successu la tò password o c'addumannasti na nova password timpurrània.",
-       "resetpass-temp-password": "Password timpurrània:",
-       "passwordreset": "Resetta la password",
-       "passwordreset-text-one": "Jinchi stu mòdulu pi reimpostari la password",
-       "changeemail-submit": "Cancia e-mail",
+       "resetpass-wrong-oldpass": "La password timpurania o attuali nun è giusta.\nPo' èssiri ca già riniscisti a' canciari la tò password, o puru ca già nn'addumannasti n'autra timpurania ancora.",
+       "resetpass-recycled": "Pi' favuri cancia a to password a' na cosa diffirenti dâ to password attuali.",
+       "resetpass-temp-emailed": "Trasisti cûn codici timpuraniu mannatu pi' posta elittrònica.\nPi' cumplitari a trasuta, hâ' mpustari na password nova cca:",
+       "resetpass-temp-password": "Password timpurania:",
+       "resetpass-abort-generic": "U canciu dâ password fu' annullatu di n'estinsioni.",
+       "resetpass-expired": "A to password scadìu. Pi' favuri mposta na password nova pi' trasiri.",
+       "resetpass-expired-soft": "A to password scadìu e s'havi a' azzirari. Pi' favuri scegghî na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'autra vota.",
+       "resetpass-validity-soft": "A to password nun è vàlida: $1\n\nPi' favuri scegghî na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'autra vota.",
+       "passwordreset": "Azziramentu dâ password",
+       "passwordreset-text-one": "Jinchi stu mòdulu pi' ricèviri na password timpurania pi' posta elittrònica.",
+       "passwordreset-text-many": "{{PLURAL:$1|Jinchi unu dî campi pi' ricèviri na password timpurania pi' posta elittrònica.}}",
+       "passwordreset-legend": "Azzera la password",
+       "passwordreset-disabled": "L'azziramentu dî password fu disattivatu nta sta wiki.",
+       "passwordreset-emaildisabled": "Li funzionalità di e-mail furu disattivati nta sta wiki.",
+       "passwordreset-username": "Nomu utenti:",
+       "passwordreset-domain": "Duminiu:",
+       "passwordreset-capture": "Ammustrari u missaggiu e-mail chi' veni cumpostu?",
+       "passwordreset-capture-help": "Si attivi sta casedda, u missaggiu e-mail (câ password timpurania) veni ammustratu a' tia 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 (prubbabilmenti tu, di l'innirizzu IP $1) fici dumanna pi' l'azziramentu dâ to password pi' {{SITENAME}} ($4). {{PLURAL:$3|U siguenti cuntu utenti è assuciatu|I siguenti cunti utenti su' assuciati}} cu' stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurania|Sti password timpuranii}} scàdunu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a' tràsiri e scègghîri na password nova. Si' fu' quarchidun'autru a' fari sta richiesta e nun tu, o si' ti ricurdasti a to password origginali e nâ voi canciari cchiu', poi gnurari stu missaggiu e cuntinuari a' adupirari a to password vecchia.",
+       "passwordreset-emailtext-user": "L'utenti $1 supra a' {{SITENAME}} fici dumanna pi' l'azziramentu dâ to password pi' {{SITENAME}} ($4). {{PLURAL:$3|U siguenti cuntu utenti è assuciatu|I siguenti cunti utenti su' assuciati}} cu' stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurania|Sti password timpuranii}} scàdunu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a' tràsiri e scègghîri na password nova. Si' fu' quarchidun'autru a' fari sta richiesta e nun tu, o si' ti ricurdasti a to password origginali e nâ voi canciari cchiu', poi gnurari stu missaggiu e cuntinuari a' adupirari a to password vecchia.",
+       "passwordreset-emailelement": "Nomu utenti: $1\nPassword timpurania: $2",
+       "passwordreset-emailsent": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu' mannatu.",
+       "passwordreset-emailsent-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu' mannatu, cû cuntinutu chi' si po' talïari ccassutta.",
+       "passwordreset-emailerror-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu' cumpilatu, cû cuntinutu chi' si po' talïari ccassutta, però a so spidizzioni a' l'utenti {{GENDER:$2|user}} nun riniscìu: $1",
+       "changeemail": "Canciu dû nnirizzu di posta elittrònica",
+       "changeemail-text": "Jinchi stu mòdulu pi' canciari u to nnirizzu di posta elittrònica. Hâ' nziriri a to password pi' cunfirmari stu canciamentu.",
+       "changeemail-no-info": "Hâ' jèssiri trasutu p'aviri accessu direttu a' sta pàggina.",
+       "changeemail-oldemail": "Nnirizzu di posta elittrònica attuali:",
+       "changeemail-newemail": "Nnirizzu di posta elittrònica novu:",
+       "changeemail-none": "(nuddu)",
+       "changeemail-password": "A to password di {{SITENAME}}:",
+       "changeemail-submit": "Cancia nnirizzu",
+       "changeemail-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "resettokens": "Azziramentu dî token",
+       "resettokens-text": "Cca poi azzirari i ''token'' chi' dùnunu accessu a' certi dati risirvati assuciati ô to cuntu.\n\nSta cosa s'avissi a' fari si' pi' sbagghiu i facisti sapiri a' quarchidunu o si' u to cuntu fu' cumprumisu.",
+       "resettokens-no-tokens": "Nun ci su' token di azzirari.",
+       "resettokens-legend": "Azziramentu dî token",
+       "resettokens-tokens": "Token:",
+       "resettokens-token-label": "$1 (valuri attuali: $2)",
+       "resettokens-watchlist-token": "Token pû feed web (Atom/RSS) dî [[Special:Watchlist|canciamenti ê pàggini ntâ to lista talïata]]",
+       "resettokens-done": "I token furu azzirati.",
+       "resettokens-resetbutton": "Azzera i token scigghiuti",
        "bold_sample": "Grassettu",
        "bold_tip": "Grassettu",
        "italic_sample": "Cursivu",
        "italic_tip": "Cursivu",
-       "link_sample": "Nomu dû link",
-       "link_tip": "Link nternu",
+       "link_sample": "Tìtulu dû culligamentu",
+       "link_tip": "Culligamentu nternu",
        "extlink_sample": "http://www.example.com tìtulu dû culligamentu",
-       "extlink_tip": "Culligamentu sternu (nutari lu prifissu http:// )",
+       "extlink_tip": "Culligamentu esternu (ricurdàrisi lu prifissu http://)",
        "headline_sample": "Ntistazzioni",
        "headline_tip": "Suttantistazzioni",
        "nowiki_sample": "Nzirisci ccà lu testu nun furmattatu",
        "nowiki_tip": "Gnora la furmattazzioni wiki",
        "image_sample": "Asempiu.jpg",
-       "image_tip": "Mmàggini ncurpurata",
+       "image_tip": "File ncurpuratu",
        "media_sample": "Asempiu.ogg",
-       "media_tip": "Culligamentu a file multimidiali",
-       "sig_tip": "Firma cu data e ura",
-       "hr_tip": "Lìnia urizzuntali (usari cu giudizziu)",
-       "summary": "Discrizzioni:",
-       "subject": "Suggettu/ntistazzioni:",
+       "media_tip": "Culligamentu a' file",
+       "sig_tip": "A to firma cu' data e ura",
+       "hr_tip": "Linia urizzuntali (usari cu' giudizziu)",
+       "summary": "Riassuntu:",
+       "subject": "Oggettu/ntistazzioni:",
        "minoredit": "Chistu è nu canciamentu nicu",
-       "watchthis": "talìa sta pàggina",
-       "savearticle": "sarva la pàggina",
-       "preview": "visuali",
-       "showpreview": "ammustra la visuali prima di sarvari",
+       "watchthis": "Talìa sta pàggina",
+       "savearticle": "Sarva la pàggina",
+       "preview": "Antiprima",
+       "showpreview": "Ammustra l'antiprima",
        "showdiff": "Ammustra li canciamenti",
-       "anoneditwarning": "'''Accura''': nun hai esiquitu lu login. Lu tò ndirizzu IP veni riggistratu ntâ cronoluggìa di sta pàggina.",
+       "blankarticle": "<strong>Accura:</strong> La pàggina chi' stai criannu è vacanti.\nSi' clicchi \"{{int:savearticle}}\" n'autra vota, la pàggina veni crïata senza nuddu cuntinutu.",
+       "anoneditwarning": "<strong>Accura:</strong> Nun si' trasutu. Lu to nnirizzu IP diventa visìbbili pubblicamenti quannu fai nu canciamentu. Si' <strong>[$1 trasi]</strong> o puru <strong>[$2 crei nu cuntu]</strong>, li canciamenti chi' fai vènunu attribbuiti ô to nomu utenti, sparti di autri vantaggi.",
        "anonpreviewwarning": "''Nun trasisti comu utiliggaturi loggatu. Sarbannu, lu tò nnirizzu IP veni arriggistratu ntâ storia dî canciamenti.''",
        "missingsummary": "'''Accura:''' Nun hà statu spicificatu l'uggettu di stu canciamentu. Primennu di novu '''Sarva''' lu canciamentu veni sarvatu cu l'uggettu vacanti.",
+       "selfredirect": "<strong>Accura:</strong> Stai rimannannu sta pàggina a' idda stissa.\nPo' èssiri chi' spicificasti na distinazzioni sbagghiata pû rimannu, o puru chi' stai canciannu a pàggina sbagghiata.\nSi' clicchi \"{{int:savearticle}}\" n'autra vota, u rimannu veni criatu u stissu.",
        "missingcommenttext": "Nziriri un cummentu ccà sutta.",
-       "missingcommentheader": "'''Accura:''' Nun hà statu spicificatu la ntistazzioni di stu cummentu. Primennu di novu '''Sarva''' lu canciamentu veni saravtu senza ntistazzioni.",
-       "summary-preview": "Antiprima uggettu:",
-       "subject-preview": "Antiprima suggettu/ntistazzioni:",
-       "blockedtitle": "Utenti bluccatu.",
+       "missingcommentheader": "<strong>Accura:</strong> Nun havi statu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"{{int:savearticle}}\", lu canciamentu veni sarvatu senza avìrinni.",
+       "summary-preview": "Antiprima dû riassuntu:",
+       "subject-preview": "Antiprima di l'oggettu/ntistazzioni:",
+       "blockedtitle": "L'utenti è bluccatu",
        "blockedtext": "'''Stu nomu d'utenti o nnirizzu IP havi statu bluccatu.'''\n\nLu bloccu fu fattu di $1. Lu mutivu dû bloccu è: ''$2''.\n\n* Accuminzata dû bloccu: $8\n* Fini dû bloccu: $6\n* Ntirvallu dû bloccu: $7\n\nPoi cuntattari a $1 o a n'àutru [[{{MediaWiki:Grouppage-sysop}}|amministraturi]] pi discùtiri dû bloccu.\n\nNun poi usari la carattirìstica 'manna n'email a st'utenti' siddu nun è spicificatu nu nnirizzu email vàlidu nta li toi [[Special:Preferences|prifirenzi]] e siddu nun hai statu bluccatu di l'usari.\n\nLu tò nnirizzu IP attuali è $3, e lu nùmmiru ID dû bloccu è #$5.\n\nSpicìfica tutti li dittagghi pricidenti nta quarsiasi addumannata di chiarimenti.",
        "autoblockedtext": "Lu tò nnirizzu IP hà statu bluccatu automaticamenti pirchì fu usatu di n'àutru utenti, chi fu bluccatu di $1.\nLu mutivu è chistu:\n\n:''$2''\n\n* Accuminzata dû bloccu: $8\n* Fini dû bloccu: $6\n* Ntirvallu dû bloccu: $7\n\nPoi cuntattari a $1 o a n'àutru [[{{MediaWiki:Grouppage-sysop}}|amministraturi]] pi discùtiri dû bloccu.\n\nNun poi usari la carattirìstica 'manna n'email a st'utenti' siddu nun è spicificatu nu nnirizzu email vàlidu ntra li tòi [[Special:Preferences|prifirenzi]] e siddu nun fusti bluccatu di l'usari.\n\nLu tò nnirizzu IP attuali è $3, e l'ID dû bloccu è $5.\nPi favuri nclùdilu nta tutti li dumanni chi fai.",
-       "blockednoreason": "nudda motivazioni ndicata",
-       "whitelistedittext": "Hai a $1 pi canciari l'artìculi.",
-       "confirmedittext": "P'èssiri abbilitati a lu canciamentu dî pàggini è nicissariu cunfirmari lu propiu ndirizzu e-mail. Pi mpustari e cunfirmari lu ndirizzu sirvìrisi dî [[Special:Preferences|prifirenzi]].",
-       "nosuchsectiontitle": "Lu paràgrafu nun fu truvatu",
-       "nosuchsectiontext": "Pruvasti a canciari na sezzioni chi nun esisti.\nForsi ca fu spustata o cancillata na mentri ca stàvutu taliannu la pàggina.",
-       "loginreqtitle": "Login nicissariu",
-       "loginreqlink": "esèquiri l'accessu",
-       "loginreqpagetext": "Pi vìdiri àutri pàggini è nicissariu $1.",
-       "accmailtitle": "Password nviata.",
-       "accmailtext": "La password pi [[User talk:$1|$1]] fu nviata a lu ndirizzu $2.\n\nLa password pi stu novu account pò essiri canciata â accessu nâ pàggina pi [[Special:ChangePassword|canciari password]].",
+       "blockednoreason": "nuddu mutivu datu",
+       "whitelistedittext": "Pi' favuri $1 pi' canciari li pàggini.",
+       "confirmedittext": "Hâ' cunvalidari lu to nnirizzu di posta elittrònica avanti di putiri canciari li pàggini.\nPi' favuri mposta e cunvàlida lu nnirizzu passannu dî [[Special:Preferences|to prifirenzi]].",
+       "nosuchsectiontitle": "La sizzioni nun fu' truvata",
+       "nosuchsectiontext": "Pruvasti a canciari na sizzioni chi' nun esisti.\nForsi ca fu' spustata o cancillata na mentri ca stàvutu talïannu la pàggina.",
+       "loginreqtitle": "S'havi a' tràsiri",
+       "loginreqlink": "trasi",
+       "loginreqpagetext": "Pi' favuri $1 pi' talïari autri pàggini.",
+       "accmailtitle": "Password mannata",
+       "accmailtext": "Na password ginirata casualmenti pi' [[User talk:$1|$1]] fu' spiduta a $2. Si po' canciari di la pàggina di <em>[[Special:ChangePassword|canciamentu dâ password]]</em> comu unu trasi.",
        "newarticle": "(Novu)",
-       "newarticletext": "Sta pàggina ancora nun esisti.\nPi criari na pàggina cu stu tìtulu, accumenza a scrìviri ccassutta (talìa la [$1 pàggina d'aiutu] pi aviri maiuri nfurmazzioni).\nSi agghicasti ccà pi sbagghiu, clicca lu buttuni ''''n arreri (back)''' dû tò browser.",
+       "newarticletext": "Siguisti nu culligamentu a' na pàggina ch'ancora nun esisti.\nPi' crïari sta pàggina, accumenza a' scrìviri ccassutta (talìa la [$1 pàggina d'ajutu] p'aviri majuri nfurmazzioni).\nSi' agghicasti cca pi' sbagghiu, calca lu buttuni <strong>n' arreri</strong> dû to browser.",
        "anontalkpagetext": "----''Chista è la pàggina di discussioni di n’utenti anònimu, ca nun criau ancora n’accessu o ca nun l’usa.\nP’idintificàrilu è pirciò nicissariu usari lu nùmmiru di lu sò nnirizzu IP.\nLi nnirizzi IP ponnu pirò èssiri spartuti di cchiù utenti.\nSiddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina nun si rifirìscinu a tia, [[Special:UserLogin/signup|crea n’accessu novu]] o [[Special:UserLogin|trasi]] cu chiddu ca già hai p’evitari d’èssiri cunfusu cu àutri utenti anònimi ‘n futuru.''",
        "noarticletext": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nta l'àutri pàggini dû situ oppuru <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|action=edit}} circari ntê riggistra culligati] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} canciari la pàggina ora]</span>.",
        "noarticletext-nopermission": "Nta stu mumentu la pàggina addumannata è vacanti. È pussibbili [[Special:Search/{{PAGENAME}}|circari stu titulu]] nti àutri pàggini dû situ o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistra culligati]</span>, ma nun hai li pirmissa pi criari sta pàggina.",
+       "missing-revision": "A virsioni #$1 dâ paggina ntitulata \"{{FULLPAGENAME}}\" nun esisti.\n\nStu fattu di sòlitu succedi quannu si segui nu culligamentu di crunuluggìa versu na pàggina chi' fu' cancillata.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
        "userpage-userdoesnotexist": "L'account \"<nowiki>$1</nowiki>\" nun currispunni a n'utenti riggistratu. Virificari si si voli criari o canciari sta pàggina.",
-       "blocked-notice-logextract": "Stu utenti è attualmenti bluccatu. L'ùrtimu elimentu dû riggistru dî blocca è ripurtatu ccà pi nfurnazzioni:",
-       "clearyourcache": "'''Nota:''' doppu aviri sarvatu è nicissariu puliri la cache dû propiu browser pi vìdiri li canciamenti. Pi '''Mozilla / Firefox / Safari''': fari clic supra ''Ricarica'' tinnennu primutu lu tastu dî maiùsculi, oppuru prèmiri ''Ctrl-Maiusc-R'' (''Cmd-Maiusc-R'' supra Mac); pi '''Internet Explorer:''' mantèniri primutu lu tastu ''Ctrl'' mentri si premi lu pulsanti ''Aggiorna'' o prèmiri ''Ctrl-F5''; pi '''Konqueror''': prèmiri lu pulsanti ''Ricarica'' o lu tastu ''F5''; pi '''Opera''' pò èssiri nicissariu svacantari cumpletamenti la cache dû menu ''Strumenti → Preferenze''.",
-       "usercssyoucanpreview": "'''Suggirimentu:''' Usa lu tastu 'Visualizza antiprima' pi pruvari li novi css/js prima di sarvàrili.",
-       "userjsyoucanpreview": "'''Suggirimentu:''' Usa lu tastu 'Visualizza antiprima' pi pruvari li novi css/js prima di sarvàrili.",
+       "userpage-userdoesnotexist-view": "U cuntu utenti \"$1\" nun è riggistratu.",
+       "blocked-notice-logextract": "St'utenti pi' com'ora è bluccatu.\nComu rifirimentu ccassutta cc'è l'ùltima vuci dû riggìstru dî blocchi:",
+       "clearyourcache": "<strong>Nota:</strong> Doppu aviri sarvatu, po' giuvari cancillari la ''cache'' dû propiu browser pi' vìdiri li canciamenti.\n* <strong>Firefox / Safari:</strong> Cliccari <em>Ricarica</em> mantinnennu primutu lu tastu dî majùsculi, o puru prèmiri o <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> ntôn Mac)\n* <strong>Google Chrome:</strong> Prèmiri <em>Ctrl-Maiusc-R</em> (<em>⌘-Maiusc-R</em> ntôn Mac)\n* <strong>Internet Explorer:</strong> Cliccari <em>Aggiorna</em> mantinennu primutu lu tastu <em>Ctrl</em>, o puru prèmiri <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Svacantari la ''cache'' dû menù <em>Strumenti → Preferenze</em>",
+       "usercssyoucanpreview": "<strong>Cunsigghiu:</strong> Adòpira u buttuni \"{{int:showpreview}}\" pi' pruvari u to CSS novu prima di sarvàrilu.",
+       "userjsyoucanpreview": "<strong>Cunsigghiu:</strong> Adòpira u buttuni \"{{int:showpreview}}\" pi' pruvari u to JavaScript novu prima di sarvàrilu.",
        "usercsspreview": "'''Arricorda ca stai sulu visualizzannu n'antiprima dû tò CSS pirsunali.'''\n'''Nun hà ancora statu sarvatu!'''",
        "userjspreview": "'''Arricorda ca stai sulu tistanno/vidennu 'n antiprima lu tò javascript pirsunali, nun hà statu ancora sarvatu!'''",
+       "sitecsspreview": "<strong>Ricòrditi chi' chista è sulu n'antiprima di stu CSS. Ancora nun havi statu sarvatu!</strong>",
+       "sitejspreview": "<strong>Ricòrditi chi' chista è sulu n'antiprima di stu còdici JavaScript. Ancora nun havi statu sarvatu!</strong>",
        "userinvalidcssjstitle": "'''Accura:''' Nun esisti arcuna skin cu nomu \"$1\". S'arricorda ca li pàggini pi li .css e .js pirsunalizzati hannu la nizziali dû tìtulu minùscula, p'asempiu {{ns:user}}:Asempiu/vector.js e nun {{ns:user}}:Asempiu/Vector.css.",
        "updated": "(Aggiurnatu)",
-       "note": "'''Accura:'''",
-       "previewnote": "'''Ricurdàtivi ca chista è sulu n'antiprima.'''\nLi canci nun foru ancora sarvati!'''",
-       "previewconflict": "L'antiprima currispunni a lu testu prisenti ntâ casella di canciamentu supiriuri e rapprisenta la pàggina comu appari siddu si scegghi di prèmiri 'Sarva' 'n stu mumentu.",
-       "session_fail_preview": "'''Purtroppu nun hà statu pussìbbili sarvari li tò canciamenti pirchì li dati dâ sissioni hannu jutu pirduti. Pi favuri, riprova. Siddu arricevi stu missaggiu d'erruri cchiù voti, prova a sculligàriti e a culligàriti novamenti.'''",
+       "note": "<strong>Nota:</strong>",
+       "previewnote": "<strong>Ricòrditi ca chista è sulu n'antiprima.</strong>\nLi to canciamenti ancora nun foru sarvati!",
+       "continue-editing": "Vai a' l'aria di mudìfica",
+       "previewconflict": "St'antiprima currispunni a lu testu prisenti ntâ casedda di canciamentu cchiu' supra e rapprisenta la pàggina comu cumpariravi siddu scegghî di sarvàrila.",
+       "session_fail_preview": "<strong>Purtroppu nun hà statu pussìbbili sarvari li tò canciamenti pirchì li dati dâ sissioni hannu jutu pirduti.</strong>\nPi' favuri prova n'autra vota.\nSiddu ancora nun funziona, prova a' [[Special:UserLogout|nèsciri]] e tràsiri n'autra vota.",
        "session_fail_preview_html": "'''Semu spiacenti, nun hà statu pussìbbili elabburari lu canciamentu pirchì hannu jutu pirduti li dati rilativi â sissioni.'''\n\n''Poichì nta stu situ è abbilitatu l'usu di HTML senza limitazzioni, l'antiprima nun veni visualizzata; si tratta di na misura di sicurizza contra l'attacchi JavaScript.''\n\n'''Siddu chistu è nu tintativu liggìttimu di canciamentu, arriprova. Siddu lu prubbrema pirsisti, si pò pruvari a [[Special:UserLogout|sculligàrisi]] e effittuari n'accessu novu.'''",
        "token_suffix_mismatch": "'''Lu canciamentu nun fu sarvatu pirchì lu client ammustrau di gèstiri 'n modu sbagghiatu li caràttiri di puntiggiatura nta lu token assuciatu a iddu. P'evitari na curruzzioni pussìbbili dô testu dâ pàggina, fu rifiutatu tuttu lu canciamentu. Sta situazzioni pò virificàrisi, certi voti, quannu s'adòpiranu arcuni sirvizza di proxy anònimi via web chi prisèntanu bug.'''",
-       "editing": "Canciu di la vuci \"$1\"",
-       "creating": "Stai criannu $1",
-       "editingsection": "Canciamentu di $1 (sezzioni)",
-       "editingcomment": "Canciu di $1 (nova sizzioni)",
-       "editconflict": "Cunflittu d'edizzioni supra $1",
+       "edit_form_incomplete": "<strong>Quarchi' parti dû mòdulu pâ mudìfica nun arrivau ô ''server''; cuntrolla bonu chi' tutti i to canciamenti su' ntatti e prova n'autra vota.</strong>",
+       "editing": "Canciamentu di $1",
+       "creating": "Crïazzioni di $1",
+       "editingsection": "Canciamentu di $1 (sizzioni)",
+       "editingcomment": "Canciamentu di $1 (nova sizzioni)",
+       "editconflict": "Cunflittu d'edizzioni: $1",
        "explainconflict": "N'àutru utenti havi sarvatu na virsioni nova dâ pàggina mentri stavi effittuannu li canciamenti.\nLa casella di canciamentu supiriuri cunteni lu testu dâ pàggina attuarmenti online, accussì comu hà statu aggiurnatu di l'àutru utenti.\nLa virsioni cu li tò canciamenti è mmeci ripurtata ntâ casella di canciamentu nfiriuri.\nSiddu addisìi cunfirmàrili, hai a ripurtari li tò canciamenti ntô testu asistenti (casella supiriuri).\nPrimennu lu pulsanti '{{int:savearticle}}', veni sarvatu '''sulu''' lu testu cuntinutu ntâ casella di canciamentu supiriuri.",
        "yourtext": "Lu tò testu",
        "storedversion": "La virsioni mimurizzata",
-       "nonunicodebrowser": "''''''ACCURA: Lu tò browser nun supporta unicode, li caràttiri nun-ASCII appàrinu nta lu box di canciamentu comu còdici esadicimali.''''''",
+       "nonunicodebrowser": "<strong>Accura: Lu to browser nun supporta bonu l'Unicode.</strong>\nFu' attivata na contramisura pi' cunsintìriti di canciari li pàggini in sicurizza: li caràttiri nun-ASCII spuntirannu nta la casedda di mudìfica comu còdici esadicimali.",
        "editingold": "'''Accura: si sta canciannu na virsioni nun aggiurnata dâ pàggina.<br /> Siddu si scegghi di sarvàrila, tutti li canciamenti appurtati doppu sta rivisioni vannu pirduti.'''",
        "yourdiff": "Diffirenzi",
-       "copyrightwarning": "Nutati chi tutti li cuntribbuti a {{SITENAME}} s'hannu a cunzidirari sutta la licenza d'usu $2 (talìa $1 pî dittagghi). Si nun vuliti chi lu vostru travagghiu curri lu rìsicu di vèniri ritravagghiatu e/o ridistribbuitu, nun suttamittìtilu ccà.<br />\nVuatri prumittiti puru chi lu scrivìstivu chî vostri palori, o chi lu cupiàstivu di nu duminiu pùbbricu o di risursi sìmili\n'''NUN SUTTAMITTÌTI MATIRIALI SUTTA COPYRIGHT SENZA PIRMISSU!'''",
-       "copyrightwarning2": "Nota: tutti li cuntribbuti mannati a {{SITENAME}} ponnu èssiri mudificati o cancillati di parti di l'àutri participanti. Siddu nun addisìi ca li tò testi ponnu èssiri mudificati senza arcunu riguardu, nun mannàrili a stu situ.<br /> Cu la mannata dû testu dichiari noltri, sutta la tò rispunzabbilitati, ca lu testu hà statu scrittu di tia pirsunalmenti oppuru c'hà statu cupiatu di na fonti di pùbbricu dominiu o analucamenti lìbbira. (vidi $1 pi maiuri dittagghi) '''NUN MANNARI MATIRIALI CUPERTU DI DRITTU D'AUTURI SENZA AUTURIZZAZZIONI!'''",
-       "longpageerror": "'''ERRURI: Lu testu ca hai suttamissu è longu $1 kilobyte, ch'è cchiù dû màssimu di $2 kilobyte. Nun pò èssiri sarvatu.'''",
-       "readonlywarning": "'''ACCURA: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu. La cosa megghia è fari un copia e ncolla dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database è accissìbbili.'''\n\nL'amministraturi ca bluccau lu database lu fici pi stu mutivu: $1",
-       "protectedpagewarning": "'''ACCURA: Sta pàggina havi na prutizzioni spiciali e sulu l'utenti chi hannu lu status di amministraturi ponnu canciàrila.'''",
-       "semiprotectedpagewarning": "'''ACCURA:''' Sta pàggina hà statu bluccata n modu ca sulu li utenti riggistrati ponnu canciàrila.",
-       "cascadeprotectedwarning": "'''Accura:''' Sta pàggina havi stata bluccata n modu ca sulu li utenti cu privileggi di amministraturi ponnu mudificàrila, pirchì veni nclusa {{PLURAL:$1|nta siquente pàggina ca hà stata prutiggiuta|ntê siquenti pàggini ca hannu stati prutiggiuti}} silizziunannu la prutizzioni \"ricursiva\":",
-       "titleprotectedwarning": "'''ATTENZIONI:  Sta pàggina fu bluccata n modu tali ca sianu nicissari [[Special:ListGroupRights|diritti spicifici]] pi criarla.'''",
-       "templatesused": "{{PLURAL:$1|Template utilizzatu|Template utilizzati}} nti sta pàggina:",
-       "templatesusedpreview": "Template utilizzati 'n st'antiprima:",
-       "templatesusedsection": "Template utilizzati 'n sta sezzioni:",
+       "copyrightwarning": "Pi' favuri nota ca tutti li cuntribbuti mannati a' {{SITENAME}} s'hannu a' cunsiddirari sutta â licenza d'usu $2 (talìa $1 pî dittagghî).\nSi' nun voi ca li to testi vènunu mudificati senza nuddu riguardu e ridistribbuùti a' vogghia, allura nê mannari cca.<br />\nMannannu lu to testu nni dichiari sparti chi' lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira.\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
+       "copyrightwarning2": "Pi' favuri nota ca tutti li cuntribbuti mannati a' {{SITENAME}} ponnu vèniri canciati, altirati o cancillati di l'autri participanti.\nSi' nun voi ca li to testi vènunu mudificati senza nuddu riguardu, allura nê mannari cca.<br />\nMannannu lu to testu nni dichiari sparti ca lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira (talìa $1 pi' majuri dittagghî).\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
+       "longpageerror": "<strong>Erruri: Lu testu ca hai suttamisu è longu {{PLURAL:$1|un kilobyte|$1 kilobyte}}, cchiù' ssai dû màssimu ca è di {{PLURAL:$2|un kilobyte|$2 kilobyte}}.</strong>\nNun si po' sarvari.",
+       "readonlywarning": "<strong>Accura: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu.</strong>\nLa cosa megghia è fari un copia e ncodda dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database torna accissìbbili.\n\nL'amministraturi ca bluccau lu database desi sta spiegazzioni: $1",
+       "protectedpagewarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' sulu l'utenti cu' privileggi d'amministraturi a ponnu canciari.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
+       "semiprotectedpagewarning": "<strong>Nota:</strong> Sta pàggina fu' prutetta a' manera chi' sulu l'utenti riggistrati la ponnu canciari.\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
+       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina havi statu bluccata di manera ca sulu l'utenti cu' privileggi di amministraturi la ponnu canciari, pirchì veni nclusa {{PLURAL:$1|nta siquente pàggina ca havi statu prutiggiuta|ntê siquenti pàggini ca hannu statu prutiggiuti}} a' cascata:",
+       "titleprotectedwarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' giuvunu [[Special:ListGroupRights|privileggi spicìfici]] pi' crïàrila.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
+       "templatesused": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta sta pàggina:",
+       "templatesusedpreview": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta st'antiprima:",
+       "templatesusedsection": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta sta sizzioni:",
        "template-protected": "(prutettu)",
        "template-semiprotected": "(semiprutettu)",
-       "hiddencategories": "Sta pàggina apparteni a {{PLURAL:$1|na catigurìa ammuciata|$1 catigurìi ammuciati}}:",
+       "hiddencategories": "Sta pàggina apparteni a' {{PLURAL:$1|na catigurìa ammucciata|$1 catigurìi ammucciati}}:",
        "edittools": "<!-- Chistu testu cumpari sutta li moduli di canciu e carricamentu. -->",
-       "nocreatetext": "La pussibbilitati di criari pàggini novi nta {{SITENAME}} è limitata a l'utenti riggistrati. Poi turnari 'n arreri e canciari na pàggina esistenti, oppuru [[Special:UserLogin|tràsiri o criari nu cuntu novu]].",
-       "nocreate-loggedin": "Nun hai lu pirmissu pi criari pàggini novi ntâ {{SITENAME}}.",
+       "nocreatetext": "{{SITENAME}} limitau la pussibbilitati di crïari pàggini novi.\nPoi turnari 'n arreri e canciari na pàggina già esistenti, o puru [[Special:UserLogin|tràsiri o crïari nu cuntu novu]].",
+       "nocreate-loggedin": "Nun hai lu pirmissu pi' crïari pàggini novi.",
+       "sectioneditnotsupported-title": "Nun è suppurtatu lu canciamentu pi' sizzioni",
+       "sectioneditnotsupported-text": "Nta sta pàggina nun è suppurtatu lu canciamentu pi' sizzioni.",
        "permissionserrors": "Erruri di pirmissu",
-       "permissionserrorstext": "Nun hai lu pirmissu pi fari chistu, pi {{PLURAL:$1|chistu motivu|sti mutivi}}:",
-       "permissionserrorstext-withaction": "Nun hai lu pirmessu di fari $2, pi {{PLURAL:$1|lu siguenti mutivu|li siguenti mutivi}}:",
+       "permissionserrorstext": "Nun hai lu pirmissu di fari sta cosa, pi' {{PLURAL:$1|chistu motivu|chisti mutivi}}:",
+       "permissionserrorstext-withaction": "Nun hai lu pirmissu di $2, pi' {{PLURAL:$1|chistu mutivu|chisti mutivi}}:",
        "recreate-moveddeleted-warn": "'''Accura: stai pi criari na pàggina chi fu cancillata 'n passatu.'''\n\nAccuràtivi ch'è uppurtunu cuntinuari a canciari sta pàggina.\nL'alencu dî cancillazzioni e spustamenti rilativi veni ripurtatu ccà pi cummudità:",
        "moveddeleted-notice": "Sta pàggina fu scancillata. La lista di li scancillazzioni e spustamenti veni ammustrata di sècutu pi nfurmazzioni.",
-       "log-fulllog": "Talìa log cumpletu",
-       "edit-hook-aborted": "Canciamentu scancillatu di l'hook.\nNun desi nudda spiecazzioni.",
-       "edit-gone-missing": "Mpussìbbili aggiurnari la pàggina.\nPari ca fu scancillata.",
-       "edit-conflict": "Cunflittu di edizzioni.",
-       "edit-no-change": "La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.",
-       "postedit-confirmation-created": "La pàggina fu criata.",
-       "postedit-confirmation-saved": "Lu canciamentu fu sarbatu.",
-       "edit-already-exists": "Mpussìbbili criari na pàggina nova.\nEsisti ggià.",
+       "log-fulllog": "Talìa lu riggìstru cumpletu",
+       "edit-hook-aborted": "Canciamentu annullatu di n'hook.\nNun desi nudda spiegazzioni.",
+       "edit-gone-missing": "Nun si po' aggiurnari la pàggina.\nPari ca fu' cancillata.",
+       "edit-conflict": "Cunflittu d'edizzioni.",
+       "edit-no-change": "La to mudìfica fu' gnurata pirchì nun foru appurtati canciamenti ntô testu.",
+       "postedit-confirmation-created": "La pàggina fu' crïata.",
+       "postedit-confirmation-restored": "La pàggina fu' ripristinata.",
+       "postedit-confirmation-saved": "Lu to canciamentu fu' sarvatu.",
+       "edit-already-exists": "Nun fu' pussìbbili crïari na pàggina nova.\nGià esisti.",
+       "defaultmessagetext": "Testu dû missaggiu pridifinutu",
+       "content-failed-to-parse": "Anàlisi sintàttica dû cuntinutu $2 pû mudellu $1 nun rinisciuta: $3",
+       "invalid-content-data": "Dati nun vàlidi ntô cuntinutu",
+       "content-not-allowed-here": "U cuntinutu \"$1\" nun è cunsintutu ntâ pàggina [[$2]]",
+       "editwarning-warning": "Annannutìnni di sta pàggina poi pèrdiri i canciamenti ch'hai fattu.\nSi' si' trasutu, poi disattivari st'avvisu ntâ sizzioni \"{{int:prefs-editing}}\" dî to prifirenzi.",
+       "editpage-notsupportedcontentformat-title": "Furmatu di cuntinutu nun suppurtatu",
+       "editpage-notsupportedcontentformat-text": "U furmatu di cuntinutu $1 non è suppurtatu dû mudellu di cuntinutu $2.",
+       "content-model-wikitext": "wikitestu",
+       "content-model-text": "testu sìmplici",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Oggettu vacanti",
+       "content-json-empty-array": "Vitturi vacanti",
+       "duplicate-args-category": "Pàggini chi' cuntènunu chiamati a' template cu' argumenti duplicati",
+       "duplicate-args-category-desc": "A pàggina cunteni chiamati a' template chi' adòpirunu argumenti duplicati, comu <code><nowiki>{{pippu|plutu=1|plutu=2}}</nowiki></code> o <code><nowiki>{{pippu|plutu|1=papirinu}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
        "expensive-parserfunction-category": "Pàggini cu troppi chiamati ê parser functions",
        "post-expand-template-inclusion-warning": "Accura: la diminzioni di li template nziriti è troppu granni.\nArcuni template non vènunu nziriti.",
        "post-expand-template-inclusion-category": "Pàggini unni la diminsioni dê template nclusi supira lu limiti cunsintutu",
        "post-expand-template-argument-warning": "Attenzioni: Sta pàggina cunteni almenu n'argomentu di nu template ca havi na diminsioni troppu rossa pi essiri espansu. St'argomenti verrannu omessi.",
        "post-expand-template-argument-category": "Pàggini ca cuntèninu template cu argumenti mancanti",
-       "parser-template-loop-warning": "Fu truvatu nu loop di Template : [[$1]]",
-       "parser-template-recursion-depth-warning": "Limiti di ricursioni funnuti di Template surpassatu ($1)",
+       "parser-template-loop-warning": "Rilivatu un cìrculu di di Template: [[$1]]",
+       "parser-template-recursion-depth-warning": "Passatu u lìmiti di funnu pâ ricursioni di template ($1)",
+       "language-converter-depth-warning": "Passatu u lìmiti di funnu dû cunvirtituri di lingua ($1)",
+       "node-count-exceeded-category": "Pàggini unni fu' passatu u nùmmiru màssimu di gruppi",
+       "node-count-exceeded-category-desc": "A pàggina passa u nùmmiru massimu di gruppi.",
+       "node-count-exceeded-warning": "Sta pàggina passau u nùmmiru màssimu di gruppi",
+       "expansion-depth-exceeded-category": "Pàggini unni fu' passatu u funnu màssimu di espansioni",
+       "expansion-depth-exceeded-category-desc": "A pàggina passa u funnu màssimu di espansioni.",
+       "expansion-depth-exceeded-warning": "Sta pàggina passau u funnu màssimu di espansioni",
+       "parser-unstrip-loop-warning": "Rilivatu un cìrculu di Unstrip",
+       "parser-unstrip-recursion-limit": "Passatu u lìmiti di ricursioni di Unstrip ($1)",
+       "converter-manual-rule-error": "Rilivatu n'erruri nta na règula manuali di cunvirsioni di lingua",
        "undo-success": "Lu canciamentu pò essiri annullatu.\nVirificati lu paraguni ccà sutta p'accuràrivi ca lu cuntinutu è chiddu addisiatu e doppu sarvati la pàggina pi cumplitari l'annullamentu.",
        "undo-failure": "Lu canciamentu nun pò èssiri annullatu a càusa d'un cunflittu cu li canciamenti ntirmedi.",
        "undo-norev": "Lu canciamentu nun pò essiri annullatu pirchì nun esisti o fù cancillato.",
+       "undo-nochange": "Pari chi' u canciamentu già fu' annullatu.",
        "undo-summary": "Annullatu lu canciamentu $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]])",
-       "cantcreateaccounttitle": "Mpussìbbili riggistrari n'utenti",
-       "cantcreateaccount-text": "La criazzioni di account di stu nnirizzu IP ('''$1''') fu bluccata di [[User:$3|$3]].\n\nLu mutivu è ''$2''",
-       "viewpagelogs": "Vidi li log rilativi a sta pàggina",
-       "nohistory": "Cronoluggìa dî virsioni di sta pàggina nun ripirìbbili.",
+       "undo-summary-username-hidden": "Annullata a virsioni $1 fatta di n'utenti ammucciatu",
+       "cantcreateaccounttitle": "Mpussìbbili crïari un cuntu",
+       "cantcreateaccount-text": "La crïazzioni di cunti a' pàrtiri di stu nnirizzu IP (<strong>$1</strong>), fu' bluccata di [[User:$3|$3]].\n\nLa spiegazzioni data di $3 è <em>$2</em>",
+       "cantcreateaccount-range-text": "La crïazzioni di cunti a' pàrtiri dî nnirizzi IP nta l'intirvallu '''$1''', chi' cumprenni u to nnirizzu IP ('''$4'''), fu' bluccata di [[User:$3|$3]].\n\nLa spiegazzioni data di $3 è ''$2''",
+       "viewpagelogs": "Talìa li riggìstra di sta pàggina",
+       "nohistory": "Nun cc'è crunuluggìa dî canciamenti pi' sta pàggina.",
        "currentrev": "Virsioni currenti",
-       "currentrev-asof": "Virsioni currenti  $1",
+       "currentrev-asof": "Virsioni currenti ô $1",
        "revisionasof": "Virsioni dû $1",
-       "revision-info": "Virsioni dû $1 di $2",
-       "previousrevision": "← Virsioni menu ricenti",
-       "nextrevision": "Virsioni cchiù ricenti →",
-       "currentrevisionlink": "Virsioni currenti",
+       "revision-info": "Virsioni dû $1 di {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Virsioni cchiu' vecchia",
+       "nextrevision": "Virsioni cchiu' nova →",
+       "currentrevisionlink": "Ùltima virsioni",
        "cur": "curr",
        "next": "pròssimu",
        "last": "pric",
        "page_first": "prima",
        "page_last": "ùrtima",
-       "histlegend": "Cunfrontu tra virsioni: silizziunari li caselli currispunnenti ê virsioni addisiati e prèmiri Mannu o lu pulsanti a basciu.<br /> Liggenna: (curr) = diffirenzi cu la virsioni attuali, (pric) = diffirenzi cu la virsioni pricidenti, '''m''' = canciamentu nicu",
+       "histlegend": "Pû cunfrontu tra virsioni: scègghîri li caseddi currispunnenti ê virsioni di cunfruntari e carcari Invio o lu buttuni ô funnu.<br />\nLegenda: <strong>({{int:cur}})</strong> = cunfruntari cu la virsioni currenti, <strong>({{int:last}})</strong> = cunfruntari cu la virsioni avanti d'idda, <strong>{{int:minoreditletter}}</strong> = canciamentu nicu",
        "history-fieldset-title": "Scurri ntâ crunuluggìa",
-       "history-show-deleted": "Sulu chiddi scancillati",
-       "histfirst": "Prima",
-       "histlast": "Ùrtima",
+       "history-show-deleted": "Sulu chiddi cancillati",
+       "histfirst": "i cchiu' vecchî",
+       "histlast": "i cchiu' novi",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "historyempty": "(vacanti)",
-       "history-feed-title": "Lista dî canciamenti",
-       "history-feed-description": "Cronoluggìa dâ pàggina supra stu situ",
+       "history-feed-title": "Crunuluggìa dî canciamenti",
+       "history-feed-description": "Crunuluggìa dî canciamenti a' sta pàggina nta sta wiki",
        "history-feed-item-nocomment": "$1 lu $2",
-       "history-feed-empty": "La pàggina richiesta nun asisti; putissi aviri stata cancillata dû situ o rinuminata. Virificari cu la [[Special:Search|pàggina di ricerca]] siddu ci sunnu novi pàggini.",
-       "rev-deleted-comment": "(cummentu rimussu)",
-       "rev-deleted-user": "(nomu utenti rimussu)",
-       "rev-deleted-event": "(elementu cancillatu)",
+       "history-feed-empty": "La pàggina chi' dumannasti nun esisti.\nPo' aviri statu cancillata dâ wiki, o puru canciata di nomu.\nProva a' [[Special:Search|circari ntâ wiki]] siddu cci sunnu pàggini novi chi' ti ponnu ntirissari.",
+       "rev-deleted-comment": "(riassuntu dû canciamentu rimossu)",
+       "rev-deleted-user": "(nomu utenti rimossu)",
+       "rev-deleted-event": "(dittagghî dû riggistru rimossi)",
+       "rev-deleted-user-contribs": "[nomu utenti o nnirizzu IP rimossi - canciamentu ammucciatu ntê cuntribbuti]",
        "rev-deleted-text-permission": "Sta virsioni dâ pàggina hà statu '''cancillata'''.\nCunzurtari lu [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log di cancillazzioni] pi ultiriuri dittagghi.",
-       "rev-deleted-text-unhide": "Sta virsioni da pàggina fu '''cancillata'''.\nTalìari lu [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dê cancillazzioni] pi autri dittagli.\nAll'aministraturi ancora è cunsintutu [$1 talìari sta virsioni] si nicissariu.",
-       "rev-suppressed-text-unhide": "Sta virsioni dâ pàggina fu '''rimossa'''.\nTalìari lu [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dê cancillazzioni] pi autri dittagli.\nAll'aministraturi ancora è cunsintutu [$1 talìari sta virsioni] si nicissariu.",
-       "rev-deleted-text-view": "Sta virsioni dâ pàggina hà statu '''cancillata'''.\nLu testu pò èssiri visualizzatu surtantu di l'amministratura dû situ. Cunzurtari lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log di cancillazzioni] pi ultiriuri dittagghi.",
-       "rev-suppressed-text-view": "Sta virsioni dâ paggina fu '''luvata'''.\nL'amministratura ponu ancora taliarla; taliari lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log di rimozzioni] pi autri dittagli.",
+       "rev-suppressed-text-permission": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
+       "rev-deleted-text-unhide": "Sta virsioni dâ pàggina fu' <strong>cancillata</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 talïari sta virsioni] si' voi prucèdiri.",
+       "rev-suppressed-text-unhide": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 talïari sta virsioni] si' voi prucèdiri.",
+       "rev-deleted-text-view": "Sta virsioni dâ pàggina fu' <strong>cancillata</strong>.\nTu ancora a poi talïari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "rev-suppressed-text-view": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nTu ancora a poi talïari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
        "rev-deleted-no-diff": "Nun è possibili taliari stu cunfrontu tra virsioni pirchì na revisioni fu '''scancillata'''.\nCunzurtari lu [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log di cancillazzioni] pi ultiriuri dittagghi.",
-       "rev-deleted-unhide-diff": "Una dê rivisioni di stu confrontu tra visrsioni fu '''cancillata'''.\nCunzurtari lu [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log di cancillazzioni] pi ultiriuri dittagghi.\nAll'amministratura è ancora possibili [$1 talìari lu confrontu] si nicissariu.",
-       "rev-delundel": "ammustra/ammuccia",
+       "rev-suppressed-no-diff": "Non poi talïari sta diffirenza picchì una dî virsioni fu' <strong>cancillata</strong>.",
+       "rev-deleted-unhide-diff": "Una dî virsioni di sta diffirenza fu' <strong>cancillata</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 talïari sta diffirenza] si' voi prucèdiri.",
+       "rev-suppressed-unhide-diff": "Una dî virsioni di sta diffirenza fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 talïari sta diffirenza] si' voi prucèdiri.",
+       "rev-deleted-diff-view": "Una dî virsioni di sta diffirenza fu' <strong>cancillata</strong>.\nTu sta diffirenza ancora a poi talïari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "rev-suppressed-diff-view": "Una dî virsioni di sta diffirenza fu' <strong>supprimuta</strong>.\nTu sta diffirenza ancora a poi talïari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
+       "rev-delundel": "cancia la visibbilità",
        "rev-showdeleted": "ammustra",
-       "revisiondelete": "Cancella o riprìstina virsioni",
-       "revdelete-nooldid-title": "Virsioni nun spicificata",
-       "revdelete-nooldid-text": "Nun hà statu spicificata arcuna virsioni dâ pàggina supra cui esèquiri sta funzioni.",
+       "revisiondelete": "Cancella o annulla la cancillazzioni di virsioni",
+       "revdelete-nooldid-title": "Virsioni oggettu nun vàlida",
+       "revdelete-nooldid-text": "O nun spicificasti la virsioni chi' havi a' èssiri oggettu di sta funzioni, o a virsioni chi' spicificasti nun esisti, o puru stai pruvannu a' ammucciari a virsioni currenti.",
        "revdelete-no-file": "Lu file spicificatu nun esisti.",
-       "revdelete-show-file-confirm": "Si desidira talìari la virsioni cancillata dô file \"<nowiki>$1</nowiki>\" dô $2 ê $3?",
+       "revdelete-show-file-confirm": "Si' sicuru chi' voi talìari na virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
        "revdelete-show-file-submit": "Sì",
+       "revdelete-selected-text": "{{PLURAL:$1|Virsioni scigghiuta|Virsioni scigghiuti}} di [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Virsioni dû file scigghiuta|Virsioni dû file scigghiuti}} di [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Eventu dû riggistru silizziunatu|Eventi dû riggistru silizziunati}}:",
-       "revdelete-suppress-text": "La rimozzioni havi a essiri utilizzata '''sulu''' ni sti casi:\n* Dati pirsonali inoppurtuni\n*: ''ndirizzi, nnummara di telefunu, codici fiscali, ecc.''",
+       "revdelete-text-text": "I virsioni cancillati spuntirannu ancora ntâ crunuluggìa dâ pàggina, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
+       "revdelete-text-file": "I virsioni di file cancillati spuntirannu ancora ntâ crunuluggìa dû file, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
+       "logdelete-text": "L'eventi cancillati spuntirannu ancora ntê riggistra, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
+       "revdelete-text-others": "L'autri amministratura purrannu ancora aviri accessu ô cuntinutu ammucciatu e annullàrinni la cancillazzioni, a' menu chi' nun si pònunu autri ristrizzioni ancora.",
+       "revdelete-confirm": "Pi' favuri cunfirma chi' hai ntinzioni di fari sta cosa, chi' capisci quali su' i so cunsiguenzi, e chi' stai prucidennu ntô rispettu dî [[{{MediaWiki:Policy-url}}|linî guida]].",
+       "revdelete-suppress-text": "A supprissioni s'avissi a' adupirari <strong>sulu</strong> nta sti casi:\n* nfurmazzioni putenzialmenti diffamatorî\n* nfurmazzioni pirsunali inuppurtuni\n*: <em>nnirizzi di casa, nùmmira di tilèfunu, còdici fiscali, etc.</em>",
        "revdelete-legend": "Mposta li limitazzioni siquenti supra li virsioni cancillati:",
-       "revdelete-hide-text": "Ammuccia lu testu dâ virsioni",
+       "revdelete-hide-text": "Testu dâ virsioni",
        "revdelete-hide-image": "Ammuccia lu cuntinutu dû file",
-       "revdelete-hide-name": "Ammuccia azione e uggettu dâ stissa",
-       "revdelete-hide-comment": "Ammuccia l'uggettu dû canciamentu",
-       "revdelete-hide-user": "Ammuccia lu nomu o lu ndirizzu IP di l'auturi",
+       "revdelete-hide-name": "Ammuccia uggettu e paràmitri",
+       "revdelete-hide-comment": "Riassuntu dû canciamentu",
+       "revdelete-hide-user": "Nomu utenti o nnirizzu IP di l'auturi",
        "revdelete-hide-restricted": "Ammuccia l'informazioni innicati macari a li amministratura",
        "revdelete-radio-same": "(nun canciari)",
-       "revdelete-radio-set": "",
-       "revdelete-radio-unset": "",
+       "revdelete-radio-set": "Ammucciatu",
+       "revdelete-radio-unset": "Visìbbili",
        "revdelete-suppress": "Ammuccia nformazioni puru all'amministratura",
        "revdelete-unsuppress": "Elìmina le limitazzioni su li rivisioni ripristinati",
        "revdelete-log": "Mutivu:",
-       "revdelete-submit": "Àpplica â rivisioni silizziunata",
-       "revdelete-success": "'''Visibbilitati dâ rivisioni mpustata currittamenti.'''",
-       "revdelete-failure": "'''A visibilità dâ rivisioni nu pò essiri impustata:'''\n$1",
-       "logdelete-success": "'''Visibbilitati de l'eventu mpustata currittamenti.'''",
+       "revdelete-submit": "Àpplica {{PLURAL:$1|â virsioni scigghiuta|ê virsioni scigghiuti}}",
+       "revdelete-success": "<strong>Visibbilitati dâ virsioni mpustata currittamenti.</strong>",
+       "revdelete-failure": "<strong>A visibbilitati dâ virsioni nun potti èssiri mpustata:</strong>\n$1",
+       "logdelete-success": "<strong>Visibbilitati di l'eventu mpustata currittamenti.</strong>",
        "logdelete-failure": "'''La visibilità dû eventu nun po essiri impustata:'''\n$1",
-       "revdel-restore": "Cancia la visibbilità",
-       "pagehist": "Storia dâ pàggina",
-       "deletedhist": "Storia cancillata",
-       "revdelete-hide-current": "Impussibili ammucciari l'oggettu cu la data $1 $2 in quantu è la rivisoni currenti.",
+       "revdel-restore": "cancia la visibbilità",
+       "pagehist": "Crunuluggìa dâ pàggina",
+       "deletedhist": "Crunuluggìa cancillata",
+       "revdelete-hide-current": "Erruri ammucciannu l'elimentu a' data $1 $2: È la virsioni currenti.\nNun si po' ammucciari.",
        "revdelete-show-no-access": "Impussibili ammustrari l'oggettu cu data $1 $2 in quantu fu identificatu comu \"riservatu\" e nun si disponi di lu rilativu accessu.",
        "revdelete-modify-no-access": "Impussibili canciari l'oggettu cu data $1 $2 in quantu fu identificatu comu \"riservatu\" e nun si disponi di lu rilativu accessu.",
        "revdelete-modify-missing": "Impossibili canciari l'oggettu cu ID $1 in quantu nun è presenti nô database.",
        "revdelete-no-change": "'''Attenzioni:''' l'oggettu cu data $1 $2 aveva già l'impostazioni di visibilità richiesti.",
        "revdelete-concurrent-change": "Impussibili canciari l'oggettu cu data $1 $2 in quantu lu sò statu fu canciatu da n'autru utenti mentri si tintava lu canciamentu.\nCuntrolla lu log.",
-       "revdelete-only-restricted": "Nun poi ammucciari â vista di l'amministraturi senza silizziunari l'autri opzioni di supprissioni.",
+       "revdelete-only-restricted": "Erruri ntô mmucciamentu di l'elimentu datatu $2,$1: Non si ponnu livari elimenti dâ vista di l'amministratura senza puru scègghîri una di l'autri opzioni di visibbilitati.",
+       "revdelete-reason-dropdown": "* Mutivi cchiu' cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** Cummenti o nfurmazzioni pirsunali inuppurtuni\n** Nomu utenti inuppurtunu\n** Nfurmazzioni putenzialmenti diffamatorî",
+       "revdelete-otherreason": "Autru/ultiriuri mutivu:",
        "revdelete-reasonotherlist": "Àutru mutivu",
        "revdelete-edit-reasonlist": "Cancia li mutivazioni pi la cancillazzioni",
-       "suppressionlog": "Log dê supprissioni",
-       "suppressionlogtext": "Ccà veni prisintatu n'elencu dê cancillazioni e dê blocchi cchiù ricenti supra cuntinuti ammucciati d'amministraturi. Vidi l'[[Special:IPBlockList|elenco d'IP bloccati]] pi l'elencu dî ban e dî blocchi attivi.",
-       "mergehistory": "Unioni storie",
-       "mergehistory-header": "Sta pàggina fa junciri li rivisioni dâ storia di na pàggina (ditta macari pàggina d'origini) cu na pàggina cchiù ricenti.\nS'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
+       "revdelete-offender": "Auturi dâ virsioni:",
+       "suppressionlog": "Riggistru dî supprissioni",
+       "suppressionlogtext": "Ccassutta veni prisintatu n'elencu dî cancillazzioni e dî blocchi chi' cumpòrtunu l'ammucciata di cuntinutu a' l'occhî di l'aministraturi.\nSi po' cunsultari a [[Special:BlockList|lista dî blocchi]] pi' canùsciri i furbanni e i blocchi in viguri pi' com'ora.",
+       "mergehistory": "Junciuta dî crunuluggìi",
+       "mergehistory-header": "Sta pàggina fa' jùnciri li crunuluggìi di du pàggini, abbuccannu li virsioni di na pàggina surgenti nta na pàggina cchiu' nova.\nAssicùriti ca stu canciamentu mantiniràvi la cuntinuità storica di la pàggina.",
        "mergehistory-box": "Junci li storii di dui pàggini:",
-       "mergehistory-from": "Pàggina di origgini:",
+       "mergehistory-from": "Pàggina d'orìggini:",
        "mergehistory-into": "Pàggina di distinazioni:",
-       "mergehistory-list": "Storia a cui è applicabili l'unioni",
-       "mergehistory-merge": "È possibili junciri li rivisioni di [[:$1]] ndicati ccà â storia di [[:$2]]. Usari la colunna cu li pulsanti di opzioni pi junciri tutti li rivisioni finu â data e ura ndicati. Talìa ca si venunu usati li pulsanti di navigazzioni, la colonna di li pulsanti di opzioni veni azzirata.",
-       "mergehistory-go": "Vidi li canciamenti ca ponu essiri junciuti",
-       "mergehistory-submit": "Junci li rivisioni",
-       "mergehistory-empty": "Nudda rivisioni da junciri.",
-       "mergehistory-success": "{{PLURAL:$3|Na rivisioni di [[:$1]] fu junciuta|$3 rivisioni di [[:$1]] sunu stati junciuti}} â storia di [[:$2]].",
-       "mergehistory-fail": "Impossibbili junciri li storii. Virificari la pàggina e li parametri temporali.",
-       "mergehistory-no-source": "La pàggina di origgini $1 nun esisti.",
+       "mergehistory-list": "Crunuluggìa chi' si po' jùnciri",
+       "mergehistory-merge": "Si pònnu jùnciri li virsioni di [[:$1]] nnicati ccassutta â crunuluggìa di [[:$2]].\nAdòpira la culonna chî buttuni di opzioni pi' jùnciri sulu li virsioni fatti nfina â data e l'ura spicificati.\nGuàrditi ca s'adòpiri culligamenti di navigazzioni la culonna veni azzirata.",
+       "mergehistory-go": "Vidi li canciamenti ca ponnu èssiri junciuti",
+       "mergehistory-submit": "Junci li virsioni",
+       "mergehistory-empty": "Nudda virsioni di jùnciri.",
+       "mergehistory-success": "$3 {{PLURAL:$3|virsioni di [[:$1]] fu' junciuta|$3 virsioni di [[:$1]] furu junciuti}} â crunuluggìa di [[:$2]].",
+       "mergehistory-fail": "Nun fu' pussìbbili jùnciri li crunuluggìi, pi' favuri cuntrolla n'autra vota li paràmitri chi' spicìficunu li pàggini e li dati.",
+       "mergehistory-fail-toobig": "Nun fu' pussìbbili jùnciri li crunuluggìi picchì s'avìssuru a' spustari cchiu' ssai virsioni dû limiti chi' è $1.",
+       "mergehistory-no-source": "La pàggina d'orìggini $1 nun esisti.",
        "mergehistory-no-destination": "La pàggina di distinazzioni $1 nun esisti.",
-       "mergehistory-invalid-source": "La pàggina di origgini havi aviri nu titulu currettu.",
-       "mergehistory-invalid-destination": "La pàggina di distinazzioni havi aviri nu tìtulu currettu.",
-       "mergehistory-autocomment": "Unioni di [[:$1]] ni [[:$2]]",
-       "mergehistory-comment": "Unioni di [[:$1]] in [[:$2]]: $3",
-       "mergehistory-same-destination": "Li pàggini d'urìggini e di distinazioni non ponnu èssiri la stissa",
+       "mergehistory-invalid-source": "La pàggina d'orìggini havi a' aviri nu tìtulu vàlidu.",
+       "mergehistory-invalid-destination": "La pàggina di distinazzioni havi a' aviri nu tìtulu vàlidu.",
+       "mergehistory-autocomment": "Junciuta la crunuluggìa di [[:$1]] a' chidda di [[:$2]]",
+       "mergehistory-comment": "Junciuta la crunuluggìa di [[:$1]] a' chidda di [[:$2]]: $3",
+       "mergehistory-same-destination": "Li pàggini d'orìggini e di distinazioni nun ponnu èssiri la stissa",
        "mergehistory-reason": "Mutivu:",
-       "mergelog": "Log d'unioni",
-       "revertmerge": "Annulla unioni",
-       "mergelogpagetext": "Appressu veni ammustrata na lista dî operazioni cchiù ricenti di unioni dâ storia di na pàggina ni n'autra.",
-       "history-title": "$1: crunoluggìa dî canciamenti",
-       "difference-title": "$1: diffirenzi ntra li virsiuni",
-       "lineno": "Lìnia $1:",
-       "compareselectedversions": "Fari lu paraguni",
-       "showhideselectedversions": "Ammustra/ammuccia virsioni silizziunati",
+       "mergelog": "Riggìstru dî junciuti",
+       "revertmerge": "Annulla la junciuta",
+       "mergelogpagetext": "Appressu veni ammustrata na lista dî junciuti cchiu' ricenti dâ crunuluggìa di na pàggina cu' chidda di n'autra.",
+       "history-title": "Crunuluggìa dî canciamenti di \"$1\"",
+       "difference-title": "Cunfruntu tra virsioni di \"$1\"",
+       "difference-title-multipage": "Cunfruntu tra dî pàggini \"$1\" e \"$2\"",
+       "difference-multipage": "(Diffirenza tra dî pàggini)",
+       "lineno": "Riga $1:",
+       "compareselectedversions": "Cunfronta li virsioni scigghiuti",
+       "showhideselectedversions": "Cancia la visibbilità dî virsioni scigghiuti",
        "editundo": "annulla",
-       "searchresults": "Risurtati dâ circata",
-       "searchresults-title": "Risurtati dâ circata di \"$1\"",
-       "titlematches": "Ntê tìtuli di l'artìculi",
-       "textmatches": "Ntô testu di l'artìculi",
+       "diff-empty": "(Nudda diffirenza)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} dû stissu utenti nun {{PLURAL:$1|mustrata|mustrati}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di {{PLURAL:$2|n'autru utenti|autri $2 utenti}} nun {{PLURAL:$1|mustrata|mustrati}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di cchiu' ssai di {{PLURAL:$2|n'autru utenti|autri $2 utenti}} nun {{PLURAL:$1|mustrata|mustrati}})",
+       "difference-missing-revision": "{{PLURAL:$2|Na virsioni|$2 virsioni}} di sta diffirenza ($1) {{PLURAL:$2|nun fu' truvata|nun furu truvati}}.\n\nStu fattu di sòlitu succedi quannu si segui nu culligamentu di diffirenza versu na pàggina chi' fu' cancillata.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "searchresults": "Risurtati dâ risciduta",
+       "searchresults-title": "Risurtati dâ risciduta di \"$1\"",
+       "titlematches": "Currispunnenzi ntê tìtuli dî pàggini",
+       "textmatches": "Currispunnenzi ntô testu dî pàggini",
        "notextmatches": "Nudda currispunnenza ntô testu dî pàggini",
        "prevn": "li pricidenti {{PLURAL:$1|$1}}",
        "nextn": "li pròssimi {{PLURAL:$1|$1}}",
        "shown-title": "Ammustra {{PLURAL:$1|nu risultatu|$1 risultati}} pi pàggina",
        "viewprevnext": "Talìa ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "* Pàggina '''[[$1]]'''",
-       "searchmenu-new": "'''Crea la pàggina \"[[:$1]]\" supra sta wiki!'''",
+       "searchmenu-new": "<strong>Crea la pàggina \"[[:$1]]\" supra a' sta wiki!<strong> {{PLURAL:$2|0=|Talìa macari la pàggina truvata câ to risciduta.|Talìa macari li risultati dâ to risciduta.}}",
        "searchprofile-articles": "Pàggini di cuntinutu",
-       "searchprofile-images": "Multimedia",
+       "searchprofile-images": "File Multimidiali",
        "searchprofile-everything": "Tuttu",
        "searchprofile-advanced": "Avanzata",
-       "searchprofile-articles-tooltip": "Cerca nti $1",
+       "searchprofile-articles-tooltip": "Cerca nta $1",
        "searchprofile-images-tooltip": "Cerca file",
        "searchprofile-everything-tooltip": "Cerca unnegghiè (puru ntî pàggini di discussioni)",
        "searchprofile-advanced-tooltip": "Cerca ntê namespace pirsunalizzati",
        "search-result-size": "$1 ({{PLURAL:$2|na parola|$2 paroli}})",
        "search-result-category-size": "{{PLURAL:$1|1 utenti|$1 utenti}} ({{PLURAL:$2|1 suttacatigurìa|$2 suttacatigurìi}}, {{PLURAL:$3|1 file|$3 files}})",
-       "search-redirect": "(redirect $1)",
+       "search-redirect": "(rimannu di $1)",
        "search-section": "(sizzioni $1)",
+       "search-category": "(catigurìa $1)",
+       "search-file-match": "(currispunnenza ntô cuntinutu dûn file)",
        "search-suggest": "Forsi circavutu: $1",
        "search-interwiki-caption": "Pruggetti frati",
-       "search-interwiki-default": "Risultati da $1:",
+       "search-interwiki-default": "Risultati di $1:",
        "search-interwiki-more": "(cchiù)",
        "search-relatedarticle": "Risultati currilati",
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
+       "showingresultsinrange": "Ccassutta {{PLURAL:$1|è ammustratu <strong>1</strong> risultatu|sunnu ammustrati <strong>$1</strong> risultati}} nta l'intirvallu di #<strong>$2</strong> a' #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Risultatu <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca ntê namespace:",
-       "powersearch-togglelabel": "Silizziona:",
+       "powersearch-togglelabel": "Scègghîli:",
        "powersearch-toggleall": "Tutti",
        "powersearch-togglenone": "Nuddu",
+       "powersearch-remember": "Ricòrditi la scelta pî risciduti futuri",
        "search-external": "Ricerca sterna",
        "searchdisabled": "La circata nterna di {{SITENAME}} hà statu disabbilitata. Nta stu mentri, poi usari la circata supra Google o supra àutri muturi di circata. Accura ca li sò ìnnici dê cuntinuti di {{SITENAME}} ponnu nun èssiri aggiurnati.",
-       "preferences": "prifirenzi",
-       "mypreferences": "Li mè prifirenzi",
-       "prefs-edits": "Nùmmuru di canciamenti:",
-       "prefs-skin": "Aspettu",
+       "search-error": "Mmattìu n'erruri duranti a risciduta: $1",
+       "preferences": "Prifirenzi",
+       "mypreferences": "Li me prifirenzi",
+       "prefs-edits": "Nùmmiru di canciamenti:",
+       "prefsnologintext2": "Hâ' tràsiri pi' canciari i to prifirenzi.",
+       "prefs-skin": "Peddi",
        "skin-preview": "Antiprima",
        "datedefault": "Nudda prifirenza",
-       "prefs-labs": "Funziunalità dî labboratoria",
-       "prefs-personal": "Prufilu utenti",
+       "prefs-labs": "Funziunalità dî labburatorî",
+       "prefs-user-pages": "Pàggini di l'utenti",
+       "prefs-personal": "Prufilu di l'utenti",
        "prefs-rc": "Ùrtimi canciamenti",
-       "prefs-watchlist": "Ossirvati spiciali",
-       "prefs-watchlist-days": "Nùmmiru di jorna ammustrati nta l'ossirvati spiciali:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-       "prefs-watchlist-edits": "Nùmmaru di canciamenti a ammustrari cu li funzioni avanzati:",
-       "prefs-watchlist-edits-max": "(nùmmaru màssimu: 1000)",
-       "prefs-watchlist-token": "Token lista taliata mia",
-       "prefs-misc": "Vari",
+       "prefs-watchlist": "Lista talïata",
+       "prefs-watchlist-days": "Nùmmiru di jorna a' ammustrari ntâ lista talïata:",
+       "prefs-watchlist-days-max": "Màssimu $1 {{PLURAL:$1|jornu|jorna}}",
+       "prefs-watchlist-edits": "Nùmmiru di canciamenti a' ammustrari ntâ lista talïata estinnuta:",
+       "prefs-watchlist-edits-max": "Nùmmiru màssimu: 1000",
+       "prefs-watchlist-token": "Token dâ me lista talïata:",
+       "prefs-misc": "Varî",
        "prefs-resetpass": "Cancia password",
-       "prefs-email": "Opzioni email",
+       "prefs-changeemail": "Cancia nnirizzu di posta elittrònica",
+       "prefs-setemail": "Mposta nu nnirizzu di posta elittrònica",
+       "prefs-email": "Opzioni di posta elittrònica",
        "prefs-rendering": "Aspettu",
-       "saveprefs": "Sarva li prifirenzi",
-       "restoreprefs": "Ripristina li mpustazzioni di default",
-       "prefs-editing": "Cancia",
+       "saveprefs": "Sarva",
+       "restoreprefs": "Riprìstina tutti li mpustazzioni pridifinuti (nta tutti li sizzioni)",
+       "prefs-editing": "Canciamentu",
        "rows": "Righi:",
        "columns": "Culonni:",
-       "searchresultshead": "Circata",
+       "searchresultshead": "Risciduta",
        "stub-threshold": "Valuri minimu pî <a href=\"#\" class=\"stub\">liami a li stub</a>:",
-       "stub-threshold-disabled": "Disabbìlitatu",
-       "recentchangesdays": "Nùmmuru di jorna a ammustrari nte l'urtimi cancaiamenti:",
+       "stub-threshold-disabled": "Disattivatu",
+       "recentchangesdays": "Nùmmiru di jorna a' ammustrari nta l'ùrtimi cancaiamenti:",
        "recentchangesdays-max": "(màssimu $1 {{PLURAL:$1|jornu|jorna}})",
-       "recentchangescount": "Nùmmiru di canciamenti da ammustrari di default:",
-       "prefs-help-recentchangescount": "Ciò includi li canciamenti ricenti, storii e riggistri.",
-       "savedprefs": "Li tò prifirenzi foru sarvati.",
-       "timezonelegend": "Fusu orariu:",
-       "localtime": "Uràriu lucali",
-       "timezoneuseserverdefault": "Usa uràriu dû server",
+       "recentchangescount": "Nùmmiru di canciamenti a' ammustrari comu mpustazzioni pridifinuta:",
+       "prefs-help-recentchangescount": "Si rifirisci a' l'ùrtimi canciamenti, li crunuluggìi e li riggistra.",
+       "prefs-help-watchlist-token2": "Chista è la chiavi sigreta pû feed web dâ to lista talïata.\nCu è jè ch'a canusci po' lèggiri la to lista talïata, dunca nâ diffunniri.\nSi' ti giuva, [[Special:ResetTokens|la poi azzirari]].",
+       "savedprefs": "Li to prifirenzi foru sarvati.",
+       "timezonelegend": "Fusu urariu:",
+       "localtime": "Ura lucali:",
+       "timezoneuseserverdefault": "Adòpira l'ura pridifinuta dâ wiki ($1)",
        "timezoneuseoffset": "Àutru (spicificari diffirenza)",
-       "servertime": "Uràriu dû server",
-       "guesstimezone": "Usa l'ura dû tò browser",
-       "timezoneregion-africa": "Africa",
-       "timezoneregion-america": "America",
-       "timezoneregion-antarctica": "Antartide",
-       "timezoneregion-arctic": "Artide",
+       "servertime": "Ura dû server:",
+       "guesstimezone": "Pigghia chidda dû to browser",
+       "timezoneregion-africa": "Àfrica",
+       "timezoneregion-america": "Amèrica",
+       "timezoneregion-antarctica": "Antàrtidi",
+       "timezoneregion-arctic": "Àrtidi",
        "timezoneregion-asia": "Asia",
-       "timezoneregion-atlantic": "Oceanu Atlantico",
+       "timezoneregion-atlantic": "Ocèanu Atlànticu",
        "timezoneregion-australia": "Australia",
        "timezoneregion-europe": "Europa",
-       "timezoneregion-indian": "Oceanu Indianu",
-       "timezoneregion-pacific": "Oceanu Pacificu",
-       "allowemail": "Cunzenti la ricezzioni di e-mail di àutri utenti",
-       "prefs-searchoptions": "Opzioni di circata",
+       "timezoneregion-indian": "Ocèanu Innianu",
+       "timezoneregion-pacific": "Ocèanu Pacìficu",
+       "allowemail": "Cunzenti la ricizzioni di posta elittrònica di l'autri utenti",
+       "prefs-searchoptions": "Risciduta",
        "prefs-namespaces": "Namespace",
-       "default": "pridifinitu",
-       "prefs-files": "Mmàggini",
-       "prefs-custom-css": "CSS personalizzatu",
-       "prefs-custom-js": "JS personalizzatu",
-       "prefs-reset-intro": "È pussibili usari sta pàggina pi reimpustari li propri prifirenzi a chiddi pridifiniti dô situ.\nL'operazioni nun pò èssiri annullata.",
-       "prefs-emailconfirm-label": "Conferma dâ e-mail:",
-       "youremail": "Lu tò nnirizzu email:",
-       "username": "Nomu d'utenti:",
-       "prefs-memberingroups": "Cumpunenti {{PLURAL:$1|dû gruppu|dî gruppi}}:",
-       "prefs-registration": "Data di riggistrazioni:",
-       "yourrealname": "Lu tò nomu veru*",
-       "yourlanguage": "Lingua dâ nterfaccia:",
-       "yourvariant": "Varianti:",
-       "yournick": "Suprannomu (nickname):",
-       "prefs-help-signature": "Li cummenta nê pàggini di discussioni hanu essiri firmata cu \"<nowiki>~~~~</nowiki>\" ca virrannu cunvirtuta nâ propria firma cu appressu la data.",
-       "badsig": "Erruri ntâ firma nun standard, virificari li tag HTML.",
-       "badsiglength": "Lu Nickname è troppu longu. Nun pò aviri cchiù di $1 {{PLURAL:$1|caràttiri|caràttiri}}.",
-       "yourgender": "Geniri:",
-       "gender-unknown": "Nun specificatu",
-       "gender-male": "Masculu",
-       "gender-female": "Fimmina",
-       "prefs-help-gender": "Opzionali: cunsenti di adattari li missaggi dô software in funzioni dô generi d'utenti. Sta nfurmazioni sarà pubblica.",
-       "email": "Nnirizzu email",
-       "prefs-help-realname": "* Nomu veru (upziunali): siddu scegghi di furnìrilu veni usatu pi dàriti crèditu dû tò travagghiu.",
-       "prefs-help-email": "Lu nnirizzu e-mail è facurtativu, ma è abbisugnatu pi risittari la password, ntô casu n cui è scurdata.",
-       "prefs-help-email-others": "Putiti videmma scegghiri di pirmèttiri ca l'autri ti cuntattanu pi posta elittronica cu nu culligamentu di la tò pàggina d'utilizzaturi o di discussioni. Lu tò nnirizzu nun veni rivilatu quannu l'àutri utilizzatura ti cuntattanu.",
-       "prefs-help-email-required": "Lu nnirizzu email è nicissariu.",
-       "prefs-info": "Informazzioni di basi",
-       "prefs-i18n": "Internazionalizzazioni",
+       "default": "pridifinutu",
+       "prefs-files": "File",
+       "prefs-custom-css": "CSS pirsunalizzatu",
+       "prefs-custom-js": "JavaScript pirsunalizzatu",
+       "prefs-common-css-js": "CSS/JavaScript cunnivisu tra tutti li peddi:",
+       "prefs-reset-intro": "Poi adupirari sta pàggina pi' azzirari li to prifirenzi a' chiddi pridifinuti dû situ.\nSt'opirazzioni nun si po' annullari doppu ch'è fatta.",
+       "prefs-emailconfirm-label": "Cunvàlida dâ posta elittrònica:",
+       "youremail": "Nnirizzu di posta elittrònica:",
+       "username": "{{GENDER:$1|Nomu utenti}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membru|Membra}} {{PLURAL:$1|dû gruppu|dî gruppi}}:",
+       "prefs-registration": "Data dâ riggistrazioni:",
+       "yourrealname": "Nomu veru:",
+       "yourlanguage": "Lingua:",
+       "yourvariant": "Varianti dâ lingua pû cuntinutu:",
+       "prefs-help-variant": "L'ortugrafìa o varianti dâ lingua chi' prifirisci pi' mmustrari lu cuntinutu dî pàggini di sta wiki.",
+       "yournick": "Firma nova:",
+       "prefs-help-signature": "Li cummenta ntê pàggini di discussioni s'avìssiru a' firmari cu' \"<nowiki>~~~~</nowiki>\", ca veni cunvirtutu ntâ to firma cu' appressu la data.",
+       "badsig": "Firma grezza nun vàlida.\nCuntrolla l'etichetti HTML.",
+       "badsiglength": "La to firma è troppu longa.\nNun havi a' èssiri cchiu' longa di $1 {{PLURAL:$1|caràttiri|caràttiri}}.",
+       "yourgender": "Comu prifirisci èssiri discrivutu?",
+       "gender-unknown": "Nô vogghiu diri",
+       "gender-male": "N'auturi di pàggini dâ wiki",
+       "gender-female": "N'autrici di pàggini dâ wiki",
+       "prefs-help-gender": "Mpustari sta prifirenza è facultativu.\nU software adòpira u so valuri pi' parrari cu' tia, e di tia a' l'autri, facennu usu dû gèniri grammaticali currettu.\nSta nfurmazzioni sarravi pùbblica.",
+       "email": "Nnirizzu di posta elittrònica",
+       "prefs-help-realname": "Lu nomu veru è facultativu.\nSiddu scegghî di furnìrilu, veni adupiratu pi' dàriti crèditu dû tò travagghiu.",
+       "prefs-help-email": "Lu nnirizzu di posta elittrònica è facultativu, ma po' giuvari p'azzirari la password, ntô casu chi' tâ scordi.",
+       "prefs-help-email-others": "Poi videmma scègghîri di pirmèttiri ca l'autri ti cuntàttanu pi' posta elittrònica a' pàrtiri di culligamenti chi' si tròvanu ntê to pàggini d'utenti o di discussioni.\nLu tò nnirizzu nun veni rivilatu quannu l'àutri utenti ti cuntattanu.",
+       "prefs-help-email-required": "Lu nnirizzu di posta elittrònica è obbligatoriu.",
+       "prefs-info": "Nfurmazzioni essinziali",
+       "prefs-i18n": "Intirnazziunalizzazioni",
        "prefs-signature": "Firma",
-       "prefs-dateformat": "Furmatu data",
-       "prefs-timeoffset": "Uri di diffirenza",
-       "prefs-advancedediting": "Opzioni avanzati",
+       "prefs-dateformat": "Furmatu dâ data",
+       "prefs-timeoffset": "Diffirenza d'urariu",
+       "prefs-advancedediting": "Opzioni ginirali",
+       "prefs-editor": "Casedda di canciamentu",
+       "prefs-preview": "Antiprima",
        "prefs-advancedrc": "Opzioni avanzati",
        "prefs-advancedrendering": "Opzioni avanzati",
        "prefs-advancedsearchoptions": "Opzioni avanzati",
        "prefs-advancedwatchlist": "Opzioni avanzati",
-       "prefs-displayrc": "Opzioni di visualizzazioni",
+       "prefs-displayrc": "Opzioni di visualizzazzioni",
+       "prefs-displaywatchlist": "Opzioni di visualizzazzioni",
+       "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diffirenzi",
-       "userrights": "Gistioni dî dritti utenti",
+       "prefs-help-prefershttps": "Sta prifirenza faravi effettu â to pròssima trasuta.",
+       "prefswarning-warning": "Hai fattu canciamenti ê to prifirenzi chi' ancora nun furu sarvati.\nSi' ti nni vai di sta pàggina senza carcari \"$1\" i to prifirenzi nun sarannu sarvati.",
+       "prefs-tabs-navigation-hint": "Cunsigghiu: Poi adupirari i buttuni fileccia manca e' dritta pi' navigari tra dî linguetti ntâ lista.",
+       "email-address-validity-valid": "U nnirizzu e-mail pari bonu",
+       "email-address-validity-invalid": "Nsirisci nu nnirizzu e-mail bonu",
+       "userrights": "Gistioni dî dritti di l'utenti",
        "userrights-lookup-user": "Gistisci li gruppi di l'utenti",
-       "userrights-user-editname": "Trasi nu nomu d'utenti:",
-       "editusergroup": "Cancia gruppi utenti",
-       "editinguser": "Canciamentu dî dritti di l'utenti '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+       "userrights-user-editname": "Metti nu nomu utenti:",
+       "editusergroup": "Cancia li gruppi di l'utenti",
+       "editinguser": "Canciamentu dî dritti di l'utenti <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Cancia li gruppi di l'utenti",
-       "saveusergroups": "Sarva gruppi utenti",
+       "saveusergroups": "Sarva li gruppi di l'utenti",
        "userrights-groupsmember": "Membru di:",
-       "userrights-groups-help": "È pussibili canciari li gruppi cui è assegnatu l'utenti.\n* Na casedda di spunta silizzionata ndica l'appartinenza dill'utenti ô gruppu\n* Na casedda di spunta nun silizzionata ndica la sou mancata appartinenza ô gruppu.\n* Lu simbulu * ndica ca nun è pussibili livari l'appartinenza ô gruppo dopo avirla junciuta (o vici versa).",
+       "userrights-groupsmember-auto": "Membru implìcitu di:",
+       "userrights-groups-help": "Poi canciari li gruppi unni è assignatu l'utenti:\n* Na casedda scigghiuta voli diri chi' l'utenti fa' parti dû gruppu.\n* Na casedda nun scigghiuta voli diri chi' l'utenti nun fa' parti dû gruppu.\n* Lu sìmmulu * voli diri chi' nun si po' cchiu' luvari l'utenti dûn gruppu na vota chi' fu' agghiunciutu, o vici versa.",
        "userrights-reason": "Mutivu:",
-       "userrights-no-interwiki": "Nun si disponi di li pirmessi nicissari pi canciari li diritti di l'utenti ni autri siti.",
-       "userrights-nodatabase": "Lu database $1 nu esisti o nun è lu database locali.",
-       "userrights-nologin": "Pi assignari li diritti di l'utenti è nicissariu [[Special:UserLogin|trasiri]] comu amministraturi.",
-       "userrights-notallowed": "L'utenti nun disponi dê pirmessi nicissari pi assignari diritti all'utenti.",
-       "userrights-changeable-col": "Gruppi canciabili",
-       "userrights-unchangeable-col": "Gruppi nun canciabili",
+       "userrights-no-interwiki": "Nun hai lu pirmissu di canciari li dritti di l'utenti nta l'autri wiki.",
+       "userrights-nodatabase": "La basi di dati $1 nun esisti o nun è lucali.",
+       "userrights-nologin": "Hâ' [[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 livàri diritti 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 cunfirma li to canciamenti.",
+       "userrights-removed-self": "Riniscisti a' livàriti li to stissi dritti. Pi' chistu, nun hai cchiu' l'accessu a' sta pàggina.",
        "group": "Gruppu:",
        "group-user": "Utenti",
-       "group-autoconfirmed": "Utenti autocunfirmati",
+       "group-autoconfirmed": "Utenti autu-cunfirmati",
        "group-bot": "Bot",
        "group-sysop": "Amministratura",
        "group-bureaucrat": "Buròcrati",
-       "group-suppress": "Oversight",
-       "group-all": "Utenti",
-       "group-user-member": "Utenti",
-       "group-autoconfirmed-member": "Utenti autocunfirmatu",
-       "group-bot-member": "Bot",
-       "group-sysop-member": "Amministraturi",
-       "group-bureaucrat-member": "Buròcrati",
-       "group-suppress-member": "Oversight",
+       "group-suppress": "Supravisura",
+       "group-all": "(tutti)",
+       "group-user-member": "{{GENDER:$1|utenti}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|utenti autu-cunfirmatu|utenti autu-cunfirmata}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|amministraturi|amministratrici}}",
+       "group-bureaucrat-member": "{{GENDER:$1|buròcrati}}",
+       "group-suppress-member": "{{GENDER:$1|supravisuri|supravisura}}",
        "grouppage-user": "{{ns:project}}:Utenti",
-       "grouppage-autoconfirmed": "{{ns:project}}:Utenti autocunfirmati",
+       "grouppage-autoconfirmed": "{{ns:project}}:Utenti autu-cunfirmati",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Amministratura",
        "grouppage-bureaucrat": "{{ns:project}}:Buròcrati",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
-       "right-read": "Leggi pàggini",
-       "right-edit": "Cancia pàggini",
-       "right-createpage": "Crea pàggini",
-       "right-createtalk": "Crea pàggini di discussioni",
-       "right-createaccount": "Crea novi account utenti",
-       "right-minoredit": "Segna li canciamenti comu nichi",
-       "right-move": "Sposta pàggini",
-       "right-move-subpages": "Sposta li pàggini nzemi a li rilativi suttapàggini",
-       "right-move-rootuserpages": "Canciari li pàggini di l'utilizzaturi dâ ràdica",
-       "right-movefile": "Movi file",
-       "right-suppressredirect": "Cancella nu redirect quannu sposti na pàggina a du tìtulu",
-       "right-upload": "Carica file",
-       "right-reupload": "Sovrascrivi nu file esistenti",
-       "right-reupload-own": "Sovrascrivi nu file esistenti caricatu dô stissu utenti",
-       "right-reupload-shared": "Suprascrivi lucalmenti file prisenti nta l'archìviu cunnivisu",
-       "right-upload_by_url": "Carica nu file da nu ndirizzu URL",
-       "right-purge": "Purga la cache dû situ senza cunfirma",
-       "right-autoconfirmed": "Cancia pàggini semiprotetti",
-       "right-bot": "A trattari comu prucessu autumàticu",
-       "right-nominornewtalk": "Fa di manera tali chi li canci nichi nun fannu cumpàriri l'avvisu di misaggiu novu.",
-       "right-apihighlimits": "Usa limiti cchiù àuti pi li ntirrugazzioni API",
-       "right-writeapi": "Usa l'API pi canciari lu wiki",
-       "right-delete": "Scancella pàggini",
-       "right-bigdelete": "Scancella pàggini cu la storia longa",
-       "right-deleterevision": "Ammuccia e ammustra canci spicìfichi dî pàggini",
-       "right-deletedhistory": "Visualizza li rivisioni dâ crunuluggìa cancillati senza lu testu assuciatu",
-       "right-browsearchive": "Talìa pàggini cancillati",
-       "right-undelete": "Riprìstina na pàggina",
-       "right-suppressrevision": "Ritalìa e riprìstina virsioni ammucciati",
-       "right-suppressionlog": "Talìa li log privati",
-       "right-block": "Blocca li canciamenti da parti di autri utenti",
-       "right-blockemail": "Mpidisci a n'utilizzaturi di mannari na mail",
-       "right-hideuser": "Blocca nu nomu d'utilizzaturi, ammucciannulu ô pùbblicu",
-       "right-ipblock-exempt": "Gnura li bloccatini di l'IP, chiddi autumàtici e chiddi di range di IP",
-       "right-proxyunbannable": "Sàuta li blocchi supra li proxy",
-       "right-protect": "Cancia li livedda di prutizzioni",
-       "right-editprotected": "Cancia li pàggini prutiggiuti",
-       "right-editinterface": "Cancia la ntirfaccia utilizzaturi",
-       "right-editusercssjs": "Cancia li file CSS e JS di àutri utilizzatura",
-       "right-editusercss": "Cancia li file CSS di àutri utilizzatura",
-       "right-edituserjs": "Cancia li file JS di àutri utilizzatura",
-       "right-rollback": "Canciu n'arreri ràpidu pi l'utilizzaturi chi canciau na pàggina particulari",
-       "right-markbotedits": "Marca li canci spicìfichi comu bot",
-       "right-noratelimit": "Nun suggettu ô limiti di azzioni",
-       "right-import": "Mpùrta pàggini di àutri wiki",
-       "right-importupload": "Mpùrta pàggini di nu carricamentu di file",
-       "right-patrol": "Marca li canci di àutri utilizzatura comu virificati",
-       "right-autopatrol": "Marca autumaticamenti li sò canci comu virificati",
-       "right-patrolmarks": "Usa la funzioni di virifica di l'ùrtimi canci",
-       "right-unwatchedpages": "Visualizza na lista di pàggini nun taliati",
-       "right-mergehistory": "Funni la crunuluggìa dî pàggini",
-       "right-userrights": "Cancia tutti li diritta di l'utilizzaturi",
-       "right-userrights-interwiki": "Cancia li diritti di l'utilizzatura di àutri wiki",
-       "right-siteadmin": "Blocca a sblocca lu databasi",
-       "right-override-export-depth": "Esporta pàggini cumpresi li pàggini culligati finu ô quintu liveddu",
-       "newuserlogpage": "Novi utenti",
-       "newuserlogpagetext": "Di sècutu vènunu elincati li criazzioni di cunti novi (account).",
-       "rightslog": "Dritti di l'utenti",
-       "rightslogtext": "Chistu è un log dî canciamenti a li dritti di l'utenti.",
+       "grouppage-suppress": "{{ns:project}}:Supravisura",
+       "right-read": "Lèggiri pàggini",
+       "right-edit": "Canciari pàggini",
+       "right-createpage": "Crïari pàggini (chi' nun sunnu di discussioni)",
+       "right-createtalk": "Crïari pàggini di discussioni",
+       "right-createaccount": "Crïari cunti novi di l'utenti",
+       "right-minoredit": "Marcari canciamenti comu nichi",
+       "right-move": "Spustari pàggini",
+       "right-move-subpages": "Spustari pàggini chî so suttapàggini",
+       "right-move-rootuserpages": "Spustari pàggini ràdica di l'utenti",
+       "right-move-categorypages": "Spustari pàggini di catigurìa",
+       "right-movefile": "Spustari file",
+       "right-suppressredirect": "Nun crïari rimanni ô postu dâ pàggina origginali quannu si spostunu pàggini",
+       "right-upload": "Carricari file",
+       "right-reupload": "Suprascrìviri file esistenti",
+       "right-reupload-own": "Suprascrìviri file esistenti carricati dû stissu utenti",
+       "right-reupload-shared": "Suprascrìviri lucalmenti file prisenti ntô dipòsitu cunnivisu",
+       "right-upload_by_url": "Carricari file partennu di n'URL",
+       "right-purge": "Svacantari la cache dû situ di na pàggina senza cunfirma",
+       "right-autoconfirmed": "Nun èssiri suggettu ê lìmiti basati supra a' l'IP",
+       "right-bot": "Èssiri trattatu comu nu prucessu autumàticu",
+       "right-nominornewtalk": "Nun fari pàrtiri l'avvisu di misaggiu novu quannu si fannu canciamenti nichi ntê pàggini di discussioni",
+       "right-apihighlimits": "Avìri limiti cchiu' auti pi' li ntirrugazzioni a' menzu API",
+       "right-writeapi": "Aduprirari l'API in scrittura",
+       "right-delete": "Cancillari pàggini",
+       "right-bigdelete": "Cancillari pàggini cu la crunuluggìa longa",
+       "right-deletelogentry": "Cancillari e annullari la cancillazzioni di vuci di riggistru spicìfichi",
+       "right-deleterevision": "Cancillari e annullari la cancillazzioni di virsioni spicìfichi dî pàggini",
+       "right-deletedhistory": "Vìdiri vuci dâ crunuluggìa cancillati, senza dû so testu assuciatu",
+       "right-deletedtext": "Vìdiri lu testu cancillatu e li canciamenti tra dî virsioni cancillati",
+       "right-browsearchive": "Circari pàggini cancillati",
+       "right-undelete": "Annullari la cancillazzioni di pàggini",
+       "right-suppressrevision": "Vìdiri, ammucciari e ammustrari virsioni spicìfichi di pàggini di quali utenti è jè",
+       "right-viewsuppressed": "Vìdiri virsioni ammucciati a' quali utenti è jè",
+       "right-suppressionlog": "Talïari li riggistra privati",
+       "right-block": "Bluccari autri utenti pi' nun fàricci fari canciamenti",
+       "right-blockemail": "Bluccari n'utenti pi' nun fàricci mannari posta elittrònica",
+       "right-hideuser": "Bluccari nu nomu utenti, ammucciannulu ô pùbblicu",
+       "right-ipblock-exempt": "Sautari li blocchi di IP, autumàtici e di ntirvalli di IP",
+       "right-proxyunbannable": "Sautari li blocchi autumàtici dî proxy",
+       "right-unblockself": "Sbluccàrisi iddu stissu",
+       "right-protect": "Canciari li liveddi di prutizzioni e mudificari pàggini prutetti a' cascata",
+       "right-editprotected": "Canciari pàggini cu' prutizzioni \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Canciari pàggini cu' prutizzioni \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Canciari u mudellu di cuntinutu di na pàggina",
+       "right-editinterface": "Canciari la ntirfaccia utenti",
+       "right-editusercssjs": "Canciari li file CSS e JavaScript di l'autri utenti",
+       "right-editusercss": "Canciari li file CSS di l'àutri utenti",
+       "right-edituserjs": "Canciari li file JavaScript di l'àutri utenti",
+       "right-editmyusercss": "Canciari li file CSS dû propiu utenti",
+       "right-editmyuserjs": "Canciari li file JavaScript dû propiu utenti",
+       "right-viewmywatchlist": "Talïari la propia lista talïata",
+       "right-editmywatchlist": "Canciari la propia lista talïata. Nota chi' certi azzioni cci ponnu agghiùnciri pàggini macari senza di stu drittu.",
+       "right-viewmyprivateinfo": "Talïari li propî dati risirvati (ad esempiu lu nnirizzu di posta elittrònica e lu nomu veru)",
+       "right-editmyprivateinfo": "Canciari li propî dati risirvati (ad esempiu lu nnirizzu di posta elittrònica e lu nomu veru)",
+       "right-editmyoptions": "Canciari li propî prifirenzi",
+       "right-rollback": "Canciari lestu n'arreri li mudìfichi di l'ùltimu utenti chi' canciau na certa pàggina",
+       "right-markbotedits": "Marcari li canciamenti n'arreri comu fatti dî bot",
+       "right-noratelimit": "Nun èssiri suggettu ô limiti di azzioni",
+       "right-import": "Mpùrtari pàggini di autri wiki",
+       "right-importupload": "Mpùrtari pàggini di nu carricamentu di file",
+       "right-patrol": "Marcari li canciamenti di l'autri utenti comu battugghiati",
+       "right-autopatrol": "Marcari autumaticamenti li propî canciamenti comu battugghiati",
+       "right-patrolmarks": "Vìdiri li marcaturi di battugghia nta l'ùrtimi canciamenti",
+       "right-unwatchedpages": "Vìdiri na lista dî pàggini chi' nuddu talìa",
+       "right-mergehistory": "Jùnciri la crunuluggìa dî pàggini",
+       "right-userrights": "Canciari tutti li dritti di l'utenti",
+       "right-userrights-interwiki": "Canciari li dritti di l'utenti di autri wiki",
+       "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'autri utenti",
+       "right-passwordreset": "Talïari li missaggi di posta elittrònica d'azziramentu dî password",
+       "newuserlogpage": "Riggistru di l'utenti novi",
+       "newuserlogpagetext": "Chistu è nu riggistru di li crïazzioni di utenti novi.",
+       "rightslog": "Riggistru dî dritti di l'utenti",
+       "rightslogtext": "Chistu è nu riggistru dî canciamenti ê dritti di l'utenti.",
        "action-read": "lèggiri sta pàggina",
        "action-edit": "canciari sta pàggina",
-       "action-createpage": "criari pàggini",
-       "action-createtalk": "creari pàggini di discussioni",
-       "action-createaccount": "creari stu cuntu di utilizzaturi",
-       "action-minoredit": "marcari stu canciu comu nicu",
+       "action-createpage": "crïari pàggini",
+       "action-createtalk": "crïari pàggini di discussioni",
+       "action-createaccount": "crïari stu cuntu di l'utenti",
+       "action-history": "talïari la crunuluggìa di sta pàggina",
+       "action-minoredit": "marcari stu canciamentu comu nicu",
        "action-move": "spustari sta pàggina",
-       "action-move-subpages": "spustari sta pàggina e li rilativi suttapàggini",
-       "action-move-rootuserpages": "spustari li pàggini di utilizzaturi dâ ràdica",
-       "action-movefile": "mòviri chistu file",
+       "action-move-subpages": "spustari sta pàggina e li so suttapàggini",
+       "action-move-rootuserpages": "spustari li pàggini ràdica di l'utenti",
+       "action-move-categorypages": "spustari pàggini di catigurìa",
+       "action-movefile": "spustari stu file",
        "action-upload": "carricari stu file",
-       "action-reupload": "suprascriviri stu file esistenti",
-       "action-reupload-shared": "suprascriviri stu file prisenti nti l'archiviu spartutu",
-       "action-upload_by_url": "carricari stu file di nu nnirizzu URL",
-       "action-writeapi": "usari li API n scrittura",
-       "action-delete": "scancillari sta pàggina",
-       "action-deleterevision": "scancillari sta virsioni",
-       "action-deletedhistory": "talìa la crunuluggìa cancillata di sta pàggina",
-       "action-browsearchive": "cercari pàggini scancillati",
-       "action-undelete": "ricupirari sta pàggina",
-       "action-suppressrevision": "rivìdiri e ripristinari li canci ammucciati",
-       "action-suppressionlog": "visiunari stu log privatu",
-       "action-block": "bluccari stu utenti n scrittura",
-       "action-protect": "cancairi li livedda di prutizzioni pi sta pàggina",
-       "action-import": "mpurtari sta pàggina di n'àutra wiki",
-       "action-importupload": "mpurtari sta pàggina di nu carricamentu di file",
-       "action-patrol": "marcari li canci li l'àutri utilizzatura comu virificati",
-       "action-autopatrol": "marcari li tò canci comu virificati",
-       "action-unwatchedpages": "visiunari la lista dî pàggini nun taliati",
+       "action-reupload": "suprascrìviri stu file esistenti",
+       "action-reupload-shared": "suprascrivìri stu file prisenti ntô dipòsitu cunnivisu",
+       "action-upload_by_url": "carricari stu file di n'URL",
+       "action-writeapi": "adupirari l'API pi' scrìviri",
+       "action-delete": "cancillari sta pàggina",
+       "action-deleterevision": "cancillari sta virsioni",
+       "action-deletedhistory": "talïari la crunuluggìa cancillata di sta pàggina",
+       "action-browsearchive": "circari pàggini cancillati",
+       "action-undelete": "annullari la cancillazzioni di sta pàggina",
+       "action-suppressrevision": "rivìdiri e ripristinari sta virsioni ammucciata",
+       "action-suppressionlog": "vìdiri stu riggìstru privatu",
+       "action-block": "bluccari st'utenti pi' nun fàricci fari canciamenti",
+       "action-protect": "canciari li livedda di prutizzioni di sta pàggina",
+       "action-rollback": "canciari lestu n'arreri li mudìfichi di l'ùltimu utenti chi' canciau na certa pàggina",
+       "action-import": "mpurtari pàggini di n'àutra wiki",
+       "action-importupload": "mpurtari pàggini di nu carricamentu di file",
+       "action-patrol": "marcari li canciamenti di l'autri utenti comu battugghiati",
+       "action-autopatrol": "marcari li tò canci comu battugghiati",
+       "action-unwatchedpages": "vìdiri la lista dî pàggini chi' nuddu talìa",
        "action-mergehistory": "jùnciri la crunuluggìa di sta pàggina",
-       "action-userrights": "canciari tutti li diritti di l'utilizzaturi",
-       "action-userrights-interwiki": "cancia li diritti di l'utenti supra a àutri wiki",
-       "action-siteadmin": "bluccari e sbluccari lu database",
+       "action-userrights": "canciari tutti li dritti di l'utenti",
+       "action-userrights-interwiki": "canciari li dritti di l'utenti supra a autri wiki",
+       "action-siteadmin": "bluccari e sbluccari la basi di dati",
+       "action-sendemail": "mannari missaggi di posta elittrònica",
+       "action-editmywatchlist": "canciari la to lista talïata",
+       "action-viewmywatchlist": "talïari la to lista talïata",
+       "action-viewmyprivateinfo": "talïari li to nfurmazzioni risirvati",
+       "action-editmyprivateinfo": "canciari li to nfurmazzioni risirvati",
+       "action-editcontentmodel": "canciari lu mudellu di cuntinutu di na pàggina",
        "nchanges": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|di l'ùltima vìsita}}",
+       "enhancedrc-history": "crunuluggìa",
        "recentchanges": "Ùrtimi canciamenti",
-       "recentchanges-legend": "Opzioni ùrtimi canciamenti",
-       "recentchanges-summary": "Chista pàggina prisenta li canci cchiù ricenti ê cuntinuti dô situ.",
-       "recentchanges-feed-description": "Stu feed riporta li canciamenti cchiù ricenti a li cuntinuti dû situ.",
-       "recentchanges-label-newpage": "Stu canciu criau na pàggina nova",
+       "recentchanges-legend": "Opzioni pi' l'ùrtimi canciamenti",
+       "recentchanges-summary": "Sta pàggina prisenta li canciamenti cchiu' ricenti ê cuntinuti dâ wiki.",
+       "recentchanges-noresult": "Nuddu canciamentu ntô pirìudu spicificatu currispunni a' sti criteria.",
+       "recentchanges-feed-description": "Stu feed prisenta li canciamenti cchiu' ricenti ê cuntinuti dâ wiki.",
+       "recentchanges-label-newpage": "Stu canciamentu crïau na pàggina nova",
        "recentchanges-label-minor": "Chistu è nu canciamentu nicu",
-       "recentchanges-label-bot": "Stu canciamentu fu fattu dû bot",
-       "recentchanges-label-unpatrolled": "Stu canciamentu nun havi ancora statu virificatu",
-       "recentchanges-label-plusminus": "La diminsioni dâ pàggina canciau di stu nùmmuru di bytes",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (talìa [[Special:NewPages|li pàggini novi]])",
-       "rcnotefrom": "Ccà sutta cci sunnu li canciamenti a pàrtiri dû <b>$2</b> (ammustrati nzinu ô <b>$1</b>).",
-       "rclistfrom": "Ammustra li canciamenti novi a pàrtiri di $3 $2",
+       "recentchanges-label-bot": "Stu canciamentu fu' fattu di nu bot",
+       "recentchanges-label-unpatrolled": "Stu canciamentu ancora nun havi statu battugghiatu",
+       "recentchanges-label-plusminus": "La grannizza dâ pàggina canciau di stu nùmmiru di byte",
+       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (talìa puru [[Special:NewPages|la lista dî pàggini novi]])",
+       "rcnotefrom": "Ccassutta {{PLURAL:$5|cc'è lu canciamentu|cci su' li canciamenti}} a' pàrtiri dû <strong>$3, $4</strong> (nn'havi ammustrati nfina a' <strong>$1</strong>).",
+       "rclistfrom": "Ammustra li canciamenti novi a' pàrtiri dû $3 $2",
        "rcshowhideminor": "$1 li canciamenti nichi",
+       "rcshowhideminor-show": "Ammustra",
+       "rcshowhideminor-hide": "Ammuccia",
        "rcshowhidebots": "$1 li bot",
-       "rcshowhideliu": "$1 l'utilizzatura cû nomu",
-       "rcshowhideanons": "$1 l'utilizzatura anònimi",
-       "rcshowhidepatr": "$1 li canciamenti cuntrullati",
-       "rcshowhidemine": "$1 li mè canciamenti",
+       "rcshowhidebots-show": "Ammustra",
+       "rcshowhidebots-hide": "Ammuccia",
+       "rcshowhideliu": "$1 l'utenti riggistrati",
+       "rcshowhideliu-show": "Ammustra",
+       "rcshowhideliu-hide": "Ammuccia",
+       "rcshowhideanons": "$1 l'utenti anònimi",
+       "rcshowhideanons-show": "Ammustra",
+       "rcshowhideanons-hide": "Ammuccia",
+       "rcshowhidepatr": "$1 li canciamenti battugghiati",
+       "rcshowhidepatr-show": "Ammustra",
+       "rcshowhidepatr-hide": "Ammuccia",
+       "rcshowhidemine": "$1 li me canciamenti",
+       "rcshowhidemine-show": "Ammustra",
+       "rcshowhidemine-hide": "Ammuccia",
        "rclinks": "Ammustra l'ùrtimi $1 canciamenti nta l'ùrtimi $2 jorna <br />$3",
        "diff": "diff",
        "hist": "storia",
-       "hide": "ammuccia",
-       "show": "ammustra",
+       "hide": "Ammuccia",
+       "show": "Ammustra",
        "minoreditletter": "n",
        "newpageletter": "N",
        "boteditletter": "b",
-       "number_of_watching_users_pageview": "[ossirvata di {{PLURAL:$1|nu utenti|$1 utenti}}]",
+       "number_of_watching_users_pageview": "[talïata di {{PLURAL:$1|nu utenti|$1 utenti}}]",
        "rc_categories": "Lìmita a li catigurìi (siparati di \"|\")",
-       "rc_categories_any": "Qualisiasi",
+       "rc_categories_any": "Quali è jè",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} appressu dû canciamentu",
        "newsectionsummary": "/* $1 */ sizzioni nova",
-       "rc-enhanced-expand": "Ammustra dittagghi (addumanna JavaScript)",
-       "rc-enhanced-hide": "Ammuccia dittagghi",
+       "rc-enhanced-expand": "Ammustra li dittagghî",
+       "rc-enhanced-hide": "Ammuccia li dittagghî",
+       "rc-old-title": "crïata ô principiu comu \"$1\"",
        "recentchangeslinked": "Canciamenti culligati",
        "recentchangeslinked-feed": "Canciamenti culligati",
        "recentchangeslinked-toolbox": "Canciamenti culligati",
        "recentchangeslinked-title": "Canciamenti culligati a \"$1\"",
        "recentchangeslinked-summary": "Chista pàggina spiciali ammustra li canciamenti cchiù ricenti ê pàggini culligati a chidda spicificata. Li pàggini taliati ni la tou [[Special:Watchlist|lista taliata]] sunu evidenziati 'n '''grassettu'''.",
-       "recentchangeslinked-page": "Nnomu dâ pàggina:",
-       "recentchangeslinked-to": "Vidi sulu li canciamenti ê pàggini culligati a chidda spicificata",
+       "recentchangeslinked-page": "Nomu dâ pàggina:",
+       "recentchangeslinked-to": "Ammustra sulu li canciamenti ê pàggini culligati a' chidda spicificata",
        "upload": "Càrrica nu file",
        "uploadbtn": "Càrrica",
-       "reuploaddesc": "Torna a lu mòdulu pi lu carricamentu.",
-       "uploadnologin": "Accessu nun effittuatu",
-       "uploadnologintext": "Hai a esèquiri [[Special:UserLogin|lu login]] pi carricari mmàggini o àutri files multimidiali.",
-       "upload_directory_missing": "La directory di upload ($1) nun asisti e non pò èssiri criata dû webserver.",
-       "upload_directory_read_only": "Lu server web nun è n gradu di scrìviri ntâ directory di upload ($1).",
+       "reuploaddesc": "Annulla lu carricamentu e torna a lu mòdulu dî carricamenti",
+       "upload-tryagain": "Manna la discrizzioni canciata dû file",
+       "uploadnologin": "Nun trasutu",
+       "uploadnologintext": "Hâ' $1 pi' putiri carricari file.",
+       "upload_directory_missing": "La cartella dî carricamenti ($1) nun esisti lu server web nun riniscìu a' crïàrila.",
+       "upload_directory_read_only": "La cartella dî carricamenti ($1) nun è scrivìbbili dû server web.",
        "uploaderror": "Erruri ntô carricamentu",
+       "upload-recreate-warning": "<strong>Accura: Nu file cu' ddu nomu fu' cancillatu o spustatu.</strong>\n\nPi' cummudità ccassutta cci su' li riggistra dî cancillazzioni e dî spustamenti di sta pàggina:",
        "uploadtext": "Usa lu mòdulu ccà sutta pi carricari file novi. Pi vìdiri o circari li file già carricati, talìa lu [[Special:FileList|log dî file carricati]]. Carricamenti di file e di virsioni novi di file sunnu riggistrati ntô [[Special:Log/upload|log di l'upload]], li cancillazzioni di file sunnu\nriggistrati [[Special:Log/delete|ccà]].\n\nPi nziriri nu file nta na pàggina, fai nu lijami accussì:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' p'usari la virsioni ntera dû file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testu altirnativu]]</nowiki></code>''' p'usari na virsioni làrica 200 pixel nziruta nta nu box, alliniata a manu manca e cu 'testu altirnativu' comu didascalìa\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pi culligari direttamenti a lu file senza vidìrilu.",
-       "upload-permitted": "Tipi di file cunzintiti: $1.",
+       "upload-permitted": "Tipi di file cunsintuti: $1.",
        "upload-preferred": "Tipi di file cunsigghiati: $1.",
-       "upload-prohibited": "Tipi di file pruibbiti: $1.",
-       "uploadlogpage": "File carricati",
-       "uploadlogpagetext": "Ccà sutta la lista di l'ùrtimi file carricati. Talìa la [[Special:NewFiles|gallarìa dî file novi]] pi na visioni ginirali.",
+       "upload-prohibited": "Tipi di file prüibbiti: $1.",
+       "uploadlogpage": "Riggistru dî file carricati",
+       "uploadlogpagetext": "Ccà sutta cc'è la lista di l'ùrtimi file carricati.\nTalìa la [[Special:NewFiles|gallarìa dî file novi]] pûn risucuntu cchiu' visuali.",
        "filename": "Nomu dû file",
        "filedesc": "Discrizzioni",
-       "fileuploadsummary": "Discrizzioni (auturi, fonti, discrizzioni, licenza d'usu, noti) dû file:",
+       "fileuploadsummary": "Discrizzioni:",
        "filereuploadsummary": "Canciamenti ô file:",
-       "filestatus": "Nfurmazzioni supra lu copyright:",
+       "filestatus": "Statu dû drittu d'auturi:",
        "filesource": "Fonti:",
-       "ignorewarning": "Gnora l'avvisu e sarva comu è gghiè lu file. La virsioni asistenti veni suvrascritta.",
-       "ignorewarnings": "Gnora li missaggi d'avvirtimentu dû sistema",
-       "minlength1": "Lu nomu dô file hà a èssiri cumpostu di armenu na lìttera.",
-       "illegalfilename": "Lu nomu \"$1\" cunteni dî caràttiri nun ammessi ntê tìtuli dî pàggini. Dari a lu file un nomu diversu e pruvari a carricàrilu di novu.",
-       "badfilename": "Lu nomu dû file è statu cummirtutu n \"$1\".",
-       "filetype-badmime": "Nun è cunzintitu carricari file di tipu MIME \"$1\".",
-       "filetype-bad-ie-mime": "Mpussìbbili caricari lu file pirchì Internet Explorer lu canuscissi comu  \"$1\", ca è nu tipu di file disattivatu e ca putissi èssiri piriculusu.",
-       "filetype-unwanted-type": "Caricari file di tipu '''\".$1\"''' è scunsigghiatu. {{PLURAL:$3|Lu tipu di file cunsigghiatu è|Li tipi di file cunsigghiati sunnu}} $2.",
-       "filetype-banned-type": "Caricari file di tipu '''\".$1\"''' non è cunzintitu. {{PLURAL:$3|Lu tipu di file cunzintitu è|Li tipi di file cunzintiti sunnu}} $2.",
-       "filetype-missing": "Lu file è privu d'estinzioni (p'asèmpiu \".jpg\").",
-       "unknown-error": "Ci fù un erruri scanusciutu",
-       "large-file": "Si raccumanna di nun supirari li diminzioni di $1 pi ognunu file; stu file è granni $2.",
-       "largefileserver": "Lu file sùpira li diminzioni cunzintiti dâ cunfigurazzioni dû server.",
-       "emptyfile": "Lu file appena carricatu pari èssiri vacanti. Chistu putissi èssiri duvutu a n'erruri ntô nomu dû file. Virificari ca si ntenni riarmenti carricari stu file.",
-       "fileexists": "Nu file cu stu nomu asisti già, pi favuri cuntrolla <strong>[[:$1]]</strong> siddu nun sî sicuru di vulìrilu suvrascrìviri.\n[[$1|thumb]]",
-       "filepageexists": "La pàggina di discrizzioni di stu file fu ggià criata nnû nnirizzu <strong>[[:$1]]</strong>, macari si ancora non c'è nu file cu stu nomu. La discrizzioni di l'uggettu ca fu misa ntô mentri dû caricamentu non si vidi supra a la pàggina di discussioni. Pi fàrila cumpàriri ntâ pàggina di discussioni, c'è la nicissitati di mudificàrila a manu",
-       "fileexists-extension": "Nu file cu nu nomu simili a chistu esisti già; l'unica diffirenza è l'usu dê maiusculi nte l'estensioni: [[$2|thumb]]\n* Nomu dû file carricatu: <strong>[[:$1]]</strong>\n* Nomu dû file esistenti: <strong>[[:$2]]</strong>\nPi favuri scegghiti n'àutru nomu.",
+       "ignorewarning": "Gnora l'avvisu e sarva lu file lu stissu",
+       "ignorewarnings": "Gnora l'avvirtimenti eventuali",
+       "minlength1": "Li nomi dî file hannu a' èssiri fatti di almenu na lìttra.",
+       "illegalfilename": "Lu nomu dû file \"$1\" cunteni caràttiri chi' nun su' cunsintuti ntê tìtuli dî pàggini.\nPi' favuri cancia nomu ô file e prova e càrriculu n'autra vota.",
+       "filename-toolong": "Li nomi dî file nun ponnu èssiri cchiù' longhi di 240 byte.",
+       "badfilename": "Lu nomu dû file fu' canciatu nta \"$1\".",
+       "filetype-mime-mismatch": "L'estinsioni dû file, \".$1\", nun currispunni ô tipu MIME rilivatu ntô file ($2).",
+       "filetype-badmime": "Nun è cunzintutu di carricari file di tipu MIME \"$1\".",
+       "filetype-bad-ie-mime": "Nun si po' carricari stu file pirchì Internet Explorer lu canuscissi comu \"$1\", ca è nu tipu di file nun cunsintutu e ca putissi èssiri piriculusu.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> è nu tipu di file nun vulutu.\n{{PLURAL:$3|Lu tipu di file cunsigghiatu è|Li tipi di file cunsigghiati sunnu}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|nun è un tipu di file cunsintutu|nun su' tipi di file cunsintuti}}.\n{{PLURAL:$3|U tipu di file cunsintutu è|I tipi di file cunsintuti su'}} $2.",
+       "filetype-missing": "Lu file nun havi estinsioni (ad esempiu \".jpg\").",
+       "empty-file": "Lu file chi' mannasti era vacanti.",
+       "file-too-large": "Lu file chi' mannasti era troppu grossu.",
+       "filename-tooshort": "Lu nomu dû file è troppu curtu.",
+       "filetype-banned": "Stu tipu di file è sbannutu.",
+       "verification-error": "Stu file nun passau â virìfica.",
+       "hookaborted": "Lu canciamentu chi' stavi pruvannu a' fari fu' annullatu di n'estinsioni.",
+       "illegal-filename": "Stu nomu dû file nun è cunsintutu.",
+       "overwrite": "Suprascrìviri nu file chi' già esisti nun è cunsintutu.",
+       "unknown-error": "Mmattìu n'erruri scanusciutu.",
+       "tmp-create-error": "Nun fu' pussìbbili crïari u file timpuraniu.",
+       "tmp-write-error": "Erruri ntâ scrittura dû file timpuraniu.",
+       "large-file": "Si raccumanna di nun passari la grannizza di $1 p'ognin file; stu file è granni $2.",
+       "largefileserver": "Stu file è cchiu' grossu di quantu lu server è cunfiguratu a' accittari.",
+       "emptyfile": "Lu file chi' carricasti pari vacanti.\nChistu putissi èssiri pruvucatu di nu sbagghiu ntô nomu dû file.\nCuntrolla ca pi' davera voi carricari stu file.",
+       "windows-nonascii-filename": "Sta wiki nun supporta i nomi di file cu' caràttiri spiciali.",
+       "fileexists": "Nu file cu' stu nomu già esisti, pi' favuri cuntrolla <strong>[[:$1]]</strong> si' nun si' {{GENDER:|sicuru|sicura}} ch'u voi canciari.\n[[$1|thumb]]",
+       "filepageexists": "La pàggina dâ discrizzioni di stu file fu' ggià crïata ô nnirizzu <strong>[[:$1]]</strong>, ma pi' com'ora nun c'è nuddu file cu' stu nomu.\nU riassuntu chi' immetti nun cumpariravi ntâ pàggina dâ discrizzioni.\nPi' fàrilu cumpàriri, avirrai a' mudificari a' manu dda pàggina.\n[[$1|thumb]]",
+       "fileexists-extension": "Nu file cûn nomu simili già esisti: [[$2|thumb]]\n* Nomu dû file carricannu: <strong>[[:$1]]</strong>\n* Nomu dû file esistenti: <strong>[[:$2]]</strong>\nForsi voi scègghîri un nomu cchiù' distintivu?",
        "fileexists-thumbnail-yes": "Lu file carricato sembra èssiri lu risurtatu di n'antiprima ''(thumbnail)''. [[$1|thumb]]\nVirificari, pi cunfruntu, lu file <strong>[[:$1]]</strong>.\nSiduu si tratta dâ stissa mmagini, nte dimenzioni urigginali, nun è nicissariu carricara àutri antiprimi.",
        "file-thumbnail-no": "Lu nomu dô file accumenza cu <strong>$1</strong>.\nPari quinni èssiri lu risurtatu di n'antiprima ''(thumbnail)''.\nSiddu si disponi dâ mmàggini ntâ risuluzzioni urigginali, si prega di carricàrila. 'N casu cuntrariu, si prega di canciari lu nomu dô file.",
        "fileexists-forbidden": "Nu file cu stu nomu asisti già e nun pò essiri sovrascrittu. Turnari n'arreri e canciari lu nomu cu lu quali carricari lu file. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Nu file cu stu nomu asisti già nta l'archiviu dî risursi multimidiali cundivisi. Siddu voi ancora carricari lu file, pi favuri torna n'arreri e cancia lu nomu ca voi dari a lu file. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Stu file è na copia duppiuni {{PLURAL:$1|dû|dî}} file ccà di sècutu:",
        "file-deleted-duplicate": "Nu file lu stissu comu a chistu file ([[:$1]]) vinni scanciallatu prima di ora. S'aviss'a cuntrullari la stòria e lu picchì dâ scancillazzioni dû file prima di ri-caricàrilu.",
-       "uploadwarning": "Avvisu di Upload",
-       "uploadwarning-text": "Cancia cà sutta la discrizzioni di lu file e prova arré",
-       "savefile": "Sarva file",
-       "uploaddisabled": "Semu spiacenti, ma lu carricamentu di file è timpuraniamenti suspisu.",
-       "uploaddisabledtext": "Lu carricamentu dî file nun è attivu supra a stu situ.",
-       "php-uploaddisabledtext": "Li file PHP non sunnu abbilitati. Pi favuri cuntrolla li mpustazzioni dû file_uploads.",
-       "uploadscripted": "Stu file cunteni còdici HTML o di script, ca putissi èssiri nterpritato erroniamenti d'un browser web.",
-       "uploadvirus": "Lu file cunteni un virus! Ultiriuri nfurmazzioni: $1",
-       "sourcefilename": "Nomu dû file d'orìggini:",
+       "file-deleted-duplicate-notitle": "Nu file idènticu a' chistu hâ statu cancillatu, e u tìtulu fu supprimutu.\nTu avissi a' dumannari a' quarchidunu chi' havi a pussibbilità di vìdiri u cuntinutu dû file suppressu di valutari a situazzioni, prima di prucèdiri a' carricàrilu n'autra vota.",
+       "uploadwarning": "Avvirtimentu pû carricamentu",
+       "uploadwarning-text": "Cancia ccassutta la discrizzioni dû file e prova n'autra vota.",
+       "savefile": "Sarva lu file",
+       "uploaddisabled": "Li carricamenti sunnu disattivati.",
+       "copyuploaddisabled": "Lu carricamentu pi' menzu di URL è disattivatu.",
+       "uploaddisabledtext": "Li carricamenti dî file sunnu disattivati.",
+       "php-uploaddisabledtext": "Li carricamenti dî file sunnu disattivati ntô PHP.\nPi' favuri cuntrolla la mpustazzioni file_uploads.",
+       "uploadscripted": "Stu file cunteni còdici HTML o di script, ca putissi èssiri ntirpitratu erruniamenti d'un browser web.",
+       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunsintutu, \"$1\".",
+       "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 è cunsintutu picchì pirmèttunu d'aggirari li ristrizzioni di sicurezza.",
+       "upload-source": "File surgenti",
+       "sourcefilename": "Nomu dû file surgenti:",
+       "sourceurl": "URL surgenti:",
        "destfilename": "Nomu dû file di distinazzioni:",
        "upload-maxfilesize": "Diminzioni màssima dû file: $1",
+       "upload-description": "Discrizzioni dû file",
+       "upload-options": "Opzioni dû carricamentu",
        "watchthisupload": "Talìa stu file",
        "filewasdeleted": "Nu file cu stu nomu hà statu già carricatu e cancillatu n passatu. Virificari $1 prima di carricàrilu di novu.",
        "filename-bad-prefix": "Lu nomu dô file chi stai carricannu ncigna cu '''\"$1\"''', chi è nu nomu non descrittivu assignatu, di solitu, automaticamenti dê màchini fotugràfici diggitali. Pi favuri scegghia nu nomu cchiù descrtittivu pi lu tò file.",
        "filename-prefix-blacklist": " #<!-- dassa sta lìnia comu è già --> <pre>\n# Chista di sèquitu è la sintassi:\n#   * Tutti li scritti a pàrtiri dô carattiri \"#\" sugnu commenti\n#   * Tutti li lìnii non vacanti sugnu prefissi pi tipici nomi di file assignati automaticamenti dê màchini fotugràfici diggitali\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # arcuni cellulari\nIMG # genericu\nJD # Jenoptik\nMGP # Pentax\nPICT # arcuni\n #</pre> <!-- dassa sta lìnia comu è già -->",
-       "upload-success-subj": "Carricamentu cumplitatu",
+       "upload-success-subj": "Carricamentu rinisciutu",
+       "upload-success-msg": "Lu to carricamentu di [$2] riniscìu. Ccà cc'è lu file carricatu: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Prubblema ntô carricamentu",
+       "upload-failure-msg": "Mmattìu un prubblema ntô to carricamentu di [$2]:\n\n$1",
+       "upload-warning-subj": "Avvirtimentu pû carricamentu",
+       "upload-warning-msg": "Mmattìu un prubblema ntô to carricamentu di [$2]. Poi turnari ô [[Special:Upload/stash/$1|mòdulu di carricamentu]] pi' currèggiri stu prubblema.",
        "upload-proto-error": "Protucollu erratu",
        "upload-proto-error-text": "Pi l'upload rimotu è nicissariu spicificari URL ca nìzzianu cu <code>http://</code> oppuru <code>ftp://</code>.",
        "upload-file-error": "Erruri nternu",
-       "upload-file-error-text": "S'hà virificatu un erruri nternu duranti la criazzioni d'un file timpuràniu supra lu server. Cuntattari un amministraturi di sistema.",
+       "upload-file-error-text": "S'hâ' virificatu n'erruri nternu duranti la crïazzioni dûn file timpuraniu supra Ã´ server.\nPi' favuri cuntatta n'[[Special:ListUsers/sysop|amministraturi di sistema]].",
        "upload-misc-error": "Erruri nun idintificatu pi l'upload",
        "upload-misc-error-text": "S'hà virificatu un erruri nun idintificatu duranti lu carricamentu dû file. Virificari ca la URL è curretta e accissìbbili e pruvari di novu. Siddu lu prubbrema pirsisti, cuntattari un amministraturi di sistema.",
        "upload-too-many-redirects": "L'URL cuntineva troppi redirect",
-       "upload-http-error": "Ci fù n'erruri HTTP: $1",
-       "img-auth-accessdenied": "Nun pò trasiri",
-       "upload-curl-error6": "URL nun ragghiuncìbbili",
-       "upload-curl-error6-text": "Mpussìbbili ragghiùnciri la URL spicificata. Virificari ca la URL è scritta currettamenti e ca lu situ n chistioni è attivu.",
-       "upload-curl-error28": "Tempu scadutu pi l'upload",
-       "upload-curl-error28-text": "Lu situ rimotu hà mpiegatu troppu tempu a arrispùnniri. Virificari ca lu situ è attivu, attènniri quarchi minutu e pruvari di novu, eventuarmenti nta un mumentu di tràfficu nicu.",
+       "upload-http-error": "Mmattìu n'erruri HTTP: $1",
+       "upload-copy-upload-invalid-domain": "Lu carricamentu di copî nun è cunsintutu di stu duminiu.",
+       "backend-fail-stream": "Nun fu' pussìbbili trasmèttiri lu file \"$1\".",
+       "backend-fail-backup": "Nun fu' pussìbbili fari na copia di riserva dû file \"$1\".",
+       "backend-fail-notexists": "Lu file $1 nun esisti.",
+       "backend-fail-hashes": "Nun fu' pussìbbili ottèniri l'hash dî file pi' fari lu cunfrontu.",
+       "backend-fail-notsame": "Già esisti un file nun idènticu a' \"$1\".",
+       "backend-fail-invalidpath": "\"$1\" nun è un caminu d'archiviazzioni vàlidu.",
+       "backend-fail-delete": "Nun fu' pussìbbili cancillari lu file \"$1\".",
+       "backend-fail-describe": "Nun fu' pussìbbili canciari li metadati dû file \"$1\".",
+       "backend-fail-alreadyexists": "Lu file \"$1\" già esisti.",
+       "backend-fail-store": "Nun fu' pussìbbili mimurizzari lu file \"$1\" nta \"$2\".",
+       "backend-fail-copy": "Nun fu' pussìbbili cupiari lu file \"$1\" nta \"$2\".",
+       "backend-fail-move": "Nun fu' pussìbbili spustari lu file \"$1\" nta \"$2\".",
+       "backend-fail-opentemp": "Nun fu' pussìbbili àpriri lu file timpuraniu.",
+       "backend-fail-writetemp": "Nun fu' pussìbbili scrìviri ntô file timpuraniu.",
+       "backend-fail-closetemp": "Nun fu' pussìbbili chiùdiri lu file timpuraniu.",
+       "backend-fail-read": "Nun fu' pussìbbili lèggiri lu file \"$1\".",
+       "backend-fail-create": "Nun fu' pussìbbili scrìviri lu file \"$1\".",
+       "backend-fail-maxsize": "Nun fu' pussìbbili scrìviri lu file \"$1\" picchì è cchiu' grossu di {{PLURAL:$2|un byte|$2 byte}}.",
+       "backend-fail-readonly": "U backend di mimurizzazzioni \"$1\" pi' com'ora è a' sula littura. La spiegazzioni data è: \"<em>$2</em>\"",
+       "backend-fail-synced": "Lu file \"$1\" si trova nta nu statu incoerenti tra dî backend di mimurizzazzioni interni.",
+       "backend-fail-connect": "Nun fu' pussìbbili culligàrisi ô backend di mimurizzazzioni \"$1\".",
+       "backend-fail-internal": "Mmattìu n'erruri scanusciutu ntô backend di mimurizzazzioni \"$1\".",
+       "backend-fail-contenttype": "Nun fu' pussìbbili ditirminari lu tipu di cuntinutu dû file di mimurizzari nta \"$1\".",
+       "backend-fail-batchsize": "U backend di mimurizzazzioni ricivìu na nfurnata di {{PLURAL:$1|una opirazzioni|$1 opirazzioni}} tra file; però lu so lìmiti è di {{PLURAL:$2|na sula opirazzioni|$2 opirazzioni}}.",
+       "backend-fail-usable": "Nun fu' pussìbbili lèggiri o scrìviri lu file \"$1\" pi' causa di pirmissi nsufficienti o cartelli/cuntinituri mancanti.",
+       "filejournal-fail-dbconnect": "Nun fu' pussìbbili culligàrisi â basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
+       "filejournal-fail-dbquery": "Nun fu' pussìbbili aggiurnari la basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
+       "lockmanager-notlocked": "Nun fu' pussìbbili sbluccari \"$1\"; nun è bluccatu.",
+       "lockmanager-fail-closelock": "Nun fu' pussìbbili chiùdiri lu file di bloccu di \"$1\".",
+       "lockmanager-fail-deletelock": "Nun fu' pussìbbili cancillari lu file di bloccu di \"$1\".",
+       "lockmanager-fail-acquirelock": "Nun fu' pussìbbili pigghiari pussèssu dû bloccu di \"$1\".",
+       "lockmanager-fail-openlock": "Nun fu' pussìbbili àpriri lu file di bloccu di \"$1\".",
+       "lockmanager-fail-releaselock": "Nun fu' pussibbili arrènniri lu bloccu di \"$1\".",
+       "lockmanager-fail-db-bucket": "Nun fu' pussìbbili cuntattàri abbastanza basi di dati di bloccu ntô bucket $1.",
+       "lockmanager-fail-db-release": "Nun fu' pussìbbili arrènniri li blocchi dâ basi di dati $1.",
+       "lockmanager-fail-svr-acquire": "Nun fu' pussìbbili pigghiari pussessu dî blocchi dû server $1.",
+       "lockmanager-fail-svr-release": "Nun fu' pussìbbili arrènniri li blocchi dû server $1.",
+       "zip-file-open-error": "Mmattìu n'erruri nta l'apirtura dû file pî cuntrolli di ZIP.",
+       "zip-wrong-format": "Lu file spicificatu nun era nu file ZIP.",
+       "zip-bad": "Lu file è nu file ZIP chi' è ruïnatu o è illiggìbbili pi' quarchi' n'autru mutivu.\nNun si po' cuntrullari bona la so sicurizza.",
+       "zip-unsupported": "Lu file è nu file ZIP chi' cunteni carattirìstichi ZIP chi' nun su' suppurtati dâ MediaWiki.\nNun si po' cuntrullari bona la so sicurizza.",
+       "uploadstash": "Ammucciàgghia dî carricamenti",
+       "uploadstash-summary": "Sta pàggina duna accessu ê file chi' furu carricati, o si stannu carricannu, però ancora nun hannu statu pubblicati ntâ wiki. Sti file nun su' visìbbili a' nuddu sparti di cu li carricau.",
+       "uploadstash-clear": "Cancella li file nta l'ammucciagghia",
+       "uploadstash-nofiles": "Nun hai nuddu file nta l'ammucciagghia.",
+       "uploadstash-badtoken": "St'azzioni nun riniscìu, forsi picchì li to cridinziali di mudìfica scaderu. Prova n'autra vota.",
+       "uploadstash-errclear": "La cancillazzioni dî file nun riniscìu.",
+       "uploadstash-refresh": "Aggiorna la lista dî file",
+       "invalid-chunk-offset": "Offset ntô chunk nun vàlidu",
+       "img-auth-accessdenied": "Accessu nigatu",
+       "img-auth-nopathinfo": "Variàbbili PATH_INFO mancanti.\nLu to server nun è mpustatu pi' passari sta nfurmazzioni.\nPurrìa èssiri basatu supra a' CGI e nun po' suppurtari img_auth.\nTalìa https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Lu caminu dumannatu nun è ntâ cartella cunfigurata pî carricamenti.",
+       "img-auth-badtitle": "Nun fu' pussìbbili custrüiri nu tìtulu vàlidu a' pàrtiri di \"$1\".",
+       "img-auth-nologinnWL": "Nun si' trasutu e \"$1\" nun è ntâ lista janca.",
+       "img-auth-nofile": "Lu file \"$1\" nun esisti.",
+       "img-auth-isdir": "Stai pruvannu a' accèdiri a' na cartella, \"$1\".\nE' cunsintutu l'accessu sulu ê file.",
+       "img-auth-streaming": "Trasmissioni di \"$1\".",
+       "img-auth-public": "U prupòsitu di img_auth.php è di emèttiri file di na wiki privata.\nSta wiki è cunfigurata comu wiki pùbblica.\nPi' sicurezza, img_auth.php fu' disattivatu.",
+       "img-auth-noread": "L'utenti nun havi pirmissu di lèggiri \"$1\".",
+       "http-invalid-url": "URL nun validu: $1",
+       "http-invalid-scheme": "L'URL cu' schema \"$1\" nun su' suppurtati.",
+       "http-request-error": "A richiesta HTTP fallìu pi' causa di n'erruri scanusciutu.",
+       "http-read-error": "Erruri di littura HTTP.",
+       "http-timed-out": "La richiesta HTTP scadìu.",
+       "http-curl-error": "Erruri ntô scarricamentu di l'URL: $1",
+       "http-bad-status": "Mmattìu nu prubblema duranti la richiesta HTTP: $1 $2",
+       "upload-curl-error6": "Nun fu' pussìbbili ragghiùnciri l'URL",
+       "upload-curl-error6-text": "Nun fu' pussìbbili ragghiùnciri l'URL ca spicificasti.\nCuntrolla megghiu ca l'URL è scritta bona e ca lu situ chi' la servi funziona.",
+       "upload-curl-error28": "Tempu scadutu pû carricamentu",
+       "upload-curl-error28-text": "Lu situ rimotu cci stesi troppu tempu a' rispùnniri.\nPi' favuri cuntrolla ca lu situ funziona, aspetta un pocu e ppoi prova n'autra vota.\nPoi cunsiddirari di pruvari ntôn mumentu quannu c'è cchiu' picca tràficu.",
        "license": "Licenza d'usu:",
-       "license-header": "Licenza d'usu:",
-       "nolicense": "Nudda silizzioni",
-       "license-nopreview": "(Antiprima nun disponibbili)",
-       "upload_source_url": "(na URL curretta e accissìbbili)",
-       "upload_source_file": "(un file supra lu propiu computer)",
-       "listfiles-summary": "Sta pàggina spiciali ammustra tutti li file caricati.\nLi file caricati di cchiù picca tempu sunnu ammustrati ô princìpiu dâ lista.\nPi canciari l'urdinamentu, fari clic supra a la ntistazzioni dâ culonna scigghiuta.",
+       "license-header": "Licenza",
+       "nolicense": "Nudda spicificata",
+       "licenses-edit": "Cancia l'opzioni dâ licenza",
+       "license-nopreview": "(Antiprima nun dispunìbbili)",
+       "upload_source_url": "(lu file chi' scigghîsti di n'URL vàlida e pubblicamenti accissìbbili)",
+       "upload_source_file": "(lu file chi' scigghîsti supra ô to computer)",
+       "listfiles-delete": "cancella",
+       "listfiles-summary": "Sta pàggina spiciali ammustra tutti li file carricati.",
        "listfiles_search_for": "Ricerca dâ mmàggini di nomu:",
        "imgfile": "file",
        "listfiles": "Alencu dî file",
+       "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nomu",
        "listfiles_user": "Utenti",
-       "listfiles_size": "Diminzioni (bytes)",
+       "listfiles_size": "Grannizza",
        "listfiles_description": "Discrizzioni",
        "listfiles_count": "Virsioni",
-       "file-anchor-link": "Mmàggini",
-       "filehist": "Crunuluggìa dô file",
-       "filehist-help": "Fari clic supra nu gruppu data/ura pi vìdiri lu file comu si prisintava ntô mumentu nnicatu.",
-       "filehist-deleteall": "cancilla tuttu",
+       "listfiles-show-all": "Includi li virsioni vecchî dî mmàggini",
+       "listfiles-latestversion": "Virsioni attuali",
+       "listfiles-latestversion-yes": "Sì",
+       "listfiles-latestversion-no": "No",
+       "file-anchor-link": "File",
+       "filehist": "Crunuluggìa dû file",
+       "filehist-help": "Clicca na data/ura pi' vìdiri lu file comu si prisintava tannu.",
+       "filehist-deleteall": "cancella tuttu",
        "filehist-deleteone": "cancella",
        "filehist-revert": "riprìstina",
-       "filehist-current": "correnti",
+       "filehist-current": "attuali",
        "filehist-datetime": "Data/Ura",
        "filehist-thumb": "Miniatura",
        "filehist-thumbtext": "Miniatura di la virsioni dû $1",
        "filehist-user": "Utenti",
        "filehist-dimensions": "Diminsioni",
        "filehist-filesize": "Dimensioni dû file",
-       "filehist-comment": "Oggettu",
+       "filehist-comment": "Cummentu",
        "imagelinks": "Usu dû file",
-       "linkstoimage": "{{PLURAL:$1|La pàggina siquenti richiàma|Li $1 pàggini siquenti richiàmanu}} sta mmàggini:",
-       "linkstoimage-more": "Chiossai di $1 {{PLURAL:$1|pàggina punta|pàggini pùntanu}} a stu file.\nDi sècutu sunnu alincati sulu {{PLURAL:$1|la prima pàggina ca punta|li primi $1 pàggini ca pùntanu}} a stu file.\nÈ dispunìbbilu nu [[Special:WhatLinksHere/$2|alencu cumpretu]].",
-       "nolinkstoimage": "Nudda pàggina cunteni sta mmàggini.",
-       "morelinkstoimage": "Visualizza [[Special:WhatLinksHere/$1|àutri link]] a stu file.",
-       "duplicatesoffile": "{{PLURAL:$1|Chistu|Chisti $1}} file {{PLURAL:$1|è nu dupppiuni|sunnu duppiuni}} di stu file ([[Special:FileDuplicateSearch/$2|cchiù dittagli]]):",
-       "sharedupload": "Stu file veni di $1 e pò èssiri utilizzatu di àutri pruggetti wiki.",
-       "sharedupload-desc-there": "Stu file pruvieni da $1 e pò èssiri usatu da l'autri prugetti.\nTalìari la [$2 paggina di discrizzioni dô file] pi autri nfurmazioni.",
-       "sharedupload-desc-here": "Stu file pruvieni da $1 e pò èssiri usatu da l'autri prugetti.\nAppressu veni ammustrata la discrizioni prisenti nâ [$2 paggina di discrizzioni dô file].",
-       "filepage-nofile": "Nun esisti nu file cu stu nnomu.",
-       "filepage-nofile-link": "Nun esisti nu file cu stu nnomu, ma è pussibili [$1 caricarlu].",
+       "linkstoimage": "{{PLURAL:$1|La pàggina siquenti richiàma|Li $1 pàggini siquenti richiàmanu}} stu file:",
+       "linkstoimage-more": "Cci su' cchiu' ssai di $1 {{PLURAL:$1|pàggina|pàggini}} ca richiàmunu stu file.\nLa lista ccassutta ammustra sulu {{PLURAL:$1|la prima pàggina|li primi $1 pàggini}}.\nSi po' puru a' vìdiri [[Special:WhatLinksHere/$2|na lista cumpleta]].",
+       "nolinkstoimage": "Nudda pàggina richiama stu file.",
+       "morelinkstoimage": "Ammustra [[Special:WhatLinksHere/$1|autri culligamenti]] a' stu file.",
+       "linkstoimage-redirect": "$1 (rimannu ô file) $2",
+       "duplicatesoffile": "{{PLURAL:$1|Stu|Sti $1}} file {{PLURAL:$1|è nu dupppiuni|sunnu duppiuni}} di st'autru file ([[Special:FileDuplicateSearch/$2|cchiù dittagli]]):",
+       "sharedupload": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.",
+       "sharedupload-desc-there": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nTalìari la so [$2 pàggina di discrizzioni] pi' autri nfurmazzioni.",
+       "sharedupload-desc-here": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nAppressu veni ammustrata la discrizioni prisenti ntâ so [$2 pàggina di discrizzioni].",
+       "sharedupload-desc-edit": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nForsi ti cunveni canciari la so discrizzioni ntâ so [$2 pàggina di discrizzioni] dda.",
+       "sharedupload-desc-create": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nForsi ti cunveni canciari a so discrizzioni ntâ so [$2 pàggina di discrizzioni] dda.",
+       "filepage-nofile": "Nun esisti nuddu file cu' stu nomu.",
+       "filepage-nofile-link": "Nun esisti nuddu file cu' stu nomu, però [$1 lu poi carricari].",
        "uploadnewversion-linktext": "Càrrica na virsioni nova di stu file",
-       "shared-repo-from": "da $1",
-       "shared-repo": "n'archiviu cundivisu",
+       "shared-repo-from": "di $1",
+       "shared-repo": "nu dipòsitu cunnivisu",
+       "upload-disallowed-here": "Nun poi suprascrìviri stu file.",
        "filerevert": "Riprìstina $1",
        "filerevert-legend": "Riprìstina file",
        "filerevert-intro": "Stai pi ripristinari lu file '''[[Media:$1|$1]]''' â [virsioni $4 dô $2, $3].",
-       "filerevert-comment": "Oggettu:",
+       "filerevert-comment": "Mutivu:",
        "filerevert-defaultcomment": "Ripristinata la virsioni dô $1, $2",
        "filerevert-submit": "Riprìstina",
        "filerevert-success": "'''Lu file [[Media:$1|$1]]''' hà statu ripristinatu â [$4 virsioni dô $2, $3].",
        "filerevert-badversion": "Nun esistanu virsiona locali pricidenti dô file cû timestamp richiestu.",
        "filedelete": "Cancella $1",
        "filedelete-legend": "Cancella lu file",
-       "filedelete-intro": "Stai pi cancillari û file '''[[Media:$1|$1]]''' cu tutta la sou storia.",
-       "filedelete-intro-old": "Stai cancillannu la virsioni di '''[[Media:$1|$1]]''' dô [$4 $3, $2].",
+       "filedelete-intro": "Stai cancillannu lu file <strong>[[Media:$1|$1]]</strong> cu' tutta la so crunuluggìa.",
+       "filedelete-intro-old": "Stai cancillannu la virsioni di <strong>[[Media:$1|$1]]</strong> dû [$4 $2 ê $2].",
        "filedelete-comment": "Mutivu:",
        "filedelete-submit": "Cancella",
-       "filedelete-success": "Lu file '''$1''' hà statu cancillatu.",
-       "filedelete-success-old": "<span class=\"plainlinks\">La virsioni dô file '''[[Media:$1|$1]]''' dô $2, $3 hà statu cancillata.</span>",
-       "filedelete-nofile": "Nta {{SITENAME}} nun c'è nuddu file $1",
-       "filedelete-nofile-old": "'N archiviu nun ci sugnu virsioni di '''$1''' cu li carattiristichi nnicati.",
-       "filedelete-otherreason": "Autra mutivazioni o mutivazioni n più:",
-       "filedelete-reason-otherlist": "Autra mutivazioni",
-       "filedelete-reason-dropdown": "*Mutivazzioni cchiù cumuni\n** Viulazzioni di copyright\n** File duplicatu",
-       "filedelete-edit-reasonlist": "Cancia li mutivazioni pi la cancillazzioni",
-       "mimesearch": "Circata 'n basi a lu tipu MIME",
-       "mimesearch-summary": "Sta pàggina cunzenti di filtrari li file 'n basi a lu tipu MIME. Nziriri la stringa di ricerca ntâ forma tipu/suttatipu, p'asempiu <code>image/jpeg</code>.",
+       "filedelete-success": "Lu file <strong>$1</strong> fu' cancillatu.",
+       "filedelete-success-old": "La virsioni dû file <strong>[[Media:$1|$1]]</strong> dû $2 ê $3 fu' cancillata.",
+       "filedelete-nofile": "<strong>$1</strong> nun esisti.",
+       "filedelete-nofile-old": "Nun cc'è archiviata nudda virsioni di <strong>$1</strong> chi' havi l'attribbuta spicificati.",
+       "filedelete-otherreason": "Autru o ultiriuri mutivu:",
+       "filedelete-reason-otherlist": "Autru mutivu",
+       "filedelete-reason-dropdown": "*Mutivi cchiu' cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** File duppiuni",
+       "filedelete-edit-reasonlist": "Cancia li mutivi dâ cancillazzioni",
+       "filedelete-maintenance": "La cancillazzioni e lu riprìstinu dî file su' timpuraniamenti disattivati duranti la manutinzioni.",
+       "filedelete-maintenance-title": "Impussìbbili cancillari lu file",
+       "mimesearch": "Risciduta pi' tipu MIME",
+       "mimesearch-summary": "Sta pàggina cunzenti di filtrari li file 'n basi a lu tipu MIME. Nziriri la stringa di ricerca ntâ forma tipu/suttatipu o tipu/*, p'asempiu <code>image/jpeg</code>.",
        "mimetype": "Tipu MIME:",
-       "download": "scarica",
-       "unwatchedpages": "Pàggini nun taliati",
-       "listredirects": "Alencu di tutti li redirect",
-       "unusedtemplates": "Template nun utilizzati",
-       "unusedtemplatestext": "Nta sta pàggina vèninu alincati tutti li template (pàggini dû namespace Template) ca nun sunnu nclusi n nudda pàggina. Prima di scancillàrili è megghiu virificari ca li sìnguli template nun hannu àutri culligamenti ca ci tràsunu.",
-       "unusedtemplateswlh": "àutri liami",
-       "randompage": "Na pàggina ammuzzu",
-       "randompage-nopages": "Nudda pàggina ntô namespace \"$1\".",
-       "randomredirect": "Un redirect a muzzu",
-       "randomredirect-nopages": "Nuddu rinnirizzamentu ntô namespace \"$1\".",
+       "download": "scàrrica",
+       "unwatchedpages": "Pàggini nun talïati",
+       "listredirects": "Alencu di tutti li rimanni",
+       "listduplicatedfiles": "Lista dî file cu' duppiuni",
+       "listduplicatedfiles-summary": "Chista è na lista dî file unni la virsioni cchiu' nova è nu duppiuni dâ virsioni cchiu' nova di quarchi' autru file. Sulu li file lucali su' pigghiati a' cunsiddirazzioni.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] havi [[$3|{{PLURAL:$2|nu duppiuni|$2 duppiuna}}]].",
+       "unusedtemplates": "Template nun usati",
+       "unusedtemplatestext": "Sta pàggina elenca tutti li pàggini nto namespace {{ns:template}} ca nun sunnu nclusi nta nudda autra pàggina.\nPrima di cancillàrili è megghiu cuntrullari ca nun hannu autri culligamenti ca cci tràsunu.",
+       "unusedtemplateswlh": "autri culligamenti",
+       "randompage": "Na pàggina a' muzzu",
+       "randompage-nopages": "Nun cci su' pàggini {{PLURAL:$2|nta stu namespace|nta sti namespace}}: $1.",
+       "randomincategory": "Na pàggina a' muzzu nta na catigurìa",
+       "randomincategory-invalidcategory": "\"$1\" nun è nu nomu di catigurìa vàlidu.",
+       "randomincategory-nopages": "Nun cci su' pàggini ntâ catigurìa [[:Category:$1|$1]].",
+       "randomincategory-category": "Catigurìa:",
+       "randomincategory-legend": "Pàggina a' muzzu nta na catigurìa",
+       "randomredirect": "Nu rimannu a' muzzu",
+       "randomredirect-nopages": "Nun cc'è nuddu rimannu ntô namespace \"$1\".",
        "statistics": "Statìstichi",
-       "statistics-header-pages": "Statistichi pî pàggini",
-       "statistics-header-edits": "Statistichi pî canci",
-       "statistics-header-users": "Li statìstichi di l'utilizzatura",
-       "statistics-header-hooks": "Autri statistichi",
+       "statistics-header-pages": "Statìstichi dî pàggini",
+       "statistics-header-edits": "Statìstichi dî canciamenti",
+       "statistics-header-users": "Statìstichi di l'utenti",
+       "statistics-header-hooks": "Autri statìstichi",
        "statistics-articles": "Pàggini di cuntinutu",
        "statistics-pages": "Pàggini",
-       "statistics-pages-desc": "Tutti li pàggini dâ wiki, cu puru chiddi di discussioni, li rinnirizzamenti, ecc.",
+       "statistics-pages-desc": "Tutti li pàggini dâ wiki, cu' puru chiddi di discussioni, li rimanni, etc.",
        "statistics-files": "File carricati",
-       "statistics-edits": "Canci a pàrtiri di la nstallazzioni di {{SITENAME}}",
-       "statistics-edits-average": "Media dî canci pi pàggina",
-       "statistics-users": "[[Special:ListUsers|Utilizzatura]] riggistrati",
-       "statistics-users-active": "Utilizzatura attivi",
-       "statistics-users-active-desc": "Utilizzatura chi fìciru n'azzioni {{PLURAL:$1|ni l'ultimu ionnu|nî l'ultimi $1 ionna}}",
-       "doubleredirects": "Rinnirizzamenti duppi",
-       "doubleredirectstext": "Chista pàggina alenca li pàggini chi rinnirìzzanu a àutri pàggini di rinnirizzamentu.\nOgnuna riga cunteni li culligamenti a lu primu e a lu secunnu redirect, oltri â prima riga di testu dû secunnu redirect ca di sòlitu cunteni la pàggina di distinazzioni \"curretta\" â quali avissi a puntari macari lu primu redirect.\nLi redirect <del>cancillati</del> furunu curretti.",
-       "double-redirect-fixed-move": "[[$1]] fu spustata 'n modu automàticu, ora è nu redirect a [[$2]]",
-       "double-redirect-fixer": "Curritturi di redirect",
-       "brokenredirects": "Riinnirizzamenti (''redirects'') rumputi.",
-       "brokenredirectstext": "Li rinnirizzamenti siquenti pùntanu a pàggini ca nun asìstinu:",
+       "statistics-edits": "Pàggini canciati di quannu {{SITENAME}} fu' armatu",
+       "statistics-edits-average": "Media dî canciamenti pi' pàggina",
+       "statistics-users": "[[Special:ListUsers|Utenti]] riggistrati",
+       "statistics-users-active": "Utenti attivi",
+       "statistics-users-active-desc": "Utenti ch'hannu fattu quarchi' azzioni {{PLURAL:$1|nta l'ùltimu jornu|nta l'ùltimi $1 jorna}}",
+       "pageswithprop": "Pàggini cu na prupietà di pàggina",
+       "pageswithprop-legend": "Pàggini cu na prupietà di pàggina",
+       "pageswithprop-text": "Sta pàggina elenca li pàggini chi' adòpirunu na particulari prupietà di pàggina.",
+       "pageswithprop-prop": "Nomu dâ prupietà:",
+       "pageswithprop-submit": "Vai",
+       "pageswithprop-prophidden-long": "valuri tistuali longu dâ prupietà ammucciatu ($1)",
+       "pageswithprop-prophidden-binary": "valuri binariu dâ prupietà ammucciatu ($1)",
+       "doubleredirects": "Rimanni duppî",
+       "doubleredirectstext": "Sta pàggina alenca li pàggini chi rimànnunu ad autri pàggini di rimannu.\nOgnin riga cunteni culligamenti a lu primu e a lu secunnu rimannu, sparti dâ distinazzioni dû secunnu rimannu, ca di sòlitu è la pàggina \"giusta\" unni avissi a' puntari macari lu primu rimannu.\nLi rimanni <del>sbarrati</del> hannu statu cunsati.",
+       "double-redirect-fixed-move": "[[$1]] fu' spustata.\nFu' aggiurnata autumaticamenti e ora rimanna a' [[$2]].",
+       "double-redirect-fixed-maintenance": "Cunsatu autumaticamenti nu rimannu duppiu di [[$1]] a' [[$2]] ntôn sirvizzu di manutinzioni.",
+       "double-redirect-fixer": "Cunsaturi dî rimanni",
+       "brokenredirects": "Rimanni rutti",
+       "brokenredirectstext": "Li rimanni siguenti pùntanu a' pàggini ca nun esìstinu:",
        "brokenredirects-edit": "cancia",
        "brokenredirects-delete": "cancella",
-       "withoutinterwiki": "Pàggini senza interwiki",
-       "withoutinterwiki-summary": "Li pàggini nnicati ccà nun hànnu liami ê virsioni nta àutri lingui:",
+       "withoutinterwiki": "Pàggini senza culligamenti intir-linguìstici",
+       "withoutinterwiki-summary": "Li pàggini siguenti nun hànnu culligamenti ê virsioni nta autri lingui.",
        "withoutinterwiki-legend": "Prifissu",
        "withoutinterwiki-submit": "Ammustra",
-       "fewestrevisions": "Pàggini cu menu rivisioni",
+       "fewestrevisions": "Pàggini cu' cchiu' picca virsioni",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|catigurìa|catigurìi}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|culligamentu|culligamenti}}",
-       "nmembers": "$1 {{PLURAL:$1|elementu|elementi}}",
+       "nmembers": "$1 {{PLURAL:$1|membru|membra}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|membru|membra}}",
        "nrevisions": "$1 {{PLURAL:$1|rivisioni|rivisioni}}",
        "nviews": "$1 {{PLURAL:$1|vìsita|vìsiti}}",
-       "specialpage-empty": "Sta pàggina spiciali è attuarmenti vacanti.",
+       "nimagelinks": "Adupiratu nta $1 {{PLURAL:$1|pàggina|pàggini}}",
+       "ntransclusions": "adupiratu nta $1 {{PLURAL:$1|pàggina|pàggini}}",
+       "specialpage-empty": "Nun cci su' risultati pi' stu rennicuntu.",
        "lonelypages": "Pàggini òrfani",
-       "lonelypagestext": "Li pàggini nnicati ccà sutta nun hannu lijami ca vèninu d'àutri pàggini di {{SITENAME}}.",
+       "lonelypagestext": "Li pàggini ccassutta nun hannu culligamenti ca vèninu d'autri pàggini e nun su' trasclusi nta autri pàggini di {{SITENAME}}.",
        "uncategorizedpages": "Pàggini nun catigurizzati",
        "uncategorizedcategories": "Catigurìi nun catigurizzati",
-       "uncategorizedimages": "Mmàggini nun catigurizzati",
-       "uncategorizedtemplates": "Template senza catigurìi",
-       "unusedcategories": "Catigurìi vacanti",
-       "unusedimages": "File nun utilizzati",
+       "uncategorizedimages": "File nun catigurizzati",
+       "uncategorizedtemplates": "Template nun catigurizzati",
+       "unusedcategories": "Catigurìi nun usati",
+       "unusedimages": "File nun usati",
        "wantedcategories": "Catigurìi addumannati",
-       "wantedpages": "Artìculi cchiù addumannati",
-       "wantedpages-badtitle": "Tìtulu nun validu nô gruppu di risultati: $1",
+       "wantedpages": "Pàggini addumannati",
+       "wantedpages-badtitle": "Tìtulu nun vàlidu ntô gruppu di risultati: $1",
        "wantedfiles": "File addumannati",
+       "wantedfiletext-cat": "Li file ccassutta su' richiamati però nun esìstunu. Ntâ lista cci ponnu èssiri macari li file chi' stannu nta dipòsiti esterni, cu' tuttu chi' esìstunu. Sti fausi pusitivi sarrannu <del>sbarrati</del>. Sparti, li pàggini chi' nclùdunu file chi' nun esìstunu su' elincati nta [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Li file ccassutta su' richiamati però nun esìstunu. Sparti, li pàggini chi' nclùdunu file chi' nun esìstunu su' elincati nta [[:$1]].",
+       "wantedfiletext-nocat": "Li file ccassutta su' richiamati però nun esìstunu. Ntâ lista cci ponnu èssiri macari li file chi' stannu nta dipòsiti esterni, cu' tuttu chi' esìstunu. Sti fausi pusitivi sarrannu <del>sbarrati</del>.",
+       "wantedfiletext-nocat-noforeign": "Li file ccassutta su' richiamati però nun esìstunu.",
        "wantedtemplates": "Template addumannati",
-       "mostlinked": "Pàggini supra cui agghìcanu cchiù liami",
-       "mostlinkedcategories": "Catigurìi cchiù richiamati",
-       "mostlinkedtemplates": "Template cchiù usati",
-       "mostcategories": "Artìculi urdinati secunnu chiddi chi hannu cchiù catigurìi",
-       "mostimages": "Mmàggini cchiù richiamati",
-       "mostrevisions": "Artìculi urdinati secunnu chiddi chi hannu cchiù canciamenti",
+       "mostlinked": "Pàggini cchiu' culligati",
+       "mostlinkedcategories": "Catigurìi Pcchiu' culligati",
+       "mostlinkedtemplates": "Pàggini cchiu' trasclusi",
+       "mostcategories": "Pàggini cu' cchiu' ssai catigurìi",
+       "mostimages": "File cchiu' culligati",
+       "mostinterwikis": "Pàggini cu' cchiu' ssai interwiki",
+       "mostrevisions": "Pàggini cu' cchiu' ssai virsioni",
        "prefixindex": "Ìnnici secunnu un prifissu",
-       "shortpages": "Artìculi urdinati secunnu la lunchizza (li cchiù curti prima)",
-       "longpages": "Artìculi urdinati secunnu la lunchizza (li cchiù lonchi prima)",
+       "prefixindex-namespace": "Tutti li pàggini cûn prifissu (namespace $1)",
+       "prefixindex-strip": "Leva li prifissi nta l'elencu",
+       "shortpages": "Pàggini curti",
+       "longpages": "Pàggini longhi",
        "deadendpages": "Pàggini senza nisciuta",
-       "deadendpagestext": "Li pàggini ndicati di sèquitu sunnu privi di culligamenti versu àutri pàggini dû situ.",
+       "deadendpagestext": "Li pàggini siguenti sunnu privi di culligamenti versu autri pàggini di {{SITENAME}}.",
        "protectedpages": "Pàggini prutetti",
-       "protectedpages-indef": "Sulu prutizzioni nfiniti",
-       "protectedpages-cascade": "Sulu prutizzioni ricursivi",
-       "protectedpagesempty": "A lu mumentu nun ci sunnu pàggini prutetti",
-       "protectedtitles": "Tituli prutiggiuti",
-       "protectedtitlesempty": "Nta stu mumentu nun ci sunnu tìtuli prutetti ccu li paràmitri nnicati.",
-       "listusers": "Lista di utilizzatura",
-       "listusers-editsonly": "Ammustra sulu utenti cu cuntribbuti",
-       "listusers-creationsort": "Ordina pi data di criazioni",
-       "usereditcount": "$1 {{PLURAL:$1|cuntribbutu|cuntribbuti}}",
-       "usercreated": "{{GENDER:$3|Criatu/a}} lu $1 ê $2",
-       "newpages": "pàggini cchiù ricenti",
+       "protectedpages-indef": "Sulu prutizzioni a' tempu innitirminatu",
+       "protectedpages-summary": "Sta pàggina elenca li pàggini già esistenti chi' comu ad ora su' prutetti. Pi' na lista dî tìtuli prutetti, chî quali vèni prüibbutu crïari pàggini novi, talìa [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Sulu prutizzioni a' cascata",
+       "protectedpages-noredirect": "Ammuccia li rimanni",
+       "protectedpagesempty": "Pi' com'ora nun cc'è nudda pàggina prutetta cu' sti paràmitri.",
+       "protectedpages-timestamp": "Data e ura",
+       "protectedpages-page": "Pàggina",
+       "protectedpages-expiry": "Scadenza",
+       "protectedpages-performer": "Prutiggiuta di l'utenti",
+       "protectedpages-params": "Paràmitri dâ prutizzioni",
+       "protectedpages-reason": "Mutivu",
+       "protectedpages-unknown-timestamp": "Scanusciuti",
+       "protectedpages-unknown-performer": "Utenti scanusciutu",
+       "protectedtitles": "Tìtuli prutetti",
+       "protectedtitles-summary": "Sta pàggina elenca li tìtuli prutetti, chî quali vèni prüibbutu crïari pàggini novi. Pi' na lista dî pàggini già esistenti chi' su' prutetti, talìa [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "Pi' com'ora nun cc'è nuddu tìtulu prutettu cu' sti paràmitri.",
+       "listusers": "Lista di l'utenti",
+       "listusers-editsonly": "Ammustra sulu l'utenti ca hannu cuntribbuti",
+       "listusers-creationsort": "Òrdina pi' data di crïazzioni",
+       "listusers-desc": "Òrdina a' scìnniri",
+       "usereditcount": "$1 {{PLURAL:$1|cuntribbutu|cuntribbuta}}",
+       "usercreated": "{{GENDER:$3|Crïatu}} lu $1 ê $2",
+       "newpages": "Pàggini novi",
        "newpages-username": "Utenti:",
-       "ancientpages": "pàggini cchiù vecchi",
-       "move": "sposta",
+       "ancientpages": "Pàggini cchiu' vecchî",
+       "move": "Sposta",
        "movethispage": "Sposta sta pàggina",
-       "unusedimagestext": "Accura, è pussìbbili fari lijami a li file d'àutri siti, usannu direttamenti la URL;\nchisti putìssiru quinni èssiri utilizzati puru siddu cumpàrinu nta l'alencu.",
-       "unusedcategoriestext": "Li siquenti pàggini dî catigurìi esìstinu, sibbeni li catigurìi currispunnenti sunnu vacanti.",
-       "notargettitle": "Dati mancanti",
-       "notargettext": "Nun hà statu innicata na pàggina o un utenti 'n rilazzioni a lu quali esèquiri l'opirazzioni addumannata.",
-       "nopagetitle": "La pàggina di distinazzioni nun asisti",
-       "nopagetext": "La pàggina c'addumannasti nun asisti.",
-       "pager-newer-n": "{{PLURAL:$1|1 di cchiù picca tempu|$1 di cchiù picca tempu}}",
-       "pager-older-n": "{{PLURAL:$1|1 di cchiù tempu|$1 di cchiù tempu}}",
-       "suppress": "Oversight",
-       "booksources": "Libbra secunnu lu còdici ISBN",
-       "booksources-search-legend": "Ricerca di fonti libbrari",
+       "unusedimagestext": "Li file ccassutta esìstunu però nun sunnu ncurpurati nta nudda pàggina.\nAccura: autri siti web ponnu aviri culligamenti ôn file pi' menzu di URL diretti; li file addupirati a' sta manera putìssiru èssiri elincati ccassutta puru si' si nni fa' usu.",
+       "unusedcategoriestext": "Li siguenti pàggini di catigurìi esìstunu, però nudda autra pàggina o catigurìa nni fa' usu.",
+       "notargettitle": "Nudda distinazzioni",
+       "notargettext": "Nun spicificasti na pàggina o puru n'utenti comu distinazzioni di st'opirazzioni.",
+       "nopagetitle": "La pàggina di distinazzioni nun esisti",
+       "nopagetext": "La pàggina ca spicificasti comu distinazzioni nun esisti.",
+       "pager-newer-n": "{{PLURAL:$1|1 cchiu' novu|$1 cchiu' novi}}",
+       "pager-older-n": "{{PLURAL:$1|1 cchiu' vecchî|$1 cchiu' vecchî}}",
+       "suppress": "Supravisuri",
+       "querypage-disabled": "Sta pàggina spiciali fu' disattivata pi' mutivi di pristazzioni.",
+       "apihelp": "Guida a' l'API",
+       "apihelp-no-such-module": "Mòdulu \"$\" nun truvatu.",
+       "booksources": "Fonti libbrarî",
+       "booksources-search-legend": "Ricerca di fonti libbrarî",
        "booksources-isbn": "Còdici ISBN:",
-       "booksources-text": "Di sèquitu veni prisintatu n'alencu di culligamenti versu siti sterni ca vìnninu libbra novi e usati, attraversu li quali è pussìbbili ottèniri maiuri nfurmazzioni supra lu testu circatu:",
-       "booksources-invalid-isbn": "L'ISBN datu pari ca nun è vàlidu; cuntrolla l'erruri di ricupiatura dâ surgenti urigginali.",
-       "specialloguserlabel": "Utenti:",
-       "speciallogtitlelabel": "Tìtulu:",
-       "log": "Log",
-       "all-logs-page": "Tutti li log pubblici",
-       "alllogstext": "Prisintazzioni unificata di tutti li riggistri di {{SITENAME}}. Poi limitari li criteri di circata silizziunannu lu tipu di riggistru, l'utenti ca fici l'azzioni (case-sensitive), e/o la pàggina ntirissata (pur'idda case-sensitive).",
-       "logempty": "Lu log nun cunteni elementi currispunnenti â ricerca.",
+       "booksources-search": "Va cerca",
+       "booksources-text": "Ccassutta cc'è n'elencu di culligamenti versu autri siti ca vìnninu libbra novi e usati, e ponnu aviri majuri nfurmazzioni a' prupòsitu dî libbra ca stai circannu:",
+       "booksources-invalid-isbn": "Lu còdici ISBN chi' spicificasti nun pari bonu; cuntrolla si' nun cci furu sbagghî di ricupiatura.",
+       "specialloguserlabel": "Fattu di l'utenti:",
+       "speciallogtitlelabel": "Oggettu (tìtulu o utenti):",
+       "log": "Riggistra",
+       "all-logs-page": "Tutti li riggistra pubblici",
+       "alllogstext": "Prisintazzioni cumminata di tutti li riggistra dispunìbbili di {{SITENAME}}.\nPoi ristrìnciri la visuali silizziunannu nu tipu di riggistru, l'utenti ca fici l'azzioni (cuntunu majusculi e minusculi), o la pàggina ntirissata (cuntunu majusculi e minusculi puru).",
+       "logempty": "Nudda vuci currispunnenti ntô riggistru.",
        "log-title-wildcard": "Attrova tituli chi ncignanu cu",
-       "allpages": "Tutti li paggini",
-       "nextpage": "Pàggina doppu ($1)",
-       "prevpage": "Pàggina pricidenti ($1)",
+       "showhideselectedlogentries": "Cancia la visibbilità dî vuci di riggistru scigghiuti",
+       "allpages": "Tutti li pàggini",
+       "nextpage": "Pàggina appressu ($1)",
+       "prevpage": "Pàggina avanti ($1)",
        "allpagesfrom": "Ammustra li pàggini a pàrtiri di:",
        "allpagesto": "Ammustra li pàggini nzinu a:",
-       "allarticles": "Tutti l'artìculi",
+       "allarticles": "Tutti li pàggini",
        "allinnamespace": "Tutti li pàggini dû namespace $1",
        "allpagessubmit": "Vai",
-       "allpagesprefix": "Ammustra li pàggini chi accumìnzanu cu:",
-       "allpagesbadtitle": "Lu tìtulu ndicatu pi la pàggina nun è vàlidu o cunteni prifissi interlingua o interwiki. Putissi noltri cuntèniri unu o cchiù caràttiri lu cui usu nun è ammissu ntê tìtuli.",
-       "allpages-bad-ns": "Lu namespace \"$1\" nun asisti supra {{SITENAME}}.",
+       "allpagesprefix": "Ammustra li pàggini chi' accumènzanu cu':",
+       "allpagesbadtitle": "Lu tìtulu di pàggina spicificatu nun era vàlidu o avìa nu prifissu intir-linguìsticu o intir-wiki.\nPutissi cuntèniri unu o cchiu' ssai caràttiri chi' nun su' cunsintuti ntê tìtula.",
+       "allpages-bad-ns": "Lu namespace \"$1\" nun asisti supra a' {{SITENAME}}.",
+       "allpages-hide-redirects": "Ammuccia li rimanni",
+       "cachedspecial-viewing-cached-ttl": "Stai talïannu na virsioni ntâ ''cache'' di sta pàggina, chi' po' èssiri vecchia nfinu a' $1.",
+       "cachedspecial-viewing-cached-ts": "Stai talïannu na virsioni ntâ ''cache'' di sta pàggina, chi' purrìa nun èssiri pirfittamenti aggiurnata.",
+       "cachedspecial-refresh-now": "Va talìa la cchiu' nova.",
        "categories": "Catigurìi",
        "categoriespagetext": "{{PLURAL:$1|La catigurìa ccassutta cunteni|Li catigurìi ccassutta cuntèninu}} pàggini o file multimidiali.\nLi [[Special:UnusedCategories|catigurìi vacanti]] nun sunnu ammustrati ccà.\nTalìa macari li [[Special:WantedCategories|catigurìi addumannati]].",
-       "categoriesfrom": "Ammustra li catigurìi a pàrtiri di:",
-       "special-categories-sort-count": "ordina pi nùmmuru",
+       "categoriesfrom": "Ammustra li catigurìi a' pàrtiri di:",
+       "special-categories-sort-count": "òrdina pi' cuntìggiu",
        "special-categories-sort-abc": "ordina alfabbeticamenti",
-       "deletedcontributions": "Cuntribbuti utenti scancillati",
-       "deletedcontributions-title": "Cuntribbuti utenti scancillati",
-       "sp-deletedcontributions-contribs": "cuntribbuti",
-       "linksearch": "Lijami di fora",
-       "linksearch-pat": "Mudellu di circata:",
+       "deletedcontributions": "Cuntribbuta di l'utenti cancillati",
+       "deletedcontributions-title": "Cuntribbuta di l'utenti cancillati",
+       "sp-deletedcontributions-contribs": "cuntribbuta",
+       "linksearch": "Risciduta dî culligamenti di fora",
+       "linksearch-pat": "Esprissioni di risciduta:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Arriscedi",
-       "linksearch-text": "C'è la pussibbilitati di fari usu di metacaràttiri, p'asèmpiu \"*.wikipedia.org\".<br />\nProtucolli suppurtati: <code>$1</code>",
-       "linksearch-line": "$1 prisenti ntâ pàggina $2",
-       "linksearch-error": "Li metacaràttiri si ponnu usari sulu a lu princìpiu dû nnirizzu.",
-       "listusersfrom": "Ammustra l'utenti a pàrtiri di:",
+       "linksearch-text": "Si ponnu adupirari li caràttiri matta, ad esempiu \"*.wikipedia.org\".\nCci voli almenu nu duminiu di primu liveddu, ad esempiu \"*.org\".<br />\n{{PLURAL:$2|Protucollu suppurtatu|Protucolli suppurtati}}: <code>$1</code> (è pridifinutu http:// si' nun si nni spicìfica)",
+       "linksearch-line": "$1 è culligatu dâ pàggina $2",
+       "linksearch-error": "Li caràttiri matta ponnu appariri sulu ô principiu dû nomu host.",
+       "listusersfrom": "Ammustra l'utenti a' pàrtiri di:",
        "listusers-submit": "Ammustra",
-       "listusers-noresult": "Nuddu utenti attruvatu. Virificari l'usu di caràttiri maiùsculi/minùsculi.",
-       "listusers-blocked": "(bloccatu)",
-       "activeusers": "Lista dî utenti attivi",
-       "activeusers-count": "$1 {{PLURAL:$1|canciamentu|canciamenti}} nti {{PLURAL:$3|l'ùrtimu jornu| nti l'ùrtimi $3 jorna}}",
-       "activeusers-from": "Ammustra li utenti a pàrtiri da:",
-       "activeusers-hidebots": "Bot ammucciati",
-       "activeusers-hidesysops": "Amministratura ammucciati",
-       "activeusers-noresult": "Nussun utenti truvatu.",
-       "listgrouprights": "Diritti dô gruppu utenti",
-       "listgrouprights-summary": "Ccà sutta sunnu elincati li gruppi utenti difiniti pi sta wiki, cu li dritti d'accessu assuciati a iddi. Pi sapìrinni chiossai supra li dritti, lèggiti [[{{MediaWiki:Listgrouprights-helppage}}|sta pàggina]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dirittu assegnatu</span>\n* <span class=\"listgrouprights-revoked\">Dirittu revocatu</span>",
+       "listusers-noresult": "Nuddu utenti attruvatu.",
+       "listusers-blocked": "(bluccatu)",
+       "activeusers": "Lista di l'utenti attivi",
+       "activeusers-intro": "Chista è na lista di l'utenti chi' fìciru na quarchi' attività {{PLURAL:$1|nta l'ùltimu jornu|nta l'ùltimi $1 jorna}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|azziòni|azziòna}} nta {{PLURAL:$3|l'ùltimu jornu|l'ùltimi $3 jorna}}",
+       "activeusers-from": "Ammustra l'utenti a' pàrtiri di:",
+       "activeusers-hidebots": "Ammuccia li bot",
+       "activeusers-hidesysops": "Ammuccia l'amministratura",
+       "activeusers-noresult": "Nuddu utenti truvatu.",
+       "listgrouprights": "Dritti di gruppa d'utenti",
+       "listgrouprights-summary": "Ccà sutta sunnu elincati li gruppa d'utenti difinuti nta sta wiki, cu li so dritti d'accessu.\nCci ponnu èssiri [[{{MediaWiki:Listgrouprights-helppage}}|autri nfurmazzioni]] a' prupòsitu di ciascunu drittu.",
+       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Drittu cuncidutu</span>\n* <span class=\"listgrouprights-revoked\">Drittu rivucatu</span>",
        "listgrouprights-group": "Gruppu",
-       "listgrouprights-rights": "Diritti",
+       "listgrouprights-rights": "Dritti",
        "listgrouprights-helppage": "Help:Diritti dô gruppu",
-       "listgrouprights-members": "(Elencu di cu ni fa parti)",
-       "listgrouprights-addgroup": "Pò jùnciri {{PLURAL:$2|lu gruppu|li gruppi}}: $1",
-       "listgrouprights-removegroup": "Pò livari {{PLURAL:$2|lu gruppu|li gruppi}}: $1",
-       "listgrouprights-addgroup-all": "Pò jùnciri a tutti li gruppi",
-       "listgrouprights-removegroup-all": "Pò livari tutti li gruppi",
-       "listgrouprights-addgroup-self": "Pò jùnciri {{PLURAL:$2|lu gruppu|li gruppi}} a lu propriu account: $1",
-       "listgrouprights-removegroup-self": "Pò livari {{PLURAL:$2|nu gruppu|li gruppi}} da lu propriu account: $1",
-       "listgrouprights-addgroup-self-all": "Junci tutti li gruppa ô propriu account",
-       "listgrouprights-removegroup-self-all": "Può livari tutti li gruppi dô propriu account",
-       "mailnologin": "Nuddu ndirizzu cui mannari lu missaggiu",
-       "mailnologintext": "Hai a fari lu [[Special:UserLogin|login]] e aver riggistratu na casella e-mail vàlida ntê tò [[Special:Preferences|prifirenzi]] pi mannari posta alittrònica a àutri Utenti.",
-       "emailuser": "Manna n'imail a stu utenti",
-       "emailpage": "Manna un missaggiu e-mail a l'utenti",
-       "emailpagetext": "Siddu st'utenti lassau nu nnirizzu email vàlidu ntê sò prifirenzi, ci putiti mannari nu missaggiu. Lu nnirizzu email ca lassasti ntê tò [[Special:Preferences|prifirenzi]] và a cumpàriri comu mittenti di lu email, di manera ca lu distinatariu ti pò arrispùnniri.",
-       "defemailsubject": "Missaggiu di {{SITENAME}}",
-       "noemailtitle": "Nuddu ndirizzu e-mail",
-       "noemailtext": "St'utilizzaturi nun spicificau nu nnirizzu email vàlidu.",
-       "nowikiemailtext": "St'utenti scigghìu di non aricèviri missaggi di posta alittrònica di l'àutri utenti.",
-       "email-legend": "Manna n'e-mail a n'àutru utenti di {{SITENAME}}",
+       "listgrouprights-members": "(elencu di cu nni fa' parti)",
+       "listgrouprights-addgroup": "Agghiùnciri {{PLURAL:$2|ô gruppu|ê gruppa}}: $1",
+       "listgrouprights-removegroup": "Livari{{PLURAL:$2|dû gruppu|dî gruppa}}: $1",
+       "listgrouprights-addgroup-all": "Agghiùnciri a' tutti li gruppa",
+       "listgrouprights-removegroup-all": "Livari di tutti li gruppa",
+       "listgrouprights-addgroup-self": "Agghiùncirisi {{PLURAL:$2|ô gruppu|ê gruppa}}: $1",
+       "listgrouprights-removegroup-self": "Livàrisi {{PLURAL:$2|dû gruppu|dî gruppa}}: $1",
+       "listgrouprights-addgroup-self-all": "Agghiùncirisi a' tutti li gruppa",
+       "listgrouprights-removegroup-self-all": "Livàrisi di tutti li gruppa",
+       "listgrouprights-namespaceprotection-header": "Ristrizzioni pi' namespace",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Dritti chi' cunsentunu a' l'utenti di fari canciamenti",
+       "trackingcategories": "Catigurìi di tracciamentu",
+       "trackingcategories-summary": "Sta pàggina elenca i catigurìi di tracciamèntu chi' vènunu jincuti autumaticamenti dû software MediaWiki. I so nomi si ponnu canciari mudificannu i missaggi di sistema currispunnenti ntô namespace {{ns:8}}.",
+       "trackingcategories-msg": "Catigurìa di tracciamentu",
+       "trackingcategories-name": "Nomu dû missaggiu",
+       "trackingcategories-desc": "Criterî pâ nclusioni ntâ catigurìa",
+       "noindex-category-desc": "Sta pàggina nun veni innicizzata dî robot picchì cunteni la palora màggica <code><nowiki>__NOINDEX__</nowiki></code> e sta nta nu namespace unni sta marcatura è cunsintuta.",
+       "index-category-desc": "Sta pàggina cunteni la palora màggica <code><nowiki>__INDEX__</nowiki></code> (e sta nta nu namespace unni sta marcatura è cunsintuta), e pi' chistu veni innicizzata dî robot quannu nurmalmenti nô sarrìa.",
+       "post-expand-template-inclusion-category-desc": "La grannizza di sta pàggina passa <code>$wgMaxArticleSize</code> appressu a' l'espansioni di tutti li template, dunca certi template nun furu espannuti.",
+       "post-expand-template-argument-category-desc": "Sta pàggina veni cchiu' granni di <code>$wgMaxArticleSize</code> appressu chi' s'espànni l'argumentu dûn template (quarchi' cosa nta parèntisi graffi tripli, comu <code>{{{Pippu}}}</code>).",
+       "expensive-parserfunction-category-desc": "Sta pàggina adòpira troppi funzioni di l'analizzaturi sintatticu custusi (comu <code>#ifexist</code>). Talìa [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Sta pàggina cunteni nu culligamentu a' file ruttu (nu culligamentu a' nu file chi' nun esisti).",
+       "hidden-category-category-desc": "Sta catigurìa cunteni <code><nowiki>__HIDDENCAT__</nowiki></code> ntô corpu dâ so pàggina, cosa chi' nâ fa' spuntari supra ê pàggini ntô riquatru dî culligamenti ê catigurìi comu mpustazzioni pridifinuta.",
+       "trackingcategories-nodesc": "Nudda discrizzioni dispunìbbili.",
+       "trackingcategories-disabled": "Sta catigurìa è disattivata",
+       "mailnologin": "Nuddu nnirizzu pi' mannari",
+       "mailnologintext": "Hâ' [[Special:UserLogin|tràsiri]] e aviri riggistratu nu nnirizzu di posta elittrònica vàlidu ntê to [[Special:Preferences|prifirenzi]] pi' putiri mannari posta elittrònica a' l'àutri utenti.",
+       "emailuser": "Manna nu missaggiu di posta elittrònica a' st'utenti",
+       "emailuser-title-target": "Mannari nu missaggiu di posta elittrònica a' {{GENDER:$1|stu utenti|sta utenti}}",
+       "emailuser-title-notarget": "Mannari nu missaggiu di posta elittrònica a' n'utenti",
+       "emailpage": "Mannari nu missaggiu di posta elittrònica a' l'utenti",
+       "emailpagetext": "Poi adupirari lu mòdulu ccassutta pi' mannari nu missaggiu di posta elittrònica a' {{GENDER:$1|stu utenti|sta utenti}}.\nLu nnirizzu di posta elittrònica ca mittisti ntê [[Special:Preferences|prifirenzi dû to utenti]] và a' cumpàriri comu mittenti dû missaggiu, di manera ca lu distinatariu ti pò arrispùnniri dirittamenti.",
+       "defemailsubject": "Missaggiu di {{SITENAME}} di l'utenti \"$1\"",
+       "usermaildisabled": "Missaggi di posta elittrònica a' l'utenti disattivati",
+       "usermaildisabledtext": "Nta sta wiki nun si ponnu mannari missaggi di posta elittrònica a' l'autri utenti",
+       "noemailtitle": "Nuddu nnirizzu di posta elittrònica",
+       "noemailtext": "St'utenti nun havi spicificatu nu nnirizzu di posta elittrònica vàlidu.",
+       "nowikiemailtext": "St'utenti scigghìu di nun ricèviri missaggi di posta elittrònica di l'autri utenti.",
+       "emailnotarget": "Spicificatu comu distinatariu un nomu utenti nun esistenti o nun vàlidu.",
+       "emailtarget": "Metti lu nomu utenti dû distinatariu",
+       "emailusername": "Nomu utenti:",
+       "emailusernamesubmit": "Manna",
+       "email-legend": "Manna posta elittrònica a n'autru utenti di {{SITENAME}}",
        "emailfrom": "Di:",
        "emailto": "A:",
        "emailsubject": "Uggettu:",
        "emailmessage": "Missaggiu:",
-       "emailsend": "Mannari",
+       "emailsend": "Manna",
        "emailccme": "Mànnami na copia dû missaggiu.",
-       "emailccsubject": "Copia dû missaggiu mannatu a $1: $2",
-       "emailsent": "Imeil mannata",
-       "emailsenttext": "Lu tò missaggiu imeil ha statu mannatu.",
-       "emailuserfooter": "Sta e-mail fu mannata di $1 a $2 attraversu la funzionu \"Manna nu missàggiu e-mail a l'utenti\" supra {{SITENAME}}.",
-       "watchlist": "Taliati spiciali",
-       "mywatchlist": "Lista taliata mia",
-       "watchlistfor2": "Pi $1, $2",
-       "nowatchlist": "Nun hai innicatu pàggini a tèniri d'occhiu.",
-       "watchlistanontext": "Pi visualizzari e canciari l'alencu di l'ossirvati spiciali è nicissariu $1.",
-       "watchnologin": "Nun hai effittuatu lu login",
-       "addedwatchtext": "La pàggina \"[[:$1]]\" è stata agghiunciuta â propia [[Special:Watchlist|lista di l'ossirvati spiciali]]. D'ora n poi, li mudìfichi appurtati â pàggina e â sò discussioni vèninu alincati n chidda sedi; lu tìtulu dâ pàggina appari n '''grassettu''' ntâ pàggina di l' [[Special:RecentChanges|ùrtimi canciamenti]] pi rinnìrilu cchiù visìbbili. Siddu n un secunnu tempu s'addisìa eliminari la pàggina dâ lista di l'ossirvati spiciali, fari clic supra \"nun sèquiri\" ntâ barra n àutu.",
-       "removedwatchtext": "La pàggina \"[[:$1]]\" hà statu eliminata dâ lista di l'ossirvati spiciali.",
-       "watch": "talìa",
-       "watchthispage": "talìa sta pàggina",
-       "unwatch": "Nun taliari",
-       "unwatchthispage": "Smetti di sèquiri",
-       "notanarticle": "Nun è n'artìculu",
-       "notvisiblerev": "La revisioni fu cancillata",
-       "watchlist-details": "La lista dê pàggini taliati cunteni {{PLURAL:$1|na pàggina (cu la rispittiva pàggina di discussioni)|$1 pàggini (cu li rispittivi pàggini di discussioni)}}.",
-       "wlheader-enotif": "La nutìfica via e-mail è attivata.",
-       "wlheader-showupdated": "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
-       "wlnote": "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i $1 canciamenti}}, nta l'ùrtim{{PLURAL:$1|a ura|i '''$2''' uri}}.",
+       "emailccsubject": "Copia dû missaggiu ca mannasti a' $1: $2",
+       "emailsent": "Missaggiu di posta elittrònica mannatu",
+       "emailsenttext": "Lu to missaggiu di posta elittrònica fu' mannatu.",
+       "emailuserfooter": "Stu missaggiu fu' mannatu di $1 a' $2 attraversu dâ funzioni \"Manna nu missàggiu di posta elittrònica a' l'utenti\" supra a' {{SITENAME}}.",
+       "usermessage-summary": "Lassatu nu missaggiu di sistema.",
+       "usermessage-editor": "Missaggeri di sistema",
+       "watchlist": "Lista talïata",
+       "mywatchlist": "La me lista talïata",
+       "watchlistfor2": "Di $1, $2",
+       "nowatchlist": "Nun hai nudda vuci ntâ to lista talïata.",
+       "watchlistanontext": "Pi' vìdiri e canciari li vuci dâ to lista talïata hâ' tràsiri.",
+       "watchnologin": "Nun hai trasutu",
+       "addwatch": "Agghiunci â lista talïata",
+       "addedwatchtext": "La pàggina \"[[:$1]]\" fu' agghiunciuta â to [[Special:Watchlist|lista talïata]].\nI canciamenti futuri a' sta pàggina e â so pàggina di discussioni venirannu elincati cca.",
+       "addedwatchtext-short": "La pàggina \"$1\" fu' agghiunciuta â to lista talïata.",
+       "removewatch": "Leva dâ lista talïata",
+       "removedwatchtext": "La pàggina \"[[:$1]]\" fu' livata dâ [[Special:Watchlist|to lista talïata]].",
+       "removedwatchtext-short": "La pàggina \"$1\" fu' livata dâ to lista talïata.",
+       "watch": "Talìa",
+       "watchthispage": "Talìa sta pàggina",
+       "unwatch": "Nun talïari cchiu'",
+       "unwatchthispage": "Finisci di talïari",
+       "notanarticle": "Nun è na pàggina di cuntinutu",
+       "notvisiblerev": "L'ùltima virsioni fatta di n'utenti diffirenti fu' cancillata",
+       "watchlist-details": "{{PLURAL:$1|Cc'è na pàggina|Cci su' $1 pàggini}} ntâ to lista talïata, senza cuntari sparti li pàggini di discussioni.",
+       "wlheader-enotif": "La nutìfica via posta elittrònica è attivata.",
+       "wlheader-showupdated": "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n <strong>grassettu</strong>.",
+       "wlnote": "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i <strong>$1</strong> canciamenti}} fatti nta l'ùrtim{{PLURAL:$1|a ura|i <strong>$2</strong> uri}}, aggiurnati ê $4 dû $3.",
        "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna",
-       "watchlist-options": "Opzioni ussirvati spiciali",
-       "watching": "Junta a l'ussirvati spiciali...",
-       "unwatching": "Scancillazzioni di l'ussirvati spiciali...",
+       "watchlist-options": "Opzioni dâ lista talïata",
+       "watching": "Agghiunciuta â lista talïata...",
+       "unwatching": "Cancillata dâ lista talïata...",
+       "watcherrortext": "Mmattìu n'erruri ntô canciari i to mpustazzioni dâ lista talïata di \"$1\".",
        "enotif_reset": "Segna tutti li pàggini comu già visitati",
        "enotif_impersonal_salutation": "Utenti di {{SITENAME}}",
+       "enotif_subject_deleted": "La pàggina $1 supra a' {{SITENAME}} fu' cancillata di $2",
+       "enotif_subject_created": "La pàggina $1 supra a' {{SITENAME}} fu' crïata di $2",
+       "enotif_subject_moved": "La pàggina $1 supra a' {{SITENAME}} fu' spustata di $2",
+       "enotif_subject_restored": "La pàggina $1 supra a' {{SITENAME}} fu' ripristinata di $2",
+       "enotif_subject_changed": "La pàggina $1 supra a' {{SITENAME}} fu' canciata di $2",
+       "enotif_body_intro_deleted": "La pàggina $1 supra a' {{SITENAME}} fu' cancillata lu $PAGEEDITDATE di $2, talìa $3.",
+       "enotif_body_intro_created": "La pàggina $1 supra a' {{SITENAME}} fu' crïata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_body_intro_moved": "La pàggina $1 supra a' {{SITENAME}} fu' spustata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_body_intro_restored": "La pàggina $1 supra a' {{SITENAME}} fu' ripristinata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_body_intro_changed": "La pàggina $1 supra a' {{SITENAME}} fu' canciata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
        "enotif_lastvisited": "Cunzurta $1 pi vìdiri tutti li canciamenti dâ tò ùrtima vìsita.",
-       "enotif_lastdiff": "Vìdiri $1 pi visualizzari lu canciamentu.",
+       "enotif_lastdiff": "Vidi $1 pi' talïari lu canciamentu.",
        "enotif_anon_editor": "utenti anonimu $1",
-       "enotif_body": "Gintili $WATCHINGUSERNAME,\n\nla pàggina $PAGETITLE di {{SITENAME}} hà stata $CHANGEDORCREATED 'n data $PAGEEDITDATE di $PAGEEDITOR; la virsioni attuali s'attrova a lu ndirizzu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRiassuntu dû canciamentu, nziritu di l'auturi: $PAGESUMMARY $PAGEMINOREDIT\n\nCuntatta l'auturi dû canciamentu:\nvia e-mail: $PAGEEDITOR_EMAIL\nsupra lu situ: $PAGEEDITOR_WIKI\n\nNun vèninu mannati àutri canciamenti 'n caso di ultiriuri canciamenti, a menu ca tu nun vìsiti la pàggina. Noltri, è pussìbbili rimpustari l'avvisu di nutìfica pi tutti li pàggini ntâ lista di l'ussirvati spiciali.\n\n             Lu sistema di nutìfica di {{SITENAME}}, a lu tò sirvizziu\n\n--\nPi mudificari li mpustazzioni dâ lista di l'ussirvati spiciali, vìsita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPi dari lu tò feedback e arricèviri ultiriuri assistenza:\n$HELPPAGE",
+       "enotif_body": "Gintili $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRiassuntu fattu di l'auturi: $PAGESUMMARY $PAGEMINOREDIT\n\nPi' cuntattari l'auturi:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNun ti mannamu autri nutìfichi 'n casu di ultiriuri attività a' menu ca nun vìsiti dda pàggina mentri chi' si' trasutu. Poi puru mpustari dâ to lista talïata l'avvisu di nutìfica pi' tutti li pàggini chi' cunteni.\n\nLu sistema di nutìfica di {{SITENAME}}, ô to sirvizziu\n\n--\nPi' canciari li to mpustazzioni di nutìfica via e-mail, vìsita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPi' canciari li mpustazzioni dâ to lista talïata, vìsita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPi' livari sta pàggina dâ to lista talïata, vìsita\n$UNWATCHURL\n\nPi' lassari cummenti e arricèviri ultiriuri assistenza:\n$HELPPAGE",
        "created": "criatu",
        "changed": "canciatu",
-       "deletepage": "Elìmina la pàggina",
-       "confirm": "Cunferma",
-       "excontent": "Lu cuntinutu era: '$1'",
-       "excontentauthor": "Lu cuntinutu era: '$1' (e lu sulu cuntribbuturi era '[[Special:Contributions/$2|$2]]')",
-       "exbeforeblank": "Lu cuntinutu prima dû svacantamentu era: '$1'",
+       "deletepage": "Cancella la pàggina",
+       "confirm": "Cunfirma",
+       "excontent": "lu cuntinutu era: \"$1\"",
+       "excontentauthor": "lu cuntinutu era: \"$1\" (e lu sulu cuntribbuturi era \"[[Special:Contributions/$2|$2]]\")",
+       "exbeforeblank": "lu cuntinutu prima dû svacantamentu era: \"$1\"",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
-       "historywarning": "Accura: La pàggina ca stai pi cancillari havi na cronoluggìa:",
-       "confirmdeletetext": "Stai cancillannu dû databbasi na pàggina o na mmàggini cu tutta la sò storia di manera pirmanenti. Pi fauri, cunferma ca tu ntenni fari sta cosa, ca tu hai caputu li cunziquenzi, e chi lu fai secunnu li linìi guida stabbiliti 'n [[{{MediaWiki:Policy-url}}]].",
+       "historywarning": "<strong>Accura:</strong> La pàggina ca stai pi' cancillari havi na crunuluggìa cu' $1 virsioni:",
+       "confirmdeletetext": "Stai cancillannu na pàggina cu' tutta la so crunuluggìa.\nPi' favuri, cunfirma ca ntenni fari sta cosa, ca hai caputu li cunsiguenzi, e chi' lu fai secunnu [[{{MediaWiki:Policy-url}}|li linî guida]].",
        "actioncomplete": "Azzioni cumpritata",
        "actionfailed": "Azioni fallita",
        "deletedtext": "\"$1\" ha statu cancillatu.\nTalìa $2 pi na lista di cancillazzioni ricenti.",
-       "dellogpage": "Cancillazzioni",
+       "dellogpage": "Riggistru dî cancillazzioni",
        "dellogpagetext": "Di sèquitu sunnu alincati li pàggini cancillati di ricenti.",
-       "deletionlog": "Log dî cancillazzioni",
+       "deletionlog": "riggistru dî cancillazzioni",
        "reverted": "Ripristinata la virsioni pricidenti",
        "deletecomment": "Mutivu:",
-       "deleteotherreason": "Autra mutivazioni o mutivazioni in più:",
-       "deletereasonotherlist": "Autra mutivazioni",
-       "deletereason-dropdown": "*Mutivazzioni cchiù cumuni pi la cancillazzioni\n** Dumanna di l'auturi\n** Viulazzioni di copyright\n** Vannalismu",
-       "delete-edit-reasonlist": "Cancia li mutivazzioni pi la cancillazioni",
-       "delete-toobig": "La storia dî canciamenti di sta pàggina è assai longa (ortri $1 {{PLURAL:$1|rivisioni|rivisioni}}). La sò scancillazzioni vinni limitata pi scanzari la pussibbilitati di criari senza vulìrilu prubbremi di funziunamentu ô database di {{SITENAME}}.",
-       "delete-warning-toobig": "La storia di sta pàggina è assai longa (ortri $1 {{PLURAL:$1|rivisioni|rivisioni}}). La sò scancillazzioni pò dari prubbremi di funziunamentu ô database di {{SITENAME}}; prucèdiri cu attinzioni.",
-       "rollback": "Annulla li canciamenti",
-       "rollback_short": "Canciu n'arreri",
+       "deleteotherreason": "Autru o ultiriuri mutivu:",
+       "deletereasonotherlist": "Autru mutivu",
+       "deletereason-dropdown": "* Mutivi cchiu' cumuni pâ cancillazzioni\n** Spam\n** Vannalismu\n** Viulazzioni di lu drittu d'auturi\n** Dumanna di l'auturi\n** Rimannu scassatu",
+       "delete-edit-reasonlist": "Cancia li mutivi dâ cancillazzioni",
+       "delete-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiu' ssai di $1 {{PLURAL:$1|virsioni|virsioni}}).\nLa cancillazzioni dî pàggini comu a' chista è risirvata, pi' scansari la pussibbilitati di pruvucari senza vulìrilu prubblemi a' {{SITENAME}}.",
+       "delete-warning-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiu' ssai di $1 {{PLURAL:$1|virsioni|virsioni}}).\nLa so cancillazzioni po' disturbari lu funziunamentu di  {{SITENAME}}; prucedi cu' cautela.",
+       "deleteprotected": "Nun poi cancillari sta pàggina picchi' fu' prutiggiuta.",
+       "deleting-backlinks-warning": "'''Accura:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Autri pàggini]] su' culligati o trascludunu la pàggina chi' stai cancillannu.",
+       "rollback": "Annullamentu di canciamenti",
        "rollbacklink": "canciu n'arreri",
-       "rollbackfailed": "Canciu 'n arreri fallitu",
-       "cantrollback": "Mpussìbbili annullari li canciamenti; l'utenti ca l'effittuau è l'ùnicu a aviri cuntribbuiutu â pàggina.",
-       "alreadyrolled": "Nun è pussìbbili annullari li canciamenti appurtati â pàggina [[:$1]] di parti di [[User:$2|$2]] ([[User talk:$2|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); n'àutru utenti hà già canciatu la pàggina oppuru hà effittuatu lu rollback.\n\nLu canciamentu cchiù ricenti â pàggina fu appurtata di [[User:$3|$3]] ([[User talk:$3|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": " discrizzioni â mudìfica era: \"''$1''\".",
-       "revertpage": "Canciu narrè di [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussioni]]) cu l'ùrtima virsioni di [[User:$1|$1]]",
-       "rollback-success": "Annullati li canciamenti di $1; ritornata â virsioni pricidenti di $2.",
-       "sessionfailure": "S'hà virificatu un prubbrema cu la tò sissioni di login;\nlu sistema nun hà esiquitu lu cumannu mpartitu pi pricauzzioni.\nPi favuri utilizza lu tastu \"'n arreri\" dû tò browser, ricàrrica la pàggina e riprova di novu.",
-       "protectlogpage": "Pàggini prutetti",
-       "protectlogtext": "Lista di prutezzioni/sprutezzioni dî pàggini. Vidi macari la [[Special:ProtectedPages|lista dî pàggini prutetti]].",
-       "protectedarticle": "hà prutettu [[$1]]",
-       "modifiedarticleprotection": "canciàu lu liveddu di prutizzioni di \"[[$1]]\"",
-       "unprotectedarticle": "hà sprutettu [[$1]]",
-       "movedarticleprotection": "spustau la prutizzioni di \"[[$2]]\" a \"[[$1]]\"",
-       "protect-title": "Prutezzioni di \"$1\"",
-       "prot_1movedto2": "[[$1]] spustatu a [[$2]]",
-       "protect-legend": "Cunferma la prutezzioni",
+       "rollbacklinkcount": "cancia n'arreri $1 {{PLURAL:$1|mudìfica|mudìfichi}}",
+       "rollbacklinkcount-morethan": "cancia n'arreri cchiu' ssai di $1 {{PLURAL:$1|mudìfica|mudìfichi}}",
+       "rollbackfailed": "Lu canciu 'n arreri nun riniscìu",
+       "cantrollback": "Nun si po' annullari lu canciamentu;\nl'ùltimu cuntribbuturi è l'ùnicu auturi di sta pàggina.",
+       "alreadyrolled": "Nun si po' annullari l'ùltimu canciamentu â pàggina [[:$1]] fattu di [[User:$2|$2]] ([[User talk:$2|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nquarchidun'autru già hâ canciatu la pàggina o puru hâ fattu nu canciu n'arreri.\n\nL'ùltimu canciamentu â pàggina fu' fattu di [[User:$3|$3]] ([[User talk:$3|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "Lu riassuntu dû canciamentu era: \"''$1''\".",
+       "revertpage": "Annullati li canciamenti fatti di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]]) nfina a' l'ùltima virsioni di [[User:$1|$1]]",
+       "revertpage-nouser": "Annullati li canciamenti fatti di n'utenti ammucciatu nfina a' l'ùltima virsioni di {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Annullati li canciamenti di $1;\nsi turnau a' l'ùltima virsioni di $2.",
+       "sessionfailure-title": "Erruri dâ sissioni",
+       "sessionfailure": "Pari chi' cc'è quarchi' prubblema câ to sissioni di trasuta;\nst'azzioni fu' annullata comu pricauzzioni contra dû furtu di sissioni.\nTorna â pàggina pricidenti, ricàrricala e prova n'autra vota.",
+       "protectlogpage": "Riggistru dî prutizzioni",
+       "protectlogtext": "Ccassutta c'è nu riggistru dî canciamenti â prutizzioni dî pàggini.\nVidi la [[Special:ProtectedPages|lista dî pàggini prutetti]] pi' canùsciri tutti i prutizzioni di pàggini chi' su' in viguri.",
+       "protectedarticle": "prutiggìu [[$1]]",
+       "modifiedarticleprotection": "canciau lu liveddu di prutizzioni di \"[[$1]]\"",
+       "unprotectedarticle": "livau la prutizzioni di \"[[$1]]\"",
+       "movedarticleprotection": "spustau la prutizzioni di \"[[$2]]\" a' \"[[$1]]\"",
+       "protect-title": "Canciamentu dû liveddu di prutizzioni di \"$1\"",
+       "protect-title-notallowed": "Vista dû liveddu di prutizzioni di \"$1\"",
+       "prot_1movedto2": "spustau [[$1]] nta [[$2]]",
+       "protect-badnamespace-title": "Namespace unni nun si po' prutèggiri",
+       "protect-badnamespace-text": "Li pàggini nta stu namespace nun si ponnu prutèggiri.",
+       "protect-norestrictiontypes-text": "Sta pàggina nun si po' prutèggiri picchì nun cc'è nudda sorta di ristrizzioni dispunìbbili.",
+       "protect-norestrictiontypes-title": "Pàggina chi' nun si po' prutèggiri",
+       "protect-legend": "Cunfirma la prutizzioni",
        "protectcomment": "Mutivu:",
        "protectexpiry": "Scadenza",
-       "protect_expiry_invalid": "Scadenza nun vàlida.",
-       "protect_expiry_old": "Scadenza già trascursa.",
-       "protect-text": "Ccà poi vìdiri e canciari lu liveddu di prutezzioni pi la pàggina '''$1'''.",
-       "protect-locked-blocked": "Nun pò canciari li liveddi di prutizzioni quannu sî bloccatu. Li mpostazzioni correnti pâ pàggina sugnu '''$1''':",
-       "protect-locked-dblock": "Mpussibbili canciari li liveddi di prutizzioni pi nu bloccu dô database.\nLi mpostazzioni correnti pâ pàggina sugnu '''$1''':",
-       "protect-locked-access": "Nun hai li pirmessi nicissari pi canciari li liveddi di prutizzioni dâ pàggina.\nLi mpostazzioni correnti pâ pàggina sugnu '''$1''':",
-       "protect-cascadeon": "A lu mumentu sta pàggina è bluccata, poichì nclusa nt{{PLURAL:$1|â pàggina innicata di sèquitu, supra la quala|ê pàggini innicati di sèquitu, supra li quali}} hà statu attivata la prutezzioni ricursiva. È pussìbbili mudificari lu liveddu di prutezzioni di sta pàggina ma lu liveddu di prutezzioni arresta chiddu difinitu dâ prutezzioni ricursiva, siddu la stissa nun veni canciata.",
-       "protect-default": "Auturizza tutti l'utenti",
-       "protect-fallback": "Richiedi lu pirmissu \"$1\"",
-       "protect-level-autoconfirmed": "Blocca l'utenti nun riggistrati",
-       "protect-level-sysop": "Sulu li amministratura",
-       "protect-summary-cascade": "ricursiva",
-       "protect-expiring": "scadi a li $1 (UTC)",
-       "protect-expiry-indefinite": "senza fini",
-       "protect-cascade": "Prutezzioni ricursiva (pruteggi tutti li pàggini nclusi nta chista).",
-       "protect-cantedit": "Nun è possibili canciari li livelli di prutizzioni pi la pàggina n quantu nun si disponi dî pirmessi necissari pi canciari la pàggina stissa.",
-       "protect-othertime": "Durata non 'n alencu:",
-       "protect-othertime-op": "durata non 'n alencu",
-       "protect-existing-expiry": "Scadenza attuali: $2, $3",
-       "protect-otherreason": "Àustri mutivi/dittagghi:",
-       "protect-otherreason-op": "àutri mutivi/dittagghi",
-       "protect-dropdown": "*Mutivi cumuni di prutizzioni\n** Vannalìsimi fatti cchiossai di na vota\n** Nzirimenti di spam fatti cchiossai di na vota\n** Edit war\n** Pàggina usata assai",
+       "protect_expiry_invalid": "L'ura di scadenza nun è vàlida.",
+       "protect_expiry_old": "L'ura di scadenza già havi passatu.",
+       "protect-unchain-permissions": "Sblocca autri opzioni di prutizzioni",
+       "protect-text": "Cca poi a' vìdiri e canciari lu liveddu di prutizzioni dâ pàggina <strong>$1</strong>.",
+       "protect-locked-blocked": "Nun si ponnu canciari li livedda di prutizzioni quannu unu è bluccatu.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
+       "protect-locked-dblock": "Nun si ponnu canciari li livedda di prutizzioni picchì cc'è attivatu un bloccu dâ basi di dati.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
+       "protect-locked-access": "Lu to cuntu nun havi lu pirmissu di canciari li livedda di prutizzioni.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
+       "protect-cascadeon": "Com'ad ora sta pàggina è prutetta picchi' veni nclusa {{PLURAL:$1|ntâ pàggina innicata di sèquitu, supra â quali|ntê pàggini innicati di sèquitu, supra ê quali}} è attivata la prutizzioni a' cascata.\nI canciamenti fatti ô liveddu di prutizzioni di sta pàggina nun vannu a' canciari la prutizzioni a' cascata.",
+       "protect-default": "Cunsenti a' tutti l'utenti",
+       "protect-fallback": "Cunsenti sulu a' l'utenti cû pirmissu \"$1\"",
+       "protect-level-autoconfirmed": "Cunsenti sulu a' l'utenti autu-cunfirmati",
+       "protect-level-sysop": "Cunsenti sulu a' l'amministratura",
+       "protect-summary-cascade": "a' cascata",
+       "protect-expiring": "scadi lu $1 (UTC)",
+       "protect-expiring-local": "scadi lu $1",
+       "protect-expiry-indefinite": "a' tempu nditirminatu",
+       "protect-cascade": "Pruteggi li pàggini nclusi nta chista (prutizzioni a' cascata)",
+       "protect-cantedit": "Nun poi canciari li livedda di prutizzioni di sta pàggina picchì nun hai lu pirmissu di canciàrila.",
+       "protect-othertime": "Autra scadenza:",
+       "protect-othertime-op": "autra scadenza",
+       "protect-existing-expiry": "Scadenza attuali: $3 dû $3",
+       "protect-existing-expiry-infinity": "Scadenza attuali: infinitu",
+       "protect-otherreason": "Autru o ultiriuri mutivu:",
+       "protect-otherreason-op": "Autru mutivu",
+       "protect-dropdown": "*Mutivi cumuni pâ prutizzioni\n** Vannalìsimi ripituti\n** Spam ripitutu\n** Guerra di canciamenti cuntrapruduttiva\n** Pàggina di autu tràficu",
        "protect-edit-reasonlist": "Cancia li mutivi pâ prutizzioni",
-       "protect-expiry-options": "1 ura:1 hour,1 jornu:1 day,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,nfinitu:infinite",
-       "restriction-type": "Pirmissu",
+       "protect-expiry-options": "1 ura:1 hour,1 jornu:1 day,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,infinitu:infinite",
+       "restriction-type": "Pirmissu:",
        "restriction-level": "Liveddu di ristrizzioni:",
-       "minimum-size": "Dimensioni minima",
-       "maximum-size": "Dimensioni massima:",
+       "minimum-size": "Grannizza mìnima",
+       "maximum-size": "Grannizza màssima:",
        "pagesize": "(byte)",
-       "restriction-edit": "Cancia",
-       "restriction-move": "Sposta",
-       "restriction-create": "Criazioni",
-       "restriction-upload": "Càrica",
+       "restriction-edit": "Canciamentu",
+       "restriction-move": "Spustamentu",
+       "restriction-create": "Crïazzioni",
+       "restriction-upload": "Carricamentu",
        "restriction-level-sysop": "prutetta",
        "restriction-level-autoconfirmed": "semi-prutetta",
        "restriction-level-all": "tutti li liveddi",
-       "undelete": "Visualizza pàggini cancillati",
+       "undelete": "Talìa li pàggini cancillati",
        "undeletepage": "Talìa e ricùpira li pàggini cancillati",
-       "undeletepagetitle": "'''Quantu segui è compostu da rivisioni cancillati di [[:$1]]'''.",
+       "undeletepagetitle": "<strong>Quantu segui è cumpostu di virsioni cancillati di [[:$1|$1]]</strong>.",
        "viewdeletedpage": "Talìa li pàggini cancillati",
-       "undeletepagetext": "{{PLURAL:$1|La pàggina ndicata di sècutu fu scancillata|Li $1 pàggini foru scancillati}}, ma {{PLURAL:$1|è|sunnu}} ancora nti l'archìviu e picciò {{PLURAL:$1|pò èssiri arripigghiata|ponnu èssiri aripigghiati}}. L'archìviu pò èssiri svacantatu piriodicamenti.",
-       "undelete-fieldset-title": "Ripigghia rivisioni",
-       "undeleteextrahelp": "Pi ricupirari la storia ntera dâ pàggina, fari clic supra '''''Riprìstina''''' senza silizziunari nudda casella. P'effittuari un riprìstinu silittivu, silizziunari li caselli currispunnenti a li rivisioni a ripristinari e fari clic supra '''''Riprìstina'''''. Facennu clic supra '''''Reset''''' vèninu disilizziunati tutti li caselli e svacantatu lu spazziu pi lu cummentu.",
-       "undeleterevisions": "{{PLURAL:$1|Na rivisioni|$1 rivisioni}} n archiviu",
-       "undeletehistory": "Siddu ricùpiri st'artìculu, tutti li sò rivisioni vèninu ricupirati ntâ cronoluggìa rilativa. Siddu doppu la cancillazzioni na pàggina nova cu lu stissu tìtulu fu criata, li rivisioni ricupirati sunnu nziriti ntâ cronoluggìa e la virsioni attuarmenti online dâ pàggina nun veni canciata.",
-       "undeleterevdel": "Lu riprìstinu nun è fattu siddu cancella parziarmenti la virsioni currenti dâ pàggina o dû file. Nta stu casu, è nicissariu livari lu signu di spunta o lu scuramentu dê rivisioni cancillati cchiù ricenti.",
-       "undeletehistorynoadmin": "Sta pàggina hà statu cancillata. Lu mutivu dâ cancillazzioni è ammustratu ccà sutta, nzèmmula a li dittagghi di l'utenti c'hà canciatu sta pàggina prima dâ cancillazzioni. Lu testu cuntinutu ntê rivisioni cancillati è dispunìbbili sulu a li amministratura.",
-       "undelete-revision": "Rivisioni scancillata di $1, nsiruta lu $4 ê $5 di $3:",
-       "undeleterevision-missing": "Rivisioni errata o mancanti. Lu culligamentu è erratu oppuru la rivisioni hà statu già ripristinata o eliminata di l'archiviu.",
-       "undelete-nodiff": "Nun s'havi attruvatu na rivisioni pricidenti.",
-       "undeletebtn": "Riprìstina!",
-       "undeletelink": "riprìstina",
+       "undeletepagetext": "{{PLURAL:$1|La siguenti pàggina fu' cancillata|Li siguenti $1 pàggini foru cancillati}}, però {{PLURAL:$1|è|sunnu}} ancora nta l'archiviu e pi' chistu si {{PLURAL:$1|po|ponnu}} ancora ricupirari.\nPiriudicamenti l'archìviu po' vèniri svacantatu.",
+       "undelete-fieldset-title": "Ricùpira virsioni",
+       "undeleteextrahelp": "Pi' ricupirari la storia sana dâ pàggina, cliccari <strong><em>{{int:undeletebtn}}</em></strong> senza scegghîri nudda casedda.\nPi' fari nu ricùpiru silittivu, scegghîri li caseddi currispunnenti ê virsioni di ripigghiari, e cliccari <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|virsioni|virsioni}} nta l'archiviu",
+       "undeletehistory": "Siddu ricùpiri sta pàggina, tutti li so virsioni vèninu ricupirati ntâ crunuluggìa.\nSiddu na pàggina nova havi statu crïata cû stissu tìtulu di chidda di ricupirari doppu dâ so cancillazzioni, li virsioni ricupirati vannu a' finiri ntâ crunuluggìa passata.",
+       "undeleterevdel": "Lu ricùpiru nun veni fattu siddu pròvuca la cancillazzioni parziali dâ virsioni currenti dâ pàggina o dû file.\nNta stu casu, hai a' livari lu signu di spunta o l'ammucciamentu dâ virsioni cancillata cchiu' ricenti.",
+       "undeletehistorynoadmin": "Sta pàggina fu' cancillata.\nLu mutivu dâ cancillazzioni è ammustratu ccà sutta, nzèmmula ê dittagghî di l'utenti ca canciaru sta pàggina prima dâ so cancillazzioni.\nLu testu cuntinutu ntê virsioni cancillati è dispunìbbili sulu a' l'amministratura.",
+       "undelete-revision": "Virsioni cancillata di $1 (dû $4 ê $5) di $3:",
+       "undeleterevision-missing": "Virsioni nun vàlida o mancanti.\nPo' èssiri chi' hai un culligamentu sbagghiatu, o puru la virsioni hâ statu già ricupirata o livata di l'archiviu.",
+       "undelete-nodiff": "Nun fu' attruvata nudda virsioni passata.",
+       "undeletebtn": "Ricùpira",
+       "undeletelink": "talìa/ricùpira",
        "undeleteviewlink": "talìa",
-       "undeleteinvert": "Scancia la silizzioni",
-       "undeletecomment": "Cummentu:",
-       "undeletedrevisions": "$1 rivisioni ricupirat{{PLURAL:$1|a|i}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|na rivisioni|$1 rivisioni}} e {{PLURAL:$2|nu file ricupiratu|$2 file ricupirati}}",
-       "undeletedfiles": "{{PLURAL:$1|un file ricupiratu|$1 file ricupirati}}",
-       "cannotundelete": "Lu ricùpiru nun è arrinisciutu: quarcunu àutru putissi aviri già ricupiratu la pàggina.",
-       "undeletedpage": "'''La pàggina $1 hà statu ricupirata''' Cunzurta lu [[Special:Log/delete|log dî cancillazzioni]] pi vìdiri li cancillazzioni e li ricùpiri cchiù ricenti.",
-       "undelete-header": "Vidi lu [[Special:Log/delete|log dî cancillazzioni]] pi li pàggini cancillati di ricenti.",
+       "undeleteinvert": "Inverti la silizzioni",
+       "undeletecomment": "Mutivu:",
+       "undeletedrevisions": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}}",
+       "undeletedrevisions-files": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}} e $2 {{PLURAL:$2|file ricupiratu|file ricupirati}}",
+       "undeletedfiles": "$1 {{PLURAL:$1|file ricupiratu|file ricupirati}}",
+       "cannotundelete": "L'annullamentu dâ cancillazzioni nun riniscìu:\n$1",
+       "undeletedpage": "<strong>La pàggina $1 fu' ricupirata</strong>\n\nCunzulta lu [[Special:Log/delete|riggistru dî cancillazzioni]] pi' vìdiri li cancillazzioni e li ricùpiri cchiu' ricenti.",
+       "undelete-header": "Talìa lu [[Special:Log/delete|riggistru dî cancillazzioni]] pî pàggini cancillati di ricenti.",
+       "undelete-search-title": "Cerca li pàggini cancillati",
        "undelete-search-box": "Cerca li pàggini cancillati",
-       "undelete-search-prefix": "Ammustra li pàggini lu cui tìtulu accumincia cu:",
+       "undelete-search-prefix": "Ammustra li pàggini unni lu tìtulu accumènza cu':",
        "undelete-search-submit": "Cerca",
-       "undelete-no-results": "Nuddu risurtatu attruvatu nta l'archìviu dî pàggini scancillati.",
-       "undelete-filename-mismatch": "Mpussibbili annullari la cancillazzioni dâ rivisioni dô file cû timestamp $1: nomu file nun currispunnenti.",
-       "undelete-bad-store-key": "Mpussibile annullari la cancillazzioni dâ rivisioni dû file cû timestamp $1: file nun dispunibbili prima dâ cancillazzioni.",
-       "undelete-cleanup-error": "Erruri ntâ cancillazzioni dû file d'archiviu nun usatu \"$1\".",
-       "undelete-missing-filearchive": "Mpussibbili ripristinari l'ID $1 de l'archiviu file picchì nun è ntô databbasi. Pò èssiri già statu ripristinatu.",
-       "undelete-error-short": "Erruri ntô ripristinu dû file: $1",
+       "undelete-no-results": "Nudda pàggina currispunnentu fu' attruvata nta l'archiviu dî pàggini cancillati.",
+       "undelete-filename-mismatch": "Nun si po' annullari la cancillazzioni dâ virsioni dû file cu' data e ura $1: Nomu di file nun currispunnenti.",
+       "undelete-bad-store-key": "Nun si po' annullari la cancillazzioni dâ virsioni dû file cu' data e ura $1: Lu file mancava avanti dâ cancillazzioni.",
+       "undelete-cleanup-error": "Erruri ntâ cancillazzioni dû file d'archiviu nun adupiratu \"$1\".",
+       "undelete-missing-filearchive": "Nun si po' ricupirari l'ID $1 di l'archiviu dî file picchì nun è ntâ basi di dati. Po' già avìri statu ricupiratu.",
+       "undelete-error": "Erruri nta l'annullamentu dâ cancillazzioni dâ pàggina",
+       "undelete-error-short": "Erruri nta l'annullamentu dâ cancillazzioni dû file: $1",
        "undelete-error-long": "Si virificaru erruri ntô tentativu di annullari la cancillazzioni dô file:\n\n$1",
-       "undelete-show-file-confirm": "Si sicuru di vuliri taliari na rivisioni dû file scancillatu \"<nowiki>$1</nowiki>\" di $2 a $3?",
+       "undelete-show-file-confirm": "Si' sicuru chi' voi talìari la virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
        "undelete-show-file-submit": "Si",
-       "namespace": "Tipu di pàggina:",
-       "invert": "scancia la silizzioni",
+       "namespace": "Namespace:",
+       "invert": "Inverti la silizzioni",
+       "tooltip-invert": "Scègghî sta casedda p'ammucciari li canciamenti chi' su' fatti a' pàggini dû namespace silizzunatu (e macari dû so namespace assuciatu, si' la casedda rilativa è scigghiuta)",
        "namespace_association": "Namespace assuciatu",
+       "tooltip-namespace_association": "Scègghî sta casedda pi' nclùdiri macari u namespace di discussioni o principali assuciatu ô namespace silizzunatu",
        "blanknamespace": "(Principali)",
-       "contributions": "Cuntribbuti {{GENDER:$1|utenti}}",
-       "contributions-title": "Cuntribbuti di $1",
-       "mycontris": "Li mè cuntribbuti",
-       "contribsub2": "Pi $1 ($2)",
-       "nocontribs": "Secunnu sti criteri nun ci sunnu canci o cuntribbuti.",
+       "contributions": "Cuntribbuta di l'{{GENDER:$1|utenti}}",
+       "contributions-title": "Cuntribbuta di l'utenti $1",
+       "mycontris": "Li me cuntribbuta",
+       "contribsub2": "Di {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Lu cuntu utenti \"$1\" nun è riggistratu.",
+       "nocontribs": "Nuddu canciamentu fu' truvatu chi' currispunni a' sti criterî.",
        "uctop": "(attuali)",
-       "month": "A pàrtiri dô mese (e pricidenti):",
-       "year": "A pàrtiri di l'annu (e pricidenti):",
-       "sp-contributions-newbies": "Ammustra sulu li cuntribbuti di l'utenti novi",
-       "sp-contributions-newbies-sub": "Pi li utenti novi",
-       "sp-contributions-newbies-title": "Cuntribbuti di l'utenti novi",
-       "sp-contributions-blocklog": "log dî blocchi",
-       "sp-contributions-deleted": "cuntribbuti utenti scancillati",
+       "month": "A' pàrtiri dû misi (e pricidenti):",
+       "year": "A' pàrtiri di l'annu (e pricidenti):",
+       "sp-contributions-newbies": "Ammustra sulu li cuntribbuta di l'utenti novi",
+       "sp-contributions-newbies-sub": "Di l'utenti novi",
+       "sp-contributions-newbies-title": "Cuntribbuta di l'utenti novi",
+       "sp-contributions-blocklog": "riggistru dî blocchi",
+       "sp-contributions-suppresslog": "cuntribbuta suppressi di l'utenti",
+       "sp-contributions-deleted": "cuntribbuta cancillati di l'utenti",
        "sp-contributions-uploads": "file carricati",
-       "sp-contributions-logs": "riggistri",
+       "sp-contributions-logs": "riggistra",
        "sp-contributions-talk": "discussioni",
-       "sp-contributions-userrights": "gistioni dî dritti utenti",
+       "sp-contributions-userrights": "gistioni dî dritti di l'utenti",
+       "sp-contributions-blocked-notice": "St'utenti pi' com'ora è bluccatu.\nComu rifirimentu ccassutta cc'è l'ùltima vuci dû riggistru dî blocchi:",
+       "sp-contributions-blocked-notice-anon": "Stu nnirizzu IP pi' com'ora è bluccatu.\nComu rifirimentu ccassutta cc'è l'ùltima vuci dû riggistru dî blocchi:",
        "sp-contributions-search": "Ricerca cuntribbuti",
        "sp-contributions-username": "Nnirizzu IP o nomu utenti:",
-       "sp-contributions-toponly": "Ammuccia sulu li cuntribbuta ca sunnu l'ùrtimi rivisioni pâ pàggina",
+       "sp-contributions-toponly": "Ammustra sulu li canciamenti ca sunnu l'ùrtimi virsioni pâ pàggina",
+       "sp-contributions-newonly": "Ammustra sulu li canciamenti ca sunnu crïazzioni di pàggini novi",
        "sp-contributions-submit": "Risciduta",
-       "whatlinkshere": "Chi punta ccà",
+       "whatlinkshere": "Chi' punta cca",
        "whatlinkshere-title": "Pàggini ca pùntanu a \"$1\"",
        "whatlinkshere-page": "Pàggina:",
        "linkshere": "Sti pàggini hannu nu liami a '''[[:$1]]''':",
        "nolinkshere": "Nudda pàggina havi nu liami a '''[[:$1]]'''.",
        "nolinkshere-ns": "Nun ci sugnu pàggini chi puntano a '''[[:$1]]''' ntô namespace silizziunatu.",
        "isredirect": "pàggina di rinnirizzamentu",
-       "istemplate": "nchiusioni",
-       "isimage": "liami dû file",
+       "istemplate": "trasclusioni",
+       "isimage": "culligamentu ô file",
        "whatlinkshere-prev": "{{PLURAL:$1|pricidenti|pricidenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|succissivu|succissivi $1}}",
        "whatlinkshere-links": "← liami",
-       "whatlinkshere-hideredirs": "$1 redirect",
-       "whatlinkshere-hidetrans": "$1 nclusioni",
-       "whatlinkshere-hidelinks": "$1 link",
-       "whatlinkshere-hideimages": "$1 liami di files",
+       "whatlinkshere-hideredirs": "$1 li rimanni",
+       "whatlinkshere-hidetrans": "$1 li trasclusioni",
+       "whatlinkshere-hidelinks": "$1 li culligamenti",
+       "whatlinkshere-hideimages": "$1 li culligamenti a' file",
        "whatlinkshere-filters": "Filtri",
-       "blockip": "Blocca l'utenti",
-       "blockip-legend": "Blocca l'utenti",
+       "autoblockid": "Bloccu autumàticu #$1",
+       "block": "Bluccari a' n'utenti",
+       "unblock": "Sbluccari a' n'utenti",
+       "blockip": "Blocca a' {{GENDER:$1|stu utenti|sta utenti}}",
+       "blockip-legend": "Blocca a' l'utenti",
        "blockiptext": "Usa lu mòdulu cassutta pi bluccari la pussibbilità di scrìviri pi n'utenti o pi nu ndirizzu IP spicìficu. Chistu s'havi a fari sulu pi privèniri lu vannalismu e secunnu la [[{{MediaWiki:Policy-url}}|pulìtica di {{SITENAME}}]]. Scrivi na raggiùni valida ccà sutta (pi asempiu, cita li pàggini chi foru vannalizzati).",
-       "ipaddressorusername": "Ndirizzu IP o nomu utenti:",
+       "ipaddressorusername": "Nnirizzu IP o nomu utenti:",
        "ipbexpiry": "Durata dû bloccu:",
        "ipbreason": "Mutivu:",
        "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzerimentu di nformazziuni falsi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumozziunalu a siti sterni\n** Nzserimentu di cuntinuti privi di sensu\n** Cumportamenti ntimidatori o molestie\n** Usu ndebitu di cchiù cunti\n** Nomu utenti nun accittabbili",
-       "ipbcreateaccount": "Mpidisci la criazzioni di àutri account",
-       "ipbemailban": "Mpedisci a l'utenti l'inviu di email",
-       "ipbenableautoblock": "Blocca automaticamenti l'ùrtimu ndirizzu IP usatu di l'utenti e li succissivi cu cui vèninu tintati canciamenti",
-       "ipbsubmit": "Blocca st'utenti",
-       "ipbother": "Durata nun n alencu",
-       "ipboptions": "2 uri:2 hours,1 jornu:1 day,3 jorna:3 days,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,nfinitu:infinite",
-       "ipbhidename": "Ammuccia lu nomu utenti dê canciamenti e dê listi",
-       "ipbwatchuser": "Talìa li pàggini e li discussioni utenti di st'utenti",
-       "ipb-disableusertalk": "Nun pirmettiri a stu utilizzaturi di canciari la sò pàggina di discussioni na mentri ca è bluccatu",
-       "ipb-change-block": "Ri-blocca l'utilizzaturi cu sti mpustazzioni",
-       "badipaddress": "Ndirizzu IP nun vàlidu.",
-       "blockipsuccesssub": "Bloccu esiquitu",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] fu bluccatu.<br />\nPi maggiuri nfurmazzioni, talìa la [[Special:BlockList|lista di l'IP bluccati]] .",
-       "ipb-edit-dropdown": "Mutivi pô bloccu",
-       "ipb-unblock-addr": "Sblocca $1",
-       "ipb-unblock": "Sblocca n'utenti o nu ndirizzu IP",
-       "ipb-blocklist": "Alenca li blocchi attivi",
-       "ipb-blocklist-contribs": "Cuntribbuti di $1",
-       "unblockip": "Sblocca ndirizzu IP",
-       "unblockiptext": "Usari lu mòdulu suttastanti pi ristituiri l'accessu n scrittura a un utenti o ndirizzu IP bluccatu.",
+       "ipb-hardblock": "Mpidisci a' l'utenti trasuti di fari canciamenti di stu nnirizzu IP",
+       "ipbcreateaccount": "Mpidisci la crïazzioni di cunti",
+       "ipbemailban": "Mpidisci a' l'utenti di mannari posta elittrònica",
+       "ipbenableautoblock": "Blocca autumaticamenti l'ùltimu nnirizzu IP adupiratu di st'utenti, e li succissivi d'unni prova a' fari canciamenti",
+       "ipbsubmit": "Blocca a' st'utenti",
+       "ipbother": "Autra scadenza:",
+       "ipboptions": "2 uri:2 hours,1 jornu:1 day,3 jorna:3 days,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,infinitu:infinite",
+       "ipbhidename": "Ammuccia lu nomu utenti ntê canciamenti e ntê listi",
+       "ipbwatchuser": "Talìa li pàggini e li discussioni di st'utenti",
+       "ipb-disableusertalk": "Mpidisci a' st'utenti di canciari la sò pàggina di discussioni nta mentri ca è bluccatu",
+       "ipb-change-block": "Blocca di novu l'utenti cu' sti mpustazzioni",
+       "ipb-confirm": "Cunfirma lu bloccu",
+       "badipaddress": "Nnirizzu IP nun vàlidu",
+       "blockipsuccesssub": "Bloccu rinisciutu",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] fu' bluccatu.<br />\nTalìa la [[Special:BlockList|lista dî blocchi]] pi' rivìdiri li blocchi.",
+       "ipb-blockingself": "Stai bluccannu a' tia stissu! Si' sicuru chi' voi fari sta cosa?",
+       "ipb-confirmhideuser": "Stai bluccannu n'utenti chi' havi l'opzioni \"ammuccia utenti\" attivata. A' sta manera u nomu di st'utenti veni supprimutu nta tutti i listi e tutti i riggìstri. Si' sicuru chi' voi fari sta cosa?",
+       "ipb-confirmaction": "Si' si' pi' davera sicuru chi' voi fari sta cosa, scegghî a casedda \"{{int:ipb-confirm}}\" ccassutta.",
+       "ipb-edit-dropdown": "Cancia li mutivi dû bloccu",
+       "ipb-unblock-addr": "Sblocca a' $1",
+       "ipb-unblock": "Sblocca a' n'utenti o nu nnirizzu IP",
+       "ipb-blocklist": "Talìa li blocchi in viguri",
+       "ipb-blocklist-contribs": "Cuntribbuta di {{GENDER:$1|$1}}",
+       "unblockip": "Sblocca a' l'utenti",
+       "unblockiptext": "Adupirari lu mòdulu suttastanti pi' ristitüiri l'accessu in scrittura a' nu nnirizzu IP o nomu utenti ca hâ statu bluccatu.",
        "ipusubmit": "Leva stu bloccu",
-       "unblocked": "L'utenti [[User:$1|$1]] hà statu sbluccatu",
-       "unblocked-id": "Lu bloccu $1 hà statu cacciatu",
-       "ipblocklist": "Utiloizzatura bluccati",
-       "ipblocklist-legend": "Atrova n'utenti bluccatu",
+       "unblocked": "L'utenti [[User:$1|$1]] fu' sbluccatu.",
+       "unblocked-range": "$1 fu' sbluccatu.",
+       "unblocked-id": "Lu bloccu $1 fu' livatu.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] fu' sbluccatu.",
+       "blocklist": "Utenti bluccati",
+       "ipblocklist": "Utenti bluccati",
+       "ipblocklist-legend": "Trova n'utenti bluccatu",
+       "blocklist-userblocks": "Ammuccia li blocchi di cunti",
+       "blocklist-tempblocks": "Ammuccia li blocchi timpuranii",
+       "blocklist-addressblocks": "Ammuccia li blocchi di IP singuli",
+       "blocklist-rangeblocks": "Ammuccia li blocchi di ntirvalli di IP",
+       "blocklist-timestamp": "Data e ura",
+       "blocklist-target": "Oggettu",
+       "blocklist-expiry": "Scadenza",
+       "blocklist-by": "Amministraturi chi' bluccau",
+       "blocklist-params": "Paràmitri dû bloccu",
+       "blocklist-reason": "Mutivu",
        "ipblocklist-submit": "Risciduta",
-       "infiniteblock": "nfinitu",
+       "ipblocklist-localblock": "Bloccu lucali",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Autru bloccu|Autri blocchi}}",
+       "infiniteblock": "infinitu",
        "expiringblock": "scadi lu $1 ê $2",
        "anononlyblock": "sulu anònimi",
-       "noautoblockblock": "bloccu automàticu disabbilitatu",
-       "createaccountblock": "criazzioni account bluccata",
-       "emailblock": "email bluccati",
-       "blocklist-nousertalk": "nun pò mudificari la sò pròpia pàggina di discussioni",
+       "noautoblockblock": "bloccu autumàticu disattivatu",
+       "createaccountblock": "crïazzioni di cunti bluccata",
+       "emailblock": "posta elittrònica bluccata",
+       "blocklist-nousertalk": "nun po' canciari la so stissa pàggina di discussioni",
        "ipblocklist-empty": "L'alencu dî blocchi è vacanti.",
        "ipblocklist-no-results": "Lu nnirizzu IP o nomu utenti richiestu nun è bluccatu.",
        "blocklink": "blocca",
        "unblocklink": "sblocca",
        "change-blocklink": "cancia bloccu",
-       "contribslink": "cuntribbuti",
-       "autoblocker": "Bluccatu automaticamenti pirchì lu ndirizzu IP è cundivisu cu l'utenti \"[[User:$1|$1]]\". Lu bloccu di l'utenti $1 fu mpostu pi lu siquenti mutivu: \"'''$2'''\".",
-       "blocklogpage": "Blocchi",
+       "contribslink": "cuntribbuta",
+       "emaillink": "manna posta elittrònica",
+       "autoblocker": "Bluccatu autumaticamenti pirchì lu to nnirizzu IP havi statu adupiratu di picca tempu di l'utenti \"[[User:$1|$1]]\".\nLu mutivu datu pû bloccu di $1 è \"$2\"",
+       "blocklogpage": "Riggistru dî blocchi",
+       "blocklog-showlog": "St'utenti havi statu bluccatu ntô passatu.\nComu rifirimentu ccassutta cc'è lu riggìstru dî blocchi:",
+       "blocklog-showsuppresslog": "St'utenti havi statu bluccatu e ammucciatu ntô passatu.\nComu rifirimentu ccassutta cc'è lu riggistru dî supprissioni:",
        "blocklogentry": "hà bluccatu [[$1]]; scadenza $2 $3",
        "reblock-logentry": "Canciau li mpustazzioni dû bloccu pi [[$1]] cu na scadenza di $2 $3",
-       "blocklogtext": "Chistu è l'alencu di l'azzioni di bloccu e sbloccu utenti. Li ndirizzi IP bluccati automaticamenti nun sunu alincati. Cunzurtari l'[[Special:BlockList|alencu IP bluccati]] pi l'alencu dî ndirizzi e noma utenti lu cui bloccu è opirativu.",
-       "unblocklogentry": "hà sbluccatu \"$1\"",
+       "blocklogtext": "Chistu è l'alencu di l'azzioni di bloccu e sbloccu di l'utenti.\nLi nnirizzi IP bluccati autumaticamenti nun sunnu alincati.\nCunzurtari l'[[Special:BlockList|alencu dî blocchi]] pi' vìdiri i furbanni e' i blocchi chi' sunnu 'n viguri pi' com'ora.",
+       "unblocklogentry": "sbluccau a' \"$1\"",
        "block-log-flags-anononly": "sulu utenti anònimi",
        "block-log-flags-nocreate": "criazzioni account bluccata",
        "block-log-flags-noautoblock": "bloccu automàticu disattivatu",
        "range_block_disabled": "La pussibbilitati di bluccari ntervalli di ndirizzi IP è disattiva a lu mumentu.",
        "ipb_expiry_invalid": "Durata o scadenza dû bloccu nun vàlida.",
        "ipb_expiry_temp": "Li blocchi dê nomi utenti ammucciati avìssiru èssiri nfiniti",
-       "ipb_hide_invalid": "Impussibili cancillari l'account; putissi aviri troppi canciamenti.",
+       "ipb_hide_invalid": "Nun si po' supprìmiri stu cuntu: havi cchiu' ssai di {{PLURAL:$1|nu canciamentu|$1 canciamenti}}.",
        "ipb_already_blocked": "L'utenti \"$1\" è già bluccatu",
        "ipb-needreblock": "$1 è già bluccatu. Vòi caciari li mpustazzioni?",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Autru bloccu|Autri blocchi}}",
+       "unblock-hideuser": "Nun poi sbluccari st'utenti, picchì u so nomu utenti fu' ammucciatu.",
        "ipb_cant_unblock": "Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.",
        "ipb_blocked_as_range": "Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.",
        "ip_range_invalid": "Ntervallu di ndirizzi IP nun vàlidu.",
+       "ip_range_toolarge": "I blocchi di ntirvalli IP cchiu' granni di /$1 nun sunnu cunsintuti.",
        "proxyblocker": "Blocca proxy",
        "proxyblockreason": "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.",
        "sorbsreason": "Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.",
        "sorbs_create_account_reason": "Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.",
+       "xffblockreason": "Nu nnirizzu IP chi' si trova nta na ntistazzioni X-Forwarded-For, o a toi o dûn server proxy chi' stai adupirannu, fu' bluccatu. U mutivu dû bloccu origginali era: $1",
+       "cant-see-hidden-user": "L'utenti chi' stai pruvannu a' bluccari già fu' bluccatu e ammucciatu.\nComu chi' tu nun hai u drittu \"hideuser\", nun poi ne' vìdiri ne' canciari u bloccu di st'utenti.",
+       "ipbblocked": "Nun poi bluccari o sbluccari a' autri utenti picchì tu stissu si' bluccatu.",
+       "ipbnounblockself": "Nun hai u pirmissu di sbluccari a' tia stissu.",
        "lockdb": "Blocca lu database",
        "unlockdb": "Sblocca lu database",
-       "lockdbtext": "Lu bloccu dû database cumporta la nterruzzioni, pi tutti l'utenti, dâ pussibbilitati di mudificari li pàggini o di criàrinni di novi, di canciari li prifirenzi e mudificari li listi di l'ossirvati spiciali, e n ginirali di tutti l'upirazzioni ca richièdinu canciamenti a lu database. Pi favuri, cunferma ca chistu currispunni effittivamenti a l'azzioni di tia richiesta e ca a lu tèrmini dâ manutinzzioni pruvidi a  lu sbloccu dû database.",
-       "unlockdbtext": "Lu sbloccu dû database cunzenti di novu a tutti li utenti di canciari li pàggini o di criàrinni di novi, di canciari li prifirenzi e canciari li listi di l'ossirvati spiciali, e n ginirali di còmpiri tutti li upirazzioni ca richièdinu canciamenti a lu database. Pi curtisìa, cunferma ca chistu currispunni effittivamenti a l'azzioni di tìa addumannata.",
+       "lockdbtext": "Lu bloccu dû database cumporta la suspinsioni pi' tutti l'utenti dâ pussibbilitati di canciari li pàggini, mpustari li so prifirenzi, mudificari li so listi talïati, e 'n ginirali di cùmpiri tutti l'upirazzioni ca richièdinu canciamenti a lu database.\nPi' favuri cunfirma ca chistu è chiddu chi' hai ntinzioni di fari, e ca a lu tèrmini dâ manutinzzioni pruvidi a lu sbloccu dû database.",
+       "unlockdbtext": "Lu sbloccu dû database cunzenti di novu a tutti l'utenti di canciari li pàggini, mpustari li so prifirenzi, mudificari li so listi talïati, e 'n ginirali di cùmpiri tutti l'upirazzioni ca richièdinu canciamenti a lu database.\nPi' favuri cunfirma ca chistu è chiddu chi' hai ntinzioni di fari.",
        "lockconfirm": "Sì, ntennu effittivamenti bluccari lu database.",
        "unlockconfirm": "Sì, effittivamenti ntennu, sutta la mè rispunzabbilitati, sbluccari lu database.",
        "lockbtn": "Blocca lu database",
        "unlockbtn": "Sblocca lu database",
-       "locknoconfirm": "Nun hà statu spuntata la casillina di cunferma.",
+       "locknoconfirm": "Nun scigghîsti a casedda di cunfirma.",
        "lockdbsuccesssub": "Bloccu dû database esiquitu",
        "unlockdbsuccesssub": "Sbloccu dû database esiquitu",
        "lockdbsuccesstext": "Lu database hà statu bluccatu.\n<br />Arricorda di [[Special:UnlockDB|rimòviri lu bloccu]] doppu aviri accabbatu l'upirazzioni di manutinzioni.",
        "unlockdbsuccesstext": "Lu database hà statu sbluccatu.",
        "lockfilenotwritable": "Mpussìbbili scrìviri supra lu file di ''lock'' dû database. L'accessu n scrittura a tali file di parti dû server web è nicissariu pi bluccari e sbluccari lu database.",
        "databasenotlocked": "Lu database nun è bluccatu.",
+       "lockedbyandtime": "(di {{GENDER:$1|$1}} u $2 ê $3)",
        "move-page": "Spustamentu di $1",
        "move-page-legend": "Sposta la pàggina",
-       "movepagetext": "Usannu lu mòdulu ccà sutta vui canciati lu nomu dâ pàggina, e spustati tutta la sò storia versu la pàggina nova. Lu tìtulu vecchiu addiventa na pàggina di ''redirect'' versu lu tìtulu novu.\nLi liami â pàggina vecchia nun càncianu.\nAssicuràtivi ca lu spustamentu nun havi criatu [[Special:DoubleRedirects|redirect duppi]] o [[Special:BrokenRedirects|redirect rumputi]]. Vui siti rispunzàbbili dî liami chi avìssiru a puntari â pàggina giusta.\n\nLa pàggina '''nun''' è spustata siddu cc'è già na pàggina cu lu tìtulu novu, tranni chi la pàggina 'n chistioni è vacanti o è na pàggina di ''redirect'' e nun havi n'archiviu di canciamenti.\nChistu signìfica chi vui putiti rinuminari la pàggina cu lu nomu vecchiu si aviti sbagghiatu, e chi nun putiti suprascrìviri nta na pàggina chi esisti già.\n\n'''Accura!'''\nChistu pò èssiri nu canciamentu dràsticu pi na pàggina pupulari; aviti a èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
+       "movepagetext": "Adupirannu lu mòdulu ccassutta si cancia lu nomu dâ pàggina, spustannu tutta la sò crunuluggìa nta la pàggina nova.\nLu tìtulu vecchiu addiventa nu rimannu versu lu tìtulu novu.\nSi pònnu aggiurnari autumaticamenti i rimanni chi' puntàvunu ô tìtulu origginali.\nMa si' scegghî di nun fàrilu, t'hai a' assicurari ca lu spustamentu nun crea [[Special:DoubleRedirects|rimanni duppî]] o puru [[Special:BrokenRedirects|rimanni rutti]].\nE' to rispunsabbilità ch'i lïami cuntinuunu a' puntari â pàggina bona.\n\nVidi chi' la pàggina <strong>nun veni spustata</strong> siddu cc'è già na pàggina chi havi lu tìtulu novu, tranni siddu la pàggina 'n quistioni è nu rimannu e nun havi crunuluggìa di canciamenti passati.\nChistu voli diri chi' si po' canciari n'autra vota u nomu di la pàggina a' chiddu ch'avìa prima siddu si fa' nu sbagghiu, e chi nun si po' suprascrìviri na pàggina chi già esisti.\n\n<strong>Accura!</strong>\nChistu po' èssiri nu canciamentu dràsticu pi na pàggina friquintata; aviti a' èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
        "movepagetext-noredirectfixer": "Usannu lu mòdulu ccà sutta vui canciati lu nomu dâ pàggina, e spustati tutta la sò storia versu la pàggina nova. Lu tìtulu vecchiu addiventa na pàggina di rinnirizzamentu versu lu tìtulu novu. \nAssicuràtivi ca lu spustamentu nun criau [[Special:DoubleRedirects|redirect duppi]] o [[Special:BrokenRedirects|redirect rumputi]]. Vui siti rispunzàbbili dî liami chi avìssiru a puntari â pàggina giusta.\n\nLa pàggina '''nun''' è spustata siddu cc'è già na pàggina cu lu tìtulu novu, tranni chi la pàggina 'n chistioni è vacanti o è na pàggina di ''redirect'' e nun havi n'archiviu di canciamenti.\nChistu signìfica chi vui putiti rinuminari la pàggina cu lu nomu vecchiu si aviti sbagghiatu, e chi nun putiti suprascrìviri nta na pàggina chi esisti già.\n\n'''Accura!'''\nChistu pò èssiri nu canciamentu dràsticu pi na pàggina pupulari; aviti a èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
-       "movepagetalktext": "La pàggina di discussioni assuciata, siddu esisti, veni spustata automaticamenti nzèmmula, '''a menu chi:'''\n*Na pàggina nun-vacanti di discussioni già esisti cu lu nomu novu,\n*Hai disilizziunatu lu quatratu ccà sutta.\n\nNta sti casi, tu hai a spustari o agghiùnciri manuarmenti la pàggina di discussioni.",
+       "movepagetalktext": "La pàggina di discussioni sarravi autumaticamenti spustata cud idda <strong>a' menu chi':</strong>\n*Na pàggina di discussioni nun vacanti già esisti cu lu nomu novu, o puru\n*Nun scegghî la casedda ccassutta.\n\nNta sti casi, si' voi, hâ' spustari o jùnciri la pàggina di discussioni a' manu.",
        "movearticle": "Sposta la pàggina",
+       "moveuserpage-warning": "<strong>Accura:</strong> Stai spustannu a pàggina di n'utenti. Hâ' sapìri chi' sulu a pàggina sarravi spustata, l'utenti <em>nun sarravi</em> canciatu di nomu.",
+       "movecategorypage-warning": "<strong>Accura:</strong> Stai spustannu a pàggina di na catigurìa. Hâ' sapìri chi' sulu a pàggina sarravi spustata, i pàggini chi' si tròvunu ntâ catigurìa vecchia <em>nun sarrannu</em> catigurizzati nta chidda nova.",
        "movenologintext": "Lu spustamentu dî pàggini è cunzintitu sulu a l'utenti riggistrati c'hannu esiquitu l'[[Special:UserLogin|accessu]] a lu situ.",
        "movenotallowed": "Nun hai li pirmessi nicissari a lu spustamentu dê pàggini.",
        "movenotallowedfile": "Nun ci su' li pirmessi nicissàrii pi spustari file.",
        "cant-move-user-page": "Nun aviti lu pirmissu nicissàriu pi spustari li pàggini utenti.",
        "cant-move-to-user-page": "Nun aviti li pirmessi nicessàrii pô spustamentu dâ pàggina supra na pàggina utenti (cu eccizzioni di na suttapàggina utenti).",
+       "cant-move-category-page": "Nun hai u pirmissu di spustari i pàggini dî catigurìi.",
+       "cant-move-to-category-page": "Nun hai u pirmissu di spustari pàggini facènnuli divintari pàggini di catigurìi.",
        "newtitle": "Cu lu tìtulu novu di",
        "move-watch": "Talìa sta pàggina",
        "movepagebtn": "Sposta la pàggina",
        "movepage-page-moved": "La pàggina $1 fu spustata a $2.",
        "movepage-page-unmoved": "La pàggina $1 nun pò èssiri spustata a $2.",
        "movepage-max-pages": "Vinni spustatu lu nùmmuru màssimu di $1 {{PLURAL:$1|pàggina|pàggini}} e non si ponnu cchiù spustari àutri pàggini autumàticamenti.",
-       "movelogpage": "Spustamenti",
+       "movelogpage": "Riggistru dî spustamenti",
        "movelogpagetext": "Chistu è l'alencu dî pàggini spustati.",
        "movesubpage": "{{PLURAL:$1|Suttapàggina|Suttapàggini}}",
        "movesubpagetext": "Sta pàggina havi $1 {{PLURAL:$1|suttapàgina ammustrata|suttapàgini ammustrati}} appressu.",
        "movenosubpage": "Sta pàggina nun havi suttapàggini.",
        "movereason": "Mutivu:",
        "revertmove": "riprìstina",
-       "delete_and_move": "Scancella e sposta",
+       "delete_and_move": "Cancella e sposta",
        "delete_and_move_text": "==Richiesta di cancillazzioni==\n\nLa pàggina di distinazzioni \"[[:$1]]\" asisti già. S'addisìa cancillàrila pi rènniri pussìbbili lu spustamentu?",
        "delete_and_move_confirm": "Sì, suvrascrivi la pàggina asistenti",
-       "delete_and_move_reason": "Cancillata pi rènniri pussìbbili lu spustamentu",
+       "delete_and_move_reason": "Cancillata pi' fari largu ô spustamentu di \"[[$1]]\"",
        "selfmove": "Lu tìtulu di distinazzioni nziritu è agguali a chiddu di pruvinenza; mpossibbili spustari la pàggina su idda stissa.",
        "immobile-source-namespace": "Non pòi spustari li pàggini nto namespace \"$1\"",
        "immobile-target-namespace": "Nun pòi spustari li pàggini ntô namespace \"$1\"",
        "immobile-target-namespace-iw": "L'interwiki link nun è n'ubbiettivu bonu pi spustari la pòggina.",
        "immobile-source-page": "Sta pàggina nun pò èssiri spustata.",
        "immobile-target-page": "Nun pòi spustari nti stu tìtulu.",
+       "bad-target-model": "A distinazzioni vuluta adòpira nu mudellu di cuntinutu diffirenti. Nun si po' cunvèrtiri dû $1 ô $2.",
        "imagenocrossnamespace": "Nun pòi spustari na mmàggini fora dû namespace Mmàggini.",
+       "nonfile-cannot-move-to-file": "Nun si po' spustari ntô namespace file chiddu chi' nun è nu file.",
        "imagetypemismatch": "La estensioni nova dû file cun currispunni â sò estensioni riali",
        "imageinvalidfilename": "Lu nomu dû file di distinazzioni nun è validu",
        "fix-double-redirects": "Aggiorna tutti li redirect chi puntanu ô titulu urigginali",
        "move-leave-redirect": "Lassa darreri nu redirect",
-       "protectedpagemovewarning": "'''Attenzioni: Sta pàggina è stata bluccata n modu ca sulu l'utentu cu li privileggi di amministraturi ponu spustarla.'''",
-       "semiprotectedpagemovewarning": "'''Nota:''' Sta pàggina fu bluccata n modo tali ca solo l'utenti riggistrati ponu spustarla.",
+       "protectedpagemovewarning": "<strong>Accura:</strong> Sta pàggina fu' prutiggiuta a' manera chi' sulu l'utenti cu' privileggi d'amministraturi la ponnu spustari.\nPi' rifirimentu, ccassutta è ripurtata l'ùltima vuci dû riggistru:",
+       "semiprotectedpagemovewarning": "<strong>Nota:</strong> Sta pàggina fu' prutiggiuta a' manera chi' sulu l'utenti riggistrati la ponnu spustari.\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
+       "move-over-sharedrepo": "== U file già esisti ==\n[[:$1]] già esisti ntôn dipòsitu cunnivisu. Spustari nu file nta chistu titulu suprascriviravi u file cunnivisu.",
+       "file-exists-sharedrepo": "U nomu di file scigghiutu già è adupiratu ntôn dipòsitu cunnivisu.\nPi' favuri scegghî n'autru nomu.",
        "export": "Esporta pàggini",
        "exporttext": "È pussìbbili espurtari lu testu e la cronoluggìa dî canciamenti di na pàggina o d'un gruppu di pàggini n furmatu XML pi mpurtàrili n àutri siti ca utilìzzanu lu software MediaWiki, attraversu la pàggina [[Special:Import|d'importu]].\n\nP'espurtari li pàggini innicari li tìtuli ntâ casella di testu suttastanti, unu pi riga, e spicificari siddu s'addisìa attèniri la virsioni currenti e tutti li virsioni pricidenti, cu li dati dâ cronoluggìa dâ pàggina, oppuru surtantu l'ùrtima virsioni e li dati currispunnenti a l'ùrtimu canciamentu.\n\nNta st'ùrtimu casu si pò macari utilizzari un culligamentu, p'asempiu [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] p'espurtari \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Esporta tutti i pàggini",
        "exportcuronly": "Ncludi sulu la rivisioni attuali, nun la ntera cronoluggìa",
        "exportnohistory": "---- '''Nota:''' l'espurtazzioni dâ ntera cronoluggìa dî pàggini attraversu sta nterfaccia hà stata disattivata pi mutivi ligati a li pristazzioni dû sistema.",
+       "exportlistauthors": "Includi n'elencu cumpletu dî cuntribbuturi p'ognin pàggina",
        "export-submit": "Espurtazzioni",
        "export-addcattext": "Agghiunci pàggini dâ catigurìa:",
        "export-addcat": "Agghiunci",
        "allmessages-prefix": "Filtra pi prefissu:",
        "allmessages-language": "Lingua:",
        "allmessages-filter-submit": "Vai",
+       "allmessages-filter-translate": "Traduci",
        "thumbnail-more": "Ngrannisci",
        "filemissing": "File mancanti",
        "thumbnail_error": "Erruri ntâ criazzioni dâ miniatura: $1",
+       "thumbnail_error_remote": "Messaggiu d'erruri di $1:\n$2",
        "djvu_page_error": "Nùmmuru di pàggina DjVu erratu",
        "djvu_no_xml": "Mpussibbili òtteniri lu XML pô file DjVu",
+       "thumbnail-temp-create": "Nun fu' pussìbbili crïari nu file timpuraniu pâ miniatura",
+       "thumbnail-dest-create": "Nun fu' pussìbbili sarvari a miniatura ntâ distinazzioni",
        "thumbnail_invalid_params": "Parametri antiprima nun validi",
+       "thumbnail_toobigimagearea": "U file è cchiu' granni di $1",
        "thumbnail_dest_directory": "Mpussibbili criari la directory di distinazzioni",
        "thumbnail_image-type": "Tipu di mmàggini nun supputtatu",
        "thumbnail_gd-library": "Cunfigurazioni ncumpleta da libreria GD: funzioni $1 mancanti",
        "thumbnail_image-missing": "Pari èssiri mancanti lu file: $1",
+       "thumbnail_image-failure-limit": "Cc'hannu statu troppu tintativi ($1 o cchiu' ssai) di ginirari sta miniatura. Pi' favuri prova n'autra vota cchiu' tardu.",
        "import": "Mporta pàggini",
        "importinterwiki": "Mpurtazzioni transwiki",
        "import-interwiki-text": "Silizziunari un pruggettu wiki e lu tìtulu dâ pàggina a mpurtari. Li dati di pubbricazzioni e li noma di l'autura dî vari virsioni sunnu sarvati. Tutti l'opirazzioni di mpurtazzioni trans-wiki sunnu riggistrati ntô [[Special:Log/import|log di mpurtazzioni]].",
+       "import-interwiki-sourcewiki": "Wiki surgenti:",
+       "import-interwiki-sourcepage": "Pàggina surgenti:",
        "import-interwiki-history": "Copia la ntera cronoluggìa di sta pàggina",
        "import-interwiki-templates": "Includi tutti li template",
        "import-interwiki-submit": "Mporta",
        "import-interwiki-namespace": "Trasfirisci li pàggini ntô namespace:",
+       "import-interwiki-rootpage": "Pàggina ràdica di distinazzioni (facultativu):",
        "import-upload-filename": "Nomu file:",
        "import-comment": "Oggettu:",
-       "importtext": "Pi favuri, esporta lu file dâ wiki d'orìggini usannu l'utility Speciale:Export, sàrvalu supra lu tò discu e carrìcalu ccà",
+       "importtext": "Pi favuri, esporta lu file dâ wiki surgenti adupirannu [[Special:Export|a funziunalità d'espurtazzioni]].\nSàrvalu supra a' lu tò computer e carrìcalu ccà.",
        "importstart": "Mpurtazzioni dî pàggini n cursu...",
        "import-revision-count": "{{PLURAL:$1|na rivisioni mpurtata|$1 rivisioni mpurtati}}",
        "importnopages": "Nudda pàggina a mpurtari.",
+       "imported-log-entries": "{{PLURAL:$1|Mpurtata na vuci di riggistru|Mpurtati $1 vuci di riggistru}}.",
        "importfailed": "Mpurtazzioni nun arrinisciuta: $1",
        "importunknownsource": "Tipu d'orìggini scanusciutu pi la mpurtazzioni",
        "importcantopen": "Mpussìbbili grapiri lu file di mpurtazzioni",
        "importuploaderrortemp": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Manca na cartedda timpurània.",
        "import-parse-failure": "Sbagghiu d'anàlisi ntâ mpurtazzioni XML",
        "import-noarticle": "Nudda pàggina di mpurtari.",
-       "import-nonewrevisions": "Tutti li rivisioni già foru mpurtati apprima.",
+       "import-nonewrevisions": "Nudda virsioni fu' mpurtata (o già c'èrunu tutti, o furu sautati tutti picchì mmatteru erruri).",
        "xml-error-string": "$1 a riga $2, culonna $3 (byte $4): $5",
        "import-upload": "Càrrica dati XML",
        "import-token-mismatch": "Si pèrsiru li dati rilativi a la sissioni. Pi piaciri, prova n'àutra vota.",
        "import-invalid-interwiki": "E' mpussìbbili mpurtari dû pruggettu wiki nnicatu.",
-       "importlogpage": "Mpurtazzioni",
+       "import-error-edit": "A pàggina \"$1\" nun fu' mpurtata picchì nun hai u pirmissu di canciàrila.",
+       "import-error-create": "A pàggina \"$1\" nun fu' mpurtata picchì nun hai u pirmissu di crïàrila.",
+       "import-error-interwiki": "A pàggina \"$1\" nun fu' mpurtata picchì u so nomu è risirvatu pû culligamentu esternu (interwiki).",
+       "import-error-special": "A pàggina \"$1\" nun fu' mpurtata picchì apparteni a' nu namespace spiciali chi' nun cunsenti pàggini.",
+       "import-error-invalid": "A pàggina \"$1\" nun fu' mpurtata picchì u nomu unni sarrìa mpurtata nun è vàlidu supra a' sta wiki.",
+       "import-error-unserialize": "A virsioni $2 dâ pàggina \"$1\" nun si potti di-sirializzari. Era signatu chi' sta virsioni adupirava u mudellu di cuntinutu $3 sirializzatu comu $4.",
+       "import-error-bad-location": "A virsioni $2 chi' adòpira u mudellu di cuntinutu $3 nun si po' mimurizzari nta \"$1\" supra a' sta wiki, picchì ddu mudellu nun è suppurtatu nta dda pàggina.",
+       "import-options-wrong": "{{PLURAL:$2|Opzioni sbagghiata|Opzioni sbagghiati}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "A pàggina ràdica spicificata nun è vàlida comu tìtulu.",
+       "import-rootpage-nosubpage": "U namespace \"$1\" dâ pàggina ràdica nun cunsenti suttapàggini.",
+       "importlogpage": "Riggistru dî mpurtazzioni",
        "importlogpagetext": "Riggistru dî mpurtazzioni d'ufficiu di pàggini pruvinenti d'àutri wiki, cumpleti di cronoluggìa.",
        "import-logentry-upload": "hà mpurtatu $1 tràmiti upload",
-       "import-logentry-upload-detail": "{{PLURAL:$1|na rivisioni mpurtata|$1 rivisioni mpurtati}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}}",
        "import-logentry-interwiki": "hà trasfiritu di àutra wiki la pàggina $1",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|na rivisioni mpurtata|$1 rivisioni mpurtati}} di $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}} di $2",
+       "javascripttest": "Virìfichi JavaScript",
+       "javascripttest-pagetext-noframework": "Sta pàggina è risirvata pi' l'esicuzzioni dî virìfichi JavaScript.",
+       "javascripttest-pagetext-unknownframework": "Framework di virìfica \"$1\" scanusciutu.",
+       "javascripttest-pagetext-frameworks": "Pi' favuri scegghî unu dî siguenti framework di virìfica: $1",
+       "javascripttest-pagetext-skins": "Scegghî na peddi câ quali esiguìri i virìfichi:",
+       "javascripttest-qunit-intro": "Talìa [$1 a ducumintazzioni a' prupositu dî virìfichi] supra a' mediawiki.org.",
        "tooltip-pt-userpage": "La tò pàggina utenti",
        "tooltip-pt-anonuserpage": "La pàggina utenti di stu ndirizzu IP",
        "tooltip-pt-mytalk": "La to' pàggina di discussioni",
        "tooltip-pt-anontalk": "Discussioni supra li canciamenti fatti di stu ndirizzu IP",
        "tooltip-pt-preferences": "Li mè prifirenzi",
        "tooltip-pt-watchlist": "La lista dî pàggini ca stai tinennu sutta ossirvazzioni",
-       "tooltip-pt-mycontris": "L'alencu dî tò cuntribbuti",
+       "tooltip-pt-mycontris": "La lista dî to cuntribbuti",
        "tooltip-pt-login": "La riggistrazzioni è cunzigghiata, puru siddu nun obbrigatoria.",
-       "tooltip-pt-logout": "Nisciuta (logout)",
+       "tooltip-pt-logout": "Nisciuta",
+       "tooltip-pt-createaccount": "Si' nvitatu a crïari nu cuntu e tràsiri; però nun è obbligatoriu",
        "tooltip-ca-talk": "Vidi li discussioni rilativi a sta pàggina",
        "tooltip-ca-edit": "Poi canciari sta pàggina. Pi favuri usa lu pulsanti d'antiprima prima di sarvari.",
        "tooltip-ca-addsection": "Agghiunci un cummentu a sta discussioni.",
        "tooltip-ca-viewsource": "Sta pàggina è prutetta, ma poi vìdiri lu sò còdici surgenti.",
        "tooltip-ca-history": "Virsioni pricidenti di sta pàggina.",
        "tooltip-ca-protect": "Pruteggi sta pàggina",
+       "tooltip-ca-unprotect": "Cancia a prutizzioni di sta pàggina",
        "tooltip-ca-delete": "Cancella sta pàggina",
        "tooltip-ca-undelete": "Riprìstina la pàggina com'era prima dâ cancillazzioni",
        "tooltip-ca-move": "Sposta sta pàggina (cancia tìtulu)",
-       "tooltip-ca-watch": "Agghiunci sta pàggina â tò lista di ossirvati spiciali",
-       "tooltip-ca-unwatch": "Elìmina sta pàggina dâ tò lista di ossirvati spiciali",
+       "tooltip-ca-watch": "Agghiunci sta pàggina â to lista talïata",
+       "tooltip-ca-unwatch": "Leva sta pàggina dâ to lista talïata",
        "tooltip-search": "Cerca 'n {{SITENAME}}",
        "tooltip-search-go": "Vai a na pàggina cu chistu nomu esattu siddu asisti",
        "tooltip-search-fulltext": "Arriscedi pàggini pi chistu testu",
        "tooltip-n-portal": "Discrizzioni dû pruggettu, zoccu poi fari, unni attruvari li cosi",
        "tooltip-n-currentevents": "Nfurmazzioni supra l'avvinimenti d'attualitati",
        "tooltip-n-recentchanges": "Alencu di l'ùrtimi canciamenti dû situ.",
-       "tooltip-n-randompage": "Ammustra na pàggina a muzzu",
+       "tooltip-n-randompage": "Carrica na pàggina a' muzzu",
        "tooltip-n-help": "Pàggini d'aiutu.",
        "tooltip-t-whatlinkshere": "Alencu di tutti li pàggini ca sunnu culligati a chista",
        "tooltip-t-recentchangeslinked": "Alencu di l'ùrtimi canciamenti a li pàggini culligati a chista",
        "tooltip-feed-rss": "Feed RSS pi sta pàggina",
        "tooltip-feed-atom": "Feed Atom pi sta pàggina",
-       "tooltip-t-contributions": "Lista dî cuntribbuti di stu utenti",
+       "tooltip-t-contributions": "La lista dî cuntribbuti di stu utenti",
        "tooltip-t-emailuser": "Manna un missaggiu e-mail a stu utenti",
+       "tooltip-t-info": "Autri nfurmazzioni a' prupòsitu di sta pàggina",
        "tooltip-t-upload": "Càrrica mmàggini o file multimidiali",
        "tooltip-t-specialpages": "Lista di tutti li pàggini spiciali",
        "tooltip-t-print": "Virsioni stampabbili di chista pàggina",
        "tooltip-preview": "Antiprima dî canciamenti, ùsala prima di sarvari!",
        "tooltip-diff": "Talìa (mudalitati diff) li canciamenti c'hai fattu.",
        "tooltip-compareselectedversions": "Talìa li diffirenzi tra li dui virsioni silizziunati di sta pàggina.",
-       "tooltip-watch": "Agghiunci sta pàggina â lista di l'ossirvati spiciali",
+       "tooltip-watch": "Agghiunci sta pàggina â to lista talïata",
+       "tooltip-watchlistedit-normal-submit": "Leva i tìtuli",
+       "tooltip-watchlistedit-raw-submit": "Aggiorna a lista talïata",
        "tooltip-recreate": "Ricrea la pàggina puru siddu hà statu cancillata",
        "tooltip-upload": "Ncigna carricamentu",
        "tooltip-rollback": "\"Rollback\" annulla li canci di l'ùrtinu cuntribbuturi â sta pâggina cu nu sulu clic.",
        "tooltip-undo": "\"Annulla\" pirmetti di annullari sta mudìfica e grapi lu mòdulu di mudifica ntâ mudalità di antiprima. Pirmetti di nsiriri na mutivazziopni nti l'uggettu dâ mudifica.",
        "tooltip-preferences-save": "Sarva prifirenzi",
-       "tooltip-summary": "Nsiriri na sintisi curta",
+       "tooltip-summary": "Scrìviri nu riassuntu curtu",
        "common.css": "/* Li stili CSS nziriti ccà s'àpplicanu a tutti li skin */",
        "common.js": "/* Lu còdici JavaScript nziritu ccà veni carricatu di ognuna pàggina, pi tutti l'utenti. */",
        "anonymous": "{{PLURAL:$1|Utenti anònimu|Utenti anònimi}} di {{SITENAME}}",
        "siteuser": "$1, utenti di {{SITENAME}}",
+       "anonuser": "utenti anònimu di {{SITENAME}} $1",
        "lastmodifiedatby": "Sta pàggina hà statu canciata pi l'ùrtima vota lu $2, $1 di $3.",
-       "othercontribs": "Basatu supra lu travagghiu di $1.",
+       "othercontribs": "Basata supra ô travagghiu di $1.",
        "others": "àutri",
        "siteusers": "$1, {{PLURAL:$2|utenti|utenti}} di {{SITENAME}}",
-       "creditspage": "Li autura dâ pàggina",
-       "nocredits": "Nudda nfurmazzioni supra li crèditi dispunìbbili pi sta pàggina.",
+       "anonusers": "{{PLURAL:$2|utenti anònimu|utenti anònimi}} di {{SITENAME}} $1",
+       "creditspage": "Autura dâ pàggina",
+       "nocredits": "Nun cc'è nudda nfurmazzioni supra a' l'autura di sta pàggina.",
        "spamprotectiontitle": "Filtru anti-spam",
        "spamprotectiontext": "La pàggina ca vulevi sarvari hà statu bluccata dû filtru anti-spam. Chistu è prubbabbirmenti duvutu â prisenza di nu liami a nu situ sternu bluccatu.",
        "spamprotectionmatch": "Lu nostru filtru anti-spam hà ndividuatu lu testu siquenti: $1",
        "spambot_username": "MediaWiki - sistema di rimuzzioni spam",
        "spam_reverting": "Ripristinata l'ùrtima virsioni priva di culligamenti a $1",
        "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìanu culligamenti a $1",
+       "spam_deleting": "Pàggina cancillata, tutti li virsioni cuntinìunu culligamenti a' $1",
+       "simpleantispam-label": "Cuntrollu anti spam.\n<strong>NUN</strong> jìnchiri stu campu!",
+       "pageinfo-title": "Nfurmazzioni supra a' \"$1\"",
+       "pageinfo-not-current": "Sfurtunatamenti, nun è pussìbbili furnìri sti nfurmazzioni pî virsioni vecchî.",
+       "pageinfo-header-basic": "Nfurmazzioni essinziali",
+       "pageinfo-header-edits": "Crunuluggìa dî canciamenti",
+       "pageinfo-header-restrictions": "Prutizzioni dâ pàggina",
+       "pageinfo-header-properties": "Prupietà dâ pàggina",
+       "pageinfo-display-title": "Tìtulu ammustratu",
+       "pageinfo-default-sort": "Criteriu d'ordinamentu pridifinutu",
+       "pageinfo-length": "Lunghizza dâ pàggina (in byte)",
+       "pageinfo-article-id": "ID dâ pàggina",
+       "pageinfo-language": "Lingua dû cuntinutu dâ pàggina",
+       "pageinfo-content-model": "Mudellu dû cuntinutu dâ pàggina",
+       "pageinfo-robot-policy": "Innicizzazzioni pi' menzu di robot",
+       "pageinfo-robot-index": "Cunsintuta",
+       "pageinfo-robot-noindex": "Prüibbuta",
+       "pageinfo-watchers": "Quanti talìunu sta pàggina",
+       "pageinfo-few-watchers": "Cchiu' picca di $1 talïaturi",
+       "pageinfo-redirects-name": "Nùmmiru di rimanni a' sta pàggina",
+       "pageinfo-subpages-name": "Nùmmiru di suttapàggini di sta pàggina",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|chi' è un rimannu|chi' su' rimanni}}; $3 {{PLURAL:$3|chi' nun è un rimannu|chi' nun su' rimanni}})",
+       "pageinfo-firstuser": "Crïaturi dâ pàggina",
+       "pageinfo-firsttime": "Data dâ crïazzioni dâ pàggina",
+       "pageinfo-lastuser": "Ùltimu cuntribbuturi",
+       "pageinfo-lasttime": "Data di l'ùltimu canciamentu",
+       "pageinfo-edits": "Nùmmiru tutali di canciamenti",
+       "pageinfo-authors": "Nùmmiru tutali di autura distinti",
+       "pageinfo-recent-edits": "Nùmmiru di canciamenti ricenti (nta l'ultimu pirìudu di $1)",
+       "pageinfo-recent-authors": "Nùmmiru di cuntribbutura ricenti distinti",
+       "pageinfo-magic-words": "{{PLURAL:$1|Palora màggica|Palori màggichi}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Catigurìa ammucciata|Catigurìi ammucciati}} ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Template trasclusu|Template trasclusi}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Pàggina|Pàggini}} unni chista è trasclusa ($1)",
        "pageinfo-toolboxlink": "Nfurmazzioni ncapu la pàggina",
-       "markaspatrolleddiff": "Segna lu canciamentu comu virificatu",
-       "markaspatrolledtext": "Segna sta pàggina comu virificata",
-       "markedaspatrolled": "Canciamentu virificatu",
-       "markedaspatrolledtext": "Lu canciamentu silizziunatu hà statu signatu comu virificatu.",
-       "rcpatroldisabled": "La virìfica di l'ùrtimi canciamenti è disattivata",
-       "rcpatroldisabledtext": "La funzioni di virìfica di l'ùrtimi canciamenti a lu mumentu nun è attiva.",
-       "markedaspatrollederror": "Mpussìbbili contrassignari lu canciamentu comu virificatu",
-       "markedaspatrollederrortext": "Ci voli spicificari un canciamentu a contrassignari comu virificatu.",
-       "markedaspatrollederror-noautopatrol": "Nun si disponi dî pirmissi nicissari pi signari li propi canciamenti comu virificati.",
-       "patrol-log-page": "Canciamenti virificati",
-       "patrol-log-header": "Ccassutta sunnu elencati li virìfichi dî canci.",
-       "log-show-hide-patrol": "$1 log di li canciamenti virificati",
-       "deletedrevision": "Rivisioni pricidenti, cancillata: $1.",
+       "pageinfo-redirectsto": "Rimanna a'",
+       "pageinfo-redirectsto-info": "nfurmazzioni",
+       "pageinfo-contentpage": "Cuntata comu pàggina di cuntinutu",
+       "pageinfo-contentpage-yes": "Sì",
+       "pageinfo-protect-cascading": "Di cca pàrtunu prutizzioni a' cascata",
+       "pageinfo-protect-cascading-yes": "Sì",
+       "pageinfo-protect-cascading-from": "Pìgghia prutizzioni a' cascata di",
+       "pageinfo-category-info": "Nfurmazzioni supra â catigurìa",
+       "pageinfo-category-pages": "Nùmmiru di pàggini",
+       "pageinfo-category-subcats": "Nùmmiru di suttacatigurìi",
+       "pageinfo-category-files": "Nùmmiru di file",
+       "markaspatrolleddiff": "Marca comu battugghiatu",
+       "markaspatrolledtext": "Marca sta pàggina comu battugghiata",
+       "markedaspatrolled": "Marcata comu battugghiata",
+       "markedaspatrolledtext": "La virsioni scigghiuta di [[:$1]] fu' marcata comu battugghiata.",
+       "rcpatroldisabled": "Lu battugghiamentu di l'ùrtimi canciamenti è disattivatu",
+       "rcpatroldisabledtext": "La funzioni di battugghiamentu di l'ùrtimi canciamenti com'ad ora è disattivata.",
+       "markedaspatrollederror": "Nun si po' marcari comu battugghiatu",
+       "markedaspatrollederrortext": "Hâ' spicificari na virsioni di marcari comu battugghiata.",
+       "markedaspatrollederror-noautopatrol": "Nun hai lu pirmissu di marcari li to canciamenti comu battugghiati.",
+       "markedaspatrollednotify": "Stu canciamentu a' $1 fu' marcatu comu battugghiatu.",
+       "markedaspatrollederrornotify": "La marcatura comu battugghiatu nun riniscìu.",
+       "patrol-log-page": "Riggìstru dî battugghî",
+       "patrol-log-header": "Chistu è nu riggìstru dî virsioni battugghiati.",
+       "log-show-hide-patrol": "$1 lu riggistru dî battugghî",
+       "deletedrevision": "Cancillata na virsioni vecchia di $1",
        "filedeleteerror-short": "Erruri ntâ cancillazzioni dû file: $1",
-       "filedeleteerror-long": "Si virificaru erruri ntô tentativu di cancillari lu file:\n\n$1",
-       "filedelete-missing": "Mpussibbili cancillari lu file \"$1\" pirchì nun asisti.",
-       "filedelete-old-unregistered": "La rivisioni dô file nnicata, \"$1\", nun è cuntinuta ntô databbasi.",
-       "filedelete-current-unregistered": "Lu file spicificatu, \"$1\", nun Ã¨ cuntinutu ntô databbasi.",
-       "filedelete-archive-read-only": "Lu server Web nun è capaci di scrìviri ntâ directory d'archiviu \"$1\".",
-       "previousdiff": "← Diffirenza pricidenti",
-       "nextdiff": "Diffirenza siquenti →",
-       "mediawarning": "'''Accura''': Stu file pò cuntèniri còdici malignu, esiquènnulu lu vostru sistema putisi vèniri cumprumissu.",
+       "filedeleteerror-long": "Mmatteru erruri ntô tintativu di cancillari lu file:\n\n$1",
+       "filedelete-missing": "Lu file \"$1\" nun si po' cancillari pirchì nun esisti.",
+       "filedelete-old-unregistered": "La virsioni spicificata dû file, \"$1\", nun è cuntinuta ntâ basi di dati.",
+       "filedelete-current-unregistered": "Lu file spicificatu, \"$1\", nun Ã¨ cuntinutu ntâ basi di dati.",
+       "filedelete-archive-read-only": "La cartella d'archiviu \"$1\" nun è scrivìbbili dû server web.",
+       "previousdiff": "← Canciamentu avanti",
+       "nextdiff": "Canciamentu appressu →",
+       "mediawarning": "<strong>Accura:</strong>Stu gèniri di file po' cuntèniri còdici malignu.\nEsiquènnulu, lu vostru sistema putissi vèniri cumprumissu.",
        "imagemaxsize": "Diminzioni màssima dî mmàggini:<br />''(pi li pàggini di discrizzioni dô file)''",
        "thumbsize": "Grannizza dî miniaturi:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàggina|pàggini}}",
-       "file-info": "Diminzioni: $1, tipu MIME: $2",
-       "file-info-size": "$1 × $2 pixel, diminzioni: $3, tipu MIME: $4",
-       "file-nohires": "Nun sunnu dispunìbbili virsioni a risuluzzioni cchiù elivata.",
-       "svg-long-desc": "file SVG, dimensioni nominali $1 × $2 pixel, dimensioni dô file: $3",
-       "show-big-image": "Virsioni a àuta risuluzzioni",
-       "file-info-gif-looped": "luppatu",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frame}}",
+       "file-info": "Grannizza: $1, tipu MIME: $2",
+       "file-info-size": "$1 × $2 pixel, grannizza dû file: $3, tipu MIME: $4",
+       "file-info-size-pages": "$1 × $2 pixel, grannizza dû file: $3, tipu MIME: $4, $5 {{PLURAL:$5|pàggina|pàggini}}",
+       "file-nohires": "Risuluzzioni cchiù auta nun nn'havi.",
+       "svg-long-desc": "File SVG, diminsioni nominali $1 × $2 pixel, grannizza dû file: $3",
+       "svg-long-desc-animated": "File SVG animatu, diminsioni numinali $1 × $2 pixel, grannizza dû file: $3",
+       "svg-long-error": "File SVG nun vàlidu: $1",
+       "show-big-image": "File origginali",
+       "show-big-image-preview": "Diminsioni di st'antiprima: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Autra risuluzzioni|Autri risuluzzioni}}: $1.",
+       "show-big-image-size": "$1 × $2 pixel",
+       "file-info-gif-looped": "a' ripitizzioni",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|futugramma|futugrammi}}",
+       "file-info-png-looped": "a' ripitizzioni",
+       "file-info-png-repeat": "ripitutu {{PLURAL:$1|na vota|$1 voti}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|futugramma|futugrammi}}",
+       "file-no-thumb-animation": "<strong>Nota: pi' causa di limitazzioni tècnichi, li miniaturi di stu file nun vènunu animati.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Nota: pi' causa di limitazzioni tècnichi, li miniaturi di na mmàggini GIF a' risuluzzioni auta comu a' chista nun vènunu animati.</strong>",
        "newimages": "Gallarìa dî file novi",
-       "imagelisttext": "Di sèquitu veni prisintata na lista di '''$1''' file urdinat{{PLURAL:$1|u|i}} pi $2.",
-       "newimages-summary": "Sta pàggina spiciali ammustra li file caricati di cchiù picca tempu.",
-       "newimages-legend": "Nomu file",
-       "newimages-label": "Nomu file (o nu pezzu d'iddu):",
-       "noimages": "Nenti a vìdiri.",
-       "ilsubmit": "Va' cerca",
-       "bydate": "pi data",
-       "sp-newimages-showfrom": "Ammustra li mmàggini cchiù ricenti a pàrtiri d'uri $2 dô $1",
-       "bad_image_list": "Lu furmatu è lu siquenti:\n\nVèninu cunzidirati sulu l'alenchi puntati (righi ca accumènzanu cû sìmmulu *). Lu primu lijami supra ogni riga havi a èssiri nu lijami a nu file nun addisiatu.\nLi lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (pàggini ntê quali lu file pò èssiri richiamatu 'n modu nurmali).",
+       "imagelisttext": "Ccassutta cc'è na lista di <strong>$1</strong> {{PLURAL:$1|file ordinatu|file ordinati}} $2.",
+       "newimages-summary": "Sta pàggina spiciali ammustra li file carricati di cchiu' picca tempu.",
+       "newimages-legend": "Filtru",
+       "newimages-label": "Nomu dû file (o na so parti):",
+       "newimages-showbots": "Ammustra li carricamenti dî bot",
+       "noimages": "Nenti a' vìdiri.",
+       "ilsubmit": "Va cerca",
+       "bydate": "pi' data",
+       "sp-newimages-showfrom": "Ammustra li file cchiu' novi a' pàrtiri dî $2 dû $1",
+       "seconds": "{{PLURAL:$1|un sicunnu|$1 sicunni}}",
+       "minutes": "{{PLURAL:$1|un minutu|$1 minuti}}",
+       "hours": "{{PLURAL:$1|un'ura|$1 uri}}",
+       "days": "{{PLURAL:$1|un jornu|$1 jorna}}",
+       "weeks": "{{PLURAL:$1|na simana|$1 simani}}",
+       "months": "{{PLURAL:$1|un misi|$1 misi}}",
+       "years": "{{PLURAL:$1|un annu|$1 anni}}",
+       "ago": "$1 fa'",
+       "just-now": "propia ora",
+       "hours-ago": "{{PLURAL:$1|un'ura|$1 uri}} fa'",
+       "minutes-ago": "{{PLURAL:$1|un minutu|$1 minuti}} fa'",
+       "seconds-ago": "{{PLURAL:$1|un sicunnu|$1 sicunni}} fa'",
+       "monday-at": "Lùniri ê $1",
+       "tuesday-at": "Màrtiri ê $1",
+       "wednesday-at": "Mèrcuri ê $1",
+       "thursday-at": "Jòviri ê $1",
+       "friday-at": "Vènniri ê $1",
+       "saturday-at": "Sàbbatu ê $1",
+       "sunday-at": "Dumìnica ê $1",
+       "yesterday-at": "Ajeri ê $1",
+       "bad_image_list": "Lu furmatu è lu siguenti:\n\nSu' pigghiati a' cunsiddirazzioni sulu li vuci d'elenchi puntati (li righi ca accumènzanu cû sìmmulu *).\nLu primu culligamentu nta ogni' riga havi a' puntari ôn file nun addisiatu.\nSi' cci su' autri culligamenti nta stissa riga, su' cunsiddirati comu eccizzioni, vali a' diri pàggini unni lu file po' èssiri ncurpuratu.",
        "metadata": "Metadati",
-       "metadata-help": "Stu file cunteni nfurmazzioni agghiuntivi, prubbabbirmenti junti dâ fotucàmira o dû scanner usati pi criàrila o diggitalizzàrila. Siddu lu file hà statu canciatu, arcuni dittagghi putìssiru nun currispùnniri â rialitati.",
-       "metadata-expand": "Ammustra dittagghi",
-       "metadata-collapse": "Ammuccia dittagghi",
-       "metadata-fields": "Li campi rilativi a li metadati di la mmàggini alincati 'n stu missaggiu vèninu ammustrati supra la pàggina dâ mmàggini quannu la tabbella dî metadati è prisintata ntâ forma brivi. Pi mpustazzioni pridifinita, l'àutri campi vèninu ammucciati.\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-help": "Stu file cunteni autri nfurmazzioni, prubbabbirmenti agghiunti dâ màchina futugràfica o dû scanner adupirati pi' crïàrilu o diggitalizzàrilu.\nSiddu lu file hâ statu canciatu dâ so cunnizzioni origginali, certi dittagghî putìssiru nun currispùnniri ô statu novu dû file.",
+       "metadata-expand": "Ammustra li nfurmazzioni dittagghiati",
+       "metadata-collapse": "Ammuccia li nfurmazzioni dittagghiati",
+       "metadata-fields": "Li campi dî metadati dâ mmàggini elincati nta stu missaggiu sarrannu ammustrati ntâ pàggina dâ mmàggini quannu la tavula dî metadati è strinciuta.\nL'àutri campi comu mpustazzioni pridifinuta sarrannu ammucciati.\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": "Larghizza",
        "exif-imagelength": "Autizza",
-       "exif-bitspersample": "Bit pi campiuni",
+       "exif-bitspersample": "Bit pi' cumpunenti",
        "exif-compression": "Miccanismu di cumprissioni",
-       "exif-photometricinterpretation": "Struttura dî pixel",
-       "exif-orientation": "Urientamentu",
-       "exif-samplesperpixel": "Nùmmuru dî cumpunenti",
+       "exif-photometricinterpretation": "Cumpusizzioni dû pixel",
+       "exif-orientation": "Orientamentu",
+       "exif-samplesperpixel": "Nùmmiru di cumpunenti",
        "exif-planarconfiguration": "Dispusizzioni dî dati",
-       "exif-ycbcrsubsampling": "Rapportu di campiunamentu Y / C",
-       "exif-ycbcrpositioning": "Pusizziunamentu cumpunenti Y e C",
-       "exif-xresolution": "Risuluzzioni urizzuntali",
+       "exif-ycbcrsubsampling": "Rapportu di suttacampiunamentu Y / C",
+       "exif-ycbcrpositioning": "Pusizziunamentu dî cumpunenti Y e C",
+       "exif-xresolution": "Risuluzzioni orizzuntali",
        "exif-yresolution": "Risuluzzioni virticali",
        "exif-stripoffsets": "Pusizzioni dî dati mmàggini",
        "exif-rowsperstrip": "Nùmmiru righi pi striscia",
        "exif-colorspace": "Spazziu dî culuri",
        "exif-componentsconfiguration": "Significatu d'ognuna cumpunenti",
        "exif-compressedbitsperpixel": "Mudalitati di cumprissioni dâ mmàggini",
-       "exif-pixelydimension": "Larghizza effittiva mmàggini",
-       "exif-pixelxdimension": "Autizza effittiva mmàggini",
+       "exif-pixelydimension": "Larghizza  mmàggini",
+       "exif-pixelxdimension": "Autizza  mmàggini",
        "exif-usercomment": "Noti di l'utenti",
        "exif-relatedsoundfile": "File audiu culligatu",
        "exif-datetimeoriginal": "Data e ura di criazzioni dî dati",
        "exif-exposureprogram": "Prugramma d'espusizzioni",
        "exif-spectralsensitivity": "Sinzibbilitati spittrali",
        "exif-isospeedratings": "Sinzibbilitati ISO",
-       "exif-shutterspeedvalue": "Tempu d'espusizzioni",
-       "exif-aperturevalue": "Apirtura",
-       "exif-brightnessvalue": "Luminusitati",
+       "exif-shutterspeedvalue": "Tempu d'espusizzioni APEX",
+       "exif-aperturevalue": "Apirtura APEX",
+       "exif-brightnessvalue": "Luminusitati APEX",
        "exif-exposurebiasvalue": "Currezzioni espusizzioni",
        "exif-maxaperturevalue": "Apirtura màssima",
        "exif-subjectdistance": "Distanza dû suggettu",
        "exif-gpsareainformation": "Nomu dâ zona GPS",
        "exif-gpsdatestamp": "Data GPS",
        "exif-gpsdifferential": "Currezzioni diffirinziali GPS",
+       "exif-jpegfilecomment": "Cummentu dû file JPEG",
+       "exif-keywords": "Palori chiavi",
+       "exif-worldregioncreated": "Parti dû munnu unni sta fotu fu' pigghiata",
+       "exif-countrycreated": "Paìsi dû munnu unni sta fotu fu' pigghiata",
+       "exif-countrycodecreated": "Còdici dû paìsi unni sta fotu fu' pigghiata",
+       "exif-provinceorstatecreated": "Riggioni o pruvincia unni sta fòtu fu' pigghiata",
+       "exif-citycreated": "Citati unni sta fotu fu' pigghiata",
+       "exif-sublocationcreated": "Parti dâ citati unni sta fotu fu' pigghiata",
+       "exif-worldregiondest": "Parti dû munnu raffigurata",
+       "exif-countrydest": "Paìsi dû munnu raffiguratu",
+       "exif-countrycodedest": "Còdici dû paìsi raffiguratu",
+       "exif-provinceorstatedest": "Riggioni o pruvincia raffigurata",
+       "exif-citydest": "Citati raffigurata",
+       "exif-sublocationdest": "Parti dâ citati raffigurata",
+       "exif-objectname": "Tìtulu curtu",
+       "exif-specialinstructions": "Istruzzioni spiciali",
+       "exif-headline": "Tìtulu",
+       "exif-credit": "Orìggini/Furnituri",
+       "exif-source": "Fonti",
+       "exif-editstatus": "Statu edituriali dâ mmàggini",
+       "exif-urgency": "Urgenza",
+       "exif-fixtureidentifier": "Rubbrica",
+       "exif-locationdest": "Postu raffiguratu",
+       "exif-locationdestcode": "Còdici dû postu raffiguratu",
+       "exif-objectcycle": "Ura dâ jurnata pâ quali stu file è ntisu",
+       "exif-contact": "Nfurmazzioni di cuntattu",
+       "exif-writer": "Scritturi",
+       "exif-languagecode": "Lingua",
+       "exif-iimversion": "Virsioni di IIM",
+       "exif-iimcategory": "Catigurìa",
+       "exif-iimsupplementalcategory": "Catigurìi aggiuntivi",
+       "exif-datetimeexpires": "Di nun adupiràri doppu",
+       "exif-datetimereleased": "Data di rilassu",
+       "exif-originaltransmissionref": "Còdici dû locu di trasmissioni origginali",
+       "exif-identifier": "Idintificaturi",
+       "exif-lens": "Lenti adupirata",
+       "exif-serialnumber": "Nummiru di serî dâ màchina futugràfica",
+       "exif-cameraownername": "Prupietariu dâ màchina futugràfica",
+       "exif-label": "Etichetta",
+       "exif-datetimemetadata": "Data di l'ùltimu canciamentu dî metadati",
+       "exif-nickname": "Nomu infurmali dâ mmàggini",
+       "exif-rating": "Votu (supra a' 5)",
+       "exif-rightscertificate": "Cirtificatu pâ gistioni dî dritti",
+       "exif-copyrighted": "Cupertu di drittu d'auturi",
+       "exif-copyrightowner": "Ditinturi dû drittu d'auturi",
+       "exif-usageterms": "Tèrmini pi l'usu",
+       "exif-webstatement": "Dichiarazzioni di drittu d'auturi in linia",
+       "exif-originaldocumentid": "Idintificaturi unìvucu dû ducumentu origginali",
+       "exif-licenseurl": "URL dâ licenza di drittu d'auturi",
+       "exif-morepermissionsurl": "Nfurmazzioni pâ cuncissioni di autri licenzi",
+       "exif-attributionurl": "Quannu si fa' usu di st'òpira, si prega di mèttiri nu culligamentu a'",
+       "exif-preferredattributionname": "Quannu si fa' usu di st'òpira, si prega di attribuìrinni a patirnità a'",
+       "exif-pngfilecomment": "Cummentu dû file PNG",
+       "exif-disclaimer": "Dichiarazzioni di esclusioni di rispunsabbilità",
+       "exif-contentwarning": "Avvirtimentu supra ô cuntinutu",
+       "exif-giffilecomment": "Cummentu dû file GIF",
+       "exif-intellectualgenre": "Gèniri di elimentu",
+       "exif-subjectnewscode": "Còdici di l'oggettu",
+       "exif-scenecode": "Còdici IPTC dâ nquatratura",
+       "exif-event": "Eventu raffiguratu",
+       "exif-organisationinimage": "Assuciazzioni raffigurata",
+       "exif-personinimage": "Pirsuna raffigurata",
+       "exif-originalimageheight": "Autizza dâ mmàggini avanti dû ritagghiu",
+       "exif-originalimagewidth": "Larghizza dâ mmàggini avanti dû ritagghiu",
        "exif-compression-1": "Nuddu",
+       "exif-compression-2": "cudìfica unidiminsiunali run-length encoding mudificata di Huffman dû Gruppu 3 CCITT",
+       "exif-compression-3": "cudìfica di fax dû Gruppu 3 CCITT",
+       "exif-compression-4": "cudìfica di fax dû Gruppu 4 CCITT",
+       "exif-copyrighted-true": "Prutettu di drittu d'auturi",
+       "exif-copyrighted-false": "Statu dû drittu d'auturi nun difinutu",
        "exif-unknowndate": "Data scanusciuta",
        "exif-orientation-1": "Nurmali",
        "exif-orientation-2": "Capuvortu urizzontarmenti",
        "exif-orientation-3": "Rutatu di 180°",
        "exif-orientation-4": "Capuvortu virticarmenti",
        "exif-orientation-5": "Rotatu 90° 'n sensu antiurariu e capuvortu virticarmenti",
-       "exif-orientation-6": "Rutatu 90° 'n senzu orariu",
+       "exif-orientation-6": "Vutatu di 90° 'n senzu antiurariu",
        "exif-orientation-7": "Rotatu 90° 'n sensu urariu e capuvortu virticarmenti",
-       "exif-orientation-8": "Rutatu 90° 'n senzu antiorariu",
+       "exif-orientation-8": "Vutatu di 90° 'n senzu urariu",
        "exif-planarconfiguration-1": "a blocchi (chunky)",
        "exif-planarconfiguration-2": "liniari (planar)",
        "exif-xyresolution-i": "$1 punti pi puseri (dpi)",
        "exif-sensingmethod-5": "Sinzuri ària culuri siquinziali",
        "exif-sensingmethod-7": "Sinzuri triliniari",
        "exif-sensingmethod-8": "Sinzuri liniari culuri siquinziali",
+       "exif-filesource-3": "Màchina futugràfica diggitali",
        "exif-scenetype-1": "Fotugrafìa diretta",
        "exif-customrendered-0": "Prucessu nurmali",
        "exif-customrendered-1": "Prucessu pirsunalizzatu",
        "exif-gpslatitude-s": "Latitùtini Sud",
        "exif-gpslongitude-e": "Lungitùtini Est",
        "exif-gpslongitude-w": "Lungitùtini Ovest",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metru|metri}} supra ô liveddu dû mari",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metru|metri}} sutta ô liveddu dû mari",
        "exif-gpsstatus-a": "Misurazzioni n cursu",
        "exif-gpsstatus-v": "Misurazzioni nteropiràbbili",
        "exif-gpsmeasuremode-2": "Misurazzioni bidiminziunali",
        "exif-gpsspeed-k": "Chilòmitri orari",
        "exif-gpsspeed-m": "Migghia orari",
        "exif-gpsspeed-n": "Gruppa",
+       "exif-gpsdestdistance-k": "Chilòmitri",
+       "exif-gpsdestdistance-m": "Migghia",
+       "exif-gpsdestdistance-n": "Migghia marini",
+       "exif-gpsdop-excellent": "Eccillenti ($1)",
+       "exif-gpsdop-good": "Bona ($1)",
+       "exif-gpsdop-moderate": "Mudesta ($1)",
+       "exif-gpsdop-fair": "Scarsa ($1)",
+       "exif-gpsdop-poor": "Pèssima ($1)",
+       "exif-objectcycle-a": "Sulu pâ matina",
+       "exif-objectcycle-p": "Sulu pâ sira",
+       "exif-objectcycle-b": "Pi' matina e sira",
        "exif-gpsdirection-t": "Direzzioni riali",
        "exif-gpsdirection-m": "Direzzioni magnètica",
+       "exif-ycbcrpositioning-1": "Cintrati",
+       "exif-ycbcrpositioning-2": "Co-sitüati",
+       "exif-dc-contributor": "Cuntribbuturi",
+       "exif-dc-coverage": "Àmmitu spazziali o timpurali",
+       "exif-dc-date": "Data/i",
+       "exif-dc-publisher": "Edituri",
+       "exif-dc-relation": "File assuciati",
+       "exif-dc-rights": "Dritti",
+       "exif-dc-source": "File surgenti",
+       "exif-dc-type": "Sorta di file",
+       "exif-rating-rejected": "Riggittatu",
+       "exif-isospeedratings-overflow": "Maggiuri di 65535",
+       "exif-iimcategory-ace": "Arti, cultura e' spittàculu",
+       "exif-iimcategory-clj": "Crìmini e giustizzia",
+       "exif-iimcategory-dis": "Disastri e incidenti",
+       "exif-iimcategory-fin": "Ecunumìa e affari",
+       "exif-iimcategory-edu": "Istruzzioni",
+       "exif-iimcategory-evn": "Ammienti",
+       "exif-iimcategory-hth": "Saluti",
+       "exif-iimcategory-hum": "Casi umani",
+       "exif-iimcategory-lab": "Travagghiu",
+       "exif-iimcategory-lif": "Stili di vita e' arricrìu",
+       "exif-iimcategory-pol": "Pulìtica",
+       "exif-iimcategory-rel": "Riliggioni e fidi",
+       "exif-iimcategory-sci": "Scienza e ticnuluggìa",
+       "exif-iimcategory-soi": "Quistioni suciali",
+       "exif-iimcategory-spo": "Sport",
+       "exif-iimcategory-war": "Guerra, cunflitti e disòrdini",
+       "exif-iimcategory-wea": "Tempu atmusfèricu",
+       "exif-urgency-normal": "Nurmali ($1)",
+       "exif-urgency-low": "Auta ($1)",
+       "exif-urgency-high": "Bascia ($1)",
+       "exif-urgency-other": "Difinuta di l'utenti ($1)",
        "namespacesall": "Tutti",
        "monthsall": "tutti",
-       "confirmemail": "Cunferma ndirizzu e-mail",
+       "confirmemail": "Cunfirma dû nnirizzu di posta elittrònica",
        "confirmemail_noemail": "Nun hà statu ndicatu un ndirizzu e-mail vàlidu ntê propi [[Special:Preferences|prifirenzi]].",
-       "confirmemail_text": "Stu situ richiedi la virìfica di l ndirizzu e-mail prima di putiri usari li funzioni cunnessi a l'email. Prèmiri lu pulsanti ccà sutta pi mannari na richiesta di cunferma a lu propiu ndirizzu; ntô missaggiu è prisenti un culligamenti ca cunteni un còdici. Visitari lu culligamentu cu lu propiu browser pi cunfirmari ca lu ndirizzu e-mail è vàlidu.",
-       "confirmemail_pending": "Lu còdici di cunferma vinni già mannatu pi posta alittrònica; siddu l'account fu criatu di picca tempu, si preja d'aspittari l'arrivu dû còdici pi quarchi minutu prima di pruvari  d'addumannàrinni unu novu.",
-       "confirmemail_send": "Manna un còdici di cunferma via e-mail.",
-       "confirmemail_sent": "Missaggiu e-mail di cunferma mannatu.",
-       "confirmemail_oncreate": "Un còdici di cunferma hà statu spiditu a lu ndirizzu di posta alittrònica ndicatu. Lu còdici nun è nicissariu pi tràsiri lu situ, ma è nicissariu furnirilu pi putiri abbilitari tutti li funzioni dû situ ca fannu usu dâ posta alittrònica.",
-       "confirmemail_sendfailed": "{{SITENAME}} nun pò mannari lu missaggiu e-mail di cunferma. Virificari ca lu nnirizzu nun cunteni caràttiri nun vàlidi.\n\nMissaggiu d'erruri dû mailer: $1",
-       "confirmemail_invalid": "Còdici di cunferma nun vàlidu. Lu còdici putissi èssiri scadutu.",
-       "confirmemail_needlogin": "È nicissariu $1 pi cunfirmari lu propiu ndirizzu e-mail.",
+       "confirmemail_text": "{{SITENAME}} dumanna la cunvàlida dû to nnirizzu di posta elittrònica pi' putìri adupirari li funziunalità assuciati.\nCalca lu buttuni ccassutta pi' mannari nu missaggiu e-mail di cunfirma a lu to nnirizzu.\nNtô missaggiu cci sarravi nu culligamentu cuntinenti un còdici;\ncàrrica ddu culligamentu cu lu to browser pi' cunfirmari ca lu to nnirizzu di posta elittrònica è vàlidu.",
+       "confirmemail_pending": "Già nu còdici di cunfirma t'havi statu mannatu via e-mail;\nsiddu hai crïatu u to cuntu di picca tempu, è mègghiu ch'aspètti l'arrivu dû còdici pi' quarchi minutu prima di pruvari a' addumannàrinni unu novu.",
+       "confirmemail_send": "Manna un còdici di cunfirma via e-mail",
+       "confirmemail_sent": "Missaggiu e-mail di cunfirma mannatu.",
+       "confirmemail_oncreate": "Un còdici di cunfirma fu' spidutu a lu to nnirizzu di posta elittrònica.\nLu còdici nun servi pi' tràsiri nta lu situ, ma ll'hâ' prisintari pi' putiri attivari tutti li funzioni dâ wiki ca fannu usu dâ posta elittrònica.",
+       "confirmemail_sendfailed": "{{SITENAME}} nun potti mannari lu to missaggiu e-mail di cunfirma.\nVirificari ca lu nnirizzu nun cunteni caràttiri nun vàlidi.\n\nMissaggiu d'erruri dû sirvizziu di posta: $1",
+       "confirmemail_invalid": "Còdici di cunfirma nun vàlidu.\nLu còdici putissi èssiri scadutu.",
+       "confirmemail_needlogin": "Pi' favuri $1 pi' cunvalidari lu to nnirizzu di posta elittrònica.",
        "confirmemail_success": "Lu ndirizzu e-mail è cunfirmatu. Ora è pussìbbili esèquiri l'accessu e fari chinu usu dû situ.",
        "confirmemail_loggedin": "Lu tò nnirizzu email fu ora cunfirmatu.",
-       "confirmemail_subject": "{{SITENAME}}: richiesta di cunferma di lu ndirizzu",
-       "confirmemail_body": "Quarcunu, prubbabbirmenti tu stissu di lu ndirizzu IP $1, hà riggistratu l'account \"$2\" supra {{SITENAME}} ndicannu stu ndirizzu e-mail.\n\nPi cunfirmari ca l'account t'apparteni e attivari li funzioni rilativi a lu nvìu di e-mail supra {{SITENAME}}, grapi lu culligamentu siquenti cu lu tò browser:\n\n$3\n\nSiddu l'account *nun* t'apparteni, grapi lu siguenti culligamentu:\n\n$5\n\nStu còdici di cunferma scadi automaticamenti a li $4.",
-       "confirmemail_invalidated": "Addumannata di cunferma ndirizzu e-mail scancillata",
-       "invalidateemail": "Scancella la dumanna di cunferma e-mail",
+       "confirmemail_subject": "Cunfirma dû nnirizzu di posta elittronica pi' {{SITENAME}}",
+       "confirmemail_body": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nriggistrau un cuntu \"$2\" cu stu nnirizzu di posta elittrònica supra a' {{SITENAME}}.\n\nPi' cunfirmari ca stu cuntu apparteni pi' davera a' tia,\ne attivari i funziunalità di posta elittronica supra a' {{SITENAME}},\napri stu culligamentu cû to browser:\n\n$3\n\nSi' nveci stu cuntu *nun t'apparteni*, clicca stu culligamentu\npi' nigari a cunfirma dû nnirizzu di posta elittronica:\n\n$5\n\nStu còdici di cunfirma scadi û $4.",
+       "confirmemail_body_changed": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\ncanciau u nnirizzu di posta elittrònica dû cuntu \"$2\" supra a' {{SITENAME}} mpustannulu a' chistu.\n\nPi' cunfirmari ca stu cuntu apparteni pi' davera a' tia,\ne attivari n'autra vota i funziunalità di posta elittronica supra a' {{SITENAME}},\napri stu culligamentu cû to browser:\n\n$3\n\nSi' nveci stu cuntu *nun t'apparteni*, clicca stu culligamentu\npi' nigari a cunfirma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunfirma scadi û $4.",
+       "confirmemail_body_set": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nmpustau stu nnirizzu di posta elittrònica pû cuntu \"$2\" supra a' {{SITENAME}}.\n\nPi' cunfirmari ca stu cuntu apparteni pi' davera a' tia,\ne attivari i funziunalità di posta elittronica supra a' {{SITENAME}},\napri stu culligamentu cû to browser:\n\n$3\n\nSi' nveci stu cuntu *nun t'apparteni*, clicca stu culligamentu\npi' nigari a cunfirma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunfirma scadi û $4.",
+       "confirmemail_invalidated": "Cunvàlida dû nnirizzu di posta elittronica nigata",
+       "invalidateemail": "Nigazzioni dâ cunvàlida dâ posta elittrònica",
        "scarytranscludedisabled": "[La nchiusioni di pàggini tra siti wiki nun è attiva]",
        "scarytranscludefailed": "[Erruri: Mpussìbbili uttèniri lu template $1]",
+       "scarytranscludefailed-httpstatus": "[Carricamentu dû template nun rinisciutu di $1: HTTP $2]",
        "scarytranscludetoolong": "[URL troppu longu]",
        "deletedwhileediting": "'''Accura''': Sta pàggina vinni scancillata doppu c'hai accuminzatu a scanciàrila!",
-       "confirmrecreate": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) scancillau sta pàggina doppu ca hai accuminciatu a scanciàrila, pi stu mutivu: ''$2'' Pi favuri, cunferma ca addisìi pi daveru criari n'àutra vota sta pàggina.",
+       "confirmrecreate": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi' tu avìi accuminciatu a' canciàrila, dannu sta spiegazzioni:\n: <em>$2</em>\nPi' favuri cunfirma chi' voi crïari n'autra vota sta pàggina pi' davera.",
+       "confirmrecreate-noreason": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi' tu avìi accuminciatu a' canciàrila. Pi' favuri cunfirma chi' voi crïari n'autra vota sta pàggina pi' davera.",
        "recreate": "Ricrìa",
        "unit-pixel": "px",
-       "confirm_purge_button": "Cunferma",
+       "confirm_purge_button": "Cunfirma",
        "confirm-purge-top": "S'addisìa puliri la cache di sta pàggina?",
        "confirm-purge-bottom": "Pulizziari la cache di na pàggina pirmetti d'ammustrari la sô virsioni cchiù nova.",
+       "confirm-watch-button": "Cunfirma",
+       "confirm-watch-top": "Agghiùnciri sta pàggina â to lista talïata?",
+       "confirm-unwatch-button": "Cunfirma",
+       "confirm-unwatch-top": "Livari sta pàggina dâ to lista talïata?",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← pàggina pricidenti",
        "imgmultipagenext": "pàggina siquenti →",
        "imgmultigo": "Va'",
        "imgmultigoto": "Vai a pàggina $1",
+       "img-lang-default": "(lingua pridifinuta)",
+       "img-lang-info": "Gènira sta mmàggini in $1. $2",
+       "img-lang-go": "Vai",
        "ascending_abbrev": "crisc",
        "descending_abbrev": "dicrisc",
        "table_pager_next": "Pàggina succissiva",
        "table_pager_first": "Prima pàggina",
        "table_pager_last": "Ùrtima pàggina",
        "table_pager_limit": "Ammustra $1 file pi pàggina",
+       "table_pager_limit_label": "Elimenti pi' pàggina:",
        "table_pager_limit_submit": "Va'",
        "table_pager_empty": "Nuddu risurtatu",
        "autosumm-blank": "Pàggina svacantata",
        "autosumm-replace": "Pàggina sustituita cu '$1'",
        "autoredircomment": "Rinnirizzamentu â pàggina [[$1]]",
        "autosumm-new": "Criata pàggina cu '$1'",
+       "autosumm-newblank": "Crïata na pàggina vacanti",
        "lag-warn-normal": "Li canciamenti appurtati {{PLURAL:$1|nta l'ùrtimu secundu|nta l'ùrtimi $1 secundi}} ponnu nun èssiri nta sta lista.",
        "lag-warn-high": "A càusa di nu ritardu eccissivu nta l'aggiurnamentu dô server di databbasi, li canciamenti appurtati {{PLURAL:$1|nta l'ùrtimu secundu|nta l'ùrtimi $1 secundi}} ponnu nun èssiri nta sta lista.",
        "watchlistedit-normal-title": "Cancia pàggini taliati",
        "watchlistedit-normal-legend": "Eliminazzioni di pàggini dâ lista dê pàggini taliati",
-       "watchlistedit-normal-explain": "Ccà sutta sugnu alincati tutti li pàggine taliati. Pi eliminari una o cchiù pàggini dâ lista, silizziunari li casiddi accantu e fari clic supra lu buttuni 'Elìmina pàggini' 'n fundu all'alencu. Accura ca è puru possibbili [[Special:EditWatchlist/raw|canciari la lista 'n forma testuali]].",
+       "watchlistedit-normal-explain": "Ccassutta cci su' li tìtuli ntâ to lista talïata.\nPi' livàrinni unu, scegghî la casedda a' latu d'iddu, e clicca \"{{int:Watchlistedit-normal-submit}}\".\nPoi puru [[Special:EditWatchlist/raw|canciari la lista 'n forma testuali]].",
        "watchlistedit-normal-submit": "Elìmina pàggini",
        "watchlistedit-normal-done": "Dâ lista dê pàggini taliati hà{{PLURAL:$1|&nbsp;stata eliminata na pàggina|nnu stati eliminati $1 pàggini}}:",
        "watchlistedit-raw-title": "Cancia li pàggini taliati 'n forma testuali",
        "watchlistedit-raw-legend": "Canciamentu testuali pàggini taliati",
-       "watchlistedit-raw-explain": "Ccà sutta sugnu alincati tutti li pàggine taliati. Pi canciari la lista agghiunciri o rimòviri li rispettivi tituli, unu pi riga. Quannu funisci, fà clic supra 'Aggiorna la lista' 'n fundu all'alencu. Accura ca è puru possibbili [[Special:EditWatchlist|canciari la lista câ 'nterfaccia standard]].",
+       "watchlistedit-raw-explain": "Ccassutta cci su' li tìtuli ntâ to lista talïata, chi' si po' canciari agghiuncennu e livannu tituli, unu pi' riga.\nQuannu hai finutu, clicca \"{{int:Watchlistedit-raw-submit}}\".\nPoi puru [[Special:EditWatchlist|canciari a lista dâ pàggina tradizziunali]].",
        "watchlistedit-raw-titles": "Pàggini:",
        "watchlistedit-raw-submit": "Aggiorna la lista",
        "watchlistedit-raw-done": "La tò lista dê pàggini taliati vinni aggiurnata.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Fu junciuta na pàggina|Foru junciuti $1 pàggini}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|&nbsp;Vinni scancillata na pàggina|Foru scancillati $1 pàggini}}:",
+       "watchlistedit-clear-title": "Lista talïata svacantata",
+       "watchlistedit-clear-legend": "Svacanta a lista talïata",
+       "watchlistedit-clear-explain": "Tutti i tìtuli sarannu livati da to lista talïata",
+       "watchlistedit-clear-titles": "Tìtuli:",
+       "watchlistedit-clear-submit": "Svacanta a lista talïata (Sta cosa è difinitiva!)",
+       "watchlistedit-clear-done": "A to lista talïata fu svacantata.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un tìtulu fu'|$1 tìtuli furu}} livati:",
+       "watchlistedit-too-many": "Cci su' troppu pàggini p'ammustràrili cca.",
+       "watchlisttools-clear": "Svacanta a lista talïata",
        "watchlisttools-view": "Talìa li canciamenti rilivanti",
        "watchlisttools-edit": "Talìa e cancia la lista",
        "watchlisttools-raw": "Cancia la lista 'n forma testuali",
        "iranian-calendar-m1": "Farvardin",
        "iranian-calendar-m2": "Ordibehesht",
        "iranian-calendar-m3": "Khordad",
-       "unknown_extension_tag": "Tag estensioni scanusciutu: \"$1\"",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussioni]])",
        "duplicate-defaultsort": "Accura: la chiavi priddifinuta d'urdinamentu \"$2\" si sciarrìa cu chidda d'antura \"$1\".",
-       "version": "virsioni",
+       "duplicate-displaytitle": "<strong>Accura:</strong> U tìtulu a' ammustrari \"$2\" va' e rimpiazza u tìtulu a' ammustrari pricidenti \"$1\".",
+       "invalid-indicator-name": "<strong>Erruri:</strong> L'attribbutu <code>name</code> di l'innicaturi di statu dâ pàggina nun havi a' èssiri vacanti.",
+       "version": "Virsioni",
        "version-extensions": "Estenzioni nstallati",
+       "version-skins": "Peddi installati",
        "version-specialpages": "Pàggini spiciali",
        "version-parserhooks": "Hook dû parser",
        "version-variables": "Variabili",
+       "version-antispam": "Anti-spam",
        "version-other": "Àutru",
        "version-mediahandlers": "Gistori di cuntinuti multimediali",
        "version-hooks": "Hook",
        "version-hook-name": "Nomu di l'hook",
        "version-hook-subscribedby": "Suttascrizzioni",
        "version-version": "(Virsioni $1)",
-       "version-license": "Licenza",
+       "version-no-ext-name": "[nuddu nomu]",
+       "version-license": "Licenza di MediaWiki",
+       "version-ext-license": "Licenza",
+       "version-ext-colheader-name": "Estinsioni",
+       "version-skin-colheader-name": "Peddi",
+       "version-ext-colheader-version": "Virsioni",
+       "version-ext-colheader-license": "Licenza",
+       "version-ext-colheader-description": "Discrizzioni",
+       "version-ext-colheader-credits": "Auturi",
+       "version-license-title": "Licenza di $1",
+       "version-license-not-found": "Pi' st'estinsioni nun fu' truvata nudda nfurmazzioni a' prupòsitu dâ licenza.",
+       "version-credits-title": "Ricanuscimenti pi' $1",
+       "version-credits-not-found": "Pi' st'estinsioni nun fu' truvata nudda nfurmazzioni a' prupòsitu dî ricanuscimenti.",
+       "version-poweredby-credits": "Sta wiki funziona cu' <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "autri",
+       "version-poweredby-translators": "i tradutturi di translatewiki.net",
+       "version-credits-summary": "Vulemu ricanusciri u cuntribbutu di sti pirsuni a' [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki è software lìbbiru; si po' ri-distribbüiri e/o mudificari sutta ê tèrmini dâ GNU General Public License comu pubblicata dâ Free Software Foundation; o la virsioni 2 dâ Licenza, o (a' propia scelta) na virsioni succissiva quali è jè.\n\nMediaWiki veni distribuùtu ntâ spiranza chi' sia ùtili, però SENZA NUDDA GARANZÌA; mancu chidda implìcita di NIGUZZIABBILITÀ o di APPLICABBILITÀ PI' NU SCOPU PARTICULARI. Si talïassi la GNU General Public License pi' maggiuri dittagghî.\n\nS'avissi a' avìri ricivutu [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia dâ GNU General Public License] nsèmmula a' stu prugramma; si' no, si po' scrìviri â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html la si po' lèggiri in linia].",
        "version-software": "Software nstallatu",
        "version-software-product": "Prodottu",
        "version-software-version": "Virsioni",
+       "version-entrypoints": "URL dî punti d'accessu",
+       "version-entrypoints-header-entrypoint": "Puntu d'accessu",
+       "version-entrypoints-header-url": "URL",
+       "version-libraries": "Libbrarìi installati",
+       "version-libraries-library": "Libbrarìa",
+       "version-libraries-version": "Virsioni",
+       "redirect": "Rimannu pi' nomu di file o còdici di utenti, di pàggina o di virsioni",
+       "redirect-legend": "Rimannari a' nu file o na pàggina",
+       "redirect-summary": "Sta pàggina spiciali rimanna a' nu file (datu u nomu dû file), a' na pàggina (datu n'ID di virsioni o n'ID di pàggina), o puru â pàggina di n'utenti (datu n'ID nummèricu di utenti). Esempî di usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Vacci",
+       "redirect-lookup": "Cerca pi':",
+       "redirect-value": "Cu' valuri:",
+       "redirect-user": "ID d'utenti",
+       "redirect-page": "ID di pàggina",
+       "redirect-revision": "ID di virsioni di pàggina",
+       "redirect-file": "Nomu di file",
+       "redirect-not-exists": "Valuri nun truvatu",
        "fileduplicatesearch": "Circata dê file duppiuni",
        "fileduplicatesearch-summary": "Circata di pussìbbili dupppiuni dû file 'n basi ô valuri di ''hash''.",
        "fileduplicatesearch-legend": "Circata di nu duppiuni",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Diminzioni: $3<br />Tipu MIME: $4",
        "fileduplicatesearch-result-1": "Non ci sunnu duppiuni li stissi dû file \"$1\".",
        "fileduplicatesearch-result-n": "{{PLURAL:$2|C'è ggià nu duppiuni lu stissu|Ci sunnu ggià $2 duppiuni li stissi}} dû file \"$1\".",
+       "fileduplicatesearch-noresults": "Nuddu file chiamatu \"$1\" fu' truvatu.",
        "specialpages": "Pàggini spiciali",
-       "specialpages-note": "* Pàggini spiciali non risirvati.\n* <strong class=\"mw-specialpagerestricted\">Pàggini spiciali risirvati sulu a quarchi catigurìa d'utenti.</strong>",
+       "specialpages-note-top": "Legenda",
+       "specialpages-note": "* Pàggini spiciali nurmali.\n* <span class=\"mw-specialpagerestricted\">Pàggini spiciali risirvati.</strong>",
        "specialpages-group-maintenance": "Resocunti di manutinzioni",
        "specialpages-group-other": "Autri pàggini spiciali",
-       "specialpages-group-login": "Trasi / riggìstrazzioni",
-       "specialpages-group-changes": "Ùrtimi canciamenti e riggistri",
+       "specialpages-group-login": "Trasuta / crïazzioni di cunti",
+       "specialpages-group-changes": "Ùrtimi canciamenti e riggistra",
        "specialpages-group-media": "File multimidiali - caricamentu e rennicunti",
        "specialpages-group-users": "Utenti e diritti",
        "specialpages-group-highuse": "Pàggini cchiù usati",
        "specialpages-group-pages": "Listi di pàggini",
        "specialpages-group-pagetools": "Strumenti ùtili pi li pàggini",
-       "specialpages-group-wiki": "Strumenti e nfurmazzioni supra lu pruggettu",
-       "specialpages-group-redirects": "Pàggini spiciali di redirect",
+       "specialpages-group-wiki": "Dati e strumenti",
+       "specialpages-group-redirects": "Pàggini spiciali chi' rimànnunu",
        "specialpages-group-spam": "Strumenti contr'a lu spam",
+       "specialpages-group-developer": "Stigghi dû sviluppaturi",
        "blankpage": "Pàggina vacanti",
        "intentionallyblankpage": "Sta pàggina è lassata vacanti apposta e è usata pi benchmark, ecc.",
-       "external_image_whitelist": " #lassa sta riga cum'è ora, senza tuccàrila<pre>\n#Nzirisci li frammenti dî sprissioni rigulari (solu la parti ca và tra //) di sècutu\n#Chisti hann'a currispùnniri cu li URL di mmàggini esterni (hotlinked)\n#Chiddi ca currispùnnunu vènunu appoi ammustrati comu mmàggini, casu cuntràriu s'ammustra sulu nu culligamentu a la mmàggini\n#Li lìnii ca accumincianu cu # sunnu di cummentu\n#La diffirenza tra maiusculi e minusculi nun è significativa\n\n#Nzirisci supr'a sta riga tutti li frammenti di regex. Lassa sta riga cum'è ora, senza tuccàrila</pre>",
+       "external_image_whitelist": " #Lassari sta riga pi' com'è ora, senza tuccàrila<pre>\n#Mèttiri li frammenti dî sprissioni rigulari (sulu la parti ca va' mmenzu ê //) ccassutta\n#Sarrannu cunfruntati cu l'URL dî mmàggini esterni (hotlinked)\n#Chiddi ca currispùnnunu sarrannu ammustrati comu mmàggini, pi' l'autri veniravi ammustratu sulu nu culligamentu a la mmàggini\n#Li righi ca accumencianu cu' # sunnu trattati comu cummenti\n#Nun cc'è diffirenza tra majusculi e minusculi\n\n#Mèttiri tutti li frammenti di sprissioni rigulari supra a' sta riga. Lassa sta riga pi' com'è ora, senza tuccàrila</pre>",
        "tags": "Tag di canciamenti validi",
        "tag-filter": "Filtru dô [[Special:Tags|Tag]]",
        "tag-filter-submit": "Filtra",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etichetta|Etichetti}}]]: $2)",
        "tags-title": "Tag",
        "tags-intro": "Sta pàggina elenca l'etichetti ca lu software putissi associari a nu canciamentu e lu loru significatu",
-       "tags-tag": "Nnomu internu dô tag",
+       "tags-tag": "Nomu di l'etichetta",
        "tags-display-header": "Aspettu nâ lista di canciamenti",
        "tags-description-header": "Discrizzioni cumpleta dô significatu",
+       "tags-active-header": "Attivu?",
        "tags-hitcount-header": "Canciamenti che hanno tag",
+       "tags-active-yes": "Sì",
+       "tags-active-no": "No",
        "tags-edit": "cancia",
        "tags-hitcount": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
+       "comparepages": "Cunfronta pàggini",
+       "compare-page1": "Pàggina 1",
+       "compare-page2": "Pàggina 2",
+       "compare-rev1": "Virsioni 1",
+       "compare-rev2": "Virsioni 2",
+       "compare-submit": "Cunfronta",
+       "compare-invalid-title": "U tìtulu ca spicificasti nun è vàlidu.",
+       "compare-title-not-exists": "U tìtulu ca spicificasti nun esisti.",
+       "compare-revision-not-exists": "A virsioni ca spicificasti nun esisti.",
        "dberr-problems": "Spiacenti! Stu situ sta havennu prublema tecnici.",
        "dberr-again": "Prova a aspittari na para di minuti e ricaricari.",
-       "dberr-info": "(Impussibili cuntattari lu server dô database: $1)",
+       "dberr-info": "(Impussìbbili accèdiri â basi di dati: $1)",
+       "dberr-info-hidden": "(Impussìbbili accèdiri â basi di dati)",
        "dberr-usegoogle": "Poi pruvari a circari supra Google ammentri.",
        "dberr-outofdate": "Nota ca la loru indicizzazioni dê nostri cuntintinuta po essiri nun aggiurnata.",
        "dberr-cachederror": "Chista ca segui è na copia cache da pàggina richiesta, e putissi essiri nun aggiurnata.",
        "htmlform-submit": "Mànna",
        "htmlform-reset": "Annulla li canciamenti",
        "htmlform-selectorother-other": "Àutru",
+       "htmlform-no": "No",
+       "htmlform-yes": "Sì",
        "htmlform-chosen-placeholder": "Silizziona na opzioni",
-       "logentry-delete-delete": "$1 cancillau la pàggina $3",
-       "revdelete-restricted": "ristrizzioni ai suli amministratura attivate",
-       "revdelete-unrestricted": "ristrizzioni pi suli amministraturi rimossi",
+       "htmlform-cloner-create": "Agghiunci autru",
+       "htmlform-cloner-delete": "Leva",
+       "htmlform-cloner-required": "Cci voli almenu nu valuri.",
+       "sqlite-has-fts": "$1 cu' capacità di risciduta a' tuttu testu",
+       "sqlite-no-fts": "$1 senza capacità di risciduta a' tuttu testu",
+       "logentry-delete-delete": "$1 {{GENDER:$2|cancillau}} la pàggina $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ripristinau}} la pàggina $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|canciau}} a visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|canciau}} a visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|canciau}} a visibbilità di eventi dû riggistru di $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|canciau}} a visibbilità di virsioni dâ pàggina $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|supprimìu}} a pàggina $3",
+       "logentry-suppress-event": "$1 {{GENDER:$2|canciau}} a' mmucciuni a' visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
+       "logentry-suppress-revision": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
+       "logentry-suppress-event-legacy": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di eventi dû riggistru di $3",
+       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di virsioni dâ pàggina $3",
+       "revdelete-content-hid": "cuntinutu ammucciatu",
+       "revdelete-summary-hid": "riassuntu dû canciamentu ammucciatu",
+       "revdelete-uname-hid": "nomu utenti ammucciatu",
+       "revdelete-content-unhid": "cuntinutu ammustratu",
+       "revdelete-summary-unhid": "riassuntu dû canciamentu ammustratu",
+       "revdelete-uname-unhid": "nomu utenti ammustratu",
+       "revdelete-restricted": "misi ristrizzioni pi' l'amministratura",
+       "revdelete-unrestricted": "livati ristrizzioni pi' l'amministratura",
+       "logentry-merge-merge": "$1 {{GENDER:$2|juncìu}} $3 nta $4 (virsioni nfina ô $5)",
        "logentry-move-move": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 senza lassari nu rimannu",
        "logentry-move-move_redir": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4 cu nu rinnirizzamentu",
-       "logentry-newusers-create": "$1 criau na utenza",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 ô postu dûn rimannu senza lassari nu rimannu",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcau}} a virsioni $4 dâ pàggina $3 comu battugghiata",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcau}} di manera autumàtica a virsioni $4 dâ pàggina $3 comu battugghiata",
+       "logentry-newusers-newusers": "U cuntu di l'utenti $1 fu' {{GENDER:$2|crïatu}}",
+       "logentry-newusers-create": "U cuntu di l'utenti $1 fu' {{GENDER:$2|crïatu}}",
+       "logentry-newusers-create2": "U cuntu di l'utenti $3 fu' {{GENDER:$2|crïatu}} di $1",
+       "logentry-newusers-byemail": "U cuntu di l'utenti $3 fu' {{GENDER:$2|crïatu}} di $1 e a password fu' mannata via posta elittrònica",
+       "logentry-newusers-autocreate": "U cuntu di l'utenti $1 fu' {{GENDER:$2|crïatu}} di manera autumàtica",
+       "logentry-rights-rights": "$1 {{GENDER:$2|canciau}} l'appartinenza di $3 dû gruppu $4 ô gruppu $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|canciau}} l'appartinenza a' gruppi di $3",
+       "logentry-rights-autopromote": "$1 fu' {{GENDER:$2|prumuvutu|prumuvuta}} di manera autumatica di $4 a' $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|carricau}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|carricau}} na virsioni nova di $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|carricau}} $3",
        "rightsnone": "(nuddu)",
        "revdelete-summary": "riassuntu dô canciamentu",
+       "feedback-bugornote": "Si' si' bonu a' discrìviri un prubblema tècnicu di manera dittagghiata, pi' favuri [$1 signala nu bug].\nSi' no, poi adupirari u mòdulu facilitatu ccassutta. U to cummentu sarravi agghiunciutu â pàggina \"[$3 $2]\", nsemmula ô to nomu utenti.",
+       "feedback-subject": "Oggettu:",
+       "feedback-message": "Missaggiu:",
+       "feedback-cancel": "Annulla",
+       "feedback-submit": "Manna u cummentu",
+       "feedback-adding": "Agghiuncimentu dû cummentu â pàggina...",
+       "feedback-error1": "Erruri: Risultatu di l'API nun ricanusciutu",
+       "feedback-error2": "Erruri: A mudìfica nun riniscìu",
+       "feedback-error3": "Erruri: Nudda risposta di l'API",
+       "feedback-thanks": "Grazzî! U to cummentu fu' affissu ntâ pàggina \"[$2 $1]\".",
+       "feedback-close": "Finutu",
+       "feedback-bugcheck": "Bonu! Sulu cuntrolla chi' nun è unu dî [$1 bug già canusciuti].",
+       "feedback-bugnew": "Cuntrullai. Signala nu bug novu",
        "searchsuggest-search": "Risciduta",
+       "searchsuggest-containing": "chi' cunteni...",
+       "api-error-badaccess-groups": "Nun hai u pirmissu di carricari file nta sta wiki.",
+       "api-error-badtoken": "Erruri nternu: Token sbagghiatu",
+       "api-error-copyuploaddisabled": "U carricamentu a' partiri di URL è disattivatu nta stu server.",
+       "api-error-duplicate": "Già {{PLURAL:$1|cc'è [$2 n'autru file]|cci sunnu [$2 autri file]}} supra ô situ chi' {{PLURAL:$1|havi|hannu}} u stissu cuntinutu.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Cc'era [$2 n'autru file]|Cc' èrunu [$2 autri file]}} supra ô situ ch'{{PLURAL:$1|avìa|avìunu}} u stissu cuntinutu, ma {{PLURAL:$1|fu' cancillatu|furu cancillati}}.",
+       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|File duppiuni|File duppiuni}} chi' già {{PLURAL:$1|havi statu cancillatu|hannu statu cancillati}}.",
+       "api-error-duplicate-popup-title": "File {{PLURAL:$1|duppiuni}}.",
+       "api-error-empty-file": "U file chi' mannasti era vacanti.",
+       "api-error-emptypage": "Crïari pàggini novi e vacanti nun è cunsintutu.",
+       "api-error-fetchfileerror": "Erruri nternu: Quarchi' cosa nun funziunau mentri chi' si carricava u file.",
+       "api-error-fileexists-forbidden": "Nu file chi' si chiama \"$1\" già esisti, e nun si po' suprascrìviri.",
+       "api-error-fileexists-shared-forbidden": "Nu file chi' si chiama \"$1\" già esisti ntô dipòsitu cunnivisu, e nun si po' suprascrìviri.",
+       "api-error-file-too-large": "U file chi' mannasti era troppu rossu.",
+       "api-error-filename-tooshort": "U 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 cunsintutu|nun su' tipi di file cunsintuti}}. {{PLURAL:$3|U tipu di file cunsintutu è|I tipi di file cunsintuti sunnu}} $2.",
+       "api-error-filetype-missing": "Ô nomu dû file cci manca l'estinsioni.",
+       "api-error-hookaborted": "U canciamentu chi' stavi pruvannu a' fari fu' annullatu di n'estinsioni.",
+       "api-error-http": "Erruri nternu: Impussìbbili culligàrisi ô server.",
+       "api-error-illegal-filename": "U nomu dû file nun è cunsintutu.",
+       "api-error-internal-error": "Erruri nternu: Quarchi' cosa nun funziunau mentri chi' si stava travagghiannu u to carricamentu supra â wiki.",
+       "api-error-invalid-file-key": "Erruri nternu: U file nun fu' truvatu ntâ mimorizzazzioni timpurania.",
+       "api-error-missingparam": "Erruri nternu: Màncunu paràmitri ntâ richiesta.",
+       "api-error-missingresult": "Erruri nternu: Nun fu' pussìbbili capiri s'a copia riniscìu.",
+       "api-error-mustbeloggedin": "Hâ' jèssiri trasutu pi' carricari file.",
+       "api-error-mustbeposted": "Erruri nternu: A richiesta havi bisognu di POST HTTP.",
+       "api-error-noimageinfo": "U carricamentu riniscìu, però u server nun nni 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: U server nun riniscìu a' pubblicari u file timpuraniu.",
+       "api-error-stasherror": "Cci fu' n'erruri ntô carricari u file nta l'ammucciagghia.",
+       "api-error-stashedfilenotfound": "U file nun fu' truvatu nta l'ammucciagghia duranti u tintativu di carricamentu a' partiri di l'ammucciagghia.",
+       "api-error-stashpathinvalid": "U caminu unni avissi avutu a' jèssiri u file nta l'ammucciagghia nun era vàlidu.",
+       "api-error-stashfilestorage": "Cci fu' n'erruri ntô mimurizzari u file nta l'ammucciagghia.",
+       "api-error-stashzerolength": "U server nun potti mèttiri u file nta l'ammucciagghia, picchì avìa lunghizza zeru.",
+       "api-error-stashnotloggedin": "Hâ' èssiri trasutu pi' sarvari file nta l'ammucciagghia.",
+       "api-error-stashwrongowner": "U file nta l'ammucciagghia chi' pruvasti a' pigghiari nun t'apparteni.",
+       "api-error-stashnosuchfilekey": "U 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-code": "Erruri scanusciuti: \"$1$\".",
+       "api-error-unknown-error": "Erruri nternu: Quarchi' cosa nun funziunau ntô tintativu di carricari u to file.",
+       "api-error-unknown-warning": "Avvirtimentu scanusciutu: \"$1\".",
+       "api-error-unknownerror": "Erruri scanusciutu: \"$1\".",
+       "api-error-uploaddisabled": "U carricamentu è disattivatu nta sta wiki.",
+       "api-error-verification-error": "U file purrìa èssiri rüinatu, o puru aviri l'estinsioni sbagghiata.",
+       "duration-seconds": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minutu|minuti}}",
+       "duration-hours": "$1 {{PLURAL:$1|ura|uri}}",
+       "duration-days": "$1 {{PLURAL:$1|jornu|jorna}}",
+       "duration-weeks": "$1 {{PLURAL:$1|simana|simani}}",
+       "duration-years": "$1 {{PLURAL:$1|annu|anni}}",
+       "duration-decades": "$1 {{PLURAL:$1|dicenniu|dicennî}}",
+       "duration-centuries": "$1 {{PLURAL:$1|sèculu|sècula}}",
+       "duration-millennia": "$1 {{PLURAL:$1|millenniu|millennî}}",
+       "rotate-comment": "Mmàggini vutata di $1 {{PLURAL:$1|gradu|gradi}} ntô sensu urariu",
+       "limitreport-title": "Dati di prufilazzioni di l'analizzaturi sintatticu:",
+       "limitreport-cputime": "Usu di tempu dâ CPU",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
+       "limitreport-walltime": "Usu di tempu rïàli",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
+       "limitreport-ppvisitednodes": "Cuntiggiu dî gruppi visitati dû priprucissuri",
+       "limitreport-ppgeneratednodes": "Cuntiggiu dî gruppi ginirati dû priprucissuri",
+       "limitreport-postexpandincludesize": "Grannizza di nclusioni appressu a' l'espansioni",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
+       "limitreport-templateargumentsize": "Grannizza di l'argumenti di template",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte}}",
+       "limitreport-expansiondepth": "Màssimu funnu d'espansioni",
+       "limitreport-expensivefunctioncount": "Cuntìggiu dî funzioni di l'analizzaturi sintatticu spisusi",
+       "expandtemplates": "Espansioni dî template",
+       "expand_templates_intro": "Sta pàggina spiciali pigghia un testu e espanni tutti i template chi' cunteni, di manera ricursiva.\nEspanni macari i funzioni di l'analizzaturi sintatticu chi' su suppurtati, comu <code><nowiki>{{</nowiki>#language:…}}</code>, e i variàbbili, comu <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn pratica, espanni cchiu' o menu tuttu chiddu chi' si trova mmenzu a' duppî parèntisi graffi.",
+       "expand_templates_title": "Tìtulu dû cuntestu, pi' {{FULLPAGENAME}} etc.:",
+       "expand_templates_input": "Testu a' espànniri:",
+       "expand_templates_output": "Risultatu",
+       "expand_templates_xml_output": "Output XML",
+       "expand_templates_html_output": "Output HTML grezzu",
+       "expand_templates_ok": "Espanni",
+       "expand_templates_remove_comments": "Leva i cummenti",
+       "expand_templates_remove_nowiki": "Leva l'etichetti <nowiki> dû risultatu",
+       "expand_templates_generate_xml": "Ammustra l'àrvulu di l'anàlisi sintàttica XML",
+       "expand_templates_generate_rawhtml": "Ammustra l'HTML grezzu",
+       "expand_templates_preview": "Antiprima",
+       "expand_templates_preview_fail_html": "<em>Comu chi' {{SITENAME}} havi l'HTML grezzu attivatu, e cci fu' na pèrdita dî dati di sissioni, l'antiprima vinni ammucciata, pi' pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si' chistu è nu tintativu onestu d'aviri n'antiprima, pi' favuri prova n'autra vota.</strong>\nS'ancora nun funziona, prova a' [[Special:UserLogout|nèsciri]] e tràsiri n'autra vota.",
+       "expand_templates_preview_fail_html_anon": "<em>Comu chi' {{SITENAME}} havi l'HTML grezzu attivatu, e tu nun si' trasutu, l'antiprima vinni ammucciata, pi' pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si' chistu è nu tintativu onestu d'aviri n'antiprima, pi' favuri [[Special:UserLogin|trasi]] e prova n'autra vota.",
+       "pagelanguage": "Scelta dâ lingua dâ pàggina",
+       "pagelang-name": "Pàggina",
+       "pagelang-language": "Lingua",
+       "pagelang-use-default": "Usa a lingua pridifinuta",
+       "pagelang-select-lang": "Scegghî na lingua",
+       "right-pagelang": "Canciari a lingua dî pàggini",
+       "action-pagelang": "canciari a lingua dî pàggini",
+       "log-name-pagelang": "Riggistru dî canci di lingua",
+       "log-description-pagelang": "Chistu è nu riggistru dî canciamenti â lingua dî pàggini.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|canciau}} a lingua dâ pàggina $3 di $4 a' $5.",
+       "default-skin-not-found": "Whoops! A peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nA' quantu pari la to installazzioni ncludi i peddi ccasutta. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manüali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu s'attìvunu e comu si scegghî chidda pridifinuta.\n\n$2\n\n; Si' hai installatu MediaWiki ora ora:\n: E' prubbàbbili chi' l'installasti dû git, o direttamenti dû còdici surgenti nta quarchi' autra manera. Allura sta cosa è privista. Prova e installa quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download u prugramma d'installazzioni in furmatu tar], chi' cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari a cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi in furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clona via git unu dî dipòsiti <code>mediawiki/skins/*</code> ntâ cartella <code dir=\"ltr\">skins/</code> dâ to installazzioni di MediaWiki.\n: Fari accussì' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki.\n\n; Si' hai aggiurnatu MediaWiki ora ora:\n: MediaWiki virsioni 1.24 e succissivi nun attìvunu cchiu' di manera autumàtica i peddi installati (talìa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manüali: Scuperta autumatica dî peddi]). Poi cupiari e ncuddari sti righi nta <code>LocalSettings.php</code> p'attivari tutti i peddi chi' sunnu pi' com'ora installati:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si' hai mudificatu <code>LocalSettings.php</code> ora ora:\n: Cuntrolla chi' nun sbagghiasti a' scriviri i nomi dî peddi.",
+       "default-skin-not-found-no-skins": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nNun hai nudda peddi installata.\n\n; Si' hai installatu o puru aggiurnatu MediaWiki ora ora:\n: E' prubbàbbili chi' l'installasti dû git, o direttamenti dû còdici surgenti nta quarchi' autra manera. Allura sta cosa è privista. MediaWiki virsioni 1.24 e succissivi nun cuntènunu nudda peddi ntô dipòsitu principali. Prova e installa quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download u prugramma d'installazzioni in furmatu tar], chi' cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari a cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi in furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clona via git unu dî dipòsiti <code>mediawiki/skins/*</code> ntâ cartella <code dir=\"ltr\">skins/</code> dâ to installazzioni di MediaWiki.\n: Fari accussì' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manüali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu s'attìvunu i peddi e comu si scegghî chidda pridifinuta.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (attivata)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disattivata''')",
+       "mediastatistics": "Statìstichi supra ê file multimidiali",
+       "mediastatistics-summary": "Statìstichi supra ê tipi di file carricati. Si cùntunu sulu i virsioni cchiu' novi dî file. I virsioni vecchî o cancillati vènunu escluduti.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipu MIME",
+       "mediastatistics-table-extensions": "Estinsioni pussìbbili",
+       "mediastatistics-table-count": "Nùmmiru di file",
+       "mediastatistics-table-totalbytes": "Rannizza cumplissiva",
+       "mediastatistics-header-unknown": "Scanusciuti",
+       "mediastatistics-header-bitmap": "Mmàggini bitmap",
+       "mediastatistics-header-drawing": "Disigni (mmàggini vitturiali)",
+       "mediastatistics-header-audio": "Audiu",
+       "mediastatistics-header-video": "Vidiu",
+       "mediastatistics-header-multimedia": "File multimidiali cumplessi",
+       "mediastatistics-header-office": "Ufficiu",
+       "mediastatistics-header-text": "Tistuali",
+       "mediastatistics-header-executable": "Esiguìbbili",
+       "mediastatistics-header-archive": "Furmati cumpressi",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|vìrgula finali fu' livata|vìrguli finali furu livati}} dû JSON",
+       "json-error-unknown": "Mmattìu un prubblema cû JSON. Erruri: $1",
+       "json-error-depth": "Fu' passatu u massimu funnu dû stack",
+       "json-error-state-mismatch": "JSON nun vàlidu o malfurmatu",
+       "json-error-ctrl-char": "Caràttiri di cuntrollu nun privistu, forsi cudificatu mali",
+       "json-error-syntax": "Erruri di sintassi",
+       "json-error-utf8": "Caràttiri UTF-8 nun vàlidi, forsi cudificati mali",
+       "json-error-recursion": "U valuri di cudificari havi unu o cchiu' ssai rifirimenti ricursivi",
+       "json-error-inf-or-nan": "U valuri di cudificari havi unu o cchiu' ssai valuri NAN o INF",
+       "json-error-unsupported-type": "Fu' passatu nu valuri dûn tipu chi' nun si po' cudificari"
 }
index ff5906d..8a4d124 100644 (file)
        "watchlisttools-edit": "See n eedit watchleet",
        "watchlisttools-raw": "Eedit raw watchleet",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tauk]])",
-       "unknown_extension_tag": "Onkent extension tag \"$1\"",
        "duplicate-defaultsort": "<strong>Warnishment:</strong> Defaut sort key \"$2\" owerrides earlier defaut sort key \"$1\".",
        "duplicate-displaytitle": "<strong>Warnishment:</strong> Displey title \"$2\" owerrides the earlier displey title \"$1\".",
        "invalid-indicator-name": "<strong>Mistak:</strong> Page status indicaters' <code>name</code> attreebute maunna be tuim.",
index 335720e..c517d95 100644 (file)
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|deede]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Dobuyan kanji šibayante \"$1\"",
        "duplicate-defaultsort": "<strong>Yaamar:</strong> Tilasu fayyan kufal \"$2\" ga tilasu fayyan kufal bisante \"$1\" daaru.",
        "duplicate-displaytitle": "<strong>Yaamar:</strong> Cebeyan maa \"$2\" ga cebeyan maa bisante \"$1\" daaru.",
        "invalid-indicator-name": "<strong>Error:</strong> Moo assariya šilbaykey <code>name</code> alhaaloo ši hima ka koonu.",
index 542a13d..3de17ab 100644 (file)
        "oct": "spa",
        "nov": "lap",
        "dec": "grd",
+       "january-date": "Sausė $1",
+       "february-date": "Vasarė $1",
+       "march-date": "Kuova $1",
+       "april-date": "Balondė $1",
+       "may-date": "Gegožė $1",
+       "june-date": "Bėrželė $1",
+       "july-date": "Lėipas $1",
+       "august-date": "Rogpjūtė $1",
+       "september-date": "Siejės $1",
+       "october-date": "Spalė $1",
+       "november-date": "Lapkrėstė $1",
+       "december-date": "Groudė $1",
        "pagecategories": "{{PLURAL:$1|Kateguorėjė|Kateguorėjės|Kateguorėju}}",
        "category_header": "Kateguorėjės „$1“ straipsnē",
        "subcategories": "Subkateguorėjės",
        "newwindow": "(īr atverams naujam longė)",
        "cancel": "Nutrauktė",
        "moredotdotdot": "Daugiau...",
-       "mypage": "Mona poslapis",
-       "mytalk": "Mona aptarėms",
+       "morenotlisted": "Tas sārošos užbengts nie.",
+       "mypage": "Poslapis",
+       "mytalk": "Aptarėms",
        "anontalk": "Šėta IP aptarėms",
        "navigation": "Naršīms",
        "and": "&#32;ėr",
        "actions": "Vēksmā",
        "namespaces": "Vardū srėtīs",
        "variants": "Variantā",
+       "navigation-heading": "Naršīma pasėrinkėmā",
        "errorpagetitle": "Klaida",
        "returnto": "Grīžtė i $1.",
        "tagline": "Straipsnis ėš {{SITENAME}}.",
        "permalink": "Nulatėnė nūruoda",
        "print": "Spausdėntė",
        "view": "Veizietė",
+       "view-foreign": "Perveiziet $1",
        "edit": "Taisītė",
+       "edit-local": "Taisītė vėitėni aprašīma",
        "create": "Sokortė",
+       "create-local": "Prikergtė vėitėni aprašīma",
        "editthispage": "Taisītė ton poslapė",
        "create-this-page": "Sokortė ta poslapi",
        "delete": "Trintė",
        "deletethispage": "Trintė ton poslapė",
+       "undeletethispage": "Atkortė ta poslapi",
        "undelete_short": "Atstatītė $1 {{PLURAL:$1:redagavėma|redagavėmus|redagavėmu}}",
        "viewdeleted_short": "Veizietė $1 {{PLURAL:$1|ėštrinta keitėma|ėštrintus keitėmus|ėštrintū keitėmu}}",
        "protect": "Ožrakintė",
        "otherlanguages": "Kėtuom kalbuom",
        "redirectedfrom": "(Nokreipta ėš $1)",
        "redirectpagesub": "Nokreipėma poslapis",
+       "redirectto": "Nukreipėms ont:",
        "lastmodifiedat": "Šėts poslapis paskotini karta pakeists $1 $2.",
        "viewcount": "Tas poslapis bova atverts $1 {{PLURAL:$1|čiesa|čiesus|čiesu}}.",
        "protectedpage": "Ožrakints poslapis",
        "ok": "Gerā",
        "retrievedfrom": "Gautė ėš „$1“",
        "youhavenewmessages": "Tamsta toret $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Tamsta turėt}} $1 nū {{PLURAL:$3|kėta nauduotojė|$3 nauduotoju}} ($2).",
+       "youhavenewmessagesmanyusers": "Tamsta turėt $1 nū daug nauduotoju ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|naus pranešėms|999=naujė pranešėmā}}",
+       "newmessagesdifflinkplural": "paskiausis {{PLURAL:$1|pakeitėms|999=pakeitėmā}}",
        "youhavenewmessagesmulti": "Toret naujū žėnotiu $1",
        "editsection": "taisītė",
        "editold": "taisītė",
        "hidetoc": "kavuotė",
        "collapsible-collapse": "Sugōžtė",
        "collapsible-expand": "Atsklēstė",
+       "confirmable-confirm": "A tikslē tēp mīslėjat?",
+       "confirmable-yes": "Tēp",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Veizėtė a atkortė $1?",
        "viewdeleted": "Ruodītė $1?",
        "restorelink": "$1 {{PLURAL:$1|ėštrinta keitėma|ėštrintos keitėmos|ėštrintū keitėmu}}",
        "page-rss-feed": "„$1“ RSS šaltėnis",
        "page-atom-feed": "„$1“ Atom šaltėnis",
        "red-link-title": "$1 (poslapis da neparašīts)",
+       "sort-descending": "Palē alfabėto",
+       "sort-ascending": "Prīš alfabėto",
        "nstab-main": "Poslapis",
        "nstab-user": "Nauduotuojė poslapis",
        "nstab-media": "Abruozdielė poslapis",
        "nstab-category": "Kateguorėjė",
        "nosuchaction": "Nier tuokė veiksma",
        "nosuchspecialpage": "Nier tuokė specēlėjė poslapė",
-       "nospecialpagetext": "Tamsta praÅ¡iet nelaistÄ\97na specÄ\93\97Ì\85jė poslapė, laistėnū specēliūju poslapiu sōraša rasėt [[Special:SpecialPages|specēliūju poslapiu sārošė]].",
+       "nospecialpagetext": "Tamsta praÅ¡iet nelaistÄ\97na specÄ\93\97Ì\84jė poslapė, laistėnū specēliūju poslapiu sōraša rasėt [[Special:SpecialPages|specēliūju poslapiu sārošė]].",
        "error": "Klaida",
        "databaseerror": "Doumenū bazės klaida",
+       "databaseerror-error": "Klaida: $1",
        "laggedslavemode": "Diemesė: Poslapī gal nesmatītė naujausiu pakeitėmu.",
        "readonly": "Doumenū bazė ožrakėnta",
        "enterlockreason": "Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta",
        "filenotfound": "Nepavīkst rastė faila „$1“.",
        "unexpected": "Natėkieta raikšmie: „$1“=„$2“.",
        "cannotdelete": "Nepavīka ėštrintė nuruodīta poslapė a faila \"$1\". (Mažo kažkas padarė pėrmesnis šėta)",
+       "cannotdelete-title": "Negal ėštrintė poslapė \"$1\"",
        "badtitle": "Bluogs pavadėnėms",
        "badtitletext": "Nuruodīts poslapė pavadėnėms bova neleistėns, toščės a neteisėngā sojongts terpkalbinis a terppruojektėnis pavadėnėms. Anamė gal būtė vėins a daugiau sėmbuoliu, neleistėnū pavadėnėmūs",
        "perfcachedts": "Ruodoma ėšsauguota doumenū kopėjė, katra bova atnaujėnta $1. Daugiausē $4 {{PLURAL:$4|rezoltats|rezoltatā|rezoltatu}} īr sauguoma.",
        "querypage-no-updates": "Atnaujėnėmā tam poslapiō nūnā ėšjongtė īr. Doumenīs nūnā čė nebus atnaujėntė.",
        "viewsource": "Veizėtė kuoda",
-       "protectedpagetext": "Šėts poslapis īr ožrakints, saugont anū nū redagavėma.",
+       "protectedpagetext": "Šėts poslapis īr ožrakints, saugont anū nū taisīma.",
        "viewsourcetext": "Tomsta galėt veizietė ėr kopėjoutė poslapė kuoda:",
-       "protectedinterface": "Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.",
+       "protectedinterface": "Šėtom poslapi īr pruogramėnės īronguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.",
        "editinginterface": "<strong>Diemesė:</strong> Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
        "namespaceprotected": "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
        "ns-specialprotected": "Specēlė̅ jė poslapē negal būtė keitamė.",
+       "exception-nologin": "Nesat prėsėjongis",
        "logouttext": "'''Daba Tamsta esat atsėjongės.'''\n\nGalat ė tuoliau nauduotė {{SITENAME}} anuonimėškā aba <span class='plainlinks'>[$1 prisėjonkat]</span> ėš naujė šėtuo patiu a kėto nauduotuojė vardu.\nPastebiejims: katruos nekatruos poslapiuos ė tuoliau gal ruodītė būktā būtomiet prisėjongės lėgė tuol, kumet ėšvalīsėt sava naršīklės dietovė (''cache'').",
+       "welcomeuser": "Svēks, $1!",
+       "welcomecreation-msg": "Tamstas paskīra jau padėrbta.\nNūnā galat pakeitė sava {{SITENAME}} [[Special:Preferences|nustatīmos]], jēgo tėktās nuorat.",
        "yourname": "Nauduotuojė vards:",
+       "userlogin-yourname": "Nauduotuojė vards:",
+       "userlogin-yourname-ph": "Ožrašīkėt sava nauduotojė varda",
+       "createacct-another-username-ph": "Ožrašīkėt nauduotojė varda",
        "yourpassword": "Slaptažuodis:",
+       "userlogin-yourpassword": "Slaptažuodis",
+       "userlogin-yourpassword-ph": "Ožrašīkėt sava slaptažuodi",
+       "createacct-yourpassword-ph": "Ožrašīkėt slaptažuodi",
        "yourpasswordagain": "Pakartuoket slaptažuodė:",
+       "createacct-yourpasswordagain": "Čīstā tuokis slaptažuodis?",
+       "createacct-yourpasswordagain-ph": "Viel ožrašīkėt slaptažuodi",
        "remembermypassword": "Atmintė prisėjongėma infuormacėjė šėtom kuompioteri (daugiausē $1 {{PLURAL:$1|dėina|dėinė|dėinas}})",
+       "userlogin-remembermypassword": "Ka liktō prisėjongis",
+       "userlogin-signwithsecure": "Apsauguots rīšīs",
        "yourdomainname": "Tamstas domens:",
+       "password-change-forbidden": "Negalat tuo wiki keistė slaptažuodiu.",
        "login": "Prisėjongtė",
        "nav-login-createaccount": "Prėsėjongtė / sokortė paskīra",
        "userlogin": "Prėsėjongtė / sokortė paskīra",
        "logout": "Atsėjongtė",
        "userlogout": "Atsėjongtė",
        "notloggedin": "Neprisėjongis",
+       "userlogin-noaccount": "Netorėt paskīruos?",
+       "userlogin-joinproject": "Jonkėtėis pri {{SITENAME}}",
        "nologin": "Netorėt prisėjongėma varda? '''$1'''.",
        "nologinlink": "Sokorkėt paskīra",
        "createaccount": "Sokortė paskīra",
        "gotaccount": "Jau torėt paskīra? '''$1'''.",
        "gotaccountlink": "Prisėjonkėt",
        "userlogin-resetlink": "Ožmiršat sava prisėjongėma doumenis?",
-       "createaccountmail": "Par elektruonėni pašta",
+       "userlogin-resetpassword-link": "Pamiršuot slaptažuodi?",
+       "userlogin-helplink2": "Prisėjongėma pagelba",
+       "userlogin-createanother": "Padėrbtė kėta paskīra",
+       "createacct-emailrequired": "El. pašta adresos",
+       "createacct-emailoptional": "El. paštos (nie būtėns)",
+       "createacct-email-ph": "Ožrašīkėt sava el. pašta adresa",
+       "createacct-another-email-ph": "Ožrašīkėt el. pašta adresa",
+       "createaccountmail": "Nauduokėt laikėna slaptažuodi ė siōskėt nuruodėtō el. paštō",
+       "createacct-realname": "Tėkros vardos (nie būtėns)",
        "createaccountreason": "Prīžastis:",
+       "createacct-reason": "Prīžastis",
+       "createacct-captcha": "Apsauguos patėkrėnėms",
+       "createacct-imgcaptcha-ph": "Ožrašīkėt ženklus, katrus veizėt viršō",
+       "createacct-submit": "Padėrbkėt sau paskīra",
+       "createacct-another-submit": "Padėrbtė kėta paskīra",
+       "createacct-benefit-heading": "{{SITENAME}} īr sokorta prietėliu, tuokiu, kāp Tamsta.",
+       "createacct-benefit-body1": "{{PLURAL:$1|pataisīms|pataisīmā|pataisīmu}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|poslapis|poslapē|poslapiu}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|vielībs nauduotuos|vielībė nauduotuojē|vielībū nauduotuoju}}",
        "badretype": "Ivestė slaptažuodē nesotamp.",
        "userexists": "Irašīts nauduotuojė vards jau īr nauduojams.\nPrašuom pasėrėnktė kėtuoki varda.",
        "loginerror": "Prisėjongėma klaida",
        "nosuchuser": "Nier anėjuokė nauduotuojė pavadėnta „$1“.\nPatikrėnkėt rašība, aba [[Special:UserLogin/signup|sokorkėt naujė paskīra]].",
        "nosuchusershort": "Nier juokė nauduotuojė, pavadėnta „$1“. Patėkrinkėt rašība.",
        "nouserspecified": "Tamstā rēk nuruodītė nauduotuojė varda.",
+       "login-userblocked": "Nauduotuos ožblokouts. Prisėjongt nie galėma.",
        "wrongpassword": "Ivests neteisings slaptažuodis. Pameginket dā karta.",
        "wrongpasswordempty": "Ivests slaptažuodis īr tošts. Pameginket vielėk.",
        "passwordtooshort": "Tamstas slaptažuodis nier laistėns aba par tromps īr. Ans tor būtė nuors {{PLURAL:$1|1 sėmbuolė|$1 sėmbuoliu}} ėlgoma.",
        "password-name-match": "Tamstas slaptažuodis tor skirtėis nu Tamstas nauduotuojė varda.",
        "password-login-forbidden": "Tuo nauduotuojė varda ė slaptažuodė nauduojėms nie galėms.",
-       "mailmypassword": "Atsiōstė naujė slaptažuodi pašto",
+       "mailmypassword": "Atkortė slaptažuodi",
        "passwordremindertitle": "Laikėns {{SITENAME}} slaptažuodis",
        "passwordremindertext": "Kažkastā (tėkriausē Tamsta, ėš IP adresa $1)\npaprašė, kū atsiōstomiet naujė slaptažuodi pruojektō {{SITENAME}} ($4).\nLaikėns slaptažuodis nauduotuojō „$2“ bova sokorts ėr nustatīts kāp „$3“.\nJēgo Tamsta nuoriejot ana pakeistė tūmet torietomiet prisėjongtė ė daba pakeistė sava slaptažuodi.\nTamstas laikėns slaptažuodis bengs galiuotė par {{PLURAL:$5|dėina|$5 dėinas}}.\n\nJēgo kažkas kėts atlėka ta prašīma aba Tamsta prisėmėniet sava slaptažuodi ė\nnebnuorėt ana pakeistė, Tamsta galėt tėisiuog nekreiptė diemiesė ė šėta gruomata ė tuoliau\nnauduotis sava senu slaptažuodžiu.",
        "noemail": "Nier anėjuokė el. pašta adresa ivesta nauduotuojō „$1“.",
        "noemailprefs": "Nuruodėkīt el. pašta adresa, kū vėiktu šėtos funkcėjės.",
        "emailconfirmlink": "Patvėrtinkėt sava el. pašta adresa",
        "accountcreated": "Nauduotuos sokorts",
-       "accountcreatedtext": "Nauduotuos $1 sokorts.",
+       "accountcreatedtext": "Paskīra nauduotojō [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|aptarėms]]) bova padėrbta.",
        "createaccount-title": "{{SITENAME}} paskīruos kūrėms",
        "loginlanguagelabel": "Kalba: $1",
+       "pt-login": "Prisėjongtė",
+       "pt-login-button": "Prisėjongtė",
+       "pt-createaccount": "Pasdėrbtė paskīra",
+       "pt-userlogout": "Atsėjongtė",
        "changepassword": "Pakeistė slaptažuodė",
+       "resetpass_announce": "Ka ožbengtomėt jongtėis, torėt sokortė nauja slaptažuodi.",
        "resetpass_header": "Keistė paskīruos slaptažuodi",
        "oldpassword": "Sens slaptažuodis:",
        "newpassword": "Naus slaptažuodis:",
        "retypenew": "Pakartuokėt nauja slaptažuodi:",
        "resetpass_submit": "Nostatītė slaptažuodi ė prėsėjongtė",
-       "changepassword-success": "Tamstas slaptažuodis pakeists siekmėngā! Daba prėsėjongiama...",
+       "changepassword-success": "Tamstas slaptažuodis pakeists siekmėngā!",
+       "changepassword-throttled": "Baisē daug čiesu mieginot prisėjongtė.\nDaba palaukėt $1 prīš mieginant vie.",
+       "resetpass-submit-loggedin": "Keistė slaptažuodi",
+       "resetpass-submit-cancel": "Nutrauktė",
        "resetpass-temp-password": "Laikėns slaptažuodis:",
+       "passwordreset-username": "Nauduotuojė vards:",
+       "passwordreset-domain": "Domens:",
+       "passwordreset-email": "El. pašta adresos:",
+       "changeemail": "Keistė el. pašta adresa",
+       "changeemail-none": "(nie)",
+       "changeemail-password": "Tamstas {{SITENAME}} slaptažuodis:",
+       "changeemail-submit": "Keistė el. pašta",
        "bold_sample": "Pastuorints teksts",
        "bold_tip": "Pastuorintė teksta",
        "italic_sample": "Teksts kursīvu",
        "media_tip": "Nūruoda i media faila",
        "sig_tip": "Tomstas parašos ėr čiesos",
        "hr_tip": "Guorizuontali linėjė (nenauduokėt ba reikala)",
-       "summary": "Kuomentars:",
+       "summary": "Pāiškėnėms:",
        "subject": "Tema/ontraštė:",
        "minoredit": "Mažos pataisims",
        "watchthis": "Keravuotė šėta poslapė",
        "recreate-moveddeleted-warn": "'''Parspiejėms: Tamsta ikeliat faila, katros onkstiau bova ėštrėnts.'''\n\nTamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.\nTuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
        "moveddeleted-notice": "Tas poslapis bova ėštrėnts.\nĖštrėnta poslapė versėju sārašos īr pateikts paveiziejėmō žemiau.",
        "edit-conflict": "Redagavėma kuonflėktos",
+       "postedit-confirmation-created": "Poslapis padėrbts.",
+       "postedit-confirmation-restored": "Poslapis atkorts.",
        "postedit-confirmation-saved": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
        "post-expand-template-inclusion-warning": "Perspiejėms: Šabluonu īterpėma dėdoms īr par dėdelis.\nKāp katrėi šabluonā nebus ītrauktė.",
        "post-expand-template-inclusion-category": "Poslapē, kur šabluonu īterpėma dėdoms viršėjams",
        "history-feed-empty": "Prašuoms poslapis nēgzėstuo.\nAns galiejė būtė ėštrėnts ėš pruojekta, aba parvardėnts.\nPamiegīkėt [[Special:Search|ėiškoutė pruojektė]] sosėjosiu naujū poslapiu.",
        "rev-delundel": "ruodītė/kavuotė",
        "revisiondelete": "Trintė/atkortė versėjės",
+       "revdelete-show-file-submit": "Tēp",
        "logdelete-selected": "{{PLURAL:$2|Pasėrinkts|Pasėrinktė|Pasėrinktė}} $1 istuorėjės {{PLURAL:$2|atėtėkims|atsėtėkimā|atsėtėkimā}}:",
+       "revdelete-hide-comment": "Keitėma pāiškėnėms",
+       "revdelete-hide-user": "Keitiejė nauduotojė vardos/IP adresos",
        "revdelete-unsuppress": "Šalėntė apribuojėmos atkortuos versėjės",
        "revdel-restore": "Keistė veizėmuma",
        "revdelete-edit-reasonlist": "Keistė trīnėma prīžastis",
        "search-result-category-size": "{{PLURAL:$1|1 narīs|$1 nariū}} ({{PLURAL:$2|1 subkateguorėjuo|$2 subkateguorėju}}, {{PLURAL:$3|1 fails|$3 failu}})",
        "search-redirect": "(paradresavėms $1)",
        "search-section": "(skīrios $1)",
+       "search-category": "(kateguorėjė $1)",
+       "search-file-match": "(atėtėnk abruozdielė torėni)",
        "search-suggest": "Mažo nuoriejot $1",
        "search-interwiki-caption": "Dokterėnē pruojektā",
        "search-interwiki-default": "$1 rezoltatā:",
        "timezoneregion-africa": "Afrėka",
        "timezoneregion-america": "Amerėka",
        "timezoneregion-antarctica": "Antarktėda",
+       "timezoneregion-arctic": "Arktės",
        "timezoneregion-asia": "Azėjė",
        "timezoneregion-atlantic": "Atlanta ondenīns",
        "timezoneregion-australia": "Australėjė",
        "timezoneregion-indian": "Indėjės ondenīns",
        "timezoneregion-pacific": "Ramosis ondenīns",
        "allowemail": "Lēstė siūstė el. gramuotelės ėš kėtū nauduotuoju",
-       "prefs-searchoptions": "Paėiškuos nustatīmā",
+       "prefs-searchoptions": "Ėiškuotė",
        "prefs-namespaces": "Vardū srėtīs",
        "default": "palē nūtīliejėma",
        "prefs-files": "Failā",
        "prefs-registration": "Ožsėregėstravėma čiesos:",
        "yourrealname": "Tėkros vards:",
        "yourlanguage": "Aplėnkuos kalba:",
-       "yourvariant": "Variants",
+       "yourvariant": "Torėnė kalba:",
        "yournick": "Pasėrinkts slapīvardis:",
        "badsig": "Neteisings parašas; patėkrinkėt HTML žīmės.",
        "badsiglength": "Tamstas parašos īr par ėlgs.\nAna gal sodarītė ne daugiau kāp $1 {{PLURAL:$1|sėmbuolis|sėmbuolē|sėmbuoliu}}.",
        "email": "El. pašts",
        "prefs-help-realname": "Tėkrs vards nier privaluoms, vuo jēgo Tamsta ana ivesėt, ons bus nauduojams Tamstas darba pažīmiejėmō.",
        "prefs-help-email": "El. pašta adresos nier privaloms, ale uns leid Tamstā gautė nauja slaptažuodi, jēgo pamėršuot kuoks uns bova, ė tēpuogi Tamsta galėt leistė kėtėims pasėiktė Tamsta par Tamstas nauduotuojė a nauduotuojė aptarėma poslapi neatsklėidont Tamstas tapatoma.",
+       "prefs-help-email-required": "Rēk el. pašta adresa",
        "prefs-info": "Glavnuojė infuormacėjė",
        "prefs-i18n": "Kalbuos nustatīmā",
+       "prefs-signature": "Parašos",
        "prefs-dateformat": "Datuos skvarma",
        "prefs-timeoffset": "Čiesa skėrtoms",
+       "prefs-advancedediting": "Bendrė parametrā",
+       "prefs-preview": "Parveiza",
        "prefs-advancedrc": "Papėlduomė nustatīmā",
+       "prefs-advancedrendering": "Papėlduomė nustatīmā",
+       "prefs-advancedsearchoptions": "Papėlduomė nustatīmā",
+       "prefs-advancedwatchlist": "Papėlduomė nustatīmā",
+       "prefs-displayrc": "Ruodītė nustatīmus",
+       "prefs-displaywatchlist": "Ruodītė nustatīmus",
        "prefs-diffs": "Skėrtomā",
        "userrights": "Nauduotuoju teisiu valdīms",
        "userrights-lookup-user": "Tvarkītė nauduotuojė gropės",
        "group-bureaucrat": "Biorokratā",
        "group-all": "(vėsė)",
        "group-user-member": "Nauduotuos",
+       "group-autoconfirmed-member": "Patvirtints nauduotuos",
        "group-bot-member": "Buots",
-       "group-sysop-member": "Adminėstratuorius",
+       "group-sysop-member": "Adminėstratuorios",
        "group-bureaucrat-member": "Biorokrats",
+       "group-suppress-member": "Revėzorios",
        "grouppage-user": "{{ns:project}}:Nauduotuojē",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatėškā patvėrtintė nauduotuojē",
        "grouppage-bot": "{{ns:project}}:Robuotā",
        "grouppage-bureaucrat": "{{ns:project}}:Biorokratā",
        "right-read": "Skaitītė poslapius",
        "right-edit": "Keistė poslapius",
+       "right-upload": "Ikeltė failus",
+       "right-delete": "Trintė poslapius",
        "newuserlogpage": "Nauduotuojė kūrėma regėstros",
        "rightslog": "Nauduotuoju teisiu istuorėjė",
        "rightslogtext": "Pateikiams nauduotuoju teisiu pakeitėmu sārašos.",
        "action-edit": "redagoutė ta poslapi",
+       "action-move": "parvadintė šėta poslapi",
+       "action-move-subpages": "parvadintė šėta poslapi ėr anuo dalės",
+       "action-move-categorypages": "parvadintė kateguorėjes",
+       "action-movefile": "parvadintė šėta faila",
+       "action-upload": "ikeltė šėta faila",
+       "action-delete": "trintė ton poslapė",
        "action-undelete": "atkortė ta poslapi",
        "action-patrol": "pažīmietė kėtū keitėmus kāp patikrėntus",
        "action-userrights": "keistė vėsū nauduotuoju teises",
        "nchanges": "$1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}}",
+       "enhancedrc-history": "istuorėjė",
        "recentchanges": "Vielībė̅jė pakeitėmā",
        "recentchanges-legend": "Vielībuju pakeitėmu pasėrinkėmā",
        "recentchanges-summary": "Keravuokėt patius vielībiausius wiki pakeitėmus tamė poslapī.",
        "recentchanges-label-bot": "Šėta keitėma padėrba autuomatėnė pruograma",
        "recentchanges-label-unpatrolled": "Tas keitėms da nebova patikrints",
        "recentchanges-label-plusminus": "Ton baitu skaitliom pakeists straipsnė apmiers",
+       "recentchanges-legend-heading": "'''Pāiškėnėmā:'''",
        "rcnotefrom": "Žemiau īr pakeitėma pradedant nū <b>$2</b> (ruodom lėgė <b>$1</b> pakeitėmu).",
        "rclistfrom": "Ruodītė naujus pakeitėmus pradedant nū $3 $2",
        "rcshowhideminor": "$1 mažus pakeitėmus",
+       "rcshowhideminor-show": "Ruodītė",
+       "rcshowhideminor-hide": "Kavuotė",
        "rcshowhidebots": "$1 robuotus",
+       "rcshowhidebots-show": "Ruodītė",
+       "rcshowhidebots-hide": "Kavuotė",
        "rcshowhideliu": "$1 prėsėjongusiūm nauduotuojūm pakeitėmus",
+       "rcshowhideliu-show": "Ruodītė",
+       "rcshowhideliu-hide": "Kavuotė",
        "rcshowhideanons": "$1 anuonimėnius nauduotuojus",
+       "rcshowhideanons-show": "Ruodītė",
+       "rcshowhideanons-hide": "Kavuotė",
        "rcshowhidepatr": "$1 patikrėntus pakeitėmus",
+       "rcshowhidepatr-show": "Ruodītė",
+       "rcshowhidepatr-hide": "Kavuotė",
        "rcshowhidemine": "$1 mona pakeitėmus",
+       "rcshowhidemine-show": "Ruodītė",
+       "rcshowhidemine-hide": "Kavuotė",
        "rclinks": "Ruodītė paskotėnius $1 pakeitėmu par paskotėnė̅sēs $2 dėinū<br />$3",
        "diff": "skėrt",
        "hist": "ist",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keravuojontis nauduotuos|keravuojontīs nauduotuojē|keravuojontiu nauduotuoju}}]",
        "rc_categories": "Ruodītė tėk šėtas kateguorėjės (atskirkit nauduodamė „|“)",
        "rc_categories_any": "Bikuokė",
+       "rc-change-size-new": "$1 {{PLURAL:$1|baits|baitā|baitu}} pu pakeitėma",
        "newsectionsummary": "/* $1 */ naus skėrsnelis",
-       "rc-enhanced-expand": "Ruodītė detales (rēk JavaScript)",
+       "rc-enhanced-expand": "Ruodītė detales",
        "rc-enhanced-hide": "Kavuotė detales",
+       "rc-old-title": "pradiuo padėrbta kāp \"$1\"",
        "recentchangeslinked": "Sosėjėn pakeitėmā",
        "recentchangeslinked-feed": "Sosėjėn pakeitėmā",
        "recentchangeslinked-toolbox": "Sosėjėn pakeitėmā",
        "filename": "Faila vards",
        "filedesc": "Kuomentars",
        "fileuploadsummary": "Kuomentars:",
+       "filesource": "Šaltėnis:",
        "ignorewarning": "Nekrėiptė diemiesė i parspiejėma ėr ėšauguotė faila vėsvėin.",
        "ignorewarnings": "Nekrėiptė diemesė i vėsuokius perspiejimos",
        "minlength1": "Faila pavadinėms tor būtė nuors vėina raidie.",
        "illegalfilename": "Faila vardė „$1“ īr sėmbuoliu, katrėi nier leidami poslapė pavadinėmūs. Prašuom parvadėntė faila ė miegītė ikeltė ana par naujė.",
        "badfilename": "Faila pavadinėms pakeists i „$1“.",
        "filetype-missing": "Fails netor galūnės (kāp pavīzdīs „.jpg“).",
+       "unknown-error": "Nutėka nežėnuoma klaida.",
        "emptyfile": "Panašu, ka fails, katra ikieliet īr toščias. Tas gal būtė diel klaiduos faila pavadėnėmė. Pasėtėkrinkėt a tėkrā nuorėt ikeltė šėta faila.",
        "fileexists": "Fails so tuokiu vardu jau īr, prašuom paveizėtė <strong>[[:$1]]</strong>, jēgo nesat ožtėkrėnts, a nuorit ana parrašītė.\n[[$1|thumb]]",
        "fileexists-extension": "Fails so pavėdiu pavadinėmu jau īr: [[$2|thumb]]\n* Ikeliama faila pavadinėms: <strong>[[:$1]]</strong>\n* Jau esontė faila pavadinėms: <strong>[[:$2]]</strong>\nPrašuom ėšsėrėnktė kėta varda.",
        "file-exists-duplicate": "Tas fails īr {{PLURAL:$1|šėta faila|šėtū failu}} doblėkats:",
        "uploadwarning": "Diemesė",
        "savefile": "Ėšsauguotė faila",
+       "uploaddisabled": "Ikielėmā oždraustė.",
        "uploaddisabledtext": "Failu ikielėmā oždraustė īr.",
        "uploadscripted": "Šėts failos tor HTML a programėni kuoda, katros gal būtė klaidėngā soprasts interneta naršīklės.",
        "uploadvirus": "Šėtom faile īr virosas! Ėšsamiau: $1",
        "sourcefilename": "Ikeliams fails",
        "destfilename": "Nuorims faila pavadinims",
        "upload-maxfilesize": "Dėdliausias faila dėdoms: $1",
+       "upload-description": "Abruozdielė aprašīms",
        "upload-options": "Nostatīmā īkelėmō",
-       "watchthisupload": "Keravuotė šėta poslapė",
+       "watchthisupload": "Keravuotė šėta faila",
        "upload-success-subj": "Ikelt siekmėngā",
+       "upload-failure-subj": "Ikielėma bieda",
        "upload-proto-error": "Nateisėngs protuokols",
        "upload-proto-error-text": "Nutuolinē ikielims raikalaun, kū URL prasėdietu <code>http://</code> o <code>ftp://</code>.",
        "upload-file-error": "Vėdėnė klaida",
        "license": "Licensėjė",
        "license-header": "Licensėjė",
        "nolicense": "Nepasėrėnkt",
+       "licenses-edit": "Keistė lėcencėju parametrus",
        "license-nopreview": "(Parveiza negalėma)",
        "upload_source_url": " (tėkrs, vėišā priėinams URL)",
        "upload_source_file": " (fails Tamstas kompioterī)",
+       "listfiles-delete": "trintė",
        "listfiles-summary": "Tas specēlus poslapis ruod vėsus ikeltus failus.\nPalē numatīma paskiausē ikeltė failā īr ruoduomė sāroša vėršou.\nPaspaude ont štolpelė ontraštės pakeisėt ėšruokavėma.",
        "imgfile": "fails",
        "listfiles": "Failu sārašos",
+       "listfiles_thumb": "Somažints",
+       "listfiles_date": "Data",
        "listfiles_name": "Pavadinėms",
        "listfiles_user": "Nauduotuos",
        "listfiles_size": "Dėdoms",
        "listfiles_description": "Aprašīms",
        "listfiles_count": "Versėjės",
+       "listfiles-latestversion": "Vielība atmaina",
+       "listfiles-latestversion-yes": "Tēp",
+       "listfiles-latestversion-no": "Ne",
        "file-anchor-link": "Fails",
        "filehist": "Abruozdielė istuorėjė",
        "filehist-help": "Paspauskėt ont datas/čiesa, ka paveizietomėt faila tuoki, kokis ons bova tū čiesu.",
        "filehist-datetime": "Data/Čiesos",
        "filehist-thumb": "Miniatiūra",
        "filehist-thumbtext": "Versėjės $1 miniatiūra",
+       "filehist-nothumb": "Somažinima nie",
        "filehist-user": "Nauduotuos",
        "filehist-dimensions": "Mierā",
        "filehist-filesize": "Faila dėdoms",
-       "filehist-comment": "Kuomentars",
+       "filehist-comment": "Pāiškėnėms",
        "imagelinks": "Failu nūruodas",
        "linkstoimage": "{{PLURAL:$1|Šėts poslapis|Šėtė poslapē}} nuruod i šėta faila:",
        "nolinkstoimage": "I faila neruod anėjuoks poslapis.",
+       "morelinkstoimage": "Veizietė [[Special:WhatLinksHere/$1|daugiau nūruodu]] ton abruozdielėn.",
        "sharedupload": "Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.",
        "sharedupload-desc-here": "Tas fails īr ėš $1 ė gal būtė nauduojams kėtūsė pruojektūsė.\nInfuormacėjė ėš [$2 faila aprašīma poslapė] īr pateikta žemiau.",
        "uploadnewversion-linktext": "Ikeltė nauja faila versėje",
+       "shared-repo-from": "ėš $1",
+       "shared-repo": "bendruos saugīklas",
+       "upload-disallowed-here": "Negalėt perrašītė ton faila.",
        "filerevert": "Sogrōžėntė $1",
        "filerevert-legend": "Faila sogrōžinėms",
        "filerevert-intro": "<span class=\"plainlinks\">Tamsta grōžėnat '''[[Media:$1|$1]]''' i versėje $4 ($2, $3).</span>",
-       "filerevert-comment": "Kuomentars:",
+       "filerevert-comment": "Pāiškėnėms:",
        "filerevert-submit": "Grōžėntė",
        "filedelete": "Trintė $1",
        "filedelete-legend": "Trintė faila",
        "unusedtemplateswlh": "kėtas nūruodas",
        "randompage": "Bikuoks poslapis",
        "randompage-nopages": "Šėtuo vardū srėti nier anėjuokiu poslapiu.",
+       "randomincategory": "Bikuoks poslapis kateguorėjuo",
+       "randomincategory-category": "Kateguorėjė:",
        "randomredirect": "Bikuoks paradresavėms",
        "randomredirect-nopages": "Šėtuo vardū srėti nier anėjuokiū paradresavėmu.",
        "statistics": "Statėstėka",
        "nowatchlist": "Netorėt anėvėina keravuojama poslapė.",
        "watchlistanontext": "Prašuom $1, ka parveizietomėt a pakeistomiet elementus sava keravuojamu sārašė.",
        "watchnologin": "Neprisėjongės",
+       "addwatch": "Prikergtė pri keravuojamu",
        "addedwatchtext": "Poslapis \"[[$1]]\" idiets i [[Special:Watchlist|keravuojamu sāraša]].\nBūsantīs poslapė ėr atėtinkama aptarėma poslapė pakeitėmā bus paruoduomė keravuojamu poslapiu sārašė,\ntēpuogi bus '''parīškintė''' [[Special:RecentChanges|vielībūju pakeitėmu sārašė]], kū ėšsėskėrtom ėš kėtū straipsniu.\nJēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"nebkeravuotė\" vėršotėniam meniū.",
+       "removewatch": "Ėšmestė ėš kieravuojamu",
        "removedwatchtext": "Poslapis „[[:$1]]“ pašalėnts ėš [[Special:Watchlist|Tamstas keravuojamu sāraša]].",
+       "removedwatchtext-short": "Poslapis \"$1\" bova ėšmests ėš kieravuojamu.",
        "watch": "Keravuotė",
        "watchthispage": "Keravuotė šėta poslapė",
        "unwatch": "Nebkeravuotė",
        "watching": "Itraukiama i keravuojamu sāraša...",
        "unwatching": "Šalėnama ėš keravuojamu sāraša...",
        "enotif_reset": "Pažīmietė vėsus poslapius kāp aplonkītus",
+       "enotif_impersonal_salutation": "{{SITENAME}} nauduotuos",
        "enotif_anon_editor": "anuonėminis nauduotuos $1",
        "created": "sokūrė",
        "changed": "pakeitė",
        "deletereason-dropdown": "*Dažnas trīnėma prižastīs\n** Autorė prašīms\n** Autorėniu teisiu pažeidėms\n** Vandalėzmos",
        "delete-edit-reasonlist": "Keistė trėnėma prīžastis",
        "rollback": "Atmestė pakeitėmos",
-       "rollback_short": "Atmestė",
        "rollbacklink": "atmestė",
        "rollbacklinkcount": "atmestė $1 {{PLURAL:$1|keitėms|keitėmo|keitėmus|keitėmu}}",
        "rollbackfailed": "Atmetims napavīka",
        "cantrollback": "Negalėma atmestė redagavėma; paskotinis keitės nauduotuos īr tuo poslapė autorius.",
        "alreadyrolled": "Nepavīka atmestė paskotėnė [[User:$2|$2]] ([[User talk:$2|Aptarėms]]) darīta straipsnė [[$1]] keitėma;\nkažkas jau pakeitė straipsnė arba sospiejė pėrmiesnis atmestė keitėma.\n\nGalėnis keitėms dėrbts nauduotuojė [[User:$3|$3]] ([[User talk:$3|Aptarėms]]).",
-       "editcomment": "Redagavėma kuomentars bova: „''$1''“.",
+       "editcomment": "Padėrbėma pāiškėnėms bova: „''$1''“.",
        "revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarėms]]) pakeitėms; sogrōžėnta nauduotuojė [[User:$1|$1]] versėjė",
        "rollback-success": "Atmestė $1 keitėmā; grōžėnta i paskotėne $2 versėje.",
        "sessionfailure": "Atruod kū īr biedū so Tamstas prėsėjongėma sesėjė; šėts veiksmos bova atšaukts kāp atsargoma prėimonė priš sesėjės vuogėma.\nPrašoum paspaustė „atgal“ ėr parkrautė poslapi ėš katruo atiejot, ė pamieginkėt vielē.",
        "protect-level-sysop": "Tėktās adminėstratuorē",
        "protect-summary-cascade": "pakuopėnė apsauga",
        "protect-expiring": "beng galiuotė $1 (UTC)",
+       "protect-expiring-local": "beng galiuotė $1",
        "protect-expiry-indefinite": "nerėbuotā",
        "protect-cascade": "Apsaugotė poslapius, itrauktus i šėta poslapi (pakuopėnė apsauga).",
        "protect-cantedit": "Tamsta negalėt keistė šėta poslapė apsauguojėma līgiu, kagongi netorėt teisiu anuo redagoutė.",
        "protect-othertime": "Kėts čiesos:",
        "protect-othertime-op": "kėts čiesos",
        "protect-existing-expiry": "Esams rakėnėma ožsėbengėma čiesos: $3, $2",
+       "protect-existing-expiry-infinity": "Dabartėnis galiuojėma čiesos: omžiams",
        "protect-otherreason": "Kėta/papėlduoma prīžastis:",
-       "protect-otherreason-op": "kėta/papėlduoma prīžastis",
+       "protect-otherreason-op": "Kėta/papėlduoma prīžastis",
        "protect-dropdown": "*Iprastas ožrakinėma prīžastīs\n** Intensīvus vandalėzmos\n** Intensīvus nūruodu reklamavėms\n** Neproduktīvi redagavėma vaina\n** Dėdlė svarboma poslapis",
        "protect-edit-reasonlist": "Keistė ožrakinėma prīžastis",
        "protect-expiry-options": "1 adīna:1 hour,1 dėina:1 day,1 nedielė:1 week,2 nedielės:2 weeks,1 mienou:1 month,3 mieniesē:3 months,6 mieniesē:6 months,1 metā:1 year,par omžius:infinite",
        "blanknamespace": "(Pagrėndinė)",
        "contributions": "Nauduotuojė duovis",
        "contributions-title": "Nauduotuojė $1 duovis",
-       "mycontris": "Mona duovis",
+       "mycontris": "Duovis",
        "contribsub2": "Nauduotuojė $1 ($2)",
-       "uctop": " (paskotinis)",
+       "uctop": " (vielībs)",
        "month": "Nu mienėsė (ėr onkstiau):",
        "year": "Nu metu (ėr onkstiau):",
        "sp-contributions-newbies": "Ruodītė tėk naujū prieteliu duovios",
        "sp-contributions-newbies-sub": "Naujuoms paskīruoms",
        "sp-contributions-newbies-title": "Nauduotuoju keitėmā naujuoms paskīruoms",
        "sp-contributions-blocklog": "Bluokavėmu istuorėjė",
+       "sp-contributions-suppresslog": "panaikėnts nauduotuojė duovis",
        "sp-contributions-deleted": "Panaikėnts nauduotuojė duovis",
        "sp-contributions-uploads": "abruozdielē",
        "sp-contributions-logs": "Specēliūju veiksmū istuorėjė",
        "whatlinkshere-hidelinks": "$1 nūruodas",
        "whatlinkshere-hideimages": "$1 abruozdieliu nūruodas",
        "whatlinkshere-filters": "Fėltrā",
+       "block": "Ožblokoutė nauduotuoja",
+       "unblock": "Atblokoutė nauduotuoja",
        "blockip": "Ožblokoutė nauduotuoja",
        "blockip-legend": "Blokoutė nauduotuoja",
        "blockiptext": "Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].\nŽemiau nuruodīkėt tėkslē prižastė.",
        "ipboptions": "2 adīnas:2 hours,1 dėina:1 day,3 dėinas:3 days,1 nedielė:1 week,2 nedielės:2 weeks,1 mienou:1 month,3 mienesē:3 months,6 mienesē:6 months,1 metā:1 year,omžėms:infinite",
        "ipbwatchuser": "Keravuotė tuo nauduotuojė poslapi ėr anuo aptarėma poslapi",
        "ipb-change-block": "Parblokoutė ta nauduotuoja so šėtās nustatīmās",
+       "ipb-confirm": "Tėkrā blokoutė",
        "badipaddress": "Nelaistėns IP adresos",
        "blockipsuccesssub": "Ožblokavėms pavīka",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bova ožblokouts.\n<br />Aplonkīkėt [[Special:BlockList|IP blokavėmu istuorėjė]] noriedamė ana parveizėtė.",
        "unblockiptext": "Nauduokėt šėta fuorma, kū atkortomiet rašīma teises\nonkstiau ožbluokoutam IP adresō a nauduotuojō.",
        "ipusubmit": "Atblokoutė šėta adresa",
        "unblocked": "[[User:$1|$1]] bova atbluokouts",
+       "unblocked-range": "$1 bova atblokouts.",
        "unblocked-id": "Bluokavėms $1 bova pašalėnts",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] bova atblokouts.",
+       "blocklist": "Ožblokoutė nauduotuojē",
        "ipblocklist": "Ožblokoutė nauduotuojē",
        "ipblocklist-legend": "Rastė ožblokouta nauduotuoja",
+       "blocklist-expiry": "Beng galiuotė",
+       "blocklist-by": "Blokoutuos",
+       "blocklist-params": "Blokavėma nustatīmā",
+       "blocklist-reason": "Prīžastis",
        "ipblocklist-submit": "Ėiškuotė",
        "infiniteblock": "neribuotā",
        "expiringblock": "beng galiuotė $1 $2",
        "noautoblockblock": "autuomatinis blokavėms ėšjongts",
        "createaccountblock": "paskīrū korėms oždrausts īr",
        "emailblock": "el. pašts ožblokouts",
+       "blocklist-nousertalk": "negal rašītė sava aptarėmė",
        "ipblocklist-empty": "Blokavėmu sarašos toščias.",
        "ipblocklist-no-results": "Prašuoms IP adresos a nauduotuojė vards ožblokouts nier.",
        "blocklink": "ožblokoutė",
        "unblocklink": "atbluokoutė",
        "change-blocklink": "keistė bluokavėma nustatīmus",
        "contribslink": "duovis",
+       "emaillink": "siōstė pašta",
        "autoblocker": "Autuomatėnis ožbluokavėms, nes dalėnaties IP adreso so nauduotuojo \"$1\". Prīžastės - \"$2\".",
        "blocklogpage": "Ožblokavėmu istuorėjė",
        "blocklogentry": "ožblokava „[[$1]]“, blokavėma čiesos - $2 $3",
        "movepage-moved-redirect": "Nukreipims bova sokorts.",
        "articleexists": "Straipsnis so tuokiu vardo jau īr\na parinktāsis vards īr bluogs.\nParinkat kėta varda.",
        "movetalk": "Parkeltė sosėta aptarėma poslapi.",
+       "movepage-page-moved": "Poslapis $1 bova parvadints kāp $2.",
        "movelogpage": "Parvardinėmu istuorėjė",
        "movelogpagetext": "Sārašos parvadintu poslapiu.",
        "movereason": "Prīžastis:",
        "allmessagescurrent": "Dabartėnis teksts",
        "allmessagestext": "Čė pateikamė sėstemėniu pranešėmu sārašos, esontis MediaWiki srėtie.",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' nepalaikuoms īr, nes nustatīms '''$wgUseDatabaseMessages''' ėšjungts īr.",
+       "allmessages-filter-translate": "Pargoldītė",
        "thumbnail-more": "Padėdintė",
        "thumbnail_error": "Klaida koriant somažėnta pavēkslieli: $1",
        "thumbnail_invalid_params": "Nalaistieni miniatiūras parametrā",
        "tooltip-ca-nstab-special": "Šėts poslapis īr specēlosis - anuo nagalėm redagoutė.",
        "tooltip-ca-nstab-project": "Ruodītė pruojekta poslapi",
        "tooltip-ca-nstab-image": "Ruodītė abruozdielė poslapi",
+       "tooltip-ca-nstab-mediawiki": "Veizietė sėstėmas pranešėma",
        "tooltip-ca-nstab-template": "Ruodītė šabluona",
        "tooltip-ca-nstab-help": "Ruodītė pagelbas poslapi",
        "tooltip-ca-nstab-category": "Ruodītė kateguorėjės poslapi",
        "tooltip-recreate": "Atkortė poslapi napaisant šėto, kū ans bova ėštrints",
        "tooltip-rollback": "Atšauktė atmestus šėta poslapė keitėmus i vielībiause versėje par vėina paspaudėma",
        "tooltip-undo": "\"Anolioutė\" atmeta ta keitėma ėr atidara unkstesnies versėjės redagavėma skvarma. Leid pridietė atmetėma prīžasti kuomentarūsė.",
+       "tooltip-preferences-save": "Sauguotė nustatīmus",
        "tooltip-summary": "Īvestė trompa santrauka",
        "anonymous": "Neregėstrouts nauduotuos",
        "siteuser": "{{SITENAME}} nauduotuos $1",
        "spambot_username": "''MediaWiki'' reklamu šalėnėms",
        "spam_reverting": "Atkoriama i onkstesne versėje, katra nator nūruodu i $1",
        "spam_blanking": "Vėsos versėjės toriejė nūruodu i $1. Ėšvaluoma",
+       "pageinfo-header-edits": "Keitėma istuorėjė",
+       "pageinfo-header-restrictions": "Poslapė apsauga",
+       "pageinfo-header-properties": "Poslapė savībės",
+       "pageinfo-article-id": "Poslapė ID",
+       "pageinfo-language": "Poslapė kalba",
        "pageinfo-toolboxlink": "Poslapė infuormacėjė",
        "markaspatrolleddiff": "Žīmietė, kū patikrėnta",
        "markaspatrolledtext": "Pažīmietė, ka poslapis patėkrėnts īr",
        "file-nohires": "Geresnis ėšraiškėms negalėms.",
        "svg-long-desc": "SVG fails, fuormalē $1 × $2 puškiu, faila dėdoms: $3",
        "show-big-image": "Pėlns ėšraiškėms",
+       "show-big-image-preview": "Parvaizos dėdoms: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Kėta rezoliocėjė|Kėtas rezoliocėjės}}: $1.",
+       "show-big-image-size": "$1 × $2 pikselē",
        "newimages": "Naujausiu abruozdieliu galerėjė",
        "imagelisttext": "Žemiau īr '''$1''' failu sārašos, sorūšiouts $2.",
+       "newimages-legend": "Rietis",
        "newimages-label": "Faila vards (ar anuo dalis):",
        "ilsubmit": "Ėiškoutė",
        "bydate": "palē data",
        "sp-newimages-showfrom": "Ruodītė naujus abruozdielius pradedant nū $2, $1",
+       "just-now": "vuo tėk daba",
        "bad_image_list": "Fuormats tuoks īr:\n\nTėk eilotės, prasėdedantės *, īr itraukiamas. Pėrmuojė nūruoda eilotie tor būtė nūruoda i bluoga abruozdieli.\nVėsas kėtas nūoruodas tuo patiuo eilotie īr laikomas ėšėmtim, tas rēšk ka poslapē, katrūs leidama iterptė abruozdieli.",
        "metadata": "Metadoumenīs",
        "metadata-help": "Šėtom failė īr papėlduomos infuormacėjės, tikriausē pridietos skaitmeninės kameruos a skanėrė, katros bova nauduots anam sokortė a parkeltė i skaitmenėni fuormata. Jēgo fails bova pakeists ėš pradėnės versėjės, katruos nekatruos datalės gal nepėlnā atspėndietė nauja faila.",
        "exif-imagedescription": "Abruozdielė pavadėnėms",
        "exif-make": "Kameras gamėntuos",
        "exif-model": "Kameras muodelis",
+       "exif-artist": "Autuorios",
        "exif-colorspace": "Spalvū pristatīms",
        "exif-compressedbitsperpixel": "Abruozdielė sospaudėma rėžėms",
        "exif-datetimeoriginal": "Doumenū generavėma data ė čiesos",
        "exif-focallength": "Žėdinė nutuolėms",
        "exif-flashenergy": "Blėca energėjė",
        "exif-contrast": "Kuontrasts",
+       "exif-languagecode": "Kalba",
+       "exif-iimversion": "IIM versėjė",
+       "exif-iimcategory": "Kateguorėjė",
        "exif-orientation-1": "Standartėšks",
        "exif-xyresolution-i": "$1 puškē cuolī",
        "exif-xyresolution-c": "$1 puškē centėmetrė",
        "exif-componentsconfiguration-0": "nēsa",
        "exif-exposureprogram-0": "Nenūruodīta",
+       "exif-lightsource-4": "Blėcos",
+       "exif-lightsource-9": "Poikos uors",
+       "exif-lightsource-10": "Apniukė",
+       "exif-lightsource-11": "Šešielis",
+       "exif-lightsource-255": "Kėts švėisuos šaltėnis",
+       "exif-flash-fired-0": "Blėcos nesovēkė",
+       "exif-flash-fired-1": "Blėcos sovēkė",
+       "exif-scenecapturetype-0": "Paprasts",
+       "exif-scenecapturetype-1": "Kraštuovaizdis",
+       "exif-scenecapturetype-2": "Puortrets",
+       "exif-scenecapturetype-3": "Naktėnė puortegrapėjė",
+       "exif-gaincontrol-0": "Nie",
        "exif-contrast-0": "Paprasts",
        "exif-contrast-1": "Mažos",
        "exif-contrast-2": "Dėdlis",
        "deletedwhileediting": "Diemesė: Šėts poslapis ėštrints po šėta, kumet pradiejot redagoutė!",
        "recreate": "Atkortė",
        "confirm_purge_button": "Tink",
+       "confirm-watch-button": "Gerā",
+       "confirm-watch-top": "Pridietė šėta poslapi i keravuojamu sāraša?",
+       "confirm-unwatch-button": "Gerā",
        "imgmultipageprev": "← unkstesnis poslapis",
        "imgmultipagenext": "kėts poslapis →",
        "imgmultigo": "Ētė!",
        "imgmultigoto": "Ētė i poslapi $1",
+       "img-lang-default": "(kalba kāp nustatīta)",
        "ascending_abbrev": "dėdiejėma tvarka",
        "descending_abbrev": "mažiejontė tvarka",
        "table_pager_next": "Kėts poslapis",
        "autosumm-replace": "Poslapis keitams so '$1'",
        "autoredircomment": "Nukreipama i [[$1]]",
        "autosumm-new": "Naus poslapis: $1",
+       "autosumm-newblank": "Sokorts toščias poslapis",
        "lag-warn-normal": "Pakeitėmā, naujesnė kāp $1 {{PLURAL:$1|sekondė|sekondės|sekondiu}}, tamė sārašė gal būtė neruodomė.",
        "lag-warn-high": "Dielē dėdlė doumenū bazės pasėlikėma pakeitėmā, naujesnė nēgo $1 {{PLURAL:$1|sekondė|sekondės|sekondiu}}, tamė sarašė gal būtė neruodomė.",
        "watchlistedit-normal-title": "Keistė keravuojamu sāroša",
        "watchlisttools-raw": "Keistė nebėngta keravuojamu straipsniu sāraša",
        "version": "Versėjė",
        "version-license": "Licenzėjė",
+       "redirect-user": "Nauduotojė ID",
+       "redirect-page": "Poslapė ID",
+       "redirect-revision": "Poslapė versėjė",
+       "redirect-file": "Abruozdėlė vards",
        "fileduplicatesearch": "Ėiškuotė doblikoutu failu",
        "fileduplicatesearch-legend": "Ėiškuotė doblėkatu",
        "fileduplicatesearch-filename": "Faila vards:",
        "fileduplicatesearch-submit": "Ėiškuotė",
        "fileduplicatesearch-info": "$1 × $2 pėkseliu<br />Faila dėdoms: $3<br />MIME tėps: $4",
        "specialpages": "Specēlė̅jė poslapē",
+       "specialpages-note-top": "Pāiškėnėmā",
        "specialpages-note": "* Normalūs specēlė̅jė puslapē.\n* <strong class=\"mw-specialpagerestricted\">Apribuotė specēlė̅jė puslapē.</strong>",
        "specialpages-group-maintenance": "Sėstemas palaikīma pranešėmā",
        "specialpages-group-other": "Kėtė specēlė̅jė poslapē",
        "blankpage": "Toščias poslapis",
        "external_image_whitelist": " #Palikėt ta eilotė, tuokė kāp īr <pre>\n#Īrašīkat standartėniu ėšraišku fragmentus (tėktās dali terp //)\n#Anūs bus miegėnama sotapatintė so ėšuorėniu abruozdieliu adresās\n#Tė, katrėi sotaps, bus ruodomė kāp abruozdielē, a kėtė bus ruodomė tėktās kāp nūoruodas\n#Raidiu dėdoms nier svarbos\n#Eilotės, katuos prasided # īr kuomentarā \n\n#Īterpkat vėsus standartiėniu ėšraišku fragmentus prīš šėta eilote. Palikat šėta eilote, tuokė kāp ana īr </pre>",
        "tag-filter": "[[Special:Tags|Žīmiejėmu]] filtros:",
+       "tag-filter-submit": "Rietis",
        "tags-edit": "taisītė",
+       "comparepages": "Primestė poslapio",
+       "logentry-delete-delete": "$1 ėštrīnė poslapi $3",
+       "logentry-delete-restore": "$1 atkūrė poslapi $3",
+       "revdelete-content-hid": "torėnīs pakavuots",
        "logentry-move-move": "$1 pervadėna poslapi $3 i $4",
        "logentry-move-move-noredirect": "$1 pervadėna poslapi $3 i $4, nepalikdams nukreipėma",
        "logentry-move-move_redir": "$1 pervadėna poslapi $3 i $4, vėituo buvosė nukreipėma",
        "logentry-move-move_redir-noredirect": "$1 pervadėna poslapi $3 i $4, vėituo buvosė nukreipėma, bat nepadėrbdams naujė",
        "logentry-newusers-newusers": "$1 padėrba nauduotuojė paskīra",
+       "logentry-newusers-create": "$1 padėrba nauduotuojė paskīra",
        "logentry-newusers-create2": "$1 padėrba nauduotuojė paskīra $3",
        "logentry-newusers-autocreate": "Paskīra $1 bova padėrbta autuomatėškā",
+       "logentry-rights-rights": "$1 perkeitė $3 ėš $4 i $5",
        "rightsnone": "(juokiū)",
+       "revdelete-summary": "keitėma pāiškėnėms",
+       "feedback-close": "Padėrbt",
+       "searchsuggest-search": "Ėiškuotė",
        "searchsuggest-containing": "katrėi tor...",
-       "expandtemplates": "Ėšskeistė šabluonus"
+       "api-error-duplicate-popup-title": "{{PLURAL:$1|Faila|Failu}} doblėkats.",
+       "expandtemplates": "Ėšskeistė šabluonus",
+       "pagelang-name": "Poslapis",
+       "pagelang-language": "Kalba",
+       "pagelang-use-default": "Nauduotė kalba kāp nustatīta",
+       "pagelang-select-lang": "Rinktėis kalba",
+       "right-pagelang": "Mainītė poslapė kalba",
+       "mediastatistics-table-mimetype": "MIME tips",
+       "mediastatistics-header-unknown": "Nežėnuoms",
+       "json-error-syntax": "Sintaksės klaida"
 }
index 16af5ec..50073d8 100644 (file)
        "mytalk": "Moj razgovor / Мој разговор",
        "anontalk": "Razgovor za ovu IP adresu",
        "navigation": "Navigacija - Навигација",
-       "and": "i/и",
+       "and": "&#32;i",
        "qbfind": "Pronađite",
        "qbbrowse": "Pregledaj - Прегледај",
        "qbedit": "Uredi",
        "import-logentry-interwiki": "uveženo (\"transwikied\") $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}} sa $2",
        "javascripttest": "Javaskript test",
-       "javascripttest-title": "Izvršavanje testova za $1",
        "javascripttest-pagetext-noframework": "Ova stranica je rezervisana za izvršavanje javaskript testova.",
        "javascripttest-pagetext-unknownframework": "Nepoznati radni okvir „$1“.",
        "javascripttest-pagetext-frameworks": "Izaberite jedan od sledećih radnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojim skinom (interfejsom) želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "javascripttest-qunit-heading": "Medijavikijin paket za testiranje – QUnit",
        "tooltip-pt-userpage": "Vaša korisnička stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za ip koju Vi uređujete kao",
        "tooltip-pt-mytalk": "Vaša stranica za razgovor",
        "watchlisttools-edit": "Vidi i uredi listu praćenja",
        "watchlisttools-raw": "Uredi grubu listu praćenja",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
-       "unknown_extension_tag": "Nepoznata oznaka ekstenzije \"$1\"",
        "duplicate-defaultsort": "'''Upozorenje''': Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
        "version": "Verzija / Верзија",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
index 3248763..fb15742 100644 (file)
                        "아라",
                        "හරිත",
                        "Indunil Chamara",
-                       "Susith Chandira Gts"
+                       "Susith Chandira Gts",
+                       "Thanushka",
+                       "Thirsty"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
        "tog-hideminor": "මෑත වෙනස් කිරීම්වල සුළු සංස්කරණ සඟවන්න",
-       "tog-hidepatrolled": "මà·\91ත à·\80à·\99නà·\83à·\8a à¶\9aà·\92රà·\93මà·\8aà·\80ල à¶¸à·\94ර à·\83à¶\82චà·\8fරය à¶\9aරන ලද à·\83à¶\82à·\83à·\8aà¶\9aරණ à·\83à¶\9fවන්න",
-       "tog-newpageshidepatrolled": "විමසුමට ලක්කෙරුණු පිටු, අළුත් පිටු ලැයිස්තුවෙහි නොපෙන්වන්න",
+       "tog-hidepatrolled": "à·\80à·\92මà·\83à·\94මට à¶½à¶\9aà·\8aà¶\9aà·\99රà·\94ණà·\94 à·\83à¶\82à·\83à·\8aà¶\9aරණ, à¶¸à·\91ත à·\80à·\99නà·\83à·\8a à¶\9aà·\92රà·\93මà·\8a à¶­à·\94ල à¶±à·\9cපà·\99නà·\8aවන්න",
+       "tog-newpageshidepatrolled": "විමසුමට ලක්කෙරුණු පිටු, අළුත් පිටු ලැයිස්තුව තුල නොපෙන්වන්න",
        "tog-extendwatchlist": "මෑත වෙනස්වීම් පමණක් නොව, අදාළ සියළු වෙනස්වීම් දක්වා පෙන්වන අයුරින් මුර-ලැයිස්තුව පුළුල් කරන්න",
        "tog-usenewrc": "මෑත වෙනස්වීම් සහ මුර ලැයිස්තුව හී පිටුව අනුව සමූහ වෙනස්වීම් (ජාවාස්ක්‍රිප්ට් ඇවැසිය)",
        "tog-numberheadings": "ශීර්ෂ-නාම ස්වයංක්‍රීයව අංකනය කරන්න",
        "tog-shownumberswatching": "මුර කරනු ලබන පරිශීලකයන් සංඛ්‍යාව පෙන්වන්න",
        "tog-oldsig": "පවතින අත්සන:",
        "tog-fancysig": "අත්සන විකිපෙළ (ස්වයංක්‍රීය සබැඳියක් විරහිතව) ලෙසින් සලකන්න",
-       "tog-uselivepreview": "තත්කාල පෙර-දසුන භාවිතා කරන්න (ජාවාස්ක්‍රිප්ට්) (පරීක්ෂණාත්මක)",
+       "tog-uselivepreview": "තත්කාල පෙර-දසුන භාවිතා කරන්න",
        "tog-forceeditsummary": "හිස් සංස්කරණ සාරාංශයකට මා ඇතුළු වන විට මාහට ඉඟි කරන්න",
        "tog-watchlisthideown": "මුර-ලැයිස්තුවෙන් මාගේ සංස්කරණ සඟවන්න",
        "tog-watchlisthidebots": "මුර-ලැයිස්තුවෙන් රොබෝ සංස්කරණ සඟවන්න",
        "tog-watchlisthideminor": "මුර-ලැයිස්තුවෙන් සුළු සංස්කරණ සඟවන්න",
        "tog-watchlisthideliu": "ප්‍රවිෂ්ට වී ඇති පරිශීලකයන් විසින් සිදුකර ඇති සංස්කරණ මුර-ලැයිස්තුවෙන් සඟවන්න",
        "tog-watchlisthideanons": "නිර්නාමික පරිශීලකයන් විසින් සිදුකොට ඇති සංස්කරණ මුර-ලැයිස්තුවෙන් සඟවන්න",
-       "tog-watchlisthidepatrolled": "විමසුමට ලක්කෙරුණු සංස්කරණයන්, මෑත වෙනස්වීම් හී නොපෙන්වන්න",
+       "tog-watchlisthidepatrolled": "විමසුමට ලක්කෙරුණු සංස්කරණයන් මුර-ලැයිස්තුව තුල නොපෙන්වන්න",
        "tog-ccmeonemails": "මා විසින් අනෙකුත් පරිශීලකයන් හට යවන විද්‍යුත්-තැපෑලයන්හි පිටපත් මාහට එවන්න",
        "tog-diffonly": "“වෙනස් ”පදයන්ට පහළින්, පිටුවල අන්තර්ගතය   නොපෙන්වන්න",
        "tog-showhiddencats": "සැඟවුනු ප්‍රවර්ග පෙන්වන්න",
@@ -69,7 +71,7 @@
        "underline-always": "සැමවිටම කරන්න",
        "underline-never": "කිසිවිටෙක නොකරන්න",
        "underline-default": "සම හෝ ගවේෂකයෙහි පෙරනිමිය",
-       "editfont-style": "à\85à¶\9aà·\94රà·\94 à·\80à·\92ලà·\8fà·\83යනà·\8a à·\83à¶\82à·\83à·\8aà¶\9aරණ à¶´à·\99දà·\99à·\83:",
+       "editfont-style": "à·\83à¶\82à·\83à·\8aà¶\9aරණ à¶´à·\99දà·\99à·\83 à¶­à·\94ල à¶\85à¶\9aà·\94රà·\94 à·\80à·\92ලà·\8fà·\83ය:",
        "editfont-default": "පෙර නිමි බ්‍රව්සරය",
        "editfont-monospace": "ඒක අවකාශිත ෆොන්ට්",
        "editfont-sansserif": "සෙරිෆ්-විරහිත අකුරු",
        "pool-timeout": "අගුල සඳහා බලාපොරොත්තුවෙන් සිටීම කල් ඉකුත්වනලදී",
        "pool-queuefull": "පොරොත්තු ලේඛනය පිරී ඇත",
        "pool-errorunknown": "හඳුනා නොගත් දෝෂය",
+       "poolcounter-usage-error": "පරිශීලන දෝෂය: $1",
        "aboutsite": "{{SITENAME}} පිළිබඳ",
        "aboutpage": "Project:පිළිබඳ",
        "copyright": " අන්ලෙසකින් සඳහන්කර නැති සෑම විටෙකම අන්තර්ගතය $1 යටතේ ඇත.",
        "filerenameerror": "\"$1\" ගොනුව \"$2\" බවට යළි-නම්-කිරීම සිදු කල නොහැකි විය.",
        "filedeleteerror": "\"$1\" ගොනුව මකා-දැමිය නොහැකි විය.",
        "directorycreateerror": "\"$1\" නාමාවලිය තැනීම කල නොහැකි විය.",
+       "directoryreadonlyerror": "\"$1\" ගොණුව කියවීමට පමණයි.",
+       "directorynotreadableerror": "\"$1\" ගොණුව කියවීමට නොහැක.",
        "filenotfound": "\"$1\" ගොනුව සොයා ගත නොහැකි විය.",
        "unexpected": "අනපේක්‍ෂිත අගය: \"$1\"=\"$2\".",
        "formerror": "දෝෂය: ආකෘති-පත්‍රය ඉදිරිපත් කල නොහැකි විය",
        "viewsourcetext": "මෙම පිටුවෙහි මූලාශ්‍රය නැරඹීමට හා පිටපත් කිරීමට ඔබ හට හැකිය:",
        "viewyourtext": "'''ඔබගේ සංස්කරණ''' නැරඹීම සහ මූලාශ්‍රය පිටපත් කිරීම ඔබට කල හැක:",
        "protectedinterface": "මෙම පිටුව විසින්, මෘදුකාංගය සඳහා අතුරුමුව පෙළ සපයන අතර එබැවින් අපයෙදුම වැලැක්වීම සඳහා එය අවුරා ඇත.",
-       "editinginterface": "'''අවවාදයයි:''' මෘදුකාංගයට අතුරුමුව පෙළ සැපයීමට භාවිතා වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.\nමෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිශීලකයන්ගේ පරිශීලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.\nපරිවර්තන සඳහා, මීඩියාවිකි ප්‍රාදේශීයකරන ව්‍යාපෘතිය, [//translatewiki.net/wiki/Main_Page?setlang=si translatewiki.net], භාවිතා කිරීම සලකා බැලීමට කාරුණික වන්න.",
+       "editinginterface": "<strong>අවවාදයයි:</strong> මෘදුකාංගයට අතුරුමුව පෙළ සැපයීමට භාවිතා වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.\nමෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිශීලකයන්ගේ පරිශීලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.",
        "cascadeprotected": "\"තීරු දර්ශන\" විකල්පය සක්‍රීයනය කොට එමගින් ආරක්‍ෂණය කල පහත දැක්වෙන {{PLURAL:$1|පිටුව|පිටු}} අඩංගු කර ඇති බැවින්, මෙම පිටුව සංස්කරණය කිරීමෙන් වලකා ඇත:\n$2",
        "namespaceprotected": "'''$1''' නාමඅවකාශයෙහි පිටු සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
        "customcssprotected": "මෙම CSS පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමැත්තේ එහි අනෙකුත් පරිශීලකයෙකුගේ පුද්ගලික පරිස්ථිතීන් අඩංගු බැවිනි.",
        "titleprotected": "මෙම ශීර්ෂ-නාමය තැනීම  [[User:$1|$1]] විසින් වාරණය කොට ඇත.\nමේ සඳහා  ''$2''  හේතුව දක්වා ඇත.",
        "filereadonlyerror": "\"$2\"දත්ත ගොනුවේ කියවීමට පමණක් ඇති ආකාරයට ඇති නිසා \"$1\" ගොනුව සංස්කරණය කල නොහැක.\n\nමෙය අගුලු දැමූ පරිගණක පරිපාලක \"$3\" හේතුව ඉදිරිපත්කර ඇත.",
        "exception-nologin": "ප්‍රවිෂ්ට වී නොමැත",
+       "exception-nologin-text": "මෙම පිටුවට ප්‍රවේශ වීමට හෝ ඉල්ලුම් කරන ලද ක්‍රියාව සිදුකිරීම සඳහා කරුණාකර ඔබගේ ගිණුමට ප්‍රවේශ වන්න.",
        "virus-badscanner": "අයෝග්‍ය වික්‍යාසයකි: අඥාත වයිරස සුපිරික්සකයකි: ''$1''",
        "virus-scanfailed": "පරිලෝකනය අසාර්ථක විය (කේතය $1)",
        "virus-unknownscanner": "නොහඳුනන ප්‍රතිවයිරසයක්:",
        "gotaccountlink": "පිවිසෙන්න",
        "userlogin-resetlink": "ඔබේ පිවිසුම් තොරතුරු අමතකද?",
        "userlogin-resetpassword-link": "ඔබේ මුරපදය නැති වුනාද?",
+       "userlogin-helplink2": "ගිණුම වෙත ප්‍රවේශ වීම සඳහා උදවු",
        "userlogin-loggedin": "ඔබ දැනටමත් {{GENDER:$1|}} ලෙස පිවිසී ඇත.\nනව පරිශීලකයෙකු ලෙස ඇතුළු වීමට පහත ආකෘතිය පුරවන්න.",
        "userlogin-createanother": "තවත් ගිණුමක් ආරම්භ කරන්න",
        "createacct-emailrequired": "වි-තැපෑල ලිපිනය",
        "createaccount-text": "කිසියම් අයෙකු, \"$2\" නමින් හා, \"$3\" යන මුර-පදය යොදමින්,  ඔබගේ විද්‍යුත්-තැපැල් ලිපිනය සඳහා {{SITENAME}} ($4) හි ගිණුමක් තනා ඇත.\nඔබ දැන් ගිණුම‍ට පිවිස, ඔබගේ මුර-පදය වෙනස් කල යුතුව ඇත.\n\nමෙම ගිණුම තැනී ඇත්තේ වැරදීමකින් නම්, මෙම පණිවුඩය නොසලකා හැරිය හැක.",
        "login-throttled": "ඔබ විසින් මෑතදී  පමණට වඩා වාර ගණනක් පිවිසීමෙහි උත්සාහයන් දරා ඇත.\nයළි උත්සාහ කිරීමට පෙර $1 වේලාවක් රැඳී සිටින්න.",
        "login-abort-generic": "ඔබගේ පිවිසීම අසාර්ථකයි - අතහැර දමනලදී",
+       "login-migrated-generic": "ඔබගේ ගිණුමේ ස්වරුපය වෙනස්කර ඇත. ඔබගේ පරිශීලක නාමය මෙම විකිය තුල තවදුරටත් භාවිත කල නොහැක.",
        "loginlanguagelabel": "භාෂාව: $1",
        "suspicious-userlogout": "නිෂ්ක්‍රමණය සඳහා ඔබගේ අයැදුම නිෂ්ප්‍රභා කෙරුනේ එය යොමු කොට ඇත්තේ භින්න(කැඩුනු) බ්‍රවුසරයකින් හෝ නිවේෂණය කෙරෙමින් පවතින ප්‍රොක්සියක් වෙතින් යැයි බැලූ බැල්මට පෙනෙන බැවිනි.",
        "createacct-another-realname-tip": "සැබෑ නාමය හෙළි කිරීම වෛකල්පිකයි.\nඔබ විසින් එය හෙළි කල හොත්, ඔබගේ කෘතීන් සඳහා ඔබහට කතෘ-බුහුමන් පිරිනැමීමට එය භාවිතා කරනු ඇත.",
        "resettokens": "සංකේත නැවත සකසන්න",
        "resettokens-legend": "සංකේත නැවත සකසන්න",
        "resettokens-tokens": "සංකේත:",
+       "resettokens-token-label": "$1 (පවතින අගය: $2)",
        "bold_sample": "තදකුරු පෙළ",
        "bold_tip": "තදකුරු පෙළ",
        "italic_sample": "ඇලකුරු පෙළ",
        "preview": "පෙරදසුන",
        "showpreview": "පෙරදසුන පෙන්වන්න",
        "showdiff": "වෙනස්කිරීම් පෙන්වන්න",
-       "anoneditwarning": "'''අවවාදයයි:''' ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට ප්‍රවිෂ්ට වී නොමැත.\nඔබගේ අයිපී යොමුව මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි වාර්තාගත වෙනු ඇත",
+       "anoneditwarning": "<strong>අවවාදයයි:</strong> ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට ප්‍රවිෂ්ට වී නොමැත.\nඔබගේ අයිපී යොමුව මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි වාර්තාගත වෙනු ඇත\nඔබ <strong>[$1 පිවිසීම]</strong> හෝ <strong>[$2 ගිණුමක් තැනීම]</strong> කලහොත්, ඔබගේ සංස්කරණයන් වෙනත් ප්‍රතිලාභ සමග, ඔබගේ පරිශීලක නාමය ඉදිරියේ දැක්වෙනු ඇත.",
        "anonpreviewwarning": "අවවාදයයි: ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට ප්‍රවිෂ්ට වී නොමැත. එමනිසා මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි, ඔබගේ අන්තර්ජාල ලිපිනය සටහන් කරගැනීමට සිදුවනු ඇත.",
        "missingsummary": "'''සිහිගැන්වීමයි:''' ඔබ විසින් සංස්කරණ සාරාංශයක් සපයා නොමැත.\nඔබ නැවතත් සුරැකීම ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවැන්නක් විරහිතවම සුරැකෙනු ඇත.",
        "missingcommenttext": "කරුණාකර පහතින් පරිකථනයක් ඇතුළු කරන්න.",
        "edit-gone-missing": "පිටුව යාවත්කාල කිරීම සිදුකල නොහැකි විය.\nඑය මකා දමා ඇති බවක් පෙනේ.",
        "edit-conflict": "සංස්කරණ ගැටුම.",
        "edit-no-change": "පෙළට කිසිදු වෙනසක් සිදු නොකල  බැවින් ඔබගේ සංස්කරණය නොසලකාහරින ලදි.",
+       "postedit-confirmation-created": "මෙම පිටුව නිර්මාණය කරන ලදී.",
+       "postedit-confirmation-restored": "මෙම පිටුව නැවත පිහිටුවන ලදී.",
        "postedit-confirmation-saved": "ඔබගේ සංස්කරණය සුරකින ලදී.",
        "edit-already-exists": "නව පිටුවක් තැනිය නොහැකි විය.\nඑය දැනටමත් පවතියි.",
        "defaultmessagetext": "සාමාන්‍ය පණිවුඩ පෙළ",
        "history-feed-empty": "අයැදුනු පිටුව නොපවතියි.\nඑය විකියෙන් මකා දමා හෝ නම-වෙනස් කොට ඇතිවා විය හැකිය.\nඅදාල නව පිටු සඳහා  [[Special:Search|විකිය තුල ගවේෂණය]] අත්හදා බලන්න.",
        "rev-deleted-comment": "(සංස්කරණ සාරාංශය ඉවත් කරන ලදි)",
        "rev-deleted-user": "(පරිශීලක-නාමය ඉවත් කරන ලදි)",
-       "rev-deleted-event": "(ලà¶\9dà·\94-à·\83ටà·\84නà·\8a à¶­à·\90බà·\93මà·\9a  à¶\9aà·\8aâ\80\8dරà·\92යà·\8fà·\80 à¶\85තà·\8aà·\84à·\92ටà·\94à·\80න à¶½à¶¯à·\92)",
+       "rev-deleted-event": "(ලà¶\9dà·\94-à·\83ටà·\84නà·\8a à¶\89à·\80තà·\8a à¶\9aරන à¶½à¶¯à·\93)",
        "rev-deleted-user-contribs": "[පරිශීපක නාමය හෝ ලිපිනය ඉවත් කළා - දායකත්ව මඟින් සඟවන ලද සංස්කරණය]",
        "rev-deleted-text-permission": "මෙම පිටු සංශෝධනය '''මකා දමා ඇත'''.\nවැඩි විස්තර බොහෝ විට [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} මකාදැමීම් ලඝු-සටහන] වෙත තිබීමට ඉඩ ඇත.",
        "rev-deleted-text-unhide": "මෙම පිටුව සංශෝධනය කිරීම '''මකා දමා ඇත'''.\nමේ පිලිබඳ විස්තර බොහෝවිට [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} මකා දැමීම් ලඝු-සටහනෙහි] තිබීමට ඉඩ ඇත.\nඔබට ඇවැසි නම් [$1 මෙම වෙනස නැරඹීම] තවමත් සිදුකල හැක.",
        "powersearch-togglelabel": "පිරික්සන්න:",
        "powersearch-toggleall": "සියල්ල",
        "powersearch-togglenone": "කිසිවක් නොමැත",
+       "powersearch-remember": "අනාගත සෙවිම් තුලදි මෙම තෝරාගැනීම් මතක තබාගන්න",
        "search-external": "බාහිර ගවේෂණය",
        "searchdisabled": "{{SITENAME}} ගවේෂණය අක්‍රීය කොට ඇත.\nමේ අතරතුර ඔබ හට ගූගල් ඔස්සේ ගවේෂණය කල හැක.\n{{SITENAME}} අන්තර්ගතය පිළිබඳ ඔවුන්ගේ සූචි යල් පැන ගොස් ඇතිවා විය හැකි බව සටහන් කර ගන්න.",
+       "search-error": "සෙවීම් සිදුකිරීමේදී වැරද්දක් මතුවී ඇත: $1",
        "preferences": "අභිරුචි",
        "mypreferences": "අභිරුචීන්",
        "prefs-edits": "සංස්කරණයන් සංඛ්‍යාව:",
        "right-editusercssjs": "අනෙකුත් පරිශීලකයන්ගේ  CSS හා JS ගොනු සංස්කරණය කරන්න",
        "right-editusercss": "අනෙකුත් පරිශීලකයන්ගේ  CSS ගොනු සංස්කරණය කරන්න",
        "right-edituserjs": "අනෙකුත් පරිශීලකයන්ගේ  JS ගොනු සංස්කරණය කරන්න",
+       "right-viewmywatchlist": "ඔබගේ මුර-ලැයිස්තුව පෙන්වන්න",
+       "right-viewmyprivateinfo": "ඔබගේ පෞද්ගලික දත්ත පෙන්වන්න (උදා. විද්‍යුත් තැපැල් ලිපිනය, නිවැරදි නම)",
+       "right-editmyprivateinfo": "ඔබගේ පෞද්ගලික දත්ත සංස්කරණය කරන්න (උදා. විද්‍යුත් තැපැල් ලිපිනය, නිවැරදි නම)",
+       "right-editmyoptions": "ඔබගේ අභිරුචියන් සංස්කරණය කරන්න",
        "right-rollback": "සුවිශේෂ පිටුවක් අවසන් වරට සංස්කරණය කල පරිශීලකයෙකුගේ සංස්කරණයන් විගසින් පුනරාවර්තනය කරන්න",
        "right-markbotedits": "පුනරාවර්තනය-කෙරුනු සංස්කරණයන් රොබෝ සංස්කරණයන් ලෙස සලකුණු කරන්න",
        "right-noratelimit": "‍සීඝ්‍රතා සීමාවන්ගෙක් බලපෑම් ඇතිනොවන්න",
        "action-createpage": "පිටු තනන්න",
        "action-createtalk": "සංවාද පිටු තනන්න",
        "action-createaccount": "මෙම පරිශීලක ගිණුම තනන්න",
+       "action-history": "මෙම පිටුවේ අතීතය පෙන්වන්න",
        "action-minoredit": "මෙම සංස්කරණය සුළු ලෙස සලකුණු කරන්න",
        "action-move": "මෙම පිටුව ගෙනයන්න",
        "action-move-subpages": "මෙම පිටුව හා එහි උප පිටු ගෙන යන්න",
        "action-userrights-interwiki": "අනෙකුත් විකියන්ගේ පරිශීලකයන්ගේ පරිශීලක හිමිකම් සංස්කරණය කරන්න",
        "action-siteadmin": "දත්ත-සංචිතය අවහිරකරන්න හෝ අවහිරය ඉවත් කරන්න",
        "action-sendemail": "ඊ-තැපැල් පණිවුඩ යවන්න",
+       "action-editmywatchlist": "ඔබගේ මුර-ලැයිස්තුව සංස්කරණය කරන්න",
+       "action-viewmywatchlist": "ඔබගේ මුර-ලැයිස්තුව පෙන්වන්න",
+       "action-viewmyprivateinfo": "ඔබගේ පෞද්ගලික තොරතුරු පෙන්වන්න",
+       "action-editmyprivateinfo": "ඔබගේ පෞද්ගලික තොරතුරු සංස්කරණය කරන්න",
        "nchanges": "$1 {{PLURAL:$1|වෙනස්වීම|වෙනස්වීම්}}",
        "enhancedrc-history": "ඉතිහාසය",
        "recentchanges": "මෑත වෙනස්කිරීම්",
        "uploaderror": "උඩුගත කිරීම් දෝෂයක්",
        "upload-recreate-warning": "'''අවවාදයයි: මෙම නම තිබූ ගොනුවක් මකාදැමීමට හෝ ගෙනයෑමට හෝ ලක්ව ඇත.'''\n\nඔබගේ පහසුව තකා මෙම පිටුවවෙහි මකාදැමුමෙහි හා ගෙනයෑමෙහි ලඝු සටහන මෙහි දැක්වේ:",
        "uploadtext": "ගොනු උඩුගත කිරීම සඳහා පහත ආකෘති පත්‍රය භාවිතා කරන්න.\nපෙරදී උඩුගතකෙරුණු ගොනු නැරඹුම හෝ ගවේෂණය සඳහා  [[Special:FileList|උඩුගතකෙරුණු ගොනු ලැයිස්තුව]] වෙත යන්න, (යළි)උඩුගතකෙරුම්ද  [[Special:Log/upload|උඩුගතකෙරුම් ලඝු-සටහන]] තුල සටහන් කර ඇති අතර, මකාදැමුම්  [[Special:Log/delete|මකාදැමුම් ලඝු-සටහන]] හි ඇත.\n\nගොනුවක් පිටුවක බහාලීම සඳහා, පහත ආකාරයේ සබැඳියක් භාවිතා කරන්න:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ගොනුවෙහි පරිපූර්ණ අනුවාදය භාවිතා කිරීමට\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 'විකල්ප පෙළ' යන්න විස්තරය ලෙසින් තැබෙමින් වම් මායිමෙහි කොටුවක පික්සල 200 පළල ප්‍රවාචිතයක් භාවිතා කිරීමට\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ගොනුව ප්‍රදර්ශනය නොකෙරෙමින්  ගොනුවට සෘජු ලෙස සබැඳීමට",
-       "upload-permitted": "අවසරලත් ගොනු වර්ගයන්: $1.",
-       "upload-preferred": "අභිරුචි ගොනු වර්ගයන්: $1.",
-       "upload-prohibited": "තහනම් ගොනු වර්ගයන්: $1.",
+       "upload-permitted": "අවසරලත් ගොනුව {{PLURAL:$2|type|types}}: $1.",
+       "upload-preferred": "අභිරුචි ගොනුව {{PLURAL:$2|type|types}}: $1",
+       "upload-prohibited": "තහනම් ගොනුව {{PLURAL:$2|type|types}}: $1.",
        "uploadlogpage": "උඩුගත කිරීම් සටහන",
        "uploadlogpagetext": "ඉතා මෑතදී සිදුකල ගොනු උඩුගතකිරීම් ලැයිස්තුවක් පහත දැක්වේ.\nවැඩිමනත් දෘශ්‍ය සමාලෝචනය සඳහා [[Special:NewFiles|නව ගොනු ගැලරිය]] බලන්න.",
        "filename": "ගොනු නාමය",
        "delete-warning-toobig": "මෙම පිටුවට, {{PLURAL:$1|එක් සංශෝධනයකට|සංශෝධන $1 කට}} වඩා වැඩි විශාල සංස්කරණ ඉතිහාසයක් ඇත.\nමෙය මකාදැමීම  {{SITENAME}} හි දත්ත-ගබඩා ක්‍රියාකාරකම් වලට අවහිරතා පැන නැංවීමට හේතු විය හැක;\nපරිස්සමින් ඉදිරි කටයුතු කරන්න.",
        "deleting-backlinks-warning": "'''ප්‍රවේශමෙන්:''' ඔබ සූදානම් වන්නේ ඔබ පරිශීලනය කරන පිටුවට සම්බන්ධ වූ අනෙක් පිටු මකා දැමීමටයි.",
        "rollback": "සංස්කරණයන් පුනරාවර්තනය කරන්න",
-       "rollback_short": "පුනරාවර්තනය",
        "rollbacklink": "ප්‍රතිවර්තනය",
        "rollbackfailed": "පුනරාවර්තනය අසාර්ථකයි",
        "cantrollback": "සංස්කරණය ප්‍රතිවර්තනය කල නොහැක;\nඅවසන් දායකයා මෙම පිටුවේ එකම කතෘවරයාද වෙයි.",
        "import-logentry-interwiki": "$1 අන්තර්විකීකරණය කරන ලදි",
        "import-logentry-interwiki-detail": "$2 වෙතින් {{PLURAL:$1|එක් සංශෝධනයක්|සංශෝධන $1 ක්}}",
        "javascripttest": "ජාවාස්ක්‍රිප්ට් පරික්ෂාකරමින්",
-       "javascripttest-title": "$1 පරික්ෂණ සිදුකරමින්",
        "javascripttest-pagetext-noframework": "මෙම පිටුව ජාවාස්ක්‍රිප්ට් පරික්ෂණ සිදුකිරීම සඳහා වෙන්කර ඇත.",
        "tooltip-pt-userpage": "ඔබගේ පරිශීලක පිටුව",
        "tooltip-pt-anonuserpage": "සංස්කරණයට ඔබ භාවිතා කරමින් පවතින අන්තර්ජාල ලිපිනය සඳහා පරිශීලක පිටුව",
        "hebrew-calendar-m12-gen": "එලුල්",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|සාකච්ඡාව]])",
        "timezone-utc": "යූටීසී",
-       "unknown_extension_tag": "අඥාත ප්‍රසර්ජන ටැගය \"$1\"",
        "duplicate-defaultsort": "'''අවවාදයයි:''' \"$2\" පෙරනිමි සුබෙදුම් යතුර විසින් ‍පූර්ව පෙරනිමි සුබෙදුම් යතුර වූ \"$1\" අතික්‍රමණය කරයි.",
        "version": "අනුවාදය",
        "version-extensions": "ස්ථාපිත ප්‍රසර්ජනයන්",
        "version-entrypoints": "නිවේශන ලක්ෂ්‍ය URL",
        "version-entrypoints-header-entrypoint": "නිවේශන ලක්ෂ්‍යය",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "ස්ථාපිත පුස්තකාල",
+       "version-libraries-library": "පුස්තකාලය",
+       "version-libraries-version": "අනුවාදය",
+       "redirect-file": "ගොනුනාමය",
        "fileduplicatesearch": "අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න",
        "fileduplicatesearch-summary": "එහි පූරක අගය පාදක කර ගෙන අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න.",
        "fileduplicatesearch-legend": "අනුපිටපතක් සඳහා ගවේෂණය කරන්න",
        "specialpages-group-wiki": "දත්ත හා මෙවලම්",
        "specialpages-group-redirects": "විශේෂ පිටු යළි-යොමුකිරීම",
        "specialpages-group-spam": "ස්පෑම් මෙවලම්",
+       "specialpages-group-developer": "සංවර්ධක මෙවලම්",
        "blankpage": "හිස් පිටුව",
        "intentionallyblankpage": "මෙම පිටුව සිතාමතාම හිස්ව තබා ඇත.",
        "external_image_whitelist": "#මෙම පේළිය මෙම අයුරින්ම තිබීමට ඉඩ හරින්න <pre>\n#ක්‍රමවත් ප්‍රකාශ ඛණ්ඩයන් (// අතරතුර පවතින කොටස පමණක්) පහත තබන්න\n#බාහිර (සෘජු-බැඳි) රූපයන්හි අන්තර්ජාල ලිපිනයන් හා සමගින් මේවා ගලපනු ඇත\n#ගැලපෙන ඒවා රූප වශයෙන් ප්‍රදර්ශනය කෙරෙනු ඇත, නැත‍ෙහාත් රූපයට සබැඳියක් පමණක් පෙන්වනු ඇත\n# # වෙතින් ඇරඹෙන පේළි පරිකථන ලෙසන් සැලකේ\n#‍මෙය අකුරු-ප්‍රමාණ-පිළිබඳ-සංවේදී නොවේ\n\n# regex කොටස් සියල්ල මෙම පේළියට ඉහලින් බහාලන්න. මෙම පේළිය මෙම අයුරින්ම තිබීමට ඉඩ හරින්න </pre>",
        "compare-revision-not-exists": "ඔබ විසින් විශේෂණය කෙරූ සංශෝධනය නොපවතියි.",
        "dberr-problems": "සමාවන්න! මෙම අඩවිය තාක්ෂණික ගැටළු අත්දකියි.",
        "dberr-again": "විනාඩි කිහිපයක් කල්ගතකර යළි-බාගැනුම උත්සාහ කරන්න.",
-       "dberr-info": "(දත්තගබඩා සේවාදායකය හා සම්බන්ධ වීම‍ට නොහැක: $1)",
+       "dberr-info": "(දත්තගබඩාවට ඇතුළු වීම‍ට නොහැකිය: $1)",
+       "dberr-info-hidden": "(දත්තගබඩාවට ඇතුළු වීම‍ට නොහැකිය)",
        "dberr-usegoogle": "මේ අතරතුර ගූගල් ඔස්සේ ගවේෂණය කිරීමට ඔබ විසින් යත්න දැරිය හැක.",
        "dberr-outofdate": "අපගේ අන්තර්ගතයෙහි සූචියන් යල් පැන ගොස් තිබිය හැකි බව සටහන් කර ගන්න.",
        "dberr-cachederror": "මෙය ඉල්ලා ඇති පිටුවෙහි පූර්වාපේක්ෂිත සංචිත පිටුවක් වන අතර එය යාවත්කාලින නොවිය හැකි බව සලකන්න.",
index 967b679..13e3d1b 100644 (file)
        "watchlisttools-raw": "Upraviť nespracovaný zoznam sledovaných stránok",
        "iranian-calendar-m1": "Farvardín",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusia]])",
-       "unknown_extension_tag": "Neznáma značka rozšírenia „$1“",
        "duplicate-defaultsort": "Upozornenie: Štandardný kláves na zoraďovanie „$2“ nahrádza starý kláves „$1“.",
        "version": "Verzia",
        "version-extensions": "Nainštalované rozšírenia",
        "specialpages-group-wiki": "Údaje a nástroje",
        "specialpages-group-redirects": "Špeciálne stránky, ktoré sú presmerovania",
        "specialpages-group-spam": "Nástroje proti spamu",
+       "specialpages-group-developer": "Nástroje vývojárov",
        "blankpage": "Prázdna stránka",
        "intentionallyblankpage": "Táto stránka je zámerne prázdna. Používa sa na meranie výkonnosti atď.",
        "external_image_whitelist": "  #Nechajte tento riadok presne tak, ako je<pre>\n#Časti regulárnych výrazov (tie, ktoré sa píšu medzi //) napíšte dolu\n#Budú porovnané s URL externých obrázkov\n#Tie, ktoré budú zodpovedať reg. výrazu sa zobrazia ako obrázky, inak sa zobrazí iba odkaz na obrázok\n#Riadky, ktoré začínajú znakom # sa považujú za komentáre\n#Na veľkosti písmen nezáleží\n\n#Napíšte všetky časti reg. výrazov nad tento riadok. Nechajte tento riadok presne tak, ako je</pre>",
index a965ded..754767d 100644 (file)
        "pool-queuefull": "Čakalna vrsta zaloge je polna",
        "pool-errorunknown": "Neznana napaka",
        "pool-servererror": "Storitev založnega pulta ni na voljo ($1).",
+       "poolcounter-usage-error": "Napaka pri uporabi: $1",
        "aboutsite": "O {{GRAMMAR:dajalnik|{{SITENAME}}}}",
        "aboutpage": "Project:O {{GRAMMAR:dajalnik|{{SITENAME}}}}",
        "copyright": "Razen, kjer je navedeno drugače, je besedilo na razpolago pod pogoji licence $1.",
        "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršno koli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
-       "selfredirect": "<strong>Opozorilo:</strong> Ustvarjate preusmeritev na isti članek.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev ustvarili.",
+       "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": "'''Opozorilo:''' Niste vnesli zadeve/naslova za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez le-tega.",
        "summary-preview": "Predogled povzetka",
        "content-model-text": "golo besedilo",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prazen objekt",
+       "content-json-empty-array": "Prazno polje",
        "duplicate-args-category": "Strani s podvojenimi argumenti v klicih predlog",
        "duplicate-args-category-desc": "Stran vsebuje klice predlog, ki vsebujejo dvojnike argumentov, kot sta <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ali <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Opozorilo:''' Ta stran vsebuje preveč klicev funkcije razčlenjevalnika kode.\n\nStran naj bi vsebovala manj kot $2 {{PLURAL:$2|klic|klica|klice|klicev}}, trenutno {{PLURAL:$1|je v uporabi $1 klic|sta v uporabi $1 klica|so v uporabi $1 klici|je v uporabi $1 klicev}}.",
        "history-feed-empty": "Zahtevana stran ne obstaja.\nMorda je bila izbrisana iz wikija ali pa jo je kdo preimenoval.\nProsimo, poskusite [[Special:Search|poiskati v wikiju]] ustrezajoče nove strani.",
        "rev-deleted-comment": "(povzetek urejanja je odstranjen)",
        "rev-deleted-user": "(uporabniško ime je bilo odstranjeno)",
-       "rev-deleted-event": "(dnevniški vnos je odstranjen)",
+       "rev-deleted-event": "(podrobnosti dnevnika so odstranjene)",
        "rev-deleted-user-contribs": "[uporabniško ime ali IP naslov odstranjeni - urajenje skrito v prispevkih]",
        "rev-deleted-text-permission": "Prikazana redakcija je bila '''izbrisana'''.\nPodrobnosti so na razpolago v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "rev-suppressed-text-permission": "Ta redakcija strani je bila <strong>zatrta</strong>.\nPodrobnosti so navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].",
        "revdelete-legend": "Nastavi omejitve vidnosti",
        "revdelete-hide-text": "Besedilo redakcije",
        "revdelete-hide-image": "Skrij vsebino datoteke.",
-       "revdelete-hide-name": "Skrij dejanje in cilj",
+       "revdelete-hide-name": "Skrij cilj in parametre",
        "revdelete-hide-comment": "Povzetek urejanja",
        "revdelete-hide-user": "Uporabniško ime/IP-naslov urejevalca",
        "revdelete-hide-restricted": "Zadrži podatke od administratorjev kakor tudi od ostalih",
        "uploaderror": "Napaka",
        "upload-recreate-warning": "'''Opozorilo: Datoteka s tem imenom je bila izbrisana ali prestavljena.'''\n\nDnevnik brisanja in prestavitev za to stran sta navedena tukaj:",
        "uploadtext": "Spodnji obrazec lahko uporabite za nalaganje datotek.\nZa ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]]; ponovna nalaganja so zabeležena tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].\n\nDatoteko lahko na želeno stran vključite na naslednje načine:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' (polna velikost)\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></code>''' (slika pomanjšana na 200 slikovnih pik širine, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' (neposredna povezava z datoteko)",
-       "upload-permitted": "Dovoljene vrste datotek: $1.",
-       "upload-preferred": "Priporočene vrste datotek: $1.",
-       "upload-prohibited": "Prepovedane vrste datotek: $1.",
+       "upload-permitted": "{{PLURAL:$2|Dovoljena vrsta|Dovoljeni vrsti|Dovoljene vrste}} datotek: $1.",
+       "upload-preferred": "{{PLURAL:$2|Priporočena vrsta|Priporočeni vrsti|Priporočene vrste}} datotek: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Prepovedana vrsta|Prepovedani vrsti|Prepovedane vrste}} datotek: $1.",
        "uploadlogpage": "Dnevnik nalaganja datotek",
        "uploadlogpagetext": "Prikazan je seznam nedavno naloženih datotek.\nZa grafični pogled obiščite [[Special:NewFiles|galerijo novih datotek]].",
        "filename": "Ime datoteke",
        "deleteprotected": "Strani ne morete izbrisati, ker jo je nekdo zaščitil.",
        "deleting-backlinks-warning": "'''Opozorilo:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge strani]] se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
        "rollback": "Vrni spremembe",
-       "rollback_short": "Vrni",
        "rollbacklink": "vrni",
        "rollbacklinkcount": "vrni $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "rollbacklinkcount-morethan": "vrni več kot $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "namespace": "Imenski prostor:",
        "invert": "obrni izbor",
        "tooltip-invert": "Označite to polje, da skrijete spremembe v izbranem imenskem prostoru (in povezanih imenskih prostorih, če je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite to polje, da skrijete povezave s strani iz izbranega imenskega prostora.",
        "namespace_association": "povezan imenski prostor",
        "tooltip-namespace_association": "Označite to polje, da vključite tudi pogovor ali predmetni imenski prostor, povezan z izbranim imenskim prostorom",
        "blanknamespace": "(Osnovno)",
        "thumbnail-temp-create": "Ne morem ustvariti začasne datoteke sličice",
        "thumbnail-dest-create": "Ne morem shraniti sličice na ciljno mesto",
        "thumbnail_invalid_params": "Neveljavni parametri za sličico",
+       "thumbnail_toobigimagearea": "Datoteke z dimenzijami, večjimi od $1",
        "thumbnail_dest_directory": "Ne morem ustvariti ciljnega direktorija",
        "thumbnail_image-type": "Vrsta slike ni podprta",
        "thumbnail_gd-library": "Nepopolna konfiguracija knjižice GD: manjka funkcija $1",
        "import-logentry-interwiki": "prenesel $1 med wikiji",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvožena $1 redakcija|Uvoženi $1 redakciji|Uvožene $1 redakcije|Uvoženih $1 redakcij}} z $2",
        "javascripttest": "Preizkušanje JavaScripta",
-       "javascripttest-title": "Poganjanje $1 preizkusov",
        "javascripttest-pagetext-noframework": "Stran je rezervirana za poganjanje preizkusov JavaScript.",
        "javascripttest-pagetext-unknownframework": "Neznano ogrodje za preizkušanje »$1«.",
+       "javascripttest-pagetext-unknownaction": "Neznano dejanje »$1«.",
        "javascripttest-pagetext-frameworks": "Prosimo, izberite enega od naslednjih ogrodjev za preizkušanje: $1",
        "javascripttest-pagetext-skins": "Izberite kožo, v kateri želite pognati preizkuse:",
        "javascripttest-qunit-intro": "Oglejte si [$1 dokumentacijo o preizkušanju] na mediawiki.org.",
-       "javascripttest-qunit-heading": "Preizkuševalni paket MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Vaša uporabniška stran",
        "tooltip-pt-anonuserpage": "Uporabniška stran IP-naslova, ki ga uporabljate",
        "tooltip-pt-mytalk": "Vaša pogovorna stran",
        "watchlisttools-edit": "Prikaz in urejanje spiska nadzorov",
        "watchlisttools-raw": "Uredi gol spisek nadzorov",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pogovor]])",
-       "unknown_extension_tag": "Neznana razširitvena etiketa »$1«",
        "duplicate-defaultsort": "'''Opozorilo:''' Privzeti ključ razvrščanja »$2« prepiše prejšnji privzeti ključ razvrščanja »$1«.",
        "duplicate-displaytitle": "<strong>Opozorilo:</strong> Prikazni naslov »$2« prepiše prejšnji prikazni naslov »$1«.",
        "invalid-indicator-name": "<strong>Napaka:</strong> Atribut <code>name</code> indikatorjev stanja strani ne sme biti prazen.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Pot članka]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Pot skripta]",
+       "version-libraries": "Nameščene knjižnice",
+       "version-libraries-library": "Knjižnica",
+       "version-libraries-version": "Različica",
        "redirect": "Preusmeri po datoteki, uporabniku, strani ali ID-ju redakcije",
        "redirect-legend": "Preusmeritev na datoteko ali stran",
        "redirect-summary": "Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije ali ID strani) ali uporabniško stran (če podate številski ID uporabnika). Uporaba: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ali [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Navedena redakcija ne obstaja.",
        "dberr-problems": "Oprostite! Ta stran se sooča s tehničnimi težavami.",
        "dberr-again": "Poskusite počakati nekaj minut in ponovno naložite stran.",
-       "dberr-info": "(Ne morem se povezati s strežnikom zbirke podatkov: $1)",
-       "dberr-info-hidden": "(Ne morem se povezati s strežnikom zbirke podatkov)",
+       "dberr-info": "(Ne morem dostopati do zbirke podatkov: $1)",
+       "dberr-info-hidden": "(Ne morem dostopati do zbirke podatkov)",
        "dberr-usegoogle": "V vmesnem času lahko poskusite z iskanjem preko Googla",
        "dberr-outofdate": "Pomnite, da so njegovi imeniki naših vsebin lahko zastareli.",
        "dberr-cachederror": "To je shranjena kopija zahtevane strani, ki morda ni najnovejša.",
index b405148..c566705 100644 (file)
        "watchlisttools-edit": "Shih dhe redakto listën mbikqyrëse.",
        "watchlisttools-raw": "Redaktoje drejtpërdrejt listën",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskutimet]])",
-       "unknown_extension_tag": "Etiketë shtesë e panjohur \"$1\"",
        "duplicate-defaultsort": "'''Kujdes:''' Renditja kryesore e çelësit \"$2\" refuzon renditjen e mëparshme kryesore të çelësit \"$1\".",
        "version": "Versioni",
        "version-extensions": "Zgjerime të instaluara",
index d51c8bf..1e645cc 100644 (file)
@@ -53,7 +53,7 @@
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
        "tog-oldsig": "Текући потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)",
-       "tog-uselivepreview": "Користи тренутан преглед (експериментално)",
+       "tog-uselivepreview": "Користи тренутан преглед",
        "tog-forceeditsummary": "Упозори ме када не унесем опис измене",
        "tog-watchlisthideown": "Сакриј моје измене са списка надгледања",
        "tog-watchlisthidebots": "Сакриј измене ботова са списка надгледања",
        "filerenameerror": "Не могу да преименујем датотеку „$1“ у „$2“.",
        "filedeleteerror": "Не могу да обришем датотеку „$1“.",
        "directorycreateerror": "Не могу да направим фасциклу „$1“.",
+       "directoryreadonlyerror": "Директоријум „$1“ је само за читање.",
+       "directorynotreadableerror": "Директоријум „$1“ није читљив.",
        "filenotfound": "Не могу да пронађем датотеку „$1“.",
        "unexpected": "Неочекивана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не могу да пошаљем образац",
        "anoneditwarning": "<strong>Упозорење:</strong> нисте пријављени. Ваша ИП адреса ће бити јавно видљива у историји ове странице ако начините било какву измену. Ако се <strong>[$1 пријавите]</strong> или <strong>[$2 отворите налог]</strong> ваше измене ће бити приписане вашем корисничком имену.",
        "anonpreviewwarning": "''Нисте пријављени. Ваша ИП адреса ће бити забележена у историји ове странице.''",
        "missingsummary": "'''Напомена:''' нисте унели опис измене.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без описа.",
+       "selfredirect": "<strong>Упозорење:</strong> преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница погрешна или уређујете погрешну страницу.\nАко још једном притиснете „{{int:savearticle}}“ преусмерење ће свеједно бити направљено.",
        "missingcommenttext": "Унесите коментар испод.",
        "missingcommentheader": "'''Напомена:''' нисте унели наслов овог коментара.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без наслова.",
        "summary-preview": "Преглед описа:",
        "editingsection": "Уређујете $1 (одељак)",
        "editingcomment": "Уређујете $1 (нови одељак)",
        "editconflict": "Сукобљене измене: $1",
-       "explainconflict": "Ð\9dеко Ð´Ñ\80Ñ\83ги Ñ\98е Ñ\83 Ð¼ÐµÑ\92Ñ\83вÑ\80еменÑ\83 Ð¿Ñ\80оменио Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.\nÐ\93оÑ\80Ñ\9aи Ð¾ÐºÐ²Ð¸Ñ\80 Ñ\81адÑ\80жи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\nÐ\92аÑ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð¿Ñ\80иказане Ñ\83 Ð´Ð¾Ñ\9aем Ð¿Ð¾Ñ\99Ñ\83.\nÐ\9cоÑ\80аÑ\9bеÑ\82е Ð´Ð° Ñ\83неÑ\81еÑ\82е Ñ\81воÑ\98е Ð¿Ñ\80омене Ñ\83 Ð¿Ð¾Ñ\81Ñ\82оÑ\98еÑ\9bи Ñ\82екÑ\81Ñ\82.\n'''Само''' ће текст у горњем текстуалном оквиру бити сачуван када кликнете на „{{int:savearticle}}“.",
+       "explainconflict": "Ð\9dеко Ð´Ñ\80Ñ\83ги Ñ\98е Ñ\83 Ð¼ÐµÑ\92Ñ\83вÑ\80еменÑ\83 Ð¿Ñ\80оменио Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.\nÐ\93оÑ\80Ñ\9aи Ð¾ÐºÐ²Ð¸Ñ\80 Ñ\81адÑ\80жи Ñ\81адаÑ\88Ñ\9aи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\nÐ\92аÑ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð¿Ñ\80иказане Ñ\83 Ð´Ð¾Ñ\9aем Ð¿Ð¾Ñ\99Ñ\83.\nÐ\9cоÑ\80аÑ\9bеÑ\82е Ð´Ð° Ñ\83неÑ\81еÑ\82е Ñ\81воÑ\98е Ð¿Ñ\80омене Ñ\83 Ñ\81адаÑ\88Ñ\9aи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\n<strong>Само</strong> ће текст у горњем текстуалном оквиру бити сачуван када кликнете на „{{int:savearticle}}“.",
        "yourtext": "Ваш текст",
        "storedversion": "Ускладиштена измена",
        "nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
        "parser-unstrip-loop-warning": "Утврђена је петља",
        "parser-unstrip-recursion-limit": "Прекорачено је ограничење рекурзије ($1)",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
-       "undo-success": "Ð\98змена Ñ\81е Ð¼Ð¾Ð¶Ðµ Ð²Ñ\80атити.\nПроверите разлике испод, па сачувајте измене.",
+       "undo-success": "Ð\98змена Ñ\81е Ð¼Ð¾Ð¶Ðµ Ð¿Ð¾Ð½Ð¸Ñ\88тити.\nПроверите разлике испод, па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због сукоба измена.",
        "undo-norev": "Не могу да вратим измену јер не постоји или је обрисана.",
        "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "cantcreateaccounttitle": "Не могу да отворим налог",
-       "cantcreateaccount-text": "Отварање налога с ове IP адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
-       "cantcreateaccount-range-text": "Отварање налога са IP адреса у распону '''$1''', који укључује и вашу IP адресу ('''$4''') је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
+       "cantcreateaccount-text": "Отварање налога с ове ИП адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
+       "cantcreateaccount-range-text": "Отварање налога са ИП адреса у распону '''$1''', који укључује и вашу ИП адресу ('''$4''') је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
        "viewpagelogs": "Погледај дневнике ове странице",
        "nohistory": "Не постоји историја измена ове странице.",
        "currentrev": "Текућа измена",
        "revdelete-legend": "Ограничења видљивости",
        "revdelete-hide-text": "Сакриј текст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
-       "revdelete-hide-name": "СакÑ\80иÑ\98 Ñ\80адÑ\9aÑ\83 Ð¸ Ð¾Ð´Ñ\80едиÑ\88Ñ\82е",
+       "revdelete-hide-name": "СакÑ\80иÑ\98 Ñ\86иÑ\99 Ð¸ Ð¿Ð°Ñ\80амеÑ\82Ñ\80е",
        "revdelete-hide-comment": "Опис измене",
        "revdelete-hide-user": "Кориснчко име уредника/ИП адреса",
        "revdelete-hide-restricted": "Сакриј податке од администратора и других корисника",
        "search-redirect": "(преусмерење $1)",
        "search-section": "(одељак $1)",
        "search-category": "(категорија $1)",
+       "search-file-match": "(подудара се садржај датотеке)",
        "search-suggest": "Да ли сте мислили на: $1",
        "search-interwiki-caption": "Братски пројекти",
        "search-interwiki-default": "Резултати са $1:",
        "right-move": "премештање страница",
        "right-move-subpages": "премештање страница с њиховим подстраницама",
        "right-move-rootuserpages": "премештање основних корисничких страница",
+       "right-move-categorypages": "премештање категорија",
        "right-movefile": "премештање датотека",
        "right-suppressredirect": "прескакање стварања преусмерења при премештању страница",
        "right-upload": "отпремање датотека",
        "right-reupload-shared": "мењање датотека на дељеном складишту мултимедије",
        "right-upload_by_url": "отпремање датотека са веб адресе",
        "right-purge": "чишћење кеш меморије странице без потврде",
-       "right-autoconfirmed": "Not be affected by IP-based rate limits",
+       "right-autoconfirmed": "без ограничавања ставки за ИП адресе",
        "right-bot": "сматрање измена као аутоматски процес",
        "right-nominornewtalk": "непоседовање малих измена на страницама за разговор отвара прозор за нове поруке",
        "right-apihighlimits": "коришћење виших граница за упите из АПИ-ја",
        "right-deletedtext": "прегледање обрисаног текста и измена између обрисаних измена",
        "right-browsearchive": "претрага обрисаних страница",
        "right-undelete": "враћање обрисаних страница",
-       "right-suppressrevision": "прегледање и враћање измена које су сакривене од стране администратора",
+       "right-suppressrevision": "прегледање, скривање и враћање одређених измена страница од свих корисника",
+       "right-viewsuppressed": "прегледање измена скривених од свих корисника",
        "right-suppressionlog": "гледање приватних дневника",
        "right-block": "блокирање даљих измена других корисника",
        "right-blockemail": "онемогућавање корисницима да шаљу е-поруке",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
-       "rcnotefrom": "Испод су измене од <strong>$2</strong> (до <strong>$1</strong> измена).",
+       "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "rcshowhideminor-show": "Прикажи",
        "license-header": "Лиценца:",
        "nolicense": "није изабрано",
        "license-nopreview": "(преглед није доступан)",
-       "upload_source_url": "(иÑ\81пÑ\80авна Ð¸ Ñ\98авно Ð´Ð¾Ñ\81Ñ\82Ñ\83пна адреса)",
-       "upload_source_file": "(даÑ\82оÑ\82ека Ð½Ð° Ð²Ð°Ñ\88ем Ñ\80аÑ\87Ñ\83наÑ\80Ñ\83)",
+       "upload_source_url": "(ваÑ\88а Ð¸Ð·Ð°Ð±Ñ\80ана Ð´Ð°Ñ\82оÑ\82ека Ð¾Ð´ Ð¸Ñ\81пÑ\80авниÑ\85 Ð¸ Ñ\98авно Ð´Ð¾Ñ\81Ñ\82Ñ\83пниÑ\85 адреса)",
+       "upload_source_file": "(ваÑ\88а Ð¾Ð´Ð°Ð±Ñ\80ана Ð´Ð°Ñ\82оÑ\82ека Ñ\81а Ð²Ð°Ñ\88ег Ñ\80аÑ\87Ñ\83наÑ\80а)",
        "listfiles-delete": "обриши",
        "listfiles-summary": "Ова посебна страница приказује све послате датотеке.",
        "listfiles_search_for": "Назив датотеке:",
        "filedelete-maintenance": "Брисање и враћање датотека је привремено онемогућено због одржавања.",
        "filedelete-maintenance-title": "Не могу да обришем датотеку",
        "mimesearch": "MIME претрага",
-       "mimesearch-summary": "Ова страница омогућава филтрирање датотека према њиховим MIME типовима.\nУлазни подаци: contenttype/subtype, нпр. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ова страница омогућава филтрирање датотека према њиховим MIME типовима.\nУлазни подаци: contenttype/subtype или contenttype/*, нпр. <code>image/jpeg</code>.",
        "mimetype": "MIME врста:",
        "download": "преузми",
        "unwatchedpages": "Ненадгледане странице",
        "pager-older-n": "{{PLURAL:$1|старији 1|старијих $1}}",
        "suppress": "Надзор",
        "querypage-disabled": "Ова посебна страница је онемогућена ради побољшања перформанси.",
+       "apihelp": "API помоћ",
+       "apihelp-no-such-module": "Модул „$1“ није пронађен.",
        "booksources": "Штампани извори",
        "booksources-search-legend": "Тражи књижевне изворе",
        "booksources-isbn": "ISBN:",
        "listgrouprights-removegroup-self": "уклањање {{PLURAL:$2|групе|група}} са свог налога: $1",
        "listgrouprights-addgroup-self-all": "Додај све групе на сопствени налог",
        "listgrouprights-removegroup-self-all": "Уклони све групе са сопственог налога",
+       "listgrouprights-namespaceprotection-header": "Ограничења именских простора",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
+       "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-nodesc": "Опис није доступан.",
        "trackingcategories-disabled": "Категорија је онемогућена",
        "deleteprotected": "Не можете обрисати ову страницу зато што је заштићена.",
        "deleting-backlinks-warning": "'''Упозорење:''' бришете страницу која је укључена у [[Special:WhatLinksHere/{{FULLPAGENAME}}|друге странице]] или друге странице воде на њу.",
        "rollback": "Врати измене",
-       "rollback_short": "Врати",
        "rollbacklink": "врати",
        "rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}",
        "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
        "protect-othertime": "Друго време:",
        "protect-othertime-op": "друго време",
        "protect-existing-expiry": "Постојеће време истека: $2 у $3",
+       "protect-existing-expiry-infinity": "Постојеће време истека: трајно",
        "protect-otherreason": "Други/додатни разлог:",
        "protect-otherreason-op": "Други разлог",
        "protect-dropdown": "* Најчешћи разлози заштићивања\n** Прекомерни вандализам\n** Непожељне поруке\n** Непродуктивни рат измена\n** Страница великог промета",
        "ipb-disableusertalk": "Забрани овом кориснику да уређује своју страницу за разговор док је блокиран",
        "ipb-change-block": "Поново блокирај корисника с овим поставкама",
        "ipb-confirm": "Потврди блокирање",
-       "badipaddress": "Неисправна IP адреса",
+       "badipaddress": "Неисправна ИП адреса",
        "blockipsuccesssub": "Блокирање је успело",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />\nБлокирања можете да погледате [[Special:BlockList|овде]].",
        "ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?",
        "ipb-unblock-addr": "Деблокирај $1",
        "ipb-unblock": "Деблокирај корисничко име или ИП адресу",
        "ipb-blocklist": "Погледај постојећа блокирања",
-       "ipb-blocklist-contribs": "Доприноси за $1",
+       "ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}",
        "unblockip": "Деблокирај корисника",
-       "unblockiptext": "Користите образац испод да бисте вратили право писања блокираној IP адреси или корисничком имену.",
+       "unblockiptext": "Користите образац испод да бисте вратили право писања блокираној ИП адреси или корисничком имену.",
        "ipusubmit": "Уклони ову блокаду",
        "unblocked": "[[User:$1|$1]] је деблокиран",
        "unblocked-range": "$1 је деблокиран",
        "import-logentry-interwiki": "је увезао $1 с другог викија",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}} из $2",
        "javascripttest": "Јаваскрипт тест",
-       "javascripttest-title": "Извршавање тестова за $1",
        "javascripttest-pagetext-noframework": "Ова страница је резервисана за извршавање јаваскрипт тестова.",
        "javascripttest-pagetext-unknownframework": "Непознати радни оквир „$1“.",
        "javascripttest-pagetext-frameworks": "Изаберите један од следећих радних оквира: $1",
        "javascripttest-pagetext-skins": "Изаберите с којом темом желите да покренете пробу:",
        "javascripttest-qunit-intro": "Погледајте [$1 документацију за тестирање] на mediawiki.org.",
-       "javascripttest-qunit-heading": "Медијавикијин пакет за тестирање – QUnit",
        "tooltip-pt-userpage": "Ваша корисничка страница",
        "tooltip-pt-anonuserpage": "Корисничка страница за ИП адресу с које уређујете",
        "tooltip-pt-mytalk": "Ваша страница за разговор",
        "imgmultigo": "Иди!",
        "imgmultigoto": "Иди на страницу $1",
        "img-lang-default": "(подразумевани језик)",
+       "img-lang-info": "Прикажи ову слику на $1. $2",
        "img-lang-go": "Иди",
        "ascending_abbrev": "раст.",
        "descending_abbrev": "опад.",
        "hebrew-calendar-m12-gen": "Елул",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Непозната ознака проширења „$1“",
        "duplicate-defaultsort": "'''Упозорење:''' подразумевани кључ сврставања „$2“ мења некадашњи кључ „$1“.",
        "version": "Верзија",
        "version-extensions": "Инсталирана проширења",
        "version-poweredby-others": "остали",
        "version-poweredby-translators": "translatewiki.net преводиоци",
        "version-credits-summary": "Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].",
-       "version-license-info": "Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.\n\nМедијавики се редистрибуирати у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ чак и без ПОДРАЗУМЕВАНЕ ГАРАНЦИЈЕ ФУНКЦИОНАЛНОСТИ или ПРИКЛАДНОСТИ ЗА ОДРЕЂЕНЕУ НАМЕНУ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.\n\nТребало би да сте примили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно са овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте овде].",
+       "version-license-info": "Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.\n\nМедијавики се редистрибуира у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ чак и без ПОДРАЗУМЕВАНЕ ГАРАНЦИЈЕ ФУНКЦИОНАЛНОСТИ или ПРИКЛАДНОСТИ ЗА ОДРЕЂЕНЕУ НАМЕНУ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.\n\nТребало би да сте добили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно са овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте овде].",
        "version-software": "Инсталирани софтвер",
        "version-software-product": "Производ",
        "version-software-version": "Верзија",
        "version-entrypoints": "Адресе улазне тачке",
        "version-entrypoints-header-entrypoint": "Улазна тачка",
        "version-entrypoints-header-url": "Адреса",
+       "version-libraries": "Инсталиране библиотеке",
+       "version-libraries-library": "Библиотека",
+       "version-libraries-version": "Верзија",
        "redirect": "Преусмерење на датотеку, корисника, страницу или измену",
        "redirect-legend": "Преусмери на датотеку или страницу",
        "redirect-submit": "Иди",
        "pagelang-select-lang": "Изабери језик",
        "right-pagelang": "мењање језика странице",
        "action-pagelang": "промену језика странице",
+       "mediastatistics": "Статистика датотека",
        "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најновије верзије датотека. Старе или обрисане верзије нису урачунате.",
        "mediastatistics-table-mimetype": "MIME тип",
        "mediastatistics-table-extensions": "Могуће екстензије",
        "mediastatistics-table-count": "Број датотека",
        "mediastatistics-table-totalbytes": "Укупна величина",
+       "mediastatistics-header-unknown": "Непознато",
        "mediastatistics-header-bitmap": "Битмап слике",
        "mediastatistics-header-drawing": "Цртежи (векторске слике)",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видео",
-       "mediastatistics-header-office": "Канцеларија"
+       "mediastatistics-header-office": "Канцеларија",
+       "mediastatistics-header-text": "Текстуалне",
+       "mediastatistics-header-executable": "Извршне",
+       "mediastatistics-header-archive": "Компресоване",
+       "json-error-syntax": "Грешка у синтакси"
 }
index 8721007..2747efe 100644 (file)
@@ -45,7 +45,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 (eksperimentalno)",
+       "tog-uselivepreview": "Koristi trenutan 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",
        "error": "Greška",
        "databaseerror": "Greška u bazi podataka",
        "databaseerror-text": "Došlo je do greške u upitu baze podataka. Možda je u pitanju programska greška.",
+       "databaseerror-textcl": "Došlo je do greške u upitu baze podataka.",
        "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
        "filerenameerror": "Ne mogu da preimenujem datoteku „$1“ u „$2“.",
        "filedeleteerror": "Ne mogu da obrišem datoteku „$1“.",
        "directorycreateerror": "Ne mogu da napravim fasciklu „$1“.",
+       "directoryreadonlyerror": "Direktorijum „$1“ je samo za čitanje.",
+       "directorynotreadableerror": "Direktorijum „$1“ nije čitljiv.",
        "filenotfound": "Ne mogu da pronađem datoteku „$1“.",
        "unexpected": "Neočekivana vrednost: „$1“=„$2“.",
        "formerror": "Greška: ne mogu da pošaljem obrazac",
        "viewyourtext": "Možete da pogledate i umnožite izvor '''vaših izmena''' na ovoj stranici:",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom vikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
        "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.",
+       "translateinterface": "Da dodate ili promenite prevode za sve vikije, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
        "cascadeprotected": "Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:\n$2",
        "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
        "customcssprotected": "Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.",
        "anoneditwarning": "<strong>Upozorenje:</strong> niste prijavljeni. Vaša IP adresa će biti javno vidljiva u istoriji ove stranice ako načinite bilo kakvu izmenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 otvorite nalog]</strong> vaše izmene će biti pripisane vašem korisničkom imenu.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji ove stranice.''",
        "missingsummary": "'''Napomena:''' niste uneli opis izmene.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez opisa.",
+       "selfredirect": "<strong>Upozorenje:</strong> preusmeravate ovu stranicu na nju samu.\nMožda vam je odredišna stranica pogrešna ili uređujete pogrešnu stranicu.\nAko još jednom pritisnete „{{int:savearticle}}“ preusmerenje će svejedno biti napravljeno.",
        "missingcommenttext": "Unesite komentar ispod.",
        "missingcommentheader": "'''Napomena:''' niste uneli naslov ovog komentara.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez naslova.",
        "summary-preview": "Pregled opisa:",
        "editingsection": "Uređujete $1 (odeljak)",
        "editingcomment": "Uređujete $1 (novi odeljak)",
        "editconflict": "Sukobljene izmene: $1",
-       "explainconflict": "Neko drugi je u međuvremenu promenio ovu stranicu.\nGornji okvir sadrži tekst stranice.\nVaše izmene su prikazane u donjem polju.\nMoraćete da unesete svoje promene u postojeći tekst.\n'''Samo''' će tekst u gornjem tekstualnom okviru biti sačuvan kada kliknete na „{{int:savearticle}}“.",
+       "explainconflict": "Neko drugi je u međuvremenu promenio ovu stranicu.\nGornji okvir sadrži sadašnji tekst stranice.\nVaše izmene su prikazane u donjem polju.\nMoraćete da unesete svoje promene u sadašnji tekst stranice.\n<strong>Samo</strong> će tekst u gornjem tekstualnom okviru biti sačuvan kada kliknete na „{{int:savearticle}}“.",
        "yourtext": "Vaš tekst",
        "storedversion": "Uskladištena izmena",
        "nonunicodebrowser": "'''Upozorenje: vaš pregledač ne podržava unikod.'''\nPromenite ga pre nego što počnete s uređivanjem.",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "parser-unstrip-recursion-limit": "Prekoračeno je ograničenje rekurzije ($1)",
        "converter-manual-rule-error": "Pronađena je greška u pravilu za ručno pretvaranje jezika",
-       "undo-success": "Izmena se može vratiti.\nProverite razlike ispod, pa sačuvajte izmene.",
+       "undo-success": "Izmena se može poništiti.\nProverite razlike ispod, pa sačuvajte izmene.",
        "undo-failure": "Ova izmena se ne može poništiti zbog sukoba izmena.",
        "undo-norev": "Ne mogu da vratim izmenu jer ne postoji ili je obrisana.",
        "undo-nochange": "Izgleda da je izmena već poništena.",
        "revdelete-legend": "Ograničenja vidljivosti",
        "revdelete-hide-text": "Sakrij tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij radnju i odredište",
+       "revdelete-hide-name": "Sakrij cilj i parametre",
        "revdelete-hide-comment": "Opis izmene",
        "revdelete-hide-user": "Korisnčko ime urednika/IP adresa",
        "revdelete-hide-restricted": "Sakrij podatke od administratora i drugih korisnika",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}}, ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
        "search-redirect": "(preusmerenje $1)",
        "search-section": "(odeljak $1)",
+       "search-category": "(kategorija $1)",
+       "search-file-match": "(podudara se sadržaj datoteke)",
        "search-suggest": "Da li ste mislili na: $1",
        "search-interwiki-caption": "Bratski projekti",
        "search-interwiki-default": "Rezultati sa $1:",
        "right-move": "premeštanje stranica",
        "right-move-subpages": "premeštanje stranica s njihovim podstranicama",
        "right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
+       "right-move-categorypages": "premeštanje kategorija",
        "right-movefile": "premeštanje datoteka",
        "right-suppressredirect": "preskakanje stvaranja preusmerenja pri premeštanju stranica",
        "right-upload": "otpremanje datoteka",
        "right-reupload-shared": "menjanje datoteka na deljenom skladištu multimedije",
        "right-upload_by_url": "otpremanje datoteka sa veb adrese",
        "right-purge": "čišćenje keš memorije stranice bez potvrde",
-       "right-autoconfirmed": "Not be affected by IP-based rate limits",
+       "right-autoconfirmed": "bez ograničavanja stavki za IP adrese",
        "right-bot": "smatranje izmena kao automatski proces",
        "right-nominornewtalk": "neposedovanje malih izmena na stranicama za razgovor otvara prozor za nove poruke",
        "right-apihighlimits": "korišćenje viših granica za upite iz API-ja",
        "right-deletedtext": "pregledanje obrisanog teksta i izmena između obrisanih izmena",
        "right-browsearchive": "pretraga obrisanih stranica",
        "right-undelete": "vraćanje obrisanih stranica",
-       "right-suppressrevision": "pregledanje i vraćanje izmena koje su sakrivene od strane administratora",
+       "right-suppressrevision": "pregledanje, skrivanje i vraćanje određenih izmena stranica od svih korisnika",
+       "right-viewsuppressed": "pregledanje izmena skrivenih od svih korisnika",
        "right-suppressionlog": "gledanje privatnih dnevnika",
        "right-block": "blokiranje daljih izmena drugih korisnika",
        "right-blockemail": "onemogućavanje korisnicima da šalju e-poruke",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
-       "rcnotefrom": "Ispod su izmene od <b>$2</b> (do <b>$1</b> izmena).",
+       "rcnotefrom": "Ispod {{PLURAL:$5|je izmena|su izmene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
        "rcshowhideminor-show": "Prikaži",
        "license-header": "Licenca:",
        "nolicense": "nije izabrano",
        "license-nopreview": "(pregled nije dostupan)",
-       "upload_source_url": "(ispravna i javno dostupna adresa)",
-       "upload_source_file": "(datoteka na vašem računaru)",
+       "upload_source_url": "(vaša izabrana datoteka od ispravnih i javno dostupnih adresa)",
+       "upload_source_file": "(vaša odabrana datoteka sa vašeg računara)",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve poslate datoteke.",
        "listfiles_search_for": "Naziv datoteke:",
        "filedelete-maintenance": "Brisanje i vraćanje datoteka je privremeno onemogućeno zbog održavanja.",
        "filedelete-maintenance-title": "Ne mogu da obrišem datoteku",
        "mimesearch": "MIME pretraga",
-       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovim MIME tipovima.\nUlazni podaci: contenttype/subtype, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovim MIME tipovima.\nUlazni podaci: contenttype/subtype ili contenttype/*, npr. <code>image/jpeg</code>.",
        "mimetype": "MIME vrsta:",
        "download": "preuzmi",
        "unwatchedpages": "Nenadgledane stranice",
        "pager-older-n": "{{PLURAL:$1|stariji 1|starijih $1}}",
        "suppress": "Nadzor",
        "querypage-disabled": "Ova posebna stranica je onemogućena radi poboljšanja performansi.",
+       "apihelp": "API pomoć",
+       "apihelp-no-such-module": "Modul „$1“ nije pronađen.",
        "booksources": "Štampani izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-isbn": "ISBN:",
        "listgrouprights-removegroup-self": "uklanjanje {{PLURAL:$2|grupe|grupa}} sa svog naloga: $1",
        "listgrouprights-addgroup-self-all": "Dodaj sve grupe na sopstveni nalog",
        "listgrouprights-removegroup-self-all": "Ukloni sve grupe sa sopstvenog naloga",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskih prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-nodesc": "Opis nije dostupan.",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "deleteprotected": "Ne možete obrisati ovu stranicu zato što je zaštićena.",
        "deleting-backlinks-warning": "'''Upozorenje:''' brišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge stranice]] ili druge stranice vode na nju.",
        "rollback": "Vrati izmene",
-       "rollback_short": "Vrati",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmenu|izmene|izmena}}",
        "rollbacklinkcount-morethan": "vrati više od $1 {{PLURAL:$1|izmene|izmene|izmena}}",
        "protect-othertime": "Drugo vreme:",
        "protect-othertime-op": "drugo vreme",
        "protect-existing-expiry": "Postojeće vreme isteka: $2 u $3",
+       "protect-existing-expiry-infinity": "Postojeće vreme isteka: trajno",
        "protect-otherreason": "Drugi/dodatni razlog:",
        "protect-otherreason-op": "Drugi razlog",
        "protect-dropdown": "* Najčešći razlozi zaštićivanja\n** Prekomerni vandalizam\n** Nepoželjne poruke\n** Neproduktivni rat izmena\n** Stranica velikog prometa",
        "import-logentry-interwiki": "je uvezao $1 s drugog vikija",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2",
        "javascripttest": "Javaskript test",
-       "javascripttest-title": "Izvršavanje testova za $1",
        "javascripttest-pagetext-noframework": "Ova stranica je rezervisana za izvršavanje javaskript testova.",
        "javascripttest-pagetext-unknownframework": "Nepoznati radni okvir „$1“.",
        "javascripttest-pagetext-frameworks": "Izaberite jedan od sledećih radnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojom temom želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "javascripttest-qunit-heading": "Medijavikijin paket za testiranje – QUnit",
        "tooltip-pt-userpage": "Vaša korisnička stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za IP adresu s koje uređujete",
        "tooltip-pt-mytalk": "Vaša stranica za razgovor",
        "tooltip-feed-atom": "Atom dovod ove stranice",
        "tooltip-t-contributions": "Pogledajte spisak doprinosa ovog korisnika",
        "tooltip-t-emailuser": "Pošaljite e-poruku ovom korisniku",
+       "tooltip-t-info": "Više informacija o ovoj stranici",
        "tooltip-t-upload": "Pošaljite datoteke",
        "tooltip-t-specialpages": "Spisak svih posebnih stranica",
        "tooltip-t-print": "Verzija ove stranice za štampanje",
        "imgmultigo": "Idi!",
        "imgmultigoto": "Idi na stranicu $1",
        "img-lang-default": "(podrazumevani jezik)",
+       "img-lang-info": "Prikaži ovu sliku na $1. $2",
        "img-lang-go": "Idi",
        "ascending_abbrev": "rast.",
        "descending_abbrev": "opad.",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Nepoznata oznaka proširenja „$1“",
        "duplicate-defaultsort": "'''Upozorenje:''' podrazumevani ključ svrstavanja „$2“ menja nekadašnji ključ „$1“.",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja",
        "version-poweredby-others": "ostali",
        "version-poweredby-translators": "translatewiki.net prevodioci",
        "version-credits-summary": "Želeli bismo da zahvalimo sledećim ljudima na njihovom doprinosu [[Special:Version|Medijavikiji]].",
-       "version-license-info": "Medijaviki je slobodan softver možete ga redistribuirati i/ili modifikovati pod uslovima GNU-ove opšte javne licence verzija 2 ili svake sledeće koju objavi Zadužbina za slobodan softver.\n\nMedijaviki se redistribuirati u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE čak i bez PODRAZUMEVANE GARANCIJE FUNKCIONALNOSTI ili PRIKLADNOSTI ZA ODREĐENEU NAMENU. Pogledajte GNU-ovu opštu javnu licencu za više informacija.\n\nTrebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opšte javne licence] zajedno s ovim programom. Ako niste, pišite na Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA ili [//www.gnu.org/licenses/old-licenses/gpl-2.0.html pročitajte ovde].",
+       "version-license-info": "Medijaviki je slobodan softver možete ga redistribuirati i/ili modifikovati pod uslovima GNU-ove opšte javne licence verzija 2 ili svake sledeće koju objavi Zadužbina za slobodan softver.\n\nMedijaviki se redistribuira u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE čak i bez PODRAZUMEVANE GARANCIJE FUNKCIONALNOSTI ili PRIKLADNOSTI ZA ODREĐENEU NAMENU. Pogledajte GNU-ovu opštu javnu licencu za više informacija.\n\nTrebalo bi da ste dobili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opšte javne licence] zajedno sa ovim programom. Ako niste, pišite na Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA ili [//www.gnu.org/licenses/old-licenses/gpl-2.0.html pročitajte ovde].",
        "version-software": "Instalirani softver",
        "version-software-product": "Proizvod",
        "version-software-version": "Verzija",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "revdelete-restricted": "primenjena ograničenja za administratore",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
+       "logentry-merge-merge": "$1 je {{GENDER:$2|spojio|spojila}} $3 u $4 (sve do izmene $5)",
        "logentry-move-move": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4 bez ostavljanja preusmerenja",
        "logentry-move-move_redir": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4 preko preusmerenja",
        "pagelang-select-lang": "Izaberi jezik",
        "right-pagelang": "menjanje jezika stranice",
        "action-pagelang": "promenu jezika stranice",
+       "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Statistike o tipovima poslatih datoteka. Ovde su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
        "mediastatistics-table-mimetype": "MIME tip",
        "mediastatistics-table-extensions": "Moguće ekstenzije",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-table-totalbytes": "Ukupna veličina",
+       "mediastatistics-header-unknown": "Nepoznato",
        "mediastatistics-header-bitmap": "Bitmap slike",
        "mediastatistics-header-drawing": "Crteži (vektorske slike)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Video",
-       "mediastatistics-header-office": "Kancelarija"
+       "mediastatistics-header-office": "Kancelarija",
+       "mediastatistics-header-text": "Tekstualne",
+       "mediastatistics-header-executable": "Izvršne",
+       "mediastatistics-header-archive": "Kompresovane",
+       "json-error-syntax": "Greška u sintaksi"
 }
index 012b957..6253392 100644 (file)
@@ -38,7 +38,7 @@
        "tog-shownumberswatching": "Témbongkeun jumlah nu ngawaskeun",
        "tog-oldsig": "Paraf nu geus aya:",
        "tog-fancysig": "Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)",
-       "tog-uselivepreview": "Paké pramidang saharita (ujicoba)",
+       "tog-uselivepreview": "Paké pratayang langsung",
        "tog-forceeditsummary": "Mun kotak ringkesan éditan masih kosong, béjaan!",
        "tog-watchlisthideown": "Sumputkeun éditan kuring dina daptar awaskeuneun",
        "tog-watchlisthidebots": "Sumputkeun éditan bot dina daptar awaskeuneun",
        "delete-toobig": "Jujutan édit ieu kaca panjang pisan, leuwih ti {{PLURAL:$1|révisi|révisi}}.\nHal ieu teu diwenangkeun pikeun nyegah karuksakan {{SITENAME}} nu teu dihaja.",
        "delete-warning-toobig": "Jujutan ieu kaca panjang pisan, leuwih ti{{PLURAL:$1|révisi|révisi}}. Dihapusna ieu kaca bisa ngaruksak jalanna pangkalan data {{SITENAME}}; sing ati-ati.",
        "rollback": "Balikkeun éditan",
-       "rollback_short": "Balikkeun",
        "rollbacklink": "balikkeun",
        "rollbackfailed": "Gagal malikkeun",
        "cantrollback": "Éditan teu bisa dibalikkeun; kontribusi panungtung ngarupakeun hiji-hijina panulis kaca ieu.",
        "watchlisttools-view": "Témbongkeun parobahan nu patali",
        "watchlisttools-edit": "Témbongkeun sarta édit béréndélan awaskeuneun",
        "watchlisttools-raw": "Robah béréndélan awaskeuneun",
-       "unknown_extension_tag": "Tag éksténsi \"$1\" teu dipikawanoh",
        "duplicate-defaultsort": "'''Awas''': Konci runtuyan asal \"$2\" ngalindih konci runtuyan asal \"$1\" anu saméméhna.",
        "version": "Vérsi",
        "version-extensions": "Éksténsi nu diinstal",
        "version-hook-subscribedby": "Didaptarkeun ku",
        "version-version": "(Vérsi $1)",
        "version-license": "Lisénsi MediaWiki",
+       "version-poweredby-translators": "darmamurcaya translatewiki.net",
        "version-software": "Sopwér nu geus diinstal",
        "version-software-product": "Produk",
        "version-software-version": "Vérsi",
index 6f52692..6c1727a 100644 (file)
@@ -60,7 +60,8 @@
                        "아라",
                        "Abbedabb",
                        "Platinawolf",
-                       "Albinomamba"
+                       "Albinomamba",
+                       "Stens51"
                ]
        },
        "tog-underline": "Stryk under länkar:",
@@ -77,7 +78,7 @@
        "tog-watchdefault": "Lägg till sidor och filer jag redigerar i min bevakningslista",
        "tog-watchmoves": "Lägg till sidor och filer jag flyttar i min bevakningslista",
        "tog-watchdeletion": "Lägg till sidor och filer jag raderar i min bevakningslista",
-       "tog-watchrollback": "Lägg till sidor där jag har utfört en tillbakarullning till min övervakningslista",
+       "tog-watchrollback": "Lägg till sidor där jag har utfört en tillbakarullning till min bevakningslista",
        "tog-minordefault": "Markera automatiskt ändringar som mindre",
        "tog-previewontop": "Visa förhandsgranskningen ovanför redigeringsrutan",
        "tog-previewonfirst": "Visa förhandsgranskning vid första redigeringen",
        "pool-queuefull": "Kön är full",
        "pool-errorunknown": "Okänt fel",
        "pool-servererror": "Pool counter-tjänsten är inte tillgänglig ($1).",
+       "poolcounter-usage-error": "Användningsfel: $1",
        "aboutsite": "Om {{SITENAME}}",
        "aboutpage": "Project:Om",
        "copyright": "Innehållet är tillgängligt under $1 om inte annat anges.",
        "anoneditwarning": "<strong>Varning:</strong> Du är inte inloggad. Din IP-adress kommer att vara publikt synlig om du gör några redigeringar. Om du <strong>[$1 loggar in]</strong> eller <strong>[$2 skapar ett konto]</strong> kommer dina redigeringar att tillskrivas ditt användarnamn, tillsammans med andra fördelar.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
        "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen kommer din redigering att sparas utan en sådan.",
-       "selfredirect": "<strong>Varning:</strong> Du omdirigerar till samma artikel.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas.",
+       "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/rubrik 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:",
        "content-model-text": "oformaterad text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tomt objekt",
+       "content-json-empty-array": "Tomt fält",
        "duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
        "duplicate-args-category-desc": "Sidan innehåller mallanrop som använder repeterade argument, så som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.\n\nAntalet anrop får vara högst $2, nu görs {{PLURAL:$1|$1 anrop}}",
        "history-feed-empty": "Den begärda sidan finns inte.\nDen kan ha tagits bort från wikin eller bytt namn.\nProva att [[Special:Search|söka på wikin]] för relevanta nya sidor.",
        "rev-deleted-comment": "(redigeringssammanfattning togs bort)",
        "rev-deleted-user": "(användarnamn borttaget)",
-       "rev-deleted-event": "(loggåtgärd borttagen)",
+       "rev-deleted-event": "(loggdetaljer borttagna)",
        "rev-deleted-user-contribs": "[användarnamn eller IP-adress har tagits bort - redigeringen visas ej bland bidragen]",
        "rev-deleted-text-permission": "Denna version av sidan har '''raderats'''.\nDet kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "rev-suppressed-text-permission": "Denna version av sidan har <strong>undanhållits</strong>.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].",
        "revdelete-legend": "Ändra synlighet",
        "revdelete-hide-text": "Versionstext",
        "revdelete-hide-image": "Dölj filinnehåll",
-       "revdelete-hide-name": "Dölj åtgärd och sidnamn",
+       "revdelete-hide-name": "Dölj mål och parametrar",
        "revdelete-hide-comment": "Redigeringssammanfattning",
        "revdelete-hide-user": "Redigerarens användarnamn/IP-adress",
        "revdelete-hide-restricted": "Undanhåll data från administratörer så väl som från övriga",
        "uploaderror": "Fel vid uppladdningen",
        "upload-recreate-warning": "'''Varning: En fil med det namnet har tagits bort eller flyttats.'''\n\nRaderings- och sidflyttningsloggen för denna sida återges här:",
        "uploadtext": "Använd formuläret nedan för att ladda upp filer.\nFör att titta på eller leta efter filer som redan har laddats upp, se [[Special:FileList|listan över uppladdade filer]]. Uppladdningar loggförs även i [[Special:Log/upload|uppladdningsloggen]], och raderingar i [[Special:Log/delete|raderingsloggen]].\n\nAnvänd en länk på något av följande format för att infoga en fil på en sida:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' för att visa filen i dess hela storlek\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alternativ text]]</nowiki></code>''' för att visa en rendering med bredden 200 pixel i en ruta till vänster med bildtexten 'alternativ text'\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' för att länka direkt till filen utan att visa den",
-       "upload-permitted": "Tillåtna filtyper: $1.",
-       "upload-preferred": "Föredragna filtyper: $1.",
-       "upload-prohibited": "Förbjudna filtyper: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tillåten filtyp|Tillåtna filtyper}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Föredragen filtyp|Föredragna filtyper}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Förbjuden filtyp|Förbjudna filtyper}}: $1.",
        "uploadlogpage": "Uppladdningslogg",
        "uploadlogpagetext": "Det här är en logg över de senast uppladdade filerna.\nSe [[Special:NewFiles|galleriet över nya filer]] för en mer visuell översikt.",
        "filename": "Filnamn",
        "deleteprotected": "Du kan inte radera denna sida eftersom den är skyddad.",
        "deleting-backlinks-warning": "'''Varning:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.",
        "rollback": "Rulla tillbaka ändringar",
-       "rollback_short": "Tillbakarullning",
        "rollbacklink": "rulla tillbaka",
        "rollbacklinkcount": "rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}",
        "rollbacklinkcount-morethan": "rulla tillbaka mer än $1 {{PLURAL:$1|redigering|redigeringar}}",
        "namespace": "Namnrymd:",
        "invert": "Invertera val",
        "tooltip-invert": "Markera denna ruta för att dölja ändringar på sidor inom det valda namnrymden (och tillhörande namnrymden om det är markerat)",
+       "tooltip-whatlinkshere-invert": "Markera denna ruta för att dölja länkar från sidor inom vald namnrymd.",
        "namespace_association": "Associerad namnrymd",
        "tooltip-namespace_association": "Markera denna ruta för att även inkludera diskussions- eller ämnesnamnrymden som är associerad med den valda namnrymden",
        "blanknamespace": "(Huvudnamnrymden)",
        "thumbnail-temp-create": "Kunde inte skapa temporär miniatyrfil",
        "thumbnail-dest-create": "Kunde inte spara miniatyr till destinationen",
        "thumbnail_invalid_params": "Ogiltiga parametrar för miniatyrbilden",
+       "thumbnail_toobigimagearea": "Fil med dimensioner som är större än $1",
        "thumbnail_dest_directory": "Kan inte skapa målkatalogen",
        "thumbnail_image-type": "Bildtypen stöds inte",
        "thumbnail_gd-library": "Inkomplett GD library konfigurering: saknar funktionen $1",
        "import-logentry-interwiki": "överförde $1 mellan wikier",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importerades från $2",
        "javascripttest": "JavaScript-testning",
-       "javascripttest-title": "Kör $1 tester",
        "javascripttest-pagetext-noframework": "Denna sida är reserverat för att köra JavaScript-tester.",
        "javascripttest-pagetext-unknownframework": "Okänd testmiljö \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Okänd handling \"$1\".",
        "javascripttest-pagetext-frameworks": "Välj en av följande testmiljöer: $1",
        "javascripttest-pagetext-skins": "Välj ett utseende att köra tester med:",
        "javascripttest-qunit-intro": "Se [$1 testningsdokumentationen] på mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit testsvit",
        "tooltip-pt-userpage": "Din användarsida",
        "tooltip-pt-anonuserpage": "Användarsida för ip-numret du redigerar från",
        "tooltip-pt-mytalk": "Din diskussionssida",
        "watchlisttools-edit": "Visa och redigera bevakningslistan",
        "watchlisttools-raw": "Redigera bevakningslistan i råformat",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])",
-       "unknown_extension_tag": "Okänd tagg \"$1\"",
        "duplicate-defaultsort": "'''Varning:''' Standardsorteringsnyckeln \"$2\" tar över från den tidigare standardsorteringsnyckeln \"$1\".",
        "duplicate-displaytitle": "<strong>Varning:</strong> Visningstiteln \"$2\" skriver över den tidigare visningstiteln \"$1\".",
        "invalid-indicator-name": "<p>Fel:</strong> Sidstatus-indikatorernas <code>namn</code>-attributet får inte vara tomt.",
        "version-entrypoints": "Startpunkts-URL:er",
        "version-entrypoints-header-entrypoint": "Startpunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Installerade bibliotek",
+       "version-libraries-library": "Bibliotek",
+       "version-libraries-version": "Version",
        "redirect": "Omdirigering efter filnamn, användar-ID, sida eller versions-ID",
        "redirect-legend": "Omdirigera till en fil eller sida",
        "redirect-summary": "Den här specialsidan omdirigerar till en fil (efter filnamn), en sida (efter en versions eller sidas ID) eller en användarsida (efter användar-ID). Användning: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], eller [[{{#Special:Redirect}}/user/101]].",
        "compare-revision-not-exists": "Versionen du angav finns inte.",
        "dberr-problems": "Ursäkta! Denna sajt har just nu tekniska problem.",
        "dberr-again": "Pröva med att vänta några minuter och ladda om.",
-       "dberr-info": "(Kan inte kontakta databasservern: $1)",
-       "dberr-info-hidden": "(Kan inte kontakta databasservern)",
+       "dberr-info": "(Kan inte komma åt databasen: $1)",
+       "dberr-info-hidden": "(Kan inte komma åt databasen)",
        "dberr-usegoogle": "Du kan pröva att söka med Google under tiden.",
        "dberr-outofdate": "Observera att deras index av vårt innehåll kan vara föråldrat.",
        "dberr-cachederror": "Följande är en cachad kopia av den efterfrågade sidan, och kan vara föråldrad.",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
        "rightsnone": "(inga)",
        "revdelete-summary": "sammanfattning",
-       "feedback-bugornote": "Om du är redo att beskriva ett tekniskt problem detaljerat, var god [$1 rapporterar en bugg].\nAnnars kan du använda det enkla formuläret nedan. Din kommentar kommer att läggas till på sidan \"[$3 $2]\", tillsammans med ditt användarnamn och vilken webbläsare du använder.",
+       "feedback-bugornote": "Om du har möjlighet att ge en detaljerad teknisk beskrivning av felet kan du göra en [$1 buggrapport]. \nAnvänd annars formuläret nedan. Din kommentar kommer att läggas till på sidan \"[$3 $2]\", tillsammans med ditt användarnamn.",
        "feedback-subject": "Ämne:",
        "feedback-message": "Meddelande:",
        "feedback-cancel": "Avbryt",
index 9c7d2b9..68d08aa 100644 (file)
        "watchlisttools-edit": "என்கவனிப்பு பட்டியலை பார்த்து தொகு",
        "watchlisttools-raw": "விக்கி நிரலற்றக் கவனிப்புப் பட்டியலைத் தொகு",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|பேச்சு]])",
-       "unknown_extension_tag": "அறியப்படாத நீட்சி வகை \"$1\"",
        "duplicate-defaultsort": "'''எச்சரிக்கை:''' இயல்புநிலை வரிசைப்படுத்து விசை ''$2 \" முன்னால் இயல்புநிலை வரிசைப்படுத்து விசை \"$1\" ஐ மீறுகிறது.",
        "version": "பதிப்பு",
        "version-extensions": "நிறுவப்பட்ட நீட்சிகள்",
        "specialpages-group-wiki": "தரவு மற்றும் கருவிகள்",
        "specialpages-group-redirects": "சிறப்புப் பக்கங்கள் வழிமாற்றம் செய்யப்படுகின்றது",
        "specialpages-group-spam": "எரித கருவிகள்",
+       "specialpages-group-developer": "உருவாக்குநர் கருவிகள்",
        "blankpage": "வெற்று பக்கம்",
        "intentionallyblankpage": "இந்த பக்கம் திட்டமிட்டே வெற்றாக விடப்பட்டுள்ளது",
        "external_image_whitelist": "#இந்த வரியை அதேபோல விட்டுவிடவும்<pre>\n#கீழே வழக்கமான வெளிப்பாட்டு துண்டுகளை (/ / இடையே செல்லும் ஒரு பகுதி) போடவும்\n#இந்த வெளிப்புற (hotlinked) படங்கள் URL கள் மூலம் பொருத்தப்படும்\n#அந்த பொருத்தம் படங்களாக காண்பிக்கப்படும், இல்லையெனில் ஒரு படத்திற்கான இணைப்பு மட்டுமே காண்பிக்கப்படும் \n#வரிகள் # உடன் ஆரம்பித்தால் அது கருத்துகளாக கருதப்படும்\n#இது எழுத்து உணர்வுடையது\n\n#அனைத்து regex துடுகளையும் இந்த வரிக்கு மேலே போடு. இந்த வரியை அதே போல விட்டுவிடவும்</pre>",
index 67346b3..a265a76 100644 (file)
        "watchlisttools-edit": "వీక్షణ జాబితాను చూడండి లేదా మార్చండి",
        "watchlisttools-raw": "ముడి వీక్షణ జాబితాలో మార్పులు చెయ్యి",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|చర్చ]])",
-       "unknown_extension_tag": "\"$1\" అనే ట్యాగు ఈ పొడిగింతకు తెలియదు",
        "duplicate-defaultsort": "హెచ్చరిక: డిఫాల్టు పేర్చు కీ \"$2\", గత డిఫాల్టు పేర్చు కీ \"$1\" ని అతిక్రమిస్తుంది.",
        "version": "సంచిక",
        "version-extensions": "స్థాపించిన పొడగింతలు",
index 87b513c..152435f 100644 (file)
        "anoneditwarning": "<strong>คำเตือน:</strong> คุณมิได้ล็อกอิน สาธารณะจะเห็นเลขที่อยู่ไอพีของคุณหากคุณแก้ไข หากคุณ<strong>[$1 ล็อกอิน]</strong>หรือ<strong>[$2 สร้างบัญชี]</strong> การแก้ไขของคุณจะถือว่าเป็นของชื่อผู้ใช้ของคุณ ร่วมกับประโยชน์อื่น",
        "anonpreviewwarning": "<em>คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้</em>",
        "missingsummary": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ให้คำอธิบายการแก้ไข \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีคำอธิบายการแก้ไข",
-       "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน หากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
+       "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "missingcommenttext": "กรุณากรอกความเห็นด้านล่าง",
        "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่หัวข้อ/พาดหัวสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีหัวข้อ/พาดหัว",
        "summary-preview": "ตัวอย่างคำอธิบาย:",
        "history-feed-empty": "ไม่มีหน้าที่ต้องการ \nซึ่งอาจถูกลบหรือเปลี่ยนชื่อแล้ว \nลอง[[Special:Search|ค้นวิกินี้]]หาหน้าใหม่ที่เกี่ยวข้อง",
        "rev-deleted-comment": "(คำอธิบายอย่างย่อถูกลบออก)",
        "rev-deleted-user": "(ชื่อผู้ใช้ถูกลบออก)",
-       "rev-deleted-event": "(à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\9bูมà¸\96ูà¸\81ลà¸\9aออà¸\81)",
+       "rev-deleted-event": "(รายละà¹\80อียà¸\94à¸\9bูมà¸\96ูà¸\81ลà¸\9a)",
        "rev-deleted-user-contribs": "[นำชื่อผู้ใช้หรือเลขที่อยู่ไอพีออกแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]",
        "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}}}} ปูมการยับยั้ง]",
        "revdelete-legend": "ตั้งการจำกัดทัศนวิสัย",
        "revdelete-hide-text": "ข้อความรุ่นปรับปรุง",
        "revdelete-hide-image": "ซ่อนเนื้อหาไฟล์",
-       "revdelete-hide-name": "à¸\8bà¹\88อà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¹\81ละà¹\80à¸\9bà¹\89าหมาย",
+       "revdelete-hide-name": "à¸\8bà¹\88อà¸\99à¹\80à¸\9bà¹\89าหมายà¹\81ละà¸\9eารามิà¹\80à¸\95อรà¹\8c",
        "revdelete-hide-comment": "คำอธิบายอย่างย่อ",
        "revdelete-hide-user": "ชื่อผู้ใช้/เลขที่อยู่ไอพีผู้เขียน",
        "revdelete-hide-restricted": "ยับยั้งข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
        "exbeforeblank": "เนื้อหาก่อนถูกทำว่างคือ: \"$1\"",
        "delete-confirm": "ลบ \"$1\"",
        "delete-legend": "ลบ",
-       "historywarning": "'''คำเตือน:'''' หน้าที่คุณกำลังลบมีประวัติการแก้ไขประมาณ $1 {{PLURAL:$1|รุ่น}}:",
+       "historywarning": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังลบมีประวัติ $1 {{PLURAL:$1|รุ่น}}:",
        "confirmdeletetext": "คุณกำลังลบหน้า รวมทั้งประวัติทั้งหมดของหน้า\nกรุณายืนยันว่าคุณเจตนา เข้าใจผลกระทบ และการกระทำนี้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]",
        "actioncomplete": "ปฏิบัติการสำเร็จ",
        "actionfailed": "ปฏิบัติการล้มเหลว",
        "watchlisttools-edit": "ดูและแก้ไขรายการเฝ้าดู",
        "watchlisttools-raw": "แก้ไขรายการเฝ้าดูทั้งหมด",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|พูดคุย]])",
-       "unknown_extension_tag": "ไม่รู้จักป้ายระบุส่วนขยาย \"$1\"",
        "duplicate-defaultsort": "<strong>คำเตือน:</strong> หลักเรียงลำดับปริยาย \"$2\" ได้ลบล้างหลักเรียงลำดับปริยาย \"$1\" ที่มีอยู่ก่อนหน้า",
        "version": "รุ่น",
        "version-extensions": "ส่วนขยายเพิ่ม (extension) ที่ติดตั้ง",
index e23eb02..e62c635 100644 (file)
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|makipag-usap]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Hindi nalalamang tatak ng karugtong na \"$1\"",
        "duplicate-defaultsort": "Babala: Madadaig ng susi ng pagtatakdang \"$2\" ang mas naunang susi ng pagtatakdang \"$1\".",
        "version": "Bersyon",
        "version-extensions": "Nakaluklok/Nakainstalang mga karugtong",
        "specialpages-group-wiki": "Kagamitan at datos ng wiki",
        "specialpages-group-redirects": "Mga natatanging pahinang pang-talon",
        "specialpages-group-spam": "Mga kagamitang pang-spam",
+       "specialpages-group-developer": "Mga kasangkapan ng tagapagpaunlad",
        "blankpage": "Walang laman na pahina",
        "intentionallyblankpage": "Sinadyang walang laman ang pahinang ito",
        "external_image_whitelist": "  #Pabayaang talagang ganito lang ang hanay na ito<pre>\n#Ilagay ang mga piraso ng karaniwang pagpapahayag (ang bahagi lang na napupunta sa pagitan ng //) sa ibaba\n#Tutugmaan ang mga ito ng mga URL ng panlabas (mainit na kawing) na mga larawan\n#Ang mga magtutugma ay ipapakita bilang mga larawan, kung hindi bilang isang kawing lamang patungo sa larawan ang ipapakita\n#Ituturing bilang mga kumento ang mga hanay na nagsisimula sa #\n\n#Ilagay sa ibabaw ng hanay na ito ang mga piraso ng karaniwang pagpapahayag.  Pabayaang ganito lang talaga ang hanay na ito</pre>",
index 4c3c97e..fd4ea73 100644 (file)
@@ -64,7 +64,9 @@
                        "Sucsuzz",
                        "Kafkasmurat",
                        "Violetanka",
-                       "Trockya"
+                       "Trockya",
+                       "Aşilleus",
+                       "BatuhanBensoy"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
@@ -92,7 +94,7 @@
        "tog-shownumberswatching": "İzleyen kullanıcı sayısını göster",
        "tog-oldsig": "Mevcut imza:",
        "tog-fancysig": "İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)",
-       "tog-uselivepreview": "Canlı önizlemeyi kullan (deneysel)",
+       "tog-uselivepreview": "Canlı ön izlemeyi kullan",
        "tog-forceeditsummary": "Özeti boş bıraktığımda beni uyar",
        "tog-watchlisthideown": "İzleme listemden düzenlemelerimi gizle",
        "tog-watchlisthidebots": "İzleme listemden bot değişikliklerini gizle",
        "pool-queuefull": "Havuz sırası dolu",
        "pool-errorunknown": "Bilinmeyen hata",
        "pool-servererror": "Anket sayacı hizmeti kullanılamıyor ($1).",
+       "poolcounter-usage-error": "Kullanım hatası: $1",
        "aboutsite": "{{SITENAME}} hakkında",
        "aboutpage": "Project:Hakkında",
        "copyright": "Aksi belirtilmedikçe içerik $1 altındadır.",
        "mainpage": "Ana Sayfa",
        "mainpage-description": "Ana sayfa",
        "policy-url": "Project:İlkeler",
-       "portal": "Topluluk portalı",
+       "portal": "Topluluk portali",
        "portal-url": "Project:Topluluk portali",
        "privacy": "Gizlilik ilkesi",
        "privacypage": "Project:Gizlilik ilkesi",
        "filerenameerror": "\"$1\" dosyasının ismi \"$2\" olarak değiştirilemedi.",
        "filedeleteerror": "\"$1\" dosyası silinemedi.",
        "directorycreateerror": "\"$1\" dizini oluşturulamadı",
+       "directoryreadonlyerror": "\"$1\" dizini salt-okunur.",
+       "directorynotreadableerror": "\"$1\" dizini okunabilir değil.",
        "filenotfound": "\"$1\" dosyası bulunamadı.",
        "unexpected": "beklenmeyen değer: \"$1\"=\"$2\".",
        "formerror": "Hata: Form gönderilemiyor",
        "anoneditwarning": "<strong>Uyarı:</strong> Giriş yapmadınız. Herhangi bir değişiklik yapmanız durumunda IP adresiniz herkese gözükecektir. Eğer <strong>[$1 giriş yaparsanız]</strong> veya <strong>[$2 bir hesap oluşturursanız]</strong>, edineceğiniz çeşitli yararların yanı sıra yaptığınız değişiklikler de kullanıcı adınıza atfedilecektir.",
        "anonpreviewwarning": "''Giriş yapmadınız. Kaydederseniz, sayfanın değişiklik geçmişine IP adresiniz yazılır.''",
        "missingsummary": "'''Uyarı:''' Herhangi bir özet yazmadın.\nKaydet tuşuna tekrar basarsan sayfa özetsiz kaydedilecek.",
+       "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": "'''Hatırlatma:''' Bu yorum için bir konu/başlık sunmadınız. Eğer \"{{int: savearticle}}\" tuşuna tekrar basarsanız, değişikliğiniz konu/başlık olmadan kaydedilecektir.",
        "summary-preview": "Ön izleme özeti:",
        "content-model-text": "düz metin",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Boş nesne",
+       "content-json-empty-array": "Boş dizi",
        "duplicate-args-category": "Yinelenen şablon değişkenleri kullanan sayfalar",
+       "duplicate-args-category-desc": "Sayfada içeren şablonları çağırmak için bu terimler kullanılır <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.\n\nBu $2 çağrıdan az olmalı, şu anda {{PLURAL:$1|1 çağrı var|$1 çağrı var}}.",
        "expensive-parserfunction-category": "Çok fazla zengin derleyici fonksiyonu çağrısına sahip sayfalar",
        "post-expand-template-inclusion-warning": "'''Uyarı''': Şablon içeriği çok büyük.\nBazı şablonlar eklenemeyecek.",
        "currentrev": "Güncel sürüm",
        "currentrev-asof": "$1 itibarı ile sayfanın şu anki hâli",
        "revisionasof": "$1 tarihindeki hâli",
-       "revision-info": "$2 tarafından oluşturulmuş $1 tarihli sürüm",
+       "revision-info": "$2 tarafından oluşturulmuş $1 tarihli sürüm $7",
        "previousrevision": "← Önceki hâli",
        "nextrevision": "Sonraki hâli →",
        "currentrevisionlink": "en güncel halini göster",
        "history-feed-empty": "İstediğiniz sayfa bulunmamaktadır.\nSayfa vikiden silinmiş ya da ismi değiştirilmiş olabilir.\nKonu ile alakalı diğer sayfaları bulmak için [[Special:Search|vikide arama yapmayı]] deneyin.",
        "rev-deleted-comment": "(düzenleme özeti silindi)",
        "rev-deleted-user": "(kullanıcı adı silindi)",
-       "rev-deleted-event": "(kayıt işlemi silindi)",
+       "rev-deleted-event": "(kayıt ayrıntıları silindi)",
        "rev-deleted-user-contribs": "[kullanıcı adı veya IP adresi çıkarıldı - değişiklik katkılardan gizlendi]",
        "rev-deleted-text-permission": "Bu sayfa revizyonu '''silinmiş'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Silme kayıtlarında] ayrıntıları bulunabilir.",
        "rev-deleted-text-unhide": "Bu sayfa revizyonu '''silinmiş'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Silme kayıtlarında] ayrıntıları bulunabilir.\nBir hizmetli olarak eğer devam ederseniz [$1 bu revizyonu hala görebilirsiniz].",
        "logdelete-selected": "{{PLURAL:$1|Seçili kayıt olayı|Seçili kayıt olayları}}:",
        "revdelete-text-text": "Silinen sürümler sayfa geçmişinde yer almaya devam edecek ancak okuyucular tarafından içeriklerine erişilemeyecektir.",
        "revdelete-text-file": "Silinen dosya sürümleri dosya geçmişinde yer almaya devam edecek ancak okuyucular tarafından içerik bölümlerine erişilemeyecektir.",
+       "logdelete-text": "Silinen dosya sürümleri dosya geçmişinde yer almaya devam edecek ancak okuyucular tarafından içerik bölümlerine erişilemeyecektir.",
        "revdelete-text-others": "Ek kısıtlamalar konulmadıkça diğer yöneticiler silinen bir gizli içeriğe işlemi geri almak için erişebilecek.",
        "revdelete-confirm": "Lütfen, bunu yapmak istediğinizi , sonuçlarını anladığınızı, ve bunu [[{{MediaWiki:Policy-url}}|ilkelere]] göre yapıyor olduğunuzu onaylayın.",
        "revdelete-suppress-text": "Saklama '''sadece''' aşağıdaki durumlarda kullanılmalıdır:\n* Muhtemel iftira niteliğindeki bilgi\n* Uygunsuz kişisel bilgi\n*: ''ev adresleri ve telefon numaraları, sosyal güvenlik numaraları, vs.''",
        "revdelete-legend": "Görünürlük kısıtlamaları ayarla",
        "revdelete-hide-text": "Revizyon metni",
        "revdelete-hide-image": "Dosya içeriğini gizle",
-       "revdelete-hide-name": "Olayı ve hedefi gizle",
+       "revdelete-hide-name": "Hedef ve parametreleri gizle",
        "revdelete-hide-comment": "Değişiklik özeti",
        "revdelete-hide-user": "Editör'ün kullanıcı adı/IP adresi",
        "revdelete-hide-restricted": "Verileri hizmetlilerle birlikte diğerlerinden de sakla",
        "search-result-category-size": "{{PLURAL:$1|1 üye|$1 üye}} ({{PLURAL:$2|1 altkategori|$2 altkategori}}, {{PLURAL:$3|1 dosya|$3 dosya}})",
        "search-redirect": "($1 sayfasından yönlendirme)",
        "search-section": "($1 bölümü)",
+       "search-category": "(kategori $1)",
        "search-file-match": "(dosya içeriğiyle eşleşiyor)",
        "search-suggest": "Bunu mu demek istediniz: $1",
        "search-interwiki-caption": "Kardeş projeler",
        "right-deletedtext": "Silinmiş metni ve silinmiş revizyonlar arasındaki değişiklikleri gör",
        "right-browsearchive": "Silinen sayfaları ara",
        "right-undelete": "Bir sayfanın silinmesini geri al",
-       "right-suppressrevision": "Sysoplardan gizlenmiş revizyonları gözden geçir ve geri yükle",
+       "right-suppressrevision": "Sysoplardan gizlenmiş revizyonlarını gizle ve göster",
        "right-suppressionlog": "Özel günlükleri gör",
        "right-block": "Diğer kullanıcıların değişiklik yapmalarını engelle",
        "right-blockemail": "Bir kullanıcının e-posta göndermesini engelle",
        "right-protect": "Koruma düzeylerini değiştir ve kademeli korumalı sayfaları düzenle",
        "right-editprotected": "\"{{int:protect-level-sysop}}\" olarak korunan sayfalarda değişiklik yap",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" olarak korunan sayfalarda değişiklik yap",
+       "right-editcontentmodel": "Sayfanın içerik modelini düzenle",
        "right-editinterface": "Kullanıcı arayüzünü değiştirmek",
        "right-editusercssjs": "Diğer kullanıcıların CSS ve JS dosyalarında değişiklik yap",
        "right-editusercss": "Diğer kullanıcıların CSS dosyalarında değişiklik yap",
        "pager-older-n": "$1 daha eski",
        "suppress": "Gözetim",
        "querypage-disabled": "Bu özel sayfa, performansa dayalı nedenlerle devre dışı bırakılır.",
+       "apihelp": "API yardımı",
        "apihelp-no-such-module": "\"$1\" modülü bulunamadı.",
        "booksources": "Kaynak kitaplar",
        "booksources-search-legend": "Kitap kaynaklarını ara",
        "listgrouprights-namespaceprotection-restrictedto": "Kullanıcının değişiklik yapmasına izin veren hak(lar)",
        "broken-file-category-desc": "Sayfa bozuk dosya bağlantısı (mevcut olmayan bir dosyayı kullanmaya çalışan bağlantı) içeriyor.",
        "trackingcategories-nodesc": "Açıklama yok.",
+       "trackingcategories-disabled": "Kategori devre dışı",
        "mailnologin": "Gönderi adresi yok.",
        "mailnologintext": "Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.",
        "emailuser": "Bu kullanıcıya e-posta gönder",
        "deleteprotected": "Bu sayfayı silemezsiniz çünkü sayfa korumaya alınmış.",
        "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya [[Özel:SayfayaBağlantılar/{{FULLPAGENAME}}|başka sayfalardan]] bağlantılar var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
        "rollback": "değişiklikleri geri al",
-       "rollback_short": "geri al",
        "rollbacklink": "geri döndür",
        "rollbacklinkcount": "$1 {{PLURAL:$1|değişikliği|değişikliği}} geri döndür",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|değişiklikten|değişiklikten}} fazla geri döndür",
        "import-logentry-interwiki": "$1 transvikileşmiş",
        "import-logentry-interwiki-detail": "$2 sayfasından $1 {{PLURAL:$1|revizyon|revizyon}} içe aktarıldı",
        "javascripttest": "JavaScript denemesi",
-       "javascripttest-title": "$1 testleri çalışıyor",
        "javascripttest-pagetext-noframework": "Bu sayfa JavaScript testleri çalıştırmak için ayrılmıştır.",
        "javascripttest-pagetext-unknownframework": "Bilinmeyen test çerçevesi \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Bilinmeyen eylem \"$1\".",
        "javascripttest-pagetext-frameworks": "Lütfen aşağıdaki test çerçevelerinden birini seçin: $1",
        "javascripttest-pagetext-skins": "Testleri koşmak için bir tema seçin:",
        "javascripttest-qunit-intro": "mediawiki.org üzerinden [$1 deneme belgelerine] bakınız.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit deneme paketi",
        "tooltip-pt-userpage": "Kullanıcı sayfanız",
        "tooltip-pt-anonuserpage": "The user page for the ip you",
        "tooltip-pt-mytalk": "Mesaj sayfanız",
        "hijri-calendar-m9": "Ramazan",
        "hijri-calendar-m10": "Şevval",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesaj]])",
-       "unknown_extension_tag": "Bilinmeyen eklenti etiketi \"$1\"",
        "duplicate-defaultsort": "'''Uyarı:''' Varsayılan \"$2\" sınıflandırma anahtarı, önceki \"$1\" sınıflandırma anahtarını geçersiz kılıyor.",
        "version": "Sürüm",
        "version-extensions": "Yüklü ekler",
        "version-entrypoints": "Giriş noktası URL'leri",
        "version-entrypoints-header-entrypoint": "Giriş noktası",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Yüklü kütüphaneler",
+       "version-libraries-library": "Kütüphane",
+       "version-libraries-version": "Sürüm",
        "redirect": "Dosya, kullanıcı, sayfa ya da revizyon kimliği ile yönlendirme",
        "redirect-legend": "Bir dosya veya sayfaya yönlendirme",
        "redirect-summary": "Bu özel sayfa sizi bir dosya (dosya adı verilen), bir sayfa (bir revizyon ya da sayfa ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir. Kullanım: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya da  [[{{#Special:Redirect}}/user/101]].",
        "specialpages-group-wiki": "Veri ve araçlar",
        "specialpages-group-redirects": "Yönlendirmeli özel sayfalar",
        "specialpages-group-spam": "Spam araçları",
+       "specialpages-group-developer": "Geliştirici araçları",
        "blankpage": "Boş sayfa",
        "intentionallyblankpage": "Bu sayfa özellikle boştur.",
        "external_image_whitelist": " #Bu satırı olduğu gibi bırakın<pre>\n#Düzenli ifade parçalarını (sadece // arasında kalan kısmı) aşağıya ekleyin\n#Bunlar harici (hotlink) resimlerin URLleri ile eşlenecektir\n#Eşleşenler resim olarak görünecek, aksi takdirde sadece resme bir bağlantı görünecektir\n# # ile başlayan satırlar yorum olarak muamele görecektir\n#Büyük-küçük harf duyarsızdır\n\n#Bütün düzenli ifade parçalarını bu satırın üstüne ekleyin. Bu satırı olduğu gibi bırakın</pre>",
        "dberr-problems": "Üzgünüz! Bu site teknik zorluklar yaşıyor.",
        "dberr-again": "Bir kaç dakika bekleyip tekrar yüklemeyi deneyin.",
        "dberr-info": "(Veritabanı sunucusuyla irtibat kurulamıyor: $1)",
-       "dberr-info-hidden": "(Veritabanı sunucusuna bağlantı kurulamıyor)",
+       "dberr-info-hidden": "(Veritabanı sunucusuyla bağlantı kurulamıyor)",
        "dberr-usegoogle": "Bu zaman zarfında Google ile aramayı deneyebilirsiniz.",
        "dberr-outofdate": "İçeriğimizin onların dizinlerinde güncel olmayabileceğini dikkate alın.",
        "dberr-cachederror": "Aşağıdaki istenen sayfanın önbellekteki bir kopyasıdır, ve güncel olmayabilir.",
        "pagelang-select-lang": "Dil seçin",
        "right-pagelang": "Sayfa dilini değiştir",
        "action-pagelang": "sayfa dilini değiştir",
+       "log-name-pagelang": "Dil günlüğünü değiştir",
        "logentry-pagelang-pagelang": "$1, $3 sayfasının dilini $4 dilinden $5 diline {{GENDER:$2|çevirdi}}.",
        "mediastatistics": "Medya istatistikleri",
        "mediastatistics-summary": "Karşıya yüklenen dosya türlerine ilişkin istatistikler. Bu yalnızca bir dosyanın en son sürümünü içerir. Eski veya silinen dosyala sürümleri hariç tutulur.",
index 8dd9504..dbc1968 100644 (file)
@@ -83,7 +83,7 @@
        "tog-shownumberswatching": "Показувати число користувачів, які додали сторінку до свого списку спостереження",
        "tog-oldsig": "Існуючий підпис:",
        "tog-fancysig": "Сприймати підпис як вікі-текст (без автоматичного посилання)",
-       "tog-uselivepreview": "Використовувати швидкий попередній перегляд (експериментально)",
+       "tog-uselivepreview": "Використовувати швидкий попередній перегляд",
        "tog-forceeditsummary": "Попереджати, коли не зазначений короткий опис редагування",
        "tog-watchlisthideown": "Приховати мої редагування у списку спостереження",
        "tog-watchlisthidebots": "Приховати редагування ботів у списку спостереження",
        "november-date": "$1 листопада",
        "december-date": "$1 грудня",
        "pagecategories": "{{PLURAL:$1|1=Категорія|Категорії}}",
-       "category_header": "СÑ\82оÑ\80Ñ\96нок Ñ\83 категорії «$1»",
+       "category_header": "СÑ\82оÑ\80Ñ\96нки Ð² категорії «$1»",
        "subcategories": "Підкатегорії",
        "category-media-header": "Файли в категорії «$1»",
        "category-empty": "''Ця категорія зараз порожня.''",
        "pool-queuefull": "Сервер запитів заповнений",
        "pool-errorunknown": "Невідома помилка",
        "pool-servererror": "Служба лічильника пулу недоступна ($1).",
+       "poolcounter-usage-error": "Помилка використання: $1",
        "aboutsite": "Про {{grammar:accusative|{{SITENAME}}}}",
        "aboutpage": "Project:Про",
        "copyright": "Вміст доступний на умовах $1, якщо не вказано інше.",
        "anoneditwarning": "<strong>Увага!</strong> Ви не авторизувалися на сайті. Ваша IP-адреса буде публічно видима, якщо ви будете вносити будь-які правки. Якщо ви <strong>[$1 увійдете]</strong> або <strong>[$2 створите обліковий запис]</strong>, правки замість цього будуть пов'язані з вашим ім'ям користувача, а також у вас з'являться інші переваги.",
        "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''",
        "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.",
+       "selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"{{int:savearticle}}\" ще раз, перенаправлення буде створено.",
        "missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.",
        "missingcommentheader": "'''Нагадування''': ви не вказали тему/заголовок для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, ви збережете редагування без заголовка.",
        "summary-preview": "Опис буде:",
        "content-model-text": "звичайний текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Порожній об'єкт",
+       "content-json-empty-array": "Порожній масив",
        "duplicate-args-category": "Сторінки, що містять шаблон із кількома значеннями одного й того ж параметра",
        "duplicate-args-category-desc": "Тут перелічено сторінки, що містять дублікатне визначення аргументу при включенні шаблону, приміром, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Увага:''' Ця сторінка містить дуже багато викликів ресурсомістких функцій.\n\nКількість викликів не повинна перевищувати $2, зараз потрібно зробити $1 {{PLURAL:$1|виклик|виклики|викликів}}.",
        "revdelete-legend": "Встановити обмеження видимості",
        "revdelete-hide-text": "Текст версії сторінки",
        "revdelete-hide-image": "Приховати вміст файлу",
-       "revdelete-hide-name": "Приховати дію та її об'єкт",
+       "revdelete-hide-name": "Приховати цілі та параметри",
        "revdelete-hide-comment": "Коментар редагування",
        "revdelete-hide-user": "Ім'я автора/IP адреса",
        "revdelete-hide-restricted": "Приховати дані також і від адміністраторів",
        "right-protect": "Зміна рівнів захисту та редагування захищених каскадно сторінок",
        "right-editprotected": "Редагування сторінок з рівнем захисту \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Редагування сторінок з рівнем захисту \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Редагувати модель вмісту сторінки",
        "right-editinterface": "Редагування інтерфейсу користувача",
        "right-editusercssjs": "Редагування CSS- і JS-файлів інших користувачів",
        "right-editusercss": "Редагування CSS-файлів інших користувачів",
        "action-viewmywatchlist": "перегляд власного списку спостереження",
        "action-viewmyprivateinfo": "перегляд своєї приватної інформації",
        "action-editmyprivateinfo": "редагування своєї приватної інформації",
+       "action-editcontentmodel": "редагувати модель вмісту сторінки",
        "nchanges": "$1 {{PLURAL:$1|зміна|зміни|змін}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|зміна з останнього візиту|зміни з останнього візиту|змін з останнього візиту}}",
        "enhancedrc-history": "історія",
        "deleteprotected": "Ви не можете видалити цю сторінку, тому що вона захищена.",
        "deleting-backlinks-warning": "'''Попередження:'''  [[Special:WhatLinksHere/{{FULLPAGENAME}}|інші сторінки]] посилаються або містять сторінку, яку ви маєте намір видалити.",
        "rollback": "Відкинуто редагування",
-       "rollback_short": "Відкинути",
        "rollbacklink": "відкинути",
        "rollbacklinkcount": "відкинути $1 {{PLURAL:$1|редагування|редагування|редагувань}}",
        "rollbacklinkcount-morethan": "відкинути понад $1 {{PLURAL:$1|редагування|редагування|редагувань}}",
        "revertmove": "відкинути",
        "delete_and_move": "Вилучити і перейменувати",
        "delete_and_move_text": "== Потрібне вилучення ==\nСторінка з назвою [[:$1|«$1»]] вже існує.\nБажаєте вилучити її для можливості перейменування?",
-       "delete_and_move_confirm": "Так, вилучити цю сторінку",
+       "delete_and_move_confirm": "Так, вилучити для перейменування",
        "delete_and_move_reason": "Вилучена для можливості перейменування сторінки «[[$1]]»",
        "selfmove": "Неможливо перейменувати сторінку: поточна й нова назви сторінки співпадають.",
        "immobile-source-namespace": "Не можна перейменовувати сторінки з простору назв «$1»",
        "import-logentry-interwiki": "«$1» — міжвікі імпорт",
        "import-logentry-interwiki-detail": "Імпортовано $1 {{PLURAL:$1|версія|версії|версій}} з $2",
        "javascripttest": "Тестування JavaScript",
-       "javascripttest-title": "Працює  $1  випробувань",
        "javascripttest-pagetext-noframework": "Ця сторінка призначений для тестування JavaScript.",
        "javascripttest-pagetext-unknownframework": "Невідоме середовище тестування \" $1 \".",
        "javascripttest-pagetext-frameworks": "Будь ласка, оберіть одне з наступних середовищ тестування: $1",
        "javascripttest-pagetext-skins": "Виберіть оформлення сторінки запуску тесту:",
        "javascripttest-qunit-intro": "Переглянути [ $1  тестування документації] на mediawiki.org.",
-       "javascripttest-qunit-heading": "Набір тестів MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Ваша сторінка користувача",
        "tooltip-pt-anonuserpage": "Сторінка користувача для вашої IP-адреси",
        "tooltip-pt-mytalk": "Ваша сторінка обговорення",
        "hebrew-calendar-m12-gen": "Елула",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обговорення]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Невідомий тег доповнення «$1»",
        "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
        "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
        "invalid-indicator-name": "<strong>Помилка:</strong> Сторінка індикатора стану <code>name</code> атрибута не може бути пуста.",
        "log-name-pagelang": "Журнал змін мови",
        "log-description-pagelang": "Це журнал змін мови сторінок.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|змінив|змінила}} мову сторінки для $3 з $4 на $5.",
-       "default-skin-not-found": "Ð\9eй! Ð¢Ð¸Ð¿Ð¾Ð²Ð° Ñ\82ема Ð¾Ñ\84оÑ\80мленнÑ\8f Ð´Ð»Ñ\8f Ð²Ð°Ñ\88оÑ\97 Ð²Ñ\96кÑ\96 <code>$wgDefaultSkin</code>, <code>$1</code> Ð½ÐµÐ´Ð¾Ñ\81Ñ\82Ñ\83пна.\n\nÐ\92аÑ\88а Ñ\83Ñ\81Ñ\82ановка, Ð²Ñ\96Ñ\80огÑ\96дно, Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\96 Ñ\82еми Ð¾Ñ\84оÑ\80мленнÑ\8f. Ð\94ив.  [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\97 Ð¿Ñ\80о Ñ\82е, Ñ\8fк Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82и Ñ\82еми Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\96 Ð²Ð¸Ð±Ñ\80аÑ\82и Ñ\82иповÑ\83 Ñ\82емÑ\83.\n\n\n$2\n\n\n; Ð¯ÐºÑ\89о Ð²Ð¸ Ñ\89ойно Ð²Ñ\81Ñ\82ановили MediaWiki:\n: Ð\92и, Ð¼Ð°Ð±Ñ\83Ñ\82Ñ\8c, Ð·Ñ\80обили Ñ\86е Ð· Git Ð°Ð±Ð¾ Ð±ÐµÐ·Ð¿Ð¾Ñ\81еÑ\80еднÑ\8cо Ð· Ð²Ð¸Ñ\85Ñ\96дного ÐºÐ¾Ð´Ñ\83, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\96нÑ\88ий Ñ\81поÑ\81Ñ\96б. Ð¢Ð¾Ð´Ñ\96 Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\83пне. Ð¡Ð¿Ñ\80обÑ\83йÑ\82е Ð²Ñ\81Ñ\82ановиÑ\82и Ð´ÐµÑ\8fкÑ\96 Ñ\82еми Ð· [https://www.mediawiki.org/wiki/Category:All_skins ÐºÐ°Ñ\82алогÑ\83 Ñ\82ем Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\81айÑ\82Ñ\83 mediawiki.org]:\n:* Ð\97аванÑ\82аживÑ\88и [https://www.mediawiki.org/wiki/Download Ð°Ñ\80Ñ\85Ñ\96в Ñ\84айлÑ\96в], Ñ\8fкий Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð´ÐµÐºÑ\96лÑ\8cка Ñ\82ем Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\96 Ñ\80озÑ\88иÑ\80енÑ\8c. Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81копÑ\96Ñ\8eваÑ\82и Ñ\82екÑ\83 <code>skins/</code> Ð· Ð½Ñ\8cого.\n:* Ð¡ÐºÐ»Ð¾Ð½Ñ\83вавÑ\88и Ð¾Ð´Ð¸Ð½ Ð· Ñ\80епозиÑ\82оÑ\80Ñ\96Ñ\97в <code>mediawiki/skins/*</code> Ñ\87еÑ\80ез git Ñ\83 Ð¿Ñ\96дÑ\82екÑ\83 <code dir=\"ltr\">skins/</code> Ñ\82еки, Ð´Ðµ Ð²Ñ\81Ñ\82ановлена MediaWiki.\n: Ð¦Ðµ Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð·Ð°Ñ\88кодиÑ\82и Ð²Ð°Ñ\88омÑ\83 Ñ\81Ñ\85овиÑ\89Ñ\83, Ñ\8fкÑ\89о Ð²Ð¸ MediaWiki-Ñ\80озÑ\80обник. Ð\94ив. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\97 Ð¿Ñ\80о Ñ\82е, Ñ\8fк Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82и Ñ\82еми Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\96 Ð²Ð¸Ð±Ñ\80аÑ\82и Ñ\82иповÑ\83 Ñ\82емÑ\83.\n; Якщо ви щойно оновили MediaWiki:\n: MediaWiki версії 1.24 і новійша більше не включає автоматично встановлені теми (див. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВи можете вставити наступні рядки в <code>LocalSettings.php</code>, щоб включити всі встановлені теми оформлення: \n\n\n<pre dir=\"ltr\">$3</pre>\n\n\n; Якщо ви щойно змінили <code>LocalSettings.php</code>:\n: Повторно перевірте назви тем на наявність помилок.",
+       "default-skin-not-found": "Ð\9eй! Ð¢Ð¸Ð¿Ð¾Ð²Ð° Ñ\82ема Ð¾Ñ\84оÑ\80мленнÑ\8f Ð´Ð»Ñ\8f Ð²Ð°Ñ\88оÑ\97 Ð²Ñ\96кÑ\96 <code>$wgDefaultSkin</code>, <code>$1</code> Ð½ÐµÐ´Ð¾Ñ\81Ñ\82Ñ\83пна.\n\nÐ\92аÑ\88а Ñ\83Ñ\81Ñ\82ановка, Ð²Ñ\96Ñ\80огÑ\96дно, Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\96 Ñ\82еми Ð¾Ñ\84оÑ\80мленнÑ\8f. Ð\94ив.  [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\97 Ð¿Ñ\80о Ñ\82е, Ñ\8fк Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82и Ñ\82еми Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\96 Ð²Ð¸Ð±Ñ\80аÑ\82и Ñ\82иповÑ\83 Ñ\82емÑ\83.\n\n\n$2\n\n\n; Ð¯ÐºÑ\89о Ð²Ð¸ Ñ\89ойно Ð²Ñ\81Ñ\82ановили MediaWiki:\n: Ð\92и, Ð¼Ð°Ð±Ñ\83Ñ\82Ñ\8c, Ð·Ñ\80обили Ñ\86е Ð· Git Ð°Ð±Ð¾ Ð±ÐµÐ·Ð¿Ð¾Ñ\81еÑ\80еднÑ\8cо Ð· Ð²Ð¸Ñ\85Ñ\96дного ÐºÐ¾Ð´Ñ\83, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\96нÑ\88ий Ñ\81поÑ\81Ñ\96б. Ð¢Ð¾Ð´Ñ\96 Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\83пне. Ð¡Ð¿Ñ\80обÑ\83йÑ\82е Ð²Ñ\81Ñ\82ановиÑ\82и Ð´ÐµÑ\8fкÑ\96 Ñ\82еми Ð· [https://www.mediawiki.org/wiki/Category:All_skins ÐºÐ°Ñ\82алогÑ\83 Ñ\82ем Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\81айÑ\82Ñ\83 mediawiki.org]:\n:* Ð\97аванÑ\82аживÑ\88и [https://www.mediawiki.org/wiki/Download Ð°Ñ\80Ñ\85Ñ\96в Ñ\84айлÑ\96в], Ñ\8fкий Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð´ÐµÐºÑ\96лÑ\8cка Ñ\82ем Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\96 Ñ\80озÑ\88иÑ\80енÑ\8c. Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81копÑ\96Ñ\8eваÑ\82и Ñ\82екÑ\83 <code>skins/</code> Ð· Ð½Ñ\8cого.\n:* Ð\97аванÑ\82аживÑ\88и Ð°Ñ\80Ñ\85Ñ\96ви Ð¾ÐºÑ\80емиÑ\85 Ñ\82ем Ð¾Ñ\84оÑ\80мленнÑ\8f Ð· [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Ð¡ÐºÐ»Ð¾Ð½Ñ\83вавÑ\88и Ð¾Ð´Ð¸Ð½ Ð· Ñ\80епозиÑ\82оÑ\80Ñ\96Ñ\97в <code>mediawiki/skins/*</code> Ñ\87еÑ\80ез git Ñ\83 Ð¿Ñ\96дÑ\82екÑ\83 <code dir=\"ltr\">skins/</code> Ñ\82еки, Ð´Ðµ Ð²Ñ\81Ñ\82ановлена MediaWiki.\n: Ð¦Ðµ Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð·Ð°Ñ\88кодиÑ\82и Ð²Ð°Ñ\88омÑ\83 Ñ\81Ñ\85овиÑ\89Ñ\83, Ñ\8fкÑ\89о Ð²Ð¸ MediaWiki-Ñ\80озÑ\80обник. Ð\94ив. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\97 Ð¿Ñ\80о Ñ\82е, Ñ\8fк Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82и Ñ\82еми Ð¾Ñ\84оÑ\80мленнÑ\8f Ñ\96 Ð²Ð¸Ð±Ñ\80аÑ\82и Ñ\82иповÑ\83 Ñ\82емÑ\83.\n\n; Якщо ви щойно оновили MediaWiki:\n: MediaWiki версії 1.24 і новійша більше не включає автоматично встановлені теми (див. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВи можете вставити наступні рядки в <code>LocalSettings.php</code>, щоб включити всі встановлені теми оформлення: \n\n\n<pre dir=\"ltr\">$3</pre>\n\n\n; Якщо ви щойно змінили <code>LocalSettings.php</code>:\n: Повторно перевірте назви тем на наявність помилок.",
        "default-skin-not-found-no-skins": "Ой! Типова тема оформлення для вашої вікі <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\n\nУ вас немає встановлених тем оформлення.\n\n\n; Якщо ви щойно встановили або оновили MediaWiki:\n: Ви, мабуть, зробили це з Git або безпосередньо з вихідного коду, використовуючи інший спосіб. Тоді можливе таке. MediaWiki версії 1.24 або новіша не містить теми оформлення в основному репозиторії. Спробуйте встановити деякі теми з [https://www.mediawiki.org/wiki/Category:All_skins каталогу тем оформлення сайту mediawiki.org]:\n:* Завантаживши [https://www.mediawiki.org/wiki/Download архів файлів], який містить декілька тем оформлення і розширень. Ви можете скопіювати теку <code>skins/</code> з нього.\n:* Склонувавши один з репозиторіїв <code>mediawiki/skins/*</code> через git в підтеку <code dir=\"ltr\">skins/</code> теки, де встановлена MediaWiki.\n: Це не повинно зашкодити вашому сховищу, якщо ви MediaWiki-розробник. Див. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для отримання інформації про те, як включити теми оформлення і вибрати типову тему.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (увімкнено)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''вимкнено''')",
index ca9b49c..c608578 100644 (file)
        "tog-numberheadings": "سرخیوں کو خودکار نمبر دیجئے",
        "tog-showtoolbar": "تدوینی اوزاردان دکھائیے",
        "tog-editondblclick": "طقین پر صفحات کی ترمیم کیجئے",
-       "tog-editsectiononrightclick": "سطری عنوانات پر دایاں طق کے ذریعے سطری ترمیم کاری فعال بناؤ",
+       "tog-editsectiononrightclick": "سطری عنوانات پر دایاں طق (رائیٹ کلک) کے ذریعے سطری ترمیم کاری فعال بناؤ",
        "tog-watchcreations": "میرے تخلیق کردہ صفحات اور میری زبر اثقال کردہ ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
        "tog-watchdefault": "میرے تدوین شدہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
        "tog-watchmoves": "میرے منتقل کردہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
        "tog-watchdeletion": "میرے حذف کردہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
+       "tog-watchrollback": "میں جن صفحات کو استرجع کروں وہ میری زیر نظر فہرست میں شامل کیا کریں",
        "tog-minordefault": "تمام ترمیمات کو ہمیشہ بطورِ معمولی ترمیم نشانزد کیا کرو",
        "tog-previewontop": "تدوینی خانہ سے پہلے نمائش دکھاؤ",
        "tog-previewonfirst": "پہلی ترمیم پر نمائش دکھاؤ",
@@ -48,7 +49,7 @@
        "tog-shownumberswatching": "دیکھنے والے صارفین کی تعداد دکھاؤ",
        "tog-oldsig": "موجودہ دستخط:",
        "tog-fancysig": "(سادہ دستخط بلا خودکار ربط)",
-       "tog-uselivepreview": "براہ راست نمائش (آزمائشی) استعمال کیجئے",
+       "tog-uselivepreview": "براہ راست نمائش (آزمائشی) استعمال کریں",
        "tog-forceeditsummary": "جب میں ترمیمی خلاصہ خالی چھوڑوں تو مجھے آگاہ کرو",
        "tog-watchlisthideown": "زیرِنظرفہرست سے میری ترمیمات چھپاؤ",
        "tog-watchlisthidebots": "زیرِنظرفہرست میں سے روبالی ترمیمات چھپاؤ",
        "hidden-category-category": "پوشیدہ زمرہ جات",
        "category-subcat-count": "{{PLURAL:$2|اِس زمرہ میں صرف درج ذیل ذیلی زمرہ ہے.|اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ|$1 ذیلی زمرہ جات}}, کل $2 میں سے.}}",
        "category-subcat-count-limited": "اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ ہے|$1 ذیلی زمرہ جات ہیں}}.",
-       "category-article-count": "{{PLURAL:$2|اس زمرہ میں صرف یہ درج ذیل صفحہ مشمول ہے۔|اس زمرہ کے کل $2 صفحات میں سے $1 {{PLURAL:$1|صفحہ|صفحات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}۔",
+       "category-article-count": "{{PLURAL:$2|اس زمرہ میں صرف درج ذیل صفحہ شامل کیا گیا ہے۔|اس زمرہ کے کل $2 صفحات میں سے $1 {{PLURAL:$1|صفحہ|صفحات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}۔",
        "category-article-count-limited": "یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں مشمول {{PLURAL:$1|ہے|ہیں}}۔",
+       "category-file-count": "{{PLURAL:$2|اس زمرہ میں صرف درج ذیل ملف شامل کی گئی ہے۔|اس زمرہ کی کل $2 ملفات میں سے $1 {{PLURAL:$1|ملف|ملفات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}۔",
        "category-file-count-limited": "یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں شامل {{PLURAL:$1|ہے|ہیں}}۔",
        "listingcontinuesabbrev": "۔جاری",
        "index-category": "فہرست شدہ صفحات",
        "deletethispage": "یہ صفحہ حذف کریں",
        "undeletethispage": "یہ صفحہ بحال کریں",
        "undelete_short": "بحال {{PLURAL:$1|ایک ترمیم|$1 ترامیم}}",
+       "viewdeleted_short": "{{PLURAL:$1|ایک ترمیم حذف ہوچکی|$1 ترامیم حذف ہوچکیں}}",
        "protect": "محفوظ",
        "protect_change": "تبدیل کرو",
        "protectthispage": "اس صفحےکومحفوظ کریں",
        "articlepage": "مندرجاتی صفحہ دیکھیۓ",
        "talk": "تبادلہٴ خیال",
        "views": "خیالات",
-       "toolbox": "اÙ\88زارداÙ\86",
+       "toolbox": "Ø¢Ù\84ات",
        "userpage": "صفحۂ صارف دیکھئے",
        "projectpage": "صفحۂ منصوبہ دیکھئے",
        "imagepage": "صفحۂ مسل دیکھئے",
        "otherlanguages": "دیگر زبانوں میں",
        "redirectedfrom": "($1 سے پلٹایا گیا)",
        "redirectpagesub": "لوٹایا گیا صفحہ",
+       "redirectto": "لوٹایا گیا صفحہ:",
        "lastmodifiedat": "آخری بار تدوین $2, $1 کو کی گئی۔",
        "viewcount": "اِس صفحہ تک {{PLURAL:$1|ایک‌بار|$1 مرتبہ}} رسائی کی گئی",
        "protectedpage": "محفوظ شدہ صفحہ",
        "jumptonavigation": "رہنمائی",
        "jumptosearch": "تلاش",
        "view-pool-error": "معذرت کے ساتھ، تمام معیلات پر اِس وقت اِضافی بوجھ ہے.\nبہت زیادہ صارفین اِس وقت یہ صفحہ ملاحظہ کرنے کی کوشش کررہے ہیں.\nبرائے مہربانی! صفحہ دیکھنے کیلئے دوبارہ کوشش کرنے سے پہلے ذرا انتظار فرمالیجئے.\n\n$1",
+       "generic-pool-error": "ہم معذرت خواہ ہیں! معیلات (سرورز) پر اِس وقت اِضافی بوجھ ہے.\nصارفین کی کثیر تعداد اِس وقت یہی صفحہ ملاحظہ کرنے کی کوشش کررہی ہے.\nبرائے مہربانی!دوبارہ کوشش کرنے سے پہلے ذرا انتظار فرمائیے.",
        "pool-errorunknown": "نامعلوم خطا",
+       "poolcounter-usage-error": "استعمال میں خامی: $1",
        "aboutsite": "تعارف {{SITENAME}}",
        "aboutpage": "Project:تعارف",
-       "copyright": "تمام مواد $1 کے تحت میسر ہے۔",
+       "copyright": "تمام مواد $1 کے تحت میسر ہے، جب تک کوئی دوسری وجہ نا ہو۔",
        "copyrightpage": "{{ns:project}}:حقوق تصانیف",
        "currentevents": "حالیہ واقعات",
        "currentevents-url": "Project:حالیہ واقعات",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "‘‘$1’’ مستعادہ منجانب",
        "youhavenewmessages": "آپکے لیۓ ایک $1 ہے۔ ($2)",
+       "newmessageslinkplural": "{{PLURAL:$1|نیا پیغام|999=نئے پیغاماتs}}",
        "newmessagesdifflinkplural": "آخری {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "youhavenewmessagesmulti": "ء$1 پر آپ کیلئے نئے پیغامات ہیں",
        "editsection": "ترمیم",
        "toc": "فہرست",
        "showtoc": "دکھائیں",
        "hidetoc": "چھپائیں",
+       "collapsible-collapse": "خاتمے",
        "collapsible-expand": "توسیع",
+       "confirmable-confirm": "کیا {{GENDER:$1|آپ کو}} اس بات کا یقین ہے؟",
+       "confirmable-yes": "جی ہاں",
+       "confirmable-no": "جی نہیں",
        "thisisdeleted": "دیکھیں یا بحال کریں $1؟",
        "viewdeleted": "دیکھیں $1؟",
        "restorelink": "{{PLURAL:$1|ایک ترمیم حذف ہوچکی|$1 ترامیم حذف ہوچکیں}}",
        "nospecialpagetext": "<strong>آپ نے ایک ناقص خاص صفحہ کی درخواست کی ہے.</strong>\n\n{{درست خاص صفحات کی ایک فہرست [[Special:SpecialPages|{{int:specialpages}}]] پر دیکھی جاسکتی ہے}}.",
        "error": "خطاء",
        "databaseerror": "خطائے ڈیٹابیس",
+       "databaseerror-text": "ڈیٹا بیس کیوری میں خامی پیدا ہوگئی ہے.\nیہ سافٹ ویئر میں ایک مسئلے (بگ) کی نشاندہی کر سکتے ہیں.",
+       "databaseerror-textcl": "ڈیٹا بیس کیوری میں خامی پیدا ہوگئی ہے.",
+       "databaseerror-query": "کیوری: $1",
+       "databaseerror-function": "فنکشن: $ 1",
+       "databaseerror-error": "خرابی: $ 1",
        "laggedslavemode": "انتباہ: ممکن ہے کہ صفحہ میں حالیہ بتاریخہ جات شامل نہ ہوں.\n\nWarning: Page may not contain recent updates.",
        "readonly": "ڈیٹابیس مقفل ہے",
        "enterlockreason": "قفل کیلئے کوئی وجہ درج کیجئے، بشمولِ تخمینہ کہ قفل کب کھولا جائے گا.",
        "readonlytext": "ڈیٹابیس  شاید معمول کی اصلاح کیلئے نئے اندراجات اور دوسری ترمیمات کیلئے مقفل ہے، جس کے بعد یہ عام حالت پر آجائے گا.\nمنتظم، جس نے قفل لگایا، یہ تفصیل فراہم کی ہے: $1",
        "missing-article": "ڈیٹابیس نے کسی صفحے کا متن بنام \"$1\" $2  نہیں پایا جو اِسے پانا چاہئے تھا.\n\nیہ عموماً کسی صفحے کے تاریخی یا پرانے حذف شدہ ربط کی وجہ سے ہوسکتا ہے.\n\nاگر یہ وجہ نہیں، تو آپ نے مصنع‌لطیف میں کھٹمل پایا ہے.\nبرائے مہربانی، URL کی نشاندہی کرتے ہوئے کسی [[Special:ListUsers/sysop|منتظم]] کو اِس کا سندیس کیجئے.",
        "missingarticle-rev": "(نظرثانی#: $1)",
+       "missingarticle-diff": "(فرق: $1، $2)",
        "readonly_lag": "ڈیٹابیس خودکار طور پر مقفل ہوچکا ہے تاکہ ماتحت ڈیٹابیسی معیلات کا درجہ آقا کا ہوجائے.",
        "internalerror": "خطائے اندرونی",
        "internalerror_info": "خطائے اندرونی: $1",
        "filerenameerror": "مسل \"$1\" کو \"$2\" میں بازنام نہیں کیا جاسکا.",
        "filedeleteerror": "مسل \"$1\" کو حذف نہیں کیا جاسکا.",
        "directorycreateerror": "رہنامچہ \"$1\" تخلیق نہیں کیا جاسکا.",
+       "directoryreadonlyerror": "ڈائریکٹری \"$1\" صرف پڑھنے کے لیے.",
+       "directorynotreadableerror": "ڈائریکٹری \"$1\" پڑھنے کے قابل نہیں.",
        "filenotfound": "مسل \"$1\" ڈھونڈا نہ جاسکا.",
        "unexpected": "غیرمتوقع قدر: \"$1\"=\"$2\"",
        "formerror": "خطا: ورقہ بھیجا نہ جاسکا.",
        "cannotdelete-title": "صفحہ ھذف نہیں کیا جا سکتا \"$1\"",
        "badtitle": "خراب عنوان",
        "badtitletext": "درخواست شدہ صفحہ کا عنوان ناقص، خالی، یا کوئی غلط ربط شدہ بین لسانی یا بین ویکی عنوان ہے.\nشاید اِس میں ایک یا زیادہ ایسے حروف موجود ہوں جو عنوانات میں استعمال نہیں ہوسکتے.",
-       "perfcached": "ذیلی ڈیٹا ابطن شدہ ہے اور اِس کے پُرانے ہونے کا امکان ہے. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "ذیلی ڈیٹا ابطن شدہ ہے اور آخری بار اِس کی بتاریخیت $1 کو ہوئی. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcached": "ذیلی ڈیٹا ابطن شدہ (cached) ہے اور اِس کے پُرانے ہونے کا امکان ہے. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "perfcachedts": "ذیلی ڈیٹا ابطن شدہ ہے (cached) اور آخری بار اِس کی بتاریخیت $1 کو ہوئی. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "اِس صفحہ کیلئے بتاریخات فی الحال ناقابل بنائی گئی ہیں.\nیہاں کا ڈیٹا ابھی تازہ نہیں کیا جائے گا.",
        "viewsource": "مسودہ",
+       "actionthrottled": "Action throttled",
        "actionthrottledtext": "بطورِ ایک ضدسپم تدبیر، آپ کو مختصر وقت میں کئی بار یہ عمل بجا لانے سے محدود کیا گیا، اور آپ یہ حد پار کرچکے ہیں.\nبراہِ کرم، کچھ منٹ بعد کوشش کیجئے.",
        "protectedpagetext": "اس صفحہ کو تدوین سے محفوظ رکھنے کیلیے مقفل کر دیا گیا ہے۔",
        "viewsourcetext": "آپ صرف مسودہ دیکھ سکتے ہیں اور اسکی نقل اتار سکتے ہیں:",
-       "protectedinterface": "یہ صفحہ مصنع‌لطیف کیلئے سطح‌البینی متن فراہم کرتا ہے، اور ناجائزاستعمال کے سدِباب کیلئے اِسے مقفل کیا گیا ہے.",
-       "editinginterface": "'''انتباہ: ''' آپ ایک ایسا صفحہ تدوین کر رہے ہیں جو مصنع‌لطیف کیلئے سطح‌البینی متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی ترمیم، دیگر صارفین کیلئے سطح‌البین کو تبدیل کردے گی۔\nبراہِ کرم، ترجمہ کیلئے [//translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیاویکی مقامیانی منصوبہ) استعمال کیجئے.",
+       "viewyourtext": "آپ اس مواد کو دیکھ سکتے ہیں اور اٹھا (کاپی) سکتے ہیں <strong>آپ کی ترامیم </strong>اس صفحہ پر:",
+       "protectedinterface": "یہ صفحہ سوفٹ وئیر کے لیے انٹرفیس متن فراہم کرتا ہے، اور ناجائزاستعمال کے سدِباب کے لیے اِسے مقفل کیا گیا ہے.",
+       "editinginterface": "'''انتباہ: ''' آپ ایک ایسا صفحہ تدوین کر رہے ہیں جو سوفٹ ویئر کیلئے انٹرفیس متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی ترمیم، دیگر صارفین کے لیے انٹرفیس کو تبدیل کردے گی۔\nبراہِ کرم، ترجمہ کے لیے [//translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیا ویکی دارالترجمہ) استعمال کریں.",
+       "translateinterface": "تمام ویکیوں میں تبدیلی یا شامل کرنے کے لیے، اسے استعمال کریں [//translatewiki.net/ translatewiki.net]، میڈیا ویکی دارالترجمہ.",
        "namespaceprotected": "آپ کو '''$1''' فضائے نام میں صفحات تدوین کرنے کی اِجازت نہیں ہے.",
+       "mycustomcssprotected": "آپ اس سی ایس ایس (CSS) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
+       "mycustomjsprotected": "آپ اس جاوا اسکپرٹ (JavaScript) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
+       "myprivateinfoprotected": "آپ ان ذاتی معلوات (private information) میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
+       "mypreferencesprotected": "آپ اپنی ان ترجیحات (preferences) میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "ns-specialprotected": "خاص صفحات کی تدوین نہیں کی جاسکتی.",
        "titleprotected": "اس عنوان کو [[User:$1|$1]] نے تخلیق سے محفوظ کیا ہے.\nوجہ یہ بتائی گئی ہے: \"''$2''\"",
        "exception-nologin": "غیر داخل نوشتہ",
        "deleteotherreason": "دوسری/اِضافی وجہ:",
        "deletereasonotherlist": "دوسری وجہ",
        "rollback": "ترمیمات سابقہ حالت پرواپس",
-       "rollback_short": "واپس سابقہ حالت",
        "rollbacklink": "واپس سابقہ حالت",
        "rollbackfailed": "سابقہ حالت پر واپسی ناکام",
        "cantrollback": "تدوین ثانی کا اعادہ نہیں کیا جاسکتا؛ کیونکہ اس میں آخری بار حصہ لینے والا ہی اس صفحہ کا واحد کاتب ہے۔",
index 968a02d..f12520e 100644 (file)
@@ -14,8 +14,8 @@
                ]
        },
        "tog-underline": "Havolalarning tagiga chizish:",
-       "tog-hideminor": "Yangi oʻzgarishlar roʻyxatidan kichik tahrirlarni yashirish",
-       "tog-hidepatrolled": "Yangi oʻzgarishlar roʻyxatidan tekshirilgan tahrirlarni yashirish",
+       "tog-hideminor": "Yangi oʻzgarishlar roʻyxatida kichik tahrirlarni yashirish",
+       "tog-hidepatrolled": "Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish",
        "tog-newpageshidepatrolled": "Yangi sahifalar roʻyxatidan tekshirilgan sahifalarni yashirish",
        "tog-extendwatchlist": "Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi",
        "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)",
        "permalink": "Doimiy ishorat",
        "print": "Chop etish",
        "view": "Koʻrish",
-       "view-foreign": "$1 da koʻrish",
+       "view-foreign": "$1da koʻrish",
        "edit": "Tahrirlash",
        "create": "Yaratish",
        "editthispage": "Ushbu sahifani tahrirlash",
        "copyrightpage": "{{ns:project}}:Mualliflik huquqlari",
        "currentevents": "Joriy hodisalar",
        "currentevents-url": "Project:Joriy hodisalar",
-       "disclaimers": "Ogohlantirishlar",
-       "disclaimerpage": "Project:Umumiy ogohlantirish",
+       "disclaimers": "Masʼuliyatdan voz kechish",
+       "disclaimerpage": "Project:Masʼuliyatdan voz kechish",
        "edithelp": "Tahrirlash yordami",
        "mainpage": "Bosh sahifa",
        "mainpage-description": "Bosh sahifa",
        "internalerror": "Ichki xato",
        "internalerror_info": "Ichki xato: $1",
        "filecopyerror": "\"$1\" fayl nusxasini \"$2\" fayliga koʻchirib boʻlmadi.",
-       "filerenameerror": "Faylning nomini \"$1\"dan \"$2\"ga o‘zgartirib bo‘lmadi.",
+       "filerenameerror": "Fayl nomini «$1»dan «$2»ga o‘zgartirish imkoni yoʻq.",
        "filedeleteerror": "\"$1\" faylini oʻchirib boʻlmadi.",
-       "directorycreateerror": "\"$1\" papkasini yaratib bo‘lmadi.",
+       "directorycreateerror": "\"$1\" papkasini yaratish imkoni yoʻq.",
        "filenotfound": "\"$1\" faylini topib boʻlmadi.",
        "unexpected": "Kutilmagan qiymat: \"$1\"=\"$2\".",
        "cannotdelete-title": "\"$1\" sahifasini oʻchirib boʻlmadi.",
        "editingcomment": "$1 tahrirlanmoqda (yangi mavzu)",
        "editconflict": "Tahrirlash toʻqnashuvi: $1",
        "yourtext": "Sizning matningiz",
+       "editingold": "<strong>Ogohlantirish: Siz sahifaning eski nusxasini tahrirlayapsiz.</strong>\nUni shunday holicha saqlasangiz, keyingi nusxalardagi oʻzgarishlar yoʻqotiladi.",
        "yourdiff": "Farqlar",
        "copyrightwarning": "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).\nAgar yozganlaringiz keyinchalik tahrir qilinishi va qayta tarqatilishiga rozi bo'lmasangiz, u holda bu yerga yozmang.<br />\nSiz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini va'da qilmoqdasiz.\n'''MUALLIFLIK HUQUQLARI BILAN HIMOYALANGAN ISHLARNI ZINHOR BERUXSAT YUBORMANG!'''",
        "copyrightwarning2": "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />\nBundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsat berilgan internet manzilidan yoki shu kabi erkin resursdan nusxa olgan bo'lishingiz lozim (Qo'shimcha ma'lumotlar uchun $1 sahifasiga murojaat qiling).\n'''MUALLIFLIK HUQUQI QO'YILGAN ISHLARNI RUXSATSIZ BU YERGA JOYLASHTIRMANG!'''",
        "post-expand-template-inclusion-warning": "'''Diqqat:''' Qo'llanilayotgan andozalarning jami hajmi juda katta.\nAyrim andozalar qo'shilmaydi.",
        "post-expand-template-inclusion-category": "Qo'llaniladigan andozalarning mumkin bo'lgan miqdoridan oshgan sahifalar",
        "post-expand-template-argument-category": "Andozalarning to'ldirilmagan o'zgaruvchilariga ega sahifalar",
-       "undo-summary": "[[Special:Contributions/$2|$2]] tomonidan qilingan $1 tahriri qaytarildi ([[User talk:$2|mun.]])",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|mun.]]) tomonidan qilingan $1-sonli tahrir qaytarildi",
        "viewpagelogs": "Ushbu sahifaga doir qaydlarni koʻrsat",
        "nohistory": "Ushbu sahifa uchun oʻzgarishlar tarixi mavjud emas.",
        "currentrev": "Hozirgi koʻrinishi",
        "file-anchor-link": "Fayl",
        "filehist": "Fayl tarixi",
        "filehist-help": "Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.",
-       "filehist-deleteall": "barini o'chirish",
+       "filehist-deleteall": "barchasini oʻchirish",
        "filehist-deleteone": "o‘chirish",
        "filehist-revert": "qaytarish",
        "filehist-current": "joriy",
        "imagelinks": "Fayllarga ishoratlar",
        "linkstoimage": "Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:",
        "nolinkstoimage": "Bu faylga bogʻlangan sahifalar yoʻq.",
-       "sharedupload": "Ushbu fayl $1dan va boshqa loyihalarda ham qo'llanilishi mumkin.",
-       "sharedupload-desc-here": "Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.\nUning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.",
+       "sharedupload": "Ushbu fayl $1ga yuklangan, shuning uchun boshqa loyihalarda ham qoʻllanilishi mumkin.",
+       "sharedupload-desc-there": "Ushbu fayl $1ga yuklangan boʻlib, boshqa loyihalarda ham qoʻllanilishi mumkin.\nQoʻshimcha maʼlumotlarni uning [$2 tavsif sahifasidan] topishingiz mumkin.",
+       "sharedupload-desc-here": "Ushbu fayl $1ga yuklangan boʻlib, boshqa loyihalarda ham qoʻllanilishi mumkin.\nUning [$2 tavsif sahifasidan] olingan maʼlumot quyida keltirilgan.",
+       "sharedupload-desc-edit": "Ushbu fayl $1ga yuklangan boʻlib, boshqa loyihalarda ham qoʻllanilishi mumkin.\nUning tavsifini [$2 mos sahifada] oʻzgartirishingiz mumkin.",
+       "sharedupload-desc-create": "Ushbu fayl $1ga yuklangan boʻlib, boshqa loyihalarda ham qoʻllanilishi mumkin.\nUning tavsifini [$2 mos sahifada] tahrirlashingiz mumkin.",
        "uploadnewversion-linktext": "Bu faylning yangi versiyasini yuklash",
+       "shared-repo-from": "$1dan",
+       "shared-repo": "umumiy fayllar saqlanadigan joy",
+       "shared-repo-name-wikimediacommons": "Vikiombor",
        "filerevert-comment": "Sabab:",
        "filedelete-comment": "Sabab:",
        "filedelete-submit": "O‘chirish",
        "prefixindex": "Prefiksli barcha sahifalar",
        "protectedpages": "Himoyalangan sahifalar",
        "listusers": "Foydalanuvchilar roʻyxati",
-       "usercreated": "$1 $2da {{GENDER:$3|ro'yxatdan o'tdi}}",
+       "usercreated": "$1, $2 da {{GENDER:$3|roʻyxatdan oʻtgan}}",
        "newpages": "Yangi sahifalar",
        "move": "Ko‘chirish",
        "movethispage": "Bu sahifani koʻchirish",
        "deletereasonotherlist": "Boshqa sabab",
        "delete-edit-reasonlist": "Sabablar roʻyxatini tahrirlash",
        "rollback": "Oʻzgarishlarni eski holiga keltirish",
-       "rollback_short": "Eski holiga keltirish",
        "rollbacklink": "eski holiga keltirish",
        "rollbacklinkcount": "$1 ta tahrirni ortga qaytarish",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1| tadan koʻp tahrir}}ni eski holiga keltirish",
index 3d36037..d0b29db 100644 (file)
        "watchlisttools-edit": "Varda e canbia le pagine tegnùe d'ocio",
        "watchlisttools-raw": "Canbia la lista in formato testo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|msj]])",
-       "unknown_extension_tag": "Tag estension sconossiùo: \"$1\"",
        "duplicate-defaultsort": "Ocio: la ciave de ordinamento predefinìa \"$2\" la va in conflito co' quela de prima \"$1\".",
        "version": "Version",
        "version-extensions": "Estension instalè",
index c5b5512..3042aec 100644 (file)
@@ -26,7 +26,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Tranquanganh",
-                       "Max20091"
+                       "Max20091",
+                       "Dinhxuanduyet"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
@@ -54,7 +55,7 @@
        "tog-shownumberswatching": "Hiển thị số người đang xem",
        "tog-oldsig": "Chữ ký hiện tại:",
        "tog-fancysig": "Xem chữ ký là mã wiki (không có liên kết tự động)",
-       "tog-uselivepreview": "Xem trước trực tiếp (thử nghiệm)",
+       "tog-uselivepreview": "Xem trước trực tiếp",
        "tog-forceeditsummary": "Nhắc tôi khi tôi quên tóm lược sửa đổi",
        "tog-watchlisthideown": "Ẩn các sửa đổi của tôi khỏi danh sách theo dõi",
        "tog-watchlisthidebots": "Ẩn các sửa đổi của robot khỏi danh sách theo dõi",
        "pool-queuefull": "Đầy hàng đợi khối ứng dụng (pool queue)",
        "pool-errorunknown": "Lỗi lạ",
        "pool-servererror": "Dịch vụ chia việc xử lý (pool counter) không có sẵn ($1).",
+       "poolcounter-usage-error": "Lỗi sử dụng: $1",
        "aboutsite": "Giới thiệu {{SITENAME}}",
        "aboutpage": "Project:Giới thiệu",
        "copyright": "Nội dung được phát hành theo $1, ngoại trừ khi có ghi chú khác.",
        "anoneditwarning": "<strong>Cảnh báo:</strong> Bạn chưa đăng nhập. Địa chỉ IP của bạn sẽ bị hiển thị công khai nếu bạn thực hiện bất kỳ sửa đổi nào. Nếu bạn <strong>[$1 đăng nhập]</strong> hoặc <strong>[$2 mở tài khoản]</strong>, sửa đổi của bạn sẽ được gán bởi tên đăng nhập của bạn, cùng nhiều lợi ích khác.",
        "anonpreviewwarning": "''Bạn chưa đăng nhập. Khi lưu trang này, địa chỉ IP của bạn sẽ được ghi vào lịch sử trang.''",
        "missingsummary": "'''Nhắc nhở:''' Bạn đã không ghi lại tóm lược sửa đổi. Nếu bạn nhấn Lưu trang một lần nữa, sửa đổi của bạn sẽ được lưu mà không có tóm lược.",
+       "selfredirect": "<strong>Cảnh báo:</strong> Bạn sắp đổi hướng trang này đến chính trang này.\nCó lẽ bạn đã định rõ mục tiêu sai hoặc bạn đang sửa trang sai.\nNếu bạn bấm “{{int:savearticle}}” lần nữa, trang đổi hướng sẽ được tạo ra.",
        "missingcommenttext": "Xin hãy gõ vào lời bàn luận ở dưới.",
        "missingcommentheader": "'''Nhắc nhở:''' Bạn chưa ghi chủ đề/tiêu đề cho bàn luận này.\nNếu bạn nhấn nút \"{{int:savearticle}}\" lần nữa, sửa đổi của bạn sẽ được lưu mà không có đề mục.",
        "summary-preview": "Xem trước dòng tóm lược:",
        "content-model-text": "văn bản thuần",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Đối tượng trống",
+       "content-json-empty-array": "Mảng trống",
        "duplicate-args-category": "Trang đưa đối số thừa vào bản mẫu",
        "duplicate-args-category-desc": "Trang đưa một đối số nhiều lần vào một bản mẫu được nhúng, thí dụ <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> hoặc <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Cảnh báo: Trang này có quá nhiều lần gọi hàm cú pháp cần mức độ xử lý cao.\n\nNó nên ít hơn $2 {{PLURAL:$2|lần gọi|lần gọi}}, hiện giờ đang là {{PLURAL:$1|$1 lần gọi|$1 lần gọi}}.",
        "history-feed-empty": "Trang bạn yêu cầu không tồn tại. Có thể là nó đã bị xóa khỏi wiki hay được đổi tên. Hãy [[Special:Search|tìm kiếm trong wiki]] về các trang mới có liên quan.",
        "rev-deleted-comment": "(tóm lược sửa đổi đã bị xóa)",
        "rev-deleted-user": "(tên người dùng đã bị xóa)",
-       "rev-deleted-event": "(tác vụ nhật trình đã bị xóa)",
+       "rev-deleted-event": "(chi tiết nhật trình đã bị xóa)",
        "rev-deleted-user-contribs": "[tên người dùng hay địa chỉ IP bị ẩn – sửa đổi được ẩn khỏi danh sách đóng góp]",
        "rev-deleted-text-permission": "Phiên bản này đã bị '''xóa'''.\nCó thể có thêm chi tiết tại [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
        "rev-suppressed-text-permission": "Phiên bản này đã bị '''ẩn'''.\nCó thêm chi tiết tại [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} nhật trình ẩn].",
        "revdelete-legend": "Thiết lập hạn chế khả kiến",
        "revdelete-hide-text": "Nội dung phiên bản",
        "revdelete-hide-image": "Ẩn nội dung tập tin",
-       "revdelete-hide-name": "Ẩn tác vụ và đích của tác vụ",
+       "revdelete-hide-name": "Ẩn mục tiêu và tham số",
        "revdelete-hide-comment": "Tóm lược sửa đổi",
        "revdelete-hide-user": "Tên người dùng hay địa chỉ IP của người viết trang",
        "revdelete-hide-restricted": "Ẩn giấu thông tin khỏi các Quản lý lẫn thành viên khác",
        "right-protect": "Thay đổi mức khóa và sửa trang khóa theo tầng",
        "right-editprotected": "Sửa trang khóa ở mức “{{int:protect-level-sysop}}”",
        "right-editsemiprotected": "Sửa trang khóa ở mức “{{int:protect-level-autoconfirmed}}”",
+       "right-editcontentmodel": "Sửa mô hình nội dung của trang",
        "right-editinterface": "Sửa giao diện người dùng",
        "right-editusercssjs": "Sửa tập tin CSS và JS của người dùng khác",
        "right-editusercss": "Sửa tập tin CSS của người dùng khác",
        "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",
        "action-editmyprivateinfo": "sửa đổi thông tin cá nhân của bạn",
+       "action-editcontentmodel": "sửa mô hình nội dung của trang",
        "nchanges": "$1 {{PLURAL:$1|thay đổi|thay đổi}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}",
        "enhancedrc-history": "lịch sử",
        "uploaderror": "Lỗi khi tải lên",
        "upload-recreate-warning": "'''Cảnh báo: Một tập tin với tên này đã từng bị xóa hoặc di chuyển.'''\n\nNhật trình xóa và di chuyển của trang này được ghi ở dưới để bạn tiện theo dõi:",
        "uploadtext": "Hãy sử dụng mẫu sau để tải tập tin lên.\nĐể xem hoặc tìm kiếm những hình ảnh đã được tải lên trước đây, xin mời xem [[Special:FileList|danh sách các tập tin đã tải lên]].\nviệc tải lên và tải lên lại được ghi lại trong [[Special:Log/upload|nhật trình tải lên]], việc xóa đi được ghi trong [[Special:Log/delete|nhật trình xóa]].\n\nĐể đưa tập tin vào trang, hãy dùng liên kết có một trong các dạng sau:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tập tin.jpg]]</nowiki></code>''' để phiên bản đầy đủ của tập tin\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tập tin.png|200px|nhỏ|trái|văn bản thay thế]]</nowiki></code>''' để dùng hình đã được co lại còn 200 điểm ảnh chiều rộng đặt trong một hộp ở lề bên trái với 'văn bản thay thế' dùng để mô tả\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tập tin.ogg]]</nowiki></code>''' để liên kết trực tiếp đến tập tin mà không hiển thị nó",
-       "upload-permitted": "Các định dạng tập tin được phép tải lên: $1.",
-       "upload-preferred": "Các định dạng tập tin nên dùng: $1.",
-       "upload-prohibited": "Các định dạng tập tin bị cấm: $1.",
+       "upload-permitted": "{{PLURAL:$2|Định dạng|Các định dạng}} tập tin được phép tải lên: $1.",
+       "upload-preferred": "{{PLURAL:$1|Định dạng|Các định dạng}} tập tin nên dùng: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Định dạng|Các định dạng}} tập tin bị cấm: $1.",
        "uploadlogpage": "Nhật trình tải lên",
        "uploadlogpagetext": "Dưới đây là danh sách các tập tin đã tải lên gần nhất.\nXem [[Special:NewFiles|trang trưng bày các tập tin mới]] để xem trực quan hơn.",
        "filename": "Tên tập tin",
        "deleteprotected": "Bạn không thể xóa trang này vì nó đã được khóa lại.",
        "deleting-backlinks-warning": "'''Cảnh báo:''' Có [[Special:WhatLinksHere/{{FULLPAGENAME}}|trang khác]] liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
        "rollback": "Lùi tất cả sửa đổi",
-       "rollback_short": "Lùi tất cả",
        "rollbacklink": "lùi tất cả",
        "rollbacklinkcount": "lùi tất cả $1 sửa đổi",
        "rollbacklinkcount-morethan": "lùi tất cả hơn $1 sửa đổi",
        "namespace": "Không gian tên:",
        "invert": "Đảo ngược lựa chọn",
        "tooltip-invert": "Ẩn các thay đổi trong các không gian tên được chọn và tương ứng",
+       "tooltip-whatlinkshere-invert": "Đánh dấu hộp kiểm này để ẩn các liên kết từ các trang nằm trong không gian tên đã chọn.",
        "namespace_association": "Không gian tên cùng đôi",
        "tooltip-namespace_association": "Cũng ẩn không gian tên thảo luận hoặc nội dung ứng với không gian được chọn",
        "blanknamespace": "(Chính)",
        "thumbnail-temp-create": "Không thể tạo tập tin hình nhỏ tạm thời",
        "thumbnail-dest-create": "Không thể lưu hình nhỏ vào đường dẫn đích",
        "thumbnail_invalid_params": "Tham số hình thu nhỏ không hợp lệ",
+       "thumbnail_toobigimagearea": "Tập tin có kích cỡ lớn hơn $1",
        "thumbnail_dest_directory": "Không thể tạo thư mục đích",
        "thumbnail_image-type": "Không hỗ trợ kiểu hình này",
        "thumbnail_gd-library": "Cấu hình thư viện GD chưa hoàn thành: thiếu hàm $1",
        "import-logentry-interwiki": "đã nhập vào $1 từ wiki khác",
        "import-logentry-interwiki-detail": "Đã nhập $1 phiên bản từ $2",
        "javascripttest": "Kiểm thử JavaScript",
-       "javascripttest-title": "Đang chạy $1 ca kiểm thử",
        "javascripttest-pagetext-noframework": "Trang này dành cho việc chạy các ca kiểm thử JavaScript.",
        "javascripttest-pagetext-unknownframework": "Nền tảng kiểm thử không rõ “$1”.",
+       "javascripttest-pagetext-unknownaction": "Tác vụ không rõ “$1”.",
        "javascripttest-pagetext-frameworks": "Hãy chọn một trong những nền tảng kiểm thử sau: $1",
        "javascripttest-pagetext-skins": "Hãy chọn giao diện để sử dụng với các ca kiểm thử:",
        "javascripttest-qunit-intro": "Xem [$1 tài liệu kiểm thử] tại mediawiki.org.",
-       "javascripttest-qunit-heading": "Tập kiểm thử QUnit JavaScript MediaWiki",
        "tooltip-pt-userpage": "Trang cá nhân của tôi",
        "tooltip-pt-anonuserpage": "Trang của IP bạn đang dùng",
        "tooltip-pt-mytalk": "Thảo luận với tôi",
        "hebrew-calendar-m11": "Av",
        "hebrew-calendar-m12": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|thảo luận]])",
-       "unknown_extension_tag": "Không hiểu thẻ mở rộng “$1”",
        "duplicate-defaultsort": "Cảnh báo: Từ khóa xếp mặc định “$2” ghi đè từ khóa trước, “$1”.",
        "duplicate-displaytitle": "<strong>Cảnh báo:</strong> Tên hiển thị “$2” ghi đè tên hiển thị “$1” bên trên.",
        "invalid-indicator-name": "<strong>Lỗi:</strong> Không thể để trống thuộc tính <code>name</code> của cái chỉ trạng thái trang.",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath?uselang=vi Đường dẫn bài]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath?uselang=vi Đường dẫn kịch bản]",
+       "version-libraries": "Các thư viện đã cài đặt",
+       "version-libraries-library": "Thư viện",
+       "version-libraries-version": "Phiên bản",
        "redirect": "Đổi hướng đến tập tin, người dùng, trang, hoặc số phiên bản",
        "redirect-legend": "Đổi hướng đến tập tin hoặc trang",
        "redirect-summary": "Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản hoặc số trang được cho vào), hoặc trang cá nhân (theo số thành viên). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], hoặc [[{{#Special:Redirect}}/user/101]].",
        "specialpages-group-wiki": "Dữ liệu và công cụ",
        "specialpages-group-redirects": "Đang đổi hướng trang đặc biệt",
        "specialpages-group-spam": "Công cụ chống spam",
+       "specialpages-group-developer": "Công cụ dành cho lập trình viên",
        "blankpage": "Trang trắng",
        "intentionallyblankpage": "Trang này được chủ định để trắng",
        "external_image_whitelist": " #Hãy để yên dòng này<pre>\n#Hãy đặt các mẩu biểu thức chính quy (chỉ gồm phần ở giữa //) vào phía dưới\n#Những mẩu này sẽ được so trùng với địa chỉ URL của hình ảnh được nhúng trực tiếp từ bên ngoài\n#Những địa chỉ nào trùng sẽ hiển thị thành hình ảnh, nếu không thì chỉ hiển thị liên kết đến hình\n#Những dòng bắt đầu bằng # được xem là chú thích\n#Không phân biệt chữ hoa chữ thường\n\n#Hãy đặt các mẩu biểu thức chính quy ở phía trên dòng này. Hãy để yên dòng này</pre>",
        "dberr-problems": "Xin lỗi! Trang này đang gặp phải những khó khăn về kỹ thuật.",
        "dberr-again": "Xin thử đợi vài phút rồi tải lại trang.",
        "dberr-info": "(Không thể liên lạc với máy chủ cơ sở dữ liệu: $1)",
-       "dberr-info-hidden": "(Không thể liên lạc với máy chủ cơ sở dữ liệu)",
+       "dberr-info-hidden": "(Không thể liên lạc với cơ sở dữ liệu)",
        "dberr-usegoogle": "Bạn có thể thử tìm trên Google trong khi chờ đợi.",
        "dberr-outofdate": "Chú ý rằng các chỉ mục của Google có thể đã lỗi thời.",
        "dberr-cachederror": "Sau đây là bản sao được lưu bộ đệm của trang bạn muốn xem, và có thể đã lỗi thời.",
        "expand_templates_generate_xml": "Xem cây phân tích XML",
        "expand_templates_generate_rawhtml": "Hiển thị HTML thô",
        "expand_templates_preview": "Xem trước",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.</em>\n\n<strong>Nếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.</strong>\nNếu vẫn không được, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.",
+       "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.</em>\n\n<strong>Nếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.</strong>\nNếu vẫn không được, hãy [[Special:UserLogin|đăng nhập]] và thử lại lần nữa.",
        "pagelanguage": "Chọn ngôn ngữ trang",
        "pagelang-name": "Trang",
        "pagelang-language": "Ngôn ngữ",
        "log-name-pagelang": "Nhật trình thay đổi ngôn ngữ",
        "log-description-pagelang": "Nhật trình này ghi các thay đổi ngôn ngữ của các trang.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2}}đã đổi ngôn ngữ của trang $3 từ $4 thành $5.",
-       "default-skin-not-found": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nViệc cài đặt của bạn dường như bao gồm những giao diện sau đây. Xin xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.\n\n$2\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Có lẽ bạn đã cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này đã nằm trong tính toán của chúng tôi. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org] bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki.\n\n; Nếu bạn vừa mới nâng cấp MediaWiki:\n: Phiên bản MediaWiki 1.24 trở lên không còn tự động kích hoạt giao diện đã cài đặt (xem [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Hướng dẫn: Tự động dò giao diện]). Bạn có thể dán những dòng lệnh vào <code>LocalSettings.php</code> để kích hoạt tất cả giao diện hiện đã được cài dặt:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Nếu bạn vừa mới chỉnh sửa <code>LocalSettings.php</code>:\n: Kiểm tra lại tên các giao diện xem có lỗi đánh máy nào không.",
-       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
+       "default-skin-not-found": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nViệc cài đặt của bạn dường như bao gồm những giao diện sau đây. Xin xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.\n\n$2\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Có lẽ bạn đã cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này đã nằm trong tính toán của chúng tôi. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org] bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki.\n\n; Nếu bạn vừa mới nâng cấp MediaWiki:\n: Phiên bản MediaWiki 1.24 trở lên không còn tự động kích hoạt giao diện đã cài đặt (xem [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Hướng dẫn: Tự động dò giao diện]). Bạn có thể dán những dòng lệnh vào <code>LocalSettings.php</code> để kích hoạt tất cả giao diện hiện đã được cài dặt:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Nếu bạn vừa mới chỉnh sửa <code>LocalSettings.php</code>:\n: Kiểm tra lại tên các giao diện xem có lỗi đánh máy nào không.",
+       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (kích hoạt)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''vô hiệu hóa''')",
        "mediastatistics": "Thống kê phương tiện",
index 72ea504..e4c02cf 100644 (file)
@@ -25,6 +25,7 @@
        "tog-watchdefault": "Panõq perräkaemisnimekirjä muq muudõduq leheq ja teedüstüq",
        "tog-watchmoves": "Panõq muq ümbrenõstõduq leheq ja teedüstüq muq perräkaemisnimekirjä",
        "tog-watchdeletion": "Panõq mu kistutõduq leheküleq mu perräkaemisnimekirjä",
+       "tog-watchrollback": "Panõq perräkaemisnimekirjä mano leheq, kon ma olõ uma muutmisõ tagasi võtnuq.",
        "tog-minordefault": "Märgiq kõik parandusõq vaikimiisi väikeisis paranduisis",
        "tog-previewontop": "Näütäq proovikaehust inne, mitte perän toimõnduskasti",
        "tog-previewonfirst": "Näütäq edimädse toimõndusõ aigo proovikaehust",
@@ -35,7 +36,7 @@
        "tog-shownumberswatching": "Näütäq, ku pall'o pruukjit taa lehe perrä kaes",
        "tog-oldsig": "Parhillanõ alakirotus:",
        "tog-fancysig": "Pruugiq vikiteksti moodulist alakirotust (ilma automaatsõ lingildä)",
-       "tog-uselivepreview": "Pruugiq õkvakipõkaehust (proomivõimalus)",
+       "tog-uselivepreview": "Pruugiq õkvakipõkaehust",
        "tog-forceeditsummary": "Annaq teedäq, ku olõ-i kirotõt kokkovõtõt",
        "tog-watchlisthideown": "Näüdäku-i perräkaemisnimekirän mu hindä toimõnduisi",
        "tog-watchlisthidebots": "Näüdäku-i perräkaemisnimekirän robotidõ toimõnduisi",
        "permalink": "Püsülink",
        "print": "Trüküq vällä",
        "view": "Näütäq",
+       "view-foreign": "Kaeq $1 pääl",
        "edit": "Toimõndaq",
+       "edit-local": "Toimõndaq paigapäälist seletüst",
        "create": "Luuq leht",
+       "create-local": "Luuq paigapääline seletüs",
        "editthispage": "Toimõndaq seod artiklit",
        "create-this-page": "Luuq seo leht",
        "delete": "Kistudaq ärq",
        "otherlanguages": "Tõisin keelin",
        "redirectedfrom": "(Ümbre saadõt artiklist $1)",
        "redirectpagesub": "Ümbresaatmislehekülg",
+       "redirectto": "Ümbre saadõt lehele:",
        "lastmodifiedat": "Seo leht om viimäte muudõt $2, $1.",
        "viewcount": "Seo lehe pääl om käüt $1 {{PLURAL:$1|kõrd|kõrda}}.",
        "protectedpage": "Kaidsõt artikli",
        "jumptonavigation": "juhtminõ",
        "jumptosearch": "otsminõ",
        "view-pool-error": "Serveriq ommaq parhilla üle koormaduq.\nPall'o hulga pruukjit pruuv kõrraga seod lehte kaiaq.\nOlõq hää, oodaq vähäkese inne ku vahtsõst proomit.\n\n$1",
+       "generic-pool-error": "Serveriq ommaq parhilla üle koormaduq.\nPall'o hulga pruukjit pruuv kõrraga seod lehte kaiaq.\nOlõq hää, oodaq vähäkese inne ku vahtsõst proomit.",
        "pool-timeout": "Kinniqpidämise uutmisaig om läbi",
        "pool-queuefull": "Kinniqpandmiisi järekõrd om täüs",
        "pool-errorunknown": "Tiidmäldä hädä",
+       "pool-servererror": "Pool counter-teenüst saa-ai pruukiq ($1).",
+       "poolcounter-usage-error": "Pruukmisviga: $1",
        "aboutsite": "{{SITENAME}} tutvustus",
        "aboutpage": "Project:Pääteedüs",
        "copyright": "Teksti või vabalt pruukiq litsendsi $1 perrä, ku olõ-õi tõisildõ üteld.",
        "ok": "Hää külh",
        "retrievedfrom": "Vällä otsit teedüskogost \"$1\"",
        "youhavenewmessages": "Sul om $1 ($2).",
-       "youhavenewmessagesfromusers": "Sullõ om $1 {{PLURAL:$3|ütelt|$3}} pruukjalt ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Sullõ om}} $1 {{PLURAL:$3|ütelt|$3 pruukjalt}} ($2).",
        "youhavenewmessagesmanyusers": "Sullõ om $1 pall'odõlt pruukjilt ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|vahtsõnõ sõnnom|999=vahtsit sõnomit}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|viimäne muutminõ|999=viimädseq muutmisõq}}",
        "hidetoc": "käkiq",
        "collapsible-collapse": "Käkiq ärq",
        "collapsible-expand": "Näütäq",
+       "confirmable-confirm": "Kas {{GENDER:$1|olõt}} kimmäs?",
+       "confirmable-yes": "Jah",
+       "confirmable-no": "Ei",
        "thisisdeleted": "Kaeq vai tiiq tagasi $1?",
        "viewdeleted": "Näüdädäq $1?",
        "restorelink": "{{PLURAL:$1|üts kistutõt muutminõ|$1 kustutõdut muutmist}}",
        "filerenameerror": "Es saaq teedüstüt \"$1\" teedüstüs \"$2\" ümbre nimetäq.",
        "filedeleteerror": "Teedüstüt nimega \"$1\" saa-i ärq kistutaq.",
        "directorycreateerror": "Saa-s luvvaq kausta \"$1\".",
+       "directoryreadonlyerror": "Kataloog \"$1\" om kirotuskaidsõt.",
+       "directorynotreadableerror": "Kataloog \"$1\" olõ-õi loetav.",
        "filenotfound": "Lövvä es teedüstüt \"$1\".",
        "unexpected": "Uutmaldaq väärtüs: \"$1\"=\"$2\".",
        "formerror": "Viga: vormi saa es pästäq",
        "viewsourcetext": "Võit kaiaq ja kopidaq taa lehe lättekoodi:",
        "viewyourtext": "Saat kaiaq ja kopidaq noidõ muutmiisi lätteteksti, miä sa seo lehe pääle '''esiq''' tennüq olõt:",
        "protectedinterface": "Taa lehe pääl om tarkvara pruukjapalgõ tekst. Leht om lukku pant, et taad saasi-i ärq ts'urkiq. \nKu tahat tetäq ümbrepandmiisi (midä pruukvaq kõik vikiq) pruugiq tuus MediaWiki ümbrepandmisõ tüükeskkunda [//translatewiki.net/ translatewiki.net].",
-       "editinginterface": "'''Hoiatus:''' Sa toimõndat tarkvara pruukjapalgõ tekstiga lehte. Ku siin midä muudat, mõotas tuu pruukjapalõt. Ümbrepandmisõs tasos pruukiq MediaWiki ümbrepandmisõ tüükeskkunda [//translatewiki.net/ translatewiki.net].",
+       "editinginterface": "<strong>Hoiatus:</strong> Sa toimõndat tarkvara pruukjapalgõ tekstiga lehte. \nKu siin midä muudat, mõotas tuu pruukjapalõt.",
+       "translateinterface": "Et tetäq vai muutaq ümbrepandmiisi ütskõik määntse viki jaos, pruugiq MediaWiki ümbrepandmiskeskkunda [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "Taa leht om kirotuskaidsõt, selle et taa {{PLURAL:$1|kuulus alanolõvidõ kaidsõtuidõ lehti hulka|kuulus alanolõvidõ kaidsõtuidõ lehti hulka}}:\n$2",
        "namespaceprotected": "Sul olõ-i lubat toimõndaq nimeruumi '''$1''' lehti.",
+       "myprivateinfoprotected": "Sul olõ-õi lubat ummi eräandmit muutaq.",
+       "mypreferencesprotected": "Sul olõ-õi lubat ummi säädmiisi muutaq.",
        "ns-specialprotected": "Tallituslehekülgi ei saaq toimõndaq.",
        "titleprotected": "Pruukja [[User:$1|$1]] om sääntse nimega lehe luumisõ ärq kiildnüq põhjusõga: ''$2''.",
+       "exception-nologin": "Olõ-i nimega sisse mint",
+       "exception-nologin-text": "Seo lehe vai tegemise mano päsemises piät nomega sisse minemä.",
+       "exception-nologin-text-manual": "Seolõ lehele vai tegemisele mano päsemises piät $1.",
        "virus-badscanner": "Viga säädmiisin: tundmalda viirusõkaidsõq: ''$1''",
        "virus-scanfailed": "viirusõotsminõ lää-s kõrda (viakuud $1)",
        "virus-unknownscanner": "tundmalda viirusõkaidsõq:",
-       "logouttext": "'''Olõt nime alt vällä lännüq.'''\n\nVõit {{SITENAME}}t ilma nimeldä edesi toimõndaq vai <span class='plainlinks'>[$1 vahtsõst sama vai tõõsõ nimega sisse minnäq]</span>.\nTähelepandmisõs: niikavva, ku sa olõ-i tühäs tennüq uma võrgokaeja vaihõmällo, võivaq mõnõq leheküleq iks viil näüdädäq, nigu sa olõsi nimega seen.",
+       "logouttext": "'''Olõt nime alt vällä lännüq.'''\n\nTähelepandmisõs: niikavva, ku sa olõ-i tühäs tennüq uma võrgokaeja vaihõmällo, võivaq mõnõq leheküleq iks viil näüdädäq, nigu sa olõsi nimega seen.",
+       "welcomeuser": "Olõq terveq tulõma, $1!",
+       "welcomecreation-msg": "Suq pruukjakonto om valmis.\nKu tahat, saat muutaq ummi {{SITENAME}} [[Special:Preferences|säädmiisi]].",
        "yourname": "Pruukjanimi",
+       "userlogin-yourname": "Pruukjanimi",
+       "userlogin-yourname-ph": "Kirodaq uma pruukjanimi",
+       "createacct-another-username-ph": "Kirodaq pruukjanimi",
        "yourpassword": "Salasõna",
+       "userlogin-yourpassword": "Salasõna",
+       "userlogin-yourpassword-ph": "Kirodaq uma salasõna",
+       "createacct-yourpassword-ph": "Kirodaq salasõna",
        "yourpasswordagain": "Kirodaq viilkõrd salasõna",
+       "createacct-yourpasswordagain": "Kinnüdäq uma salasõna",
+       "createacct-yourpasswordagain-ph": "Kirodaq salasõna vahtsõst",
        "remembermypassword": "Jätäq salasõna miilde (kooniq $1 {{PLURAL:$1|pääväs|pääväs}})",
+       "userlogin-remembermypassword": "Jääq uma nimega sisse",
+       "userlogin-signwithsecure": "Pruugiq kaidsõtut võrgoütistüst",
        "yourdomainname": "Võrgonimi",
+       "password-change-forbidden": "Seon vikin saa-ai salasõnno muutaq.",
        "externaldberror": "Välitsen kimmästegemisteedüskogon om viga vai olõ-i sul lubat umma pruukjanimme muutaq.",
        "login": "Nimega sisseminek",
        "nav-login-createaccount": "Mineq nimega sisse",
        "logout": "Nime alt välläminek",
        "userlogout": "Mineq nime alt vällä",
        "notloggedin": "Olõ-i nimega sisse mint",
+       "userlogin-noaccount": "Sul olõ-i viil pruukjanimme?",
+       "userlogin-joinproject": "Nakkaq {{SITENAME}} pruukjas!",
        "nologin": "Sul olõ-i viil pruukjanimme? '''$1'''.",
        "nologinlink": "Tiiq hindäle pruukjanimi",
        "createaccount": "Tiiq pruukjanimi ärq",
        "gotaccount": "Ku sul jo om uma pruukjanimi, sis '''$1'''.",
        "gotaccountlink": "võit nimega sisse minnäq",
        "userlogin-resetlink": "Kas olõt uma salasõna ärq unõhtanuq?",
-       "createaccountmail": "e-postiga",
+       "userlogin-resetpassword-link": "Kas salasõna läts' meelest ärq?",
+       "userlogin-helplink2": "Nimega sisseminemise abi",
+       "userlogin-createanother": "Luuq tõõnõ konto",
+       "createacct-emailrequired": "E-postiaadrõs",
+       "createacct-emailoptional": "E-postiaadrõs (või ka kirotamalda jättäq)",
+       "createacct-email-ph": "Kirodaq uma e-postiaadrõss",
+       "createacct-another-email-ph": "Kirodaq e-postiaadrõss",
+       "createaccountmail": "Pruugiq aotlist johuslist salasõnna ja saadaq tuu annõdu aadrõsi pääle",
+       "createacct-realname": "Peris nimi (või ka kirotamalda jättäq)",
        "createaccountreason": "Põhjus:",
+       "createacct-reason": "Põhjus",
+       "createacct-reason-ph": "Mille tahat luvvaq tõõsõ pruukjakonto?",
+       "createacct-captcha": "Kaitsõkontroll",
+       "createacct-imgcaptcha-ph": "Kirodaq seo tekst, midä tan näet",
+       "createacct-submit": "Luuq konto",
+       "createacct-another-submit": "Luuq tõõnõ konto",
+       "createacct-benefit-heading": "{{SITENAME}} um luud sääntsilsamol inemiisil, nigu saq.",
+       "createacct-benefit-body1": "{{PLURAL:$1|muutminõ|muutmist}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|lehekülg|lehekülge}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|ildaaigo toimõndanuq pruukja|ildaaigo toimõndanut pruukjat}}",
        "badretype": "Kirotõduq salasõnaq ei klapiq kokko.",
        "userexists": "Taad pruukjanimme jo pruugitas.\nValiq tõõnõ nimi.",
        "loginerror": "Sisseminemise viga",
+       "createacct-error": "Pruukjanome luumisõ viga",
        "createaccounterror": "Pruukjanime luuminõ lää-äs kõrda: $1",
        "nocookiesnew": "Pruukjakonto om valmis, a sa päse-s sisse, selle et {{SITENAME}} tarvitas pruukjidõ kimmästegemises valmistuisi. Suq võrgokaejan ommaq valmistusõq ärq keeledüq. Säeq valmistusõq lubatus ja mineq sis uma vahtsõ pruukjanime ja salasõnaga sisse.",
        "nocookieslogin": "{{SITENAME}} tarvitas pruukjidõ kimmästegemises valmistuisi. Suq võrgokaejan ommaq valmistusõq keeledüq. Säeq valmistusõq lubatus ja prooviq vahtsõst.",
+       "nocookiesfornew": "Pruukjanimme saa-as luvvaq, miiq saa-as kinnütüst tuu lätte kotsilõ.\nKaeq üle, kas sul ummaq lisaprogrammiq (cookie'q) lubaduq ja laadiq seo leht vahtsõst.",
        "noname": "Võlssi kirotõt pruukjanimi.",
        "loginsuccesstitle": "Sisseminek läts' kõrda",
        "loginsuccess": "Olõt nimega sisse lännüq. Suq pruukjanimi om \"$1\".",
        "nosuchuser": "\"$1\" nimelist pruukjat olõ-i olõman.\nKaeq kiräpilt üle vai [[Special:UserLogin/signup|luuq vahtsõnõ pruukjanimi]].",
        "nosuchusershort": "\"$1\" nimelist pruukjat olõ-i olõman. Kas kirotit iks nime õigõhe?",
        "nouserspecified": "Olõ-i kirotõt pruukjanimme.",
+       "login-userblocked": "Seo pruukja om kinniq peet. Nimega sisseminemine olõ-õi lubat.",
        "wrongpassword": "Kirotõt võlss salasõna. Prooviq vahtsõst.",
        "wrongpasswordempty": "Salasõna tohe-i tühi ollaq.",
-       "passwordtooshort": "Salasõna om viganõ vai pall'o lühkü. Taan piät olõma vähämbält {{PLURAL:$1|1 märk|$1 märki}} ja taa tohe-i ollaq sama, miä su pruukjanimi.",
+       "passwordtooshort": "Salasõna piät olõma vähämbält {{PLURAL:$1|1 märk|$1 märki}} pikk.",
+       "password-name-match": "Salasõna piät olõma midägi muud ku pruukjanimi..",
+       "password-login-forbidden": "Seo pruukjanime ja salasõna tarvitaminõ om keelet.",
        "mailmypassword": "Vahtsõndaq umma salasõnna",
        "passwordremindertitle": "{{SITENAME}} salasõna miildetulõtus",
        "passwordremindertext": "Kiäki (arvadaq saq esiq, puutri võrgonummõr $1),\npallõl' vahtsõt sisseminegi salasõnna {{SITENAME}} ($4) jaos.\nPruukja \"$2\" salasõna om noq \"$3\". Ku olõt nimega sisse lännüq, võit taa aotlidsõ salasõna ärq muutaq.\nAotlinõ salasõna lätt vanas {{PLURAL:$5|üte päävä|$5 päävä}} peräst.\n\nKu taa pallõmisõ om tennüq kiä tõõnõ vai ku olõt uma salasõna miilde tulõtanuq ja taha-i taad inämb muutaq,\nsis teku-i seost sõnomist vällä ja pruugiq umma vanna salasõnna edesi.",
        "noemail": "Kah'os olõ-i meil pruukja \"$1\" e-postiaadrõssit.",
+       "noemailcreate": "Pead kirotama kõrraligu e-postiaadrõsi",
        "passwordsent": "Vahtsõnõ salasõna om saadõt pruukja \"$1\" kirotõdu e-postiaadrõsi pääle. Ku olõt salasõna kätte saanuq, mineq nimega sisse.",
        "blocked-mailpassword": "Su võrgonumbrilõ om pant pääle toimõndamiskiild, miä lasõ-i salasõnna miilde tulõtaq.",
-       "eauthentsent": "Sullõ om saadõt kinnütüskiri. Muid kirjo saadõta-i inne, ku olõt tennüq nii, kuis kirän opat ja kinnütänüq, et taa om suq e-postiaadrõs.",
+       "eauthentsent": "Sullõ om saadõt kinnütüskiri. \nMuid kirjo saadõta-i inne, ku olõt tennüq nii, kuis kirän opat ja kinnütänüq, et taa om suq e-postiaadrõs.",
        "throttled-mailpassword": "{{PLURAL:$1|tunni|$1 tunni}} seen om saadõt salasõna miildetulõtus. Sääntsit miildetulõtuisi saadõtas õnnõ {{PLURAL:$1|tunni|$1 tunni}} takast.",
        "mailerror": "Kirä saatmisõ viga: $1",
        "acct_creation_throttle_hit": "Sa olõt tennüq jo {{PLURAL:$1|1 pruukjanime|$1 pruukjanimme}}. Rohkõmb ei saaq.",
        "emailauthenticated": "Su e-postiaadrõs kinnütedi ärq $2 kell $3.",
-       "emailnotauthenticated": "Su e-postiaadrõssit olõ-i viil kinnütet. Alanolõvi as'on e-kirjo ei saadõtaq.",
+       "emailnotauthenticated": "Su e-postiaadrõssit olõ-i viil kinnütet. \nAlanolõvidõ asjo kotsilõ sullõ e-kirjo ei saadõdaq.",
        "noemailprefs": "Olõ-i ant e-postiaadrõssit.",
        "emailconfirmlink": "Kinnüdäq uma e-postiaadrõs.",
        "invalidemailaddress": "Olõ-i kõrralik e-postiaadrõs, taa om võlss moodun.\nKirodaq õigõ e-postiaadrõs vai jätäq rivi rühäs.",
+       "cannotchangeemail": "Seon vikin saa-ai konto e-postiaadressit muutaq.",
+       "emaildisabled": "Seo võrgokotusõ kaudu saa-ai e-kirjo saataq.",
        "accountcreated": "Pruukjanimi luudi",
-       "accountcreatedtext": "Luudi pruukjanimi pruukjalõ $1.",
+       "accountcreatedtext": "Pruukja [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) konto om luud.",
        "createaccount-title": "Vahtsõ {{SITENAME}} pruukjanime luuminõ",
        "createaccount-text": "Kiäki om loonuq pruukjanime $2 lehistüle {{SITENAME}} ($4). Pruukjanime \"$2\" salasõna om \"$3\".\nMineq nimega sisse ja vaihtaq salasõna ärq.\n\nKu taa pruukjanimi om luud kogõmaldaq, olõ-i sul vaia taast sõnomist vällä tetäq.",
-       "login-throttled": "Olõt uma nime ala minekis pruuvnuq pall'o hulga esiqsugutsit salasõnno.\nOodaq vähä inne ku proovit vahtsõst.",
+       "login-throttled": "Olõt pall'o hulga kõrdo pruuvnuq uma nimega sisse minnäq.\nOodaq $1 inne ku proovit vahtsõst.",
+       "login-abort-generic": "Nimega sisseminek lää-äs kõrda – katski jätet",
+       "login-migrated-generic": "Su konto om ärq viid ja su pruukjanimme olõ-õi inämb seon vikin.",
        "loginlanguagelabel": "Kiil: $1",
+       "createacct-another-realname-tip": "Sa piä-äi umma peris nimme kirotama.\nKu otsustat tuu kirotaq, näüdätäs tuud pruukjanime asõmal lehe tegijide nimekirän.",
+       "pt-login": "Nimega sisseminek",
+       "pt-login-button": "Nimega sisseminek",
+       "pt-createaccount": "Tiiq hindäle pruukjanimi",
+       "pt-userlogout": "Mineq nime alt vällä",
        "changepassword": "Muudaq salasõnna",
-       "resetpass_announce": "Sa lätsit sisse e-postiga saadõdu aotlidsõ koodiga. Kõrdapiten sisseminekis tulõ sul siin tetäq hindäle  vahtsõnõ salasõna:",
+       "resetpass_announce": "Kõrdapiten sisseminekis tulõ sul tetäq hindäle vahtsõnõ salasõna.",
        "resetpass_text": "<!-- Kirodaq siiäq -->",
        "resetpass_header": "Muudaq pruukjanime salasõnna",
        "oldpassword": "Vana salasõna",
        "newpassword": "Vahtsõnõ salasõna",
        "retypenew": "Kirodaq viilkõrd vahtsõnõ salasõna",
        "resetpass_submit": "Kirodaq salasõna ja mineq nimega sisse",
-       "changepassword-success": "Salasõna vaihtaminõ läts kõrda.",
+       "changepassword-success": "Salasõna vaihtaminõ läts kõrda!",
+       "changepassword-throttled": "Olõt ildaaigo pruuvnuq pall'o hulga kõrdo nimega sisse minnäq.\nOlõq hää, oodaq $1, inne ku vahtsõst proovit.",
        "resetpass_forbidden": "Salasõnno saa-i muutaq.",
        "resetpass-no-info": "Taa lehe pääle päsemises piät olõma nimega sisse lännüq.",
        "resetpass-submit-loggedin": "Muudaq salasõnna",
        "resetpass-submit-cancel": "Jätäq katski",
        "resetpass-wrong-oldpass": "Viganõ aotlinõ vai parhillanõ salasõna.\nVõi-ollaq olõt jo uma salasõna ärq muutnuq vai küsünüq vahtsõ aotlidsõ salasõna.",
+       "resetpass-recycled": "Olõq hää, valiq umas salasõnas midägi muud, ku parhillanõ salasõna.",
        "resetpass-temp-password": "Aotlinõ salasõna:",
        "bold_sample": "Paks kiri",
        "bold_tip": "Paks kiri",
        "deletereasonotherlist": "Muu põhjus",
        "deletereason-dropdown": "*Hariliguq kistutamisõ põhjusõq\n** Kirotaja hindä palvõl\n** Tegijäõigusõ rikminõ\n** Lehe ts'urkminõ",
        "rollback": "Mineq tagasi vana kujo pääle",
-       "rollback_short": "Võtaq tagasi",
        "rollbacklink": "võtaq tagasi vana kujo",
        "rollbackfailed": "Muutmiisi tagasivõtminõ lää-s kõrda",
        "cantrollback": "Saa-i muutmiisi tagasi pöördäq; viimäne muutja om lehe ainugõnõ toimõndaja.",
index c862c3c..b8f9930 100644 (file)
@@ -40,7 +40,7 @@
        "tog-shownumberswatching": "ווייזן דעם נומער פון בלאט אויפֿפאסערס",
        "tog-oldsig": "איצטיגער אונטערשריפֿט:",
        "tog-fancysig": "באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)",
-       "tog-uselivepreview": "באניצן זיך מיט גיכער פאראויסדיגער ווייזונג (עקספערימענטאל)",
+       "tog-uselivepreview": "באניצן זיך מיט גיכער פאראויסדיגער ווייזונג",
        "tog-forceeditsummary": "ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג",
        "tog-watchlisthideown": "באהאלט מיינע ענדערונגען פון דער אויפפאסן ליסטע",
        "tog-watchlisthidebots": "באהאלט באט עדיטס פון אויפפאסן ליסטע",
@@ -80,7 +80,7 @@
        "february": "פֿעברואַר",
        "march": "מערץ",
        "april": "אַפּריל",
-       "may_long": "×\9eײַ",
+       "may_long": "×\9e×\90Ö·×\99",
        "june": "יוני",
        "july": "יולי",
        "august": "אויגוסט",
        "feb": "פֿעב׳",
        "mar": "מער׳",
        "apr": "אַפּר׳",
-       "may": "×\9eײַ",
+       "may": "×\9e×\90Ö·×\99",
        "jun": "יונ׳",
        "jul": "יול׳",
        "aug": "אויג׳",
        "cancel": "אַנולירן",
        "moredotdotdot": "נאך…",
        "morenotlisted": "די ליסטע איז נישט פֿולשטענדיק.",
-       "mypage": "×\9eײַ×\9f ×\91×\9c×\90ט",
+       "mypage": "×\9e×\99×\99×\9f ×\91×\9c×\90Ö·ט",
        "mytalk": "שמועס",
        "anontalk": "דאס רעדן פון דעם IP",
        "navigation": "נאַוויגאַציע",
        "pool-queuefull": "ריי איז פֿול",
        "pool-errorunknown": "אומבאַקאַנטער פֿעלער",
        "pool-servererror": "נישט פאראן דער פול־צאל דינסט ($1).",
+       "poolcounter-usage-error": "באניץ־פעלער: $1",
        "aboutsite": "וועגן {{SITENAME}}",
        "aboutpage": "Project:וועגן",
        "copyright": "דער אינהאַלט איז פֿאַראַן אונטער $1 ווען נישט באוויזן אנדערש.",
        "nosuchactiontext": "די אַקציע ספעציפֿירט דורך דעם URL איז נישט גילטיג.\nאיר האט מעגלעך אַרײַנגעקלאַפט פֿאַלש, אדער נאָכגעפֿאלגט א פֿאַלשן לינק.\nס'קען אויך זײַן א באַג אין דעם ווייכוואַרג געניצט אין {{SITENAME}}.",
        "nosuchspecialpage": "נישטא אזא ספעציעלער בלאט",
        "nospecialpagetext": "<strong>איר האט געבעטן אן אומגילטיגן באַזונדערבלאט.</strong>\n\nמ'קען טרעפֿן א ליסטע פון אלע באַזונדערבלעטער בײַ [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "פעלער",
+       "error": "פֿעלער",
        "databaseerror": "דאטנבאזע פעלער",
-       "databaseerror-text": "ס'האט פאסירט א דאטנבאזע פֿראגע פֿעלער.\nקען אפשר זיין א באַג אינעם ווייכווארג.",
-       "databaseerror-textcl": "ס'האט פאסירט א דאטנבאזע פֿראגע פֿעלער.",
+       "databaseerror-text": "ס׳האָט פּאַסירט אַ דאַטנבאַזע־אָנפֿראַגע פֿעלער.\nס׳קען אפשר זיין אַ סימן פון אַ באַג אינעם ווייכוואַרג.",
+       "databaseerror-textcl": "ס׳האָט פּאַסירט אַ דאַטנבאַזע־אָנפראַגע פֿעלער.",
        "databaseerror-query": "פֿראגע: $1",
        "databaseerror-function": "פֿונקציע: $1",
        "databaseerror-error": "פֿעלער: $1",
        "missingarticle-rev": "(רעוויזיע נומער: $1)",
        "missingarticle-diff": "(אונטערשייד: $1, $2)",
        "readonly_lag": "די דאטעבאזע איז געווארן אויטאמטיש אפגעשפארט כדי צו דערמעגליכן פאר די אונטער דאטע באזע סערווערס צו ווערן דערהיינטיגט פון דעם אויבער סערווער.",
-       "internalerror": "×\90×\99נער×\95×\95×\99×\99× ×\99×\92ער ×¤Ö¿עלער",
-       "internalerror_info": "×\90×\99נער×\95×\95×\99×\99× ×\99×\92ער פֿעלער: $1",
+       "internalerror": "×\90×\99נער×\9c×¢×\9bער ×¤עלער",
+       "internalerror_info": "×\90×\99נער×\9c×¢×\9bער פֿעלער: $1",
        "filecopyerror": "האט נישט געקענט קאפירן \"$1\" צו \"$2\".",
        "filerenameerror": "נאמען טויש פֿאַר \"$1\" צו \"$2\" איז נישט אדורכגעגאנגען.",
        "filedeleteerror": "אויסמעקן \"$1\" נישט דורך.",
        "directorycreateerror": "קען נישט באשאפן דירעקטארי \"$1\".",
+       "directoryreadonlyerror": "דירעקטאריע \"$1\" איז נאר לייענבאר.",
+       "directorynotreadableerror": "דירעקטאריע \"$1\" איז נישט לייענבאר.",
        "filenotfound": "קען נישט געפינען טעקע \"$1\".",
        "unexpected": "אומערווארטערטער ווערד: \"$1\"=\"$2\"",
        "formerror": "פֿעלער: קען נישט שיקן פֿארעם.",
        "perfcachedts": "די פאלגנדע דאטן זענען פונעם זאַפאַס, וואס איז לעצט געווארן דערהײַנטיגט $1. מאקסימום {{PLURAL:$4|איין רעזולטאט איז|$4 רעזולטאטן זענען}} פאראן אין זאפאס",
        "querypage-no-updates": "דערהיינטיגן דעם בלאט איז איצט אומערמעגלעכט.\nדאטן דא וועט נישט דערווייל ווערן באנייט.",
        "viewsource": "ווײַזן מקור",
-       "viewsource-title": "באקוקן מקור פֿון $1",
+       "viewsource-title": "באַקוקן דעם מקור פון $1",
        "actionthrottled": "די אַקציע איז באַגרענעצט",
        "actionthrottledtext": "אלס מאָסמיטל קעגן ספאַם, זענט איר באַגרענעצט פֿון דורכפֿירן די פעולה צופֿיל מאל אין א קורצער צײַט. ביטע פרובירט נאכאַמאָל אין א פאר מינוט.",
        "protectedpagetext": "דער בלאט איז געשיצט צו פארמיידן רעדאקטירן און אנדערע פעולות.",
        "yourpasswordagain": "ווידער אריינקלאפן פאסווארט",
        "createacct-yourpasswordagain": "באשטעטיקן פאסווארט",
        "createacct-yourpasswordagain-ph": "ארײַנגעבן פאסווארט נאכאמאל",
-       "remembermypassword": "×\92×¢×\93×\99×\99נק ×\9eײַ×\9f ×\90ַרײַנ×\9c×\90×\92×\99ר×\9f ×\90×\95×\99×£ ×\93×¢×\9d ×§×\90×\9eפ×\99×\95×\98ער (×\91×\99×\96  $1 {{PLURAL:$1|טאָג|טעג}})",
+       "remembermypassword": "×\92×¢×\93ענקע×\9f ×\9e×\99×\99×\9f ×\90ַר×\99×\99× ×\9c×\90Ö¸×\92×\99ר×\9f ×\90×\99×\9f ×\93×¢×\9d ×\93×\90Ö¸×\96×\99ק×\9f ×\91ר×\90Ö·×\95×\96ער (×\91×\99×\96 $1 {{PLURAL:$1|טאָג|טעג}})",
        "userlogin-remembermypassword": "לאז מיך בלײַבן ארײַנלאגירט",
        "userlogin-signwithsecure": "ניצן זיכערן סארווער",
        "yourdomainname": "אײַער געביט:",
        "password-change-forbidden": "איר קען נישט ענדערן פאסווערטער אויף דער וויקי.",
-       "externaldberror": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
+       "externaldberror": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פֿעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
        "login": "אַרײַנלאָגירן",
        "nav-login-createaccount": "ארײַנלאָגירן / זיך אײַנשרײַבן",
        "userlogin": "ארײַנלאָגירן / זיך אײַנשרײַבן",
        "createacct-benefit-body3": "לעצטיקע {{PLURAL:$1|בײַשטײַערער}}",
        "badretype": "די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.",
        "userexists": "דער באַניצער נאָמען איז שוין געניצט.\nביטע קלײַבט אױס אַן אַנדער נאָמען.",
-       "loginerror": "×\9c×\90×\92×\99ר×\9f ×¤Ö¿×¢×\9cער",
+       "loginerror": "פע×\9cער ×\91×\99×\99×\9d ×\9c×\90Ö¸×\92×\99ר×\9f",
        "createacct-error": "קאנטע שאפן פעלער",
        "createaccounterror": "האט נישט געקענט שאַפֿן קאנטע: $1",
        "nocookiesnew": "די באניצער קאנטע איז באשאפן, אבער איר זענט נישט אריינלאגירט.\n{{SITENAME}} ניצט קיכלעך אריינצולאגירן באניצער.\nאיר האט קיכלעך נישט-ערמעגלעכט.\nביטע ערמעגלעכט זיי, דאן טוט אריינלאגירן מיט אייערע נייע באניצער נאמען און פאסווארט.",
        "blocked-mailpassword": "אייער איי פי אדרעס איז בלאקירט צו רעדאקטירן, דערוועגן זענט איר נישט ערלויבט צו באניצן מיטן פאסווארט ווידעראויפלעבונג פֿונקציע כדי צו פארמיידן סיסטעם קרומבאניץ.",
        "eauthentsent": "א באשטעטיגונג ע-בריוו איז געשיקט געווארן צו דעם באשטימטן ע-פאסט אדרעס. איידער סיי וועלכע אנדערע ע-פאסט וועט ווערן געשיקט צו דער קאנטע, וועט איר דארפן פאלגן די אנווייזונגען אין דער מעלדונג כדי צו זיין זיכער אז די קאנטע איז טאקע אייערס.",
        "throttled-mailpassword": "מ'האט שוין געשיקט א בליצבריוו צוריקצושטעלן דאס פאסווארט, אין {{PLURAL:$1|דער לעצטער שעה|די לעצטע $1 שעה'ן}}. כדי צו פארמײַדן שלעכט באניצן, נאר איין פאסווארט צוריקשטעלן בליצבריוו וועט געשיקט ווערן אין {{PLURAL:$1|א שעה |$1 שעה'ן}}.",
-       "mailerror": "פֿעלער שיקנדיג פאסט: $1",
+       "mailerror": "פעלער ביים שיקן פּאָסט: $1",
        "acct_creation_throttle_hit": "באַזוכער צו דער וויקי וואס באַניצן אייער IP אַדרעס האָבן שױן באַשאַפֿן {{PLURAL:$1|1 קאנטע|$1 קאנטעס}} במשך דעם לעצטן טאָג, דעם מאַקסימום וואָס מען ערלויבט אין דעם פעריאד.\n\nדערפֿאַר קענען באַזוכער וואס באַניצן דעם  IP אַדרעס נישט מער שאַפֿן נײַע קאָנטעס דערווײַל.",
        "emailauthenticated": "אייער ע-פאסט אדרעס איז באשטעטיגט געווארן אום $2, $3.",
        "emailnotauthenticated": "אײַער ע-פאסט אדרעס איז נאכנישט באשטעטיגט. \nקיין ע-פאסט וועט נישט ווערן געשיקט פון קיין איינע פון די פאלגנדע אייגנקייטן.",
        "pt-login": "אַרײַנלאגירן",
        "pt-login-button": "אַרײַנלאָגירן",
        "pt-createaccount": "שאַפֿן אַ קאנטע",
-       "pt-userlogout": "אַרויסלאגירן",
+       "pt-userlogout": "אַרויסלאָגירן",
        "php-mail-error-unknown": "אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.",
        "user-mail-no-addy": "געפרוווט צו שיקן ע-פּאָסט אָן אַן ע-פּאָסט אַדרעס.",
        "user-mail-no-body": "האט פרובירט צו שיקן א בליצבריוו וואס זיין אינהאלט איז ליידיק אדער גאר קורץ.",
        "anoneditwarning": "<strong>ווארענונג:</strong> איר זענט נישט אריינלאגירט. אייער איי פי אדרעס וועט ווערן עפנטלעך זעבאר ווען איר פירט דורך  ענדערונגען . אז איר <strong>[$1 לאגירט ארײַן]</strong> אדער <strong>[$2 שאפט א קאנטע]</strong>, וועלן אײַערע רעדאקטירונגען ווערן צוגעשריבן צו אײַער באניצער-נאמען, ווי אויך אנדערע טובות.",
        "anonpreviewwarning": "''איר זענט נישט אַרײַנלאגירט. אויפֿהיטן וועט ארײַנשרײַבן אײַער IP אַדרעס אין דער רעדאַקטירונג היסטאריע פונעם בלאַט.''",
        "missingsummary": "'''דערמאנונג:''' איר האט נישט אויסגעפילט דעם קורץ ווארט אויפקלערונג אויף אייער עדיט. אויב וועט איר דרוקן נאכאמאל אויף  \"היט אפ דעם בלאט\", וועט אייער ענדערונג ווערן געהיטן אן דעם.",
+       "selfredirect": "<strong>ווארענונג:</strong> איר טוט ווײַטערפירן דעם בלאט צו זיך אליין.\nאיר העט אפשר ספעציפיצירט א פאלשן ווײַטערפירונג־ציל  אדער איר רעדאקטירט דעם פאלשן בלאט.\nטאמער קליקט איר נאכאמאל \"{{int:savearticle}}\", וועט מען טאקע שאפן די ווײַטערפירונג.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
        "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע/קעפל פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
        "summary-preview": "סך-הכל פאראויסדיגע ווייזונג:",
        "nocreate-loggedin": "איר זענט נישט ערלויבט צו שאַפֿן נײַע בלעטער.",
        "sectioneditnotsupported-title": "רעדאקטירן אפטיילונגען נישט געשטיצט.",
        "sectioneditnotsupported-text": "רעדאַקטירן אָפטיילונגען נישט געשטיצט אויף דעם בלאַט",
-       "permissionserrors": "דערלויבענישן פֿעלער",
+       "permissionserrors": "דערלויבעניש פֿעלער",
        "permissionserrorstext": "איר זענט נישט ערלויבט צו טון דאס, פֿאַר {{PLURAL:$1|דער פֿאלגנדער סיבה|די פֿאלגנדע סיבות}}:",
        "permissionserrorstext-withaction": "איר זענט נישט ערלויבט צו $2, וועגן {{PLURAL:$1|דער פֿאלגנדער סיבה| די פֿאלגנדע סיבות}}:",
        "recreate-moveddeleted-warn": "'''ווארענונג: איר שאפט א נייעם בלאט וואס איז שוין איינמאל  געווארן אויסגעמעקט.'''\n\nאיר זאלט איבערטראכטן צי עס פאַסט רעדאַקטירן דעם בלאַט ווײַטער.\nדי אויסמעקן און באַוועגן לאגביכער ווערן געוויזן דא:",
        "content-model-text": "פשוטער טעקסט",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "ליידיגער אביעקט",
        "duplicate-args-category": "בלעטער וואס ניצן געטאפלטע ארגומענטן אין מוסטער רופן",
        "expensive-parserfunction-warning": "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.\n\nער דארף האבן ווינציגער פון  $2 {{PLURAL:$2|רוף|רופן}}, אבער אצינד {{PLURAL:$1|איז דא $1 רוף|זענען דא $1 רופן}}.",
        "expensive-parserfunction-category": "בלעטער מיט צופֿיל טייערע פאַרזער פֿונקציאן רופֿן",
        "history-feed-empty": "דער געבעטענער בלאט עקזיסטירט נישט.\nעס איז מעגליך אויסגעמעקט געווארן פון דער וויקי, אדער דער נאמען געטוישט.\nפרובירט [[Special:Search|צו זיכן אין וויקי]] נאך רעלאווענטע נייע בלעטער.",
        "rev-deleted-comment": "(קורץ־ווארט אראָפגענומען)",
        "rev-deleted-user": "(באנוצער נאמען אראפגענומען)",
-       "rev-deleted-event": "(×\9c×\90×\92×\99ר×\9f ×\90קצ×\99×¢ אראפגענומען)",
+       "rev-deleted-event": "(×\9c×\90×\92×\99ר×\9f ×¤×¨×\98×\99×\9d אראפגענומען)",
        "rev-deleted-user-contribs": "[באַניצער נאָמען אָדער IP אַדרעס אראפגענומען - רעדאַקטירונג פֿאַרבאָרגן פֿון בייַשטייַערונגען]",
        "rev-deleted-text-permission": "די בלאט רעוויזיע איז געווארן '''אויסגעמעקט '''.\nעס איז מעגלעך דא נאך פרטים אין דעם\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאג].",
        "rev-suppressed-text-permission": "די בלאט רעוויזיע איז געווארן <strong>אונטערדריקט</strong>. מען קען געפינען נאך פרטים אין דעם [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} אונטערדריקן לאגבוך].",
        "revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
        "revdelete-hide-text": "ווערסיע טעקסט",
        "revdelete-hide-image": "באהאלט טעקע אינהאלט",
-       "revdelete-hide-name": "באהאלט אקציע און ציל",
+       "revdelete-hide-name": "באהאלטן ציל און פאראמעטערס",
        "revdelete-hide-comment": "רעדאקטירונג רעזומע",
        "revdelete-hide-user": "רעדאַקטאר'ס באניצער-נאמען/IP-אַדרעס",
        "revdelete-hide-restricted": "באהאלט אינפארמאציע אויך פון אדמיניסטראטורן פונקט ווי פשוטע באנוצער",
        "revdel-restore": "טויש די זעבארקייט",
        "pagehist": "בלאט היסטאריע",
        "deletedhist": "אויסגעמעקטע ווערסיעס",
-       "revdelete-hide-current": "פֿעלער בײַם באַהאַלטן דעם איינהייט פֿון $2, $1: דאָס איז די לויפֿיגע ווערסיע.\nמען קען זי נישט פֿאַרבאָרגן.",
+       "revdelete-hide-current": "פעלער ביים באַהאַלטן דעם איינס פון $2, $1: דאָס איז די לויפיקע ווערסיע.\nזי קען נישט באַהאַלטן ווערן.",
        "revdelete-show-no-access": "פֿעלער בײַם ווייַזן דעם איינהייט פֿון $2 , $1 : דער איינהייט איז אָנגעצייכנט געווארן \"באַשרענקט\".\nאיר האט נישט קיין צוטריט צו אים.",
        "revdelete-modify-no-access": "פֿעלער בײַם מאדיפֿיצירן דעם איינהייט פֿון $2 , $1 : דער איינהייט איז אָנגעצייכנט געווארן \"באַשרענקט\".\nאיר האט נישט קיין צוטריט צו אים.",
-       "revdelete-modify-missing": "פֿעלער בײַ מאדיפֿיצירן  דעם איינס ID $1: ער פֿעלט פֿון דער דאַטנבאַזע!",
+       "revdelete-modify-missing": "פעלער ביים מאָדיפיצירן דעם איינס ID&rlm; $1: ער פעלט אין דער דאַטנבאַזע!",
        "revdelete-no-change": "'''ווארענונג:''' דער איינהייט פֿון $2 , $1 האט שוין די געבעטענע זעבאַרקייט איינשטעלונגען.",
        "revdelete-concurrent-change": "גרײַז בײַם מאדיפֿיצירן דעם איינהייט פֿון דאַטע $2 , $1 : ווײַזט אויס אַז זייַן סטאַטוס איז געווארן געענדערט דורך א צווייטן בשעת איר האט געפרוווט צו מאָדיפיצירן אים\nביטע זײַט בודק די לאָגביכער.",
        "revdelete-only-restricted": "פֿעלער בײַם באַהאַלטן דאס איינסל פֿון  $2, $1: איר קענט נישט באהאלטן פרטים פון אַדמיניסטראטורן נאר אויב איר וויילט אויס איינע פון די אַנדערע באַהאַלטן ברירות.",
        "mergehistory-empty": "קיין רעוויזיעס קען נישט ווערן צונויפֿגעגאסן.",
        "mergehistory-success": "{{PLURAL:$3|איין גירסא|$3 גירסאות}} פֿון [[:$1]] צונויפֿגעגאסן אין [[:$2]] מיט דערפֿאלג.",
        "mergehistory-fail": "נישט מעגלעך אדורכצופֿירן היסטאריע צונויפֿגאס, ביטע זײַט בודק די בלאַט און צײַט פאַראַמעטערס.",
+       "mergehistory-fail-toobig": "אוממעגלעך אויסצופירן היסטאריע צונויפמישונג ווײַל מען וואלט געדארפט באוועגן מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}.",
        "mergehistory-no-source": "מקור בלאַט $1 עקזיסטירט נישט.",
        "mergehistory-no-destination": "פֿארציל בלאַט $1 עקזיסטירט נישט.",
        "mergehistory-invalid-source": "מקור בלאַט מוז זײַן א גילטיק קעפל.",
        "powersearch-remember": "געדנעקען אויסקלייב פאר צוקונפטדיקע זוכן",
        "search-external": "דרויסנדיק זוכן",
        "searchdisabled": "{{SITENAME}} זוך איז אָפאַקטיווירט.\nצווישנצײַט קענט איר זוכן מיט גוגל.\nגעב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
-       "search-error": "ס'האט פאסירט א פֿעלער ביים זוכן: $1",
+       "search-error": "ס׳האָט פּאַסירט אַ פֿעלער ביים זוכן: $1",
        "preferences": "פרעפֿערענצן",
        "mypreferences": "פּרעפֿערענצן",
        "prefs-edits": "צאָל ענדערונגען:",
        "uploaderror": "אַרויפֿלאָדן פֿעלער",
        "upload-recreate-warning": "'''ווארענונג: א טעקע מיט דעם נאמען איז געווארן אויסגעמעקט אדער באוועגט.'''\n\nדאס אויסמעקן־ און באוועגן־לאגבוך פאר דעם בלאט זענען געוויזן דא:",
        "uploadtext": "באניצט דעם פֿארעם אַרויפֿצולאָדן טעקעס.\nכדי צו זען אדער זוכן טעקעס וואס זענען שוין אַרויפֿגעלאָדן ווענדט זיך צו דער [[Special:FileList|ליסטע פֿון אַרויפֿגעלאָדענע טעקעס]]; (ווידער)אַרויפֿלאָדונגען ווערן אויך לאגירט אינעם  [[Special:Log/upload| אַרויפֿלאָדן לאג-בוך]], אויסמעקונגען אינעם [[Special:Log/delete|אויסמעקן לאג-בוך]].\n\nכדי אײַנשליסן א טעקע אין א בלאַט, באניצט א לינק אין איינעם פון די פֿאלגנדע פֿארעמען:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' צו ניצן די פֿולע ווערסיע פֿון דער טעקע\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|טעקסט קעפל]]</nowiki></code>''' צו ניצן א 200 פיקסל ברייט ווערסיע אין א קעסטל אויף דער לינקער זײַט, מיט דער שילדערונג 'טעקסט קעפל'\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' פֿאר א גראָדער פֿאַרבינדונג צו דער טעקע אָן צו ווײַזן זי",
-       "upload-permitted": "ערלויבטע טעקע טיפן: $1.",
-       "upload-preferred": "פרעפֿרירטע טעקע טיפן: $1.",
-       "upload-prohibited": "פֿאַרווערענע טעקע טיפן: $1.",
+       "upload-permitted": "{{PLURAL:$2|ערלויבטער טעקע טיפ|ערלויבטע טעקע טיפן}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|פרעפֿערירטער טעקע טיפ|פרעפֿערירטע טעקע טיפן}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|פֿאַרווערענער טעקע טיפ|פֿאַרווערענע טעקע טיפן}}: $1.",
        "uploadlogpage": "ארויפֿלאדן לאג",
        "uploadlogpagetext": "פֿאָלגנד איז אַ ליסטע פֿון די לעצטע אַרױפֿגעלאָדענע טעקעס.\nזעט די  [[Special:NewFiles|גאלאריע פֿון נײַע טעקעס]] פֿאַר א מער וויזועלע איבערבליק.",
        "filename": "טעקע נאמען",
        "upload-warning-msg": "געווען א פראבלעם מיט אײַער ארויפֿלאָד פֿון [$2]. איר קענט צוריקקערן צום [[Special:Upload/stash/$1|ארויפֿלאָדן פֿארעם]] צו פֿאררעכטן דעם פראבלעם.",
        "upload-proto-error": "פֿאלשער פראטאקאל",
        "upload-proto-error-text": "ביי א ווייטן ארויפלאד דארף דער URL אנהייבן מיט <code>http://</code> אדער <code>ftp://</code>.",
-       "upload-file-error": "×\90×\99נער×\9c×\99×\9bער ×¤Ö¿עלער",
-       "upload-file-error-text": "אן אינערלעכע פֿעלער האט פאסירט ביים פרובירן צו שאפֿן א פראוויזארישע טעקע אויפֿן סארווער.\nביטע פֿארבינדט זיך מיט א [[Special:ListUsers/sysop|סיסאפ]].",
+       "upload-file-error": "×\90×\99נער×\9c×¢×\9bער ×¤עלער",
+       "upload-file-error-text": "אַן אינערלעכער פעלער האָט פּאַסירט ביים פּרובירן צו שאַפן אַ צייטווייליקע טעקע אויפן סערווער.\nזייט אַזוי גוט, פאַרבינדט זיך מיט אַן [[Special:ListUsers/sysop|אַדמיניסטראַטאָר]].",
        "upload-misc-error": "אומבאַוואוסטער ארויפֿלאָדן גרײַז",
        "upload-misc-error-text": "אן אומבאקאנטער גרייז האט פאסירט בשעת דעם ארויפלאד.\nביטע באשטעטיקט אז דער  URL איז גילטיק און דערגרייכבאר און פרובירט נאכאמאל.\nווען דער פראבלעם בלייבט ווייטער, קאנטאקטירט  א [[Special:ListUsers/sysop|סיסאפ]].",
        "upload-too-many-redirects": "דער URL אַנטהאַלט צופֿיל ווײַטערפֿירונגען.",
        "backend-fail-create": "קען נישט שרייבן טעקע \"$1\".",
        "backend-fail-maxsize": "מ'האט נישט געקענט שרייבן די טעקע \"$1\" ווייל זי איז גרעסער פון {{PLURAL:$2|איין בייט|$2 בייטן}}.",
        "backend-fail-connect": "מ'קען נישט פארבינדן צום שפייכלער־בעקענד \"$1\".",
-       "backend-fail-internal": "אן אומבאוואוסטער פֿעלער האט פאסירט אין שפייכלער־בעקענד \"$1\".",
+       "backend-fail-internal": "אַן אומבאַקאַנטער פֿעלער האָט פּאַסירט אין שפּייכלער־בעקענד \"$1\".",
        "backend-fail-contenttype": "מ'קען נישט פעסטשטעלן דעם אינהאלט טיפ פון דער טעקע צו שפייכלערן ביי \"$1\".",
        "filejournal-fail-dbquery": "נישט געווען מעגלעך צו דערהײַנטיקן די שזור אל־דאטנבאזע פארן אײַנשפײַכלערונג־רעזערוו \"$1\".",
        "lockmanager-notlocked": "מ'קען נישט אויפֿשליסן \"$1\"; ער איז נישט פֿארשלאסן.",
        "deleteprotected": "איר קענט נישט אויסמעקן דעם בלאט ווײַל ער איז געשיצט.",
        "deleting-backlinks-warning": "'''ווארענוג:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|אנדערע בלעטער]]  פארבינדן צום בלאט אדער אריבערשליסן דעם בלאט איר האלט ביי אויסמעקן.",
        "rollback": "צוריקדרייען רעדאַקטירונגען",
-       "rollback_short": "צוריקדרייען",
        "rollbacklink": "צוריקדרייען",
        "rollbacklinkcount": "צוריקדרייען $1 {{PLURAL:$1|רעדאקטירונג|רעדאקטירונגען}}",
        "rollbacklinkcount-morethan": "צוריקדרייען מער ווי $1 {{PLURAL:$1|רעדאקטירונג|רעדאקטירונגען}}",
        "restriction-level-all": "וואָסער ניווא",
        "undelete": "זען אויסגעמעקטע בלעטער",
        "undeletepage": "זען און צוריקשטעלן אויסגעמעקט בלעטער",
-       "undeletepagetitle": "'''פֿ×\90×\9c×\92× ×\93 ×\91×\90ַש×\98×\99×\99×\98 ×¤Ö¿×\95×\9f ×\90×\95×\99ס×\92×¢×\9eעק×\98×¢ ×\95×\95ערס×\99×¢ ×¤Ö¿ון [[:$1]]'''.",
+       "undeletepagetitle": "'''×\93×\90ָס ×¤×\90Ö¸×\9c×\92× ×\93×\99קע ×\91×\90ַש×\98×\99×\99×\98 ×¤×\95×\9f ×\90×\95×\99ס×\92×¢×\9eעק×\98×¢ ×\95×\95ערס×\99עס ×¤ון [[:$1]]'''.",
        "viewdeletedpage": "זען אויסגעמעקטע בלעטער",
        "undeletepagetext": "The following {{PLURAL:$1|דער פֿאלגנדער בלאַט איז געווארן אויסגעמעקט אבער קען|די פֿאלגנדע $1  בלעט ער זענען געווארן אויסגעמעקט אבער קענען}} נאך  ווערן צוריקגעשטעלט פֿון אַרכיוו.\nפֿון צײַט צו צײַט רייניגט מען אויס דעם אַרכיוו.",
        "undelete-fieldset-title": "צוריקשטעלן רעוויזיעס",
        "year": "ביז יאר:",
        "sp-contributions-newbies": "ווײַזן בײַשטײַערונגען נאר פֿון נײַע באַניצערס",
        "sp-contributions-newbies-sub": "פאר נייע קאנטעס",
-       "sp-contributions-newbies-title": "×\91ײַש×\98ײַער×\95× ×\92×¢×\9f ×¤Ö¿×\95×\9f × ×²Ö·×¢ ×\91×\90Ö·× ×\99צערס",
+       "sp-contributions-newbies-title": "×\91×\99×\99ש×\98×\99×\99ער×\95× ×\92×¢×\9f ×¤×\95×\9f × ×\99×\99×¢ ×\91×\90Ö·× ×\99צער",
        "sp-contributions-blocklog": "בלאקירן לאג",
        "sp-contributions-suppresslog": "אונטערדריקטע באַניצער בײַשטײַערונגען",
        "sp-contributions-deleted": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
        "importuploaderrorsize": "אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.\nדי טעקע איז גרעסער פֿון דער דערלויבטער אַרויפֿלאָדן גרייס.",
        "importuploaderrorpartial": "אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.\nדי טעקע איז נאר טיילווייז אַרויפֿגעלאָדן.",
        "importuploaderrortemp": "אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.\nאַ פראוויזארישער טעקע־האלטער פֿעלט.",
-       "import-parse-failure": "פֿעלער בײַם אימפארטירן XML",
+       "import-parse-failure": "פעלער ביים אימפּאָרטירן XML",
        "import-noarticle": "נישטא קיין בלאט צו אימפארטירן!",
        "import-nonewrevisions": "קיין רעוויזיעס נישט אימפארטירט (אדער אלע שוין דא, אדער איבערגעהיפט צוליב גרײַזן).",
        "xml-error-string": "$1 בײַ שורה $2, זייל $3 (בייט $4): $5",
        "import-logentry-interwiki": "אריבערגעוויקיט $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} אימפארטירט פֿון $2",
        "javascripttest": "JavaScript טעסט",
-       "javascripttest-title": "דורכפירנדיק $1 בדיקות",
        "javascripttest-pagetext-noframework": " דער בלאט איז רעזערווירט פאר JavaScript. פרואוון.",
        "javascripttest-pagetext-unknownframework": "אומבאקאנטער טעסטן גערעם \"$1\".",
        "javascripttest-pagetext-frameworks": "ביטע קלויבט איינעם פון די פאלגנדע טעסטן־גערעם: $1",
        "javascripttest-pagetext-skins": "קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:",
        "javascripttest-qunit-intro": "זעט [$1 דאקומענטאציע פאר טעסטן] בײַ mediawiki.org.",
-       "javascripttest-qunit-heading": "מעדיעוויקי JavaScript QUnit קאנטראל־פראגראם",
        "tooltip-pt-userpage": "אייער באניצער בלאט",
        "tooltip-pt-anonuserpage": "באַניצער בלאַט פון דעם IP אַדרעס",
        "tooltip-pt-mytalk": "אייער שמועס בלאט",
        "exif-label": "צעטל",
        "exif-datetimemetadata": "דאטע ווען מעטאדאטן זענען געווען לעצט געענדערט",
        "exif-nickname": "אויספארמעלער נאמען פון בילד",
-       "exif-rating": "ש×\90צ×\95× ×\92 (פֿון 5)",
+       "exif-rating": "×\90ָפּש×\90ַצ×\95× ×\92 (פון 5)",
        "exif-rightscertificate": "רעכטן פארוואלטונג צערטיפיקאט",
        "exif-copyrighted": "קאפירעכט סטאַטוס",
        "exif-copyrightowner": "קאפירעכטן האלטער",
        "hebrew-calendar-m11-gen": "אב",
        "hebrew-calendar-m12-gen": "אלול",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|רעדן]])",
-       "unknown_extension_tag": "אומבאַוואוסטער פֿאַרברייטערונג טאַג \"$1\"",
        "duplicate-defaultsort": "'''ווארענונג:''' גרונט סארטשליסל \"$2\" פֿאָרט איבערן פֿריערדיגן גרונט סארטשליסל \"$1\".",
        "version": "ווערסיע",
        "version-extensions": "אינסטאלירטע פארברייטערונגען",
        "compare-revision-not-exists": "די רעוויזיע וואס איר האט ספעציפֿירט עקזיסטירט נישט.",
        "dberr-problems": "אנטשולדיגט! דער דאזיקער סייט האט טעכנישע פראבלעמען.",
        "dberr-again": "וואַרט א פאָר מינוט און לאָדנט אָן ווידער.",
-       "dberr-info": "(קע×\9f × ×\99ש×\98 ×¤Ö¿×\90ַר×\91×\99× ×\93×\9f ×\9e×\99×\98×\9f ×\93×\90Ö·×\98× ×\91×\90Ö·×\96×¢ ×\91×\90Ö·×\93×\99נער: $1)",
+       "dberr-info": "(קע×\9f × ×\99ש×\98 ×¦×\95ק×\95×\9e×¢×\9f ×¦×\95 ×\93ער ×\93×\90Ö·×\98× ×\91×\90Ö·×\96×¢: $1)",
        "dberr-usegoogle": "אינצווישנצײַט קענט איר פרובירן זוכן דורך גוגל.",
        "dberr-outofdate": "גיט אַכט אַז זײַערע אינדעקסן פֿון אונזער אינהאַלט איז מעגלעך פֿאַרעלטערט.",
        "dberr-cachederror": "דאָס איז אַן אײַנגעשפייכלערט קאפיע פֿון  דעם געפֿאדערטן בלאַט, און קען זײַן פֿאַרעלטערט.",
index 4d53855..0924acb 100644 (file)
@@ -21,7 +21,8 @@
                        "Kc kennylau",
                        "Mywood",
                        "Impersonator 1",
-                       "Cedric tsan cantonais"
+                       "Cedric tsan cantonais",
+                       "Liuxinyu970226"
                ]
        },
        "tog-underline": "連結加底線:",
@@ -48,7 +49,7 @@
        "tog-shownumberswatching": "顯示有幾多人監視",
        "tog-oldsig": "現有簽名:",
        "tog-fancysig": "將簽名以維基字對待(冇自動連結)",
-       "tog-uselivepreview": "用即時預覽(實驗緊)",
+       "tog-uselivepreview": "用即時預覽",
        "tog-forceeditsummary": "我冇入修改註解時通知我",
        "tog-watchlisthideown": "響監視清單度隱藏我嘅編輯",
        "tog-watchlisthidebots": "響監視清單度隱藏機械人嘅編輯",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript程式語言",
        "content-model-css": "層疊樣式表",
-       "duplicate-args-category": "爾版用徂幾個重複加類嘅模。",
+       "duplicate-args-category": "模用重複參數嘅嘅版面",
        "expensive-parserfunction-warning": "警告: 呢一版有太多耗費嘅語法功能呼叫。\n\n佢應該少過$2次呼叫,佢而家係$1次呼叫。",
        "expensive-parserfunction-category": "響版度有太多嘅耗費嘅語法功能呼叫",
        "post-expand-template-inclusion-warning": "警告: 包含模大細太大。\n有啲模將唔會包含。",
        "currentrev": "最新嘅修訂",
        "currentrev-asof": "響 $1 嘅最新修訂",
        "revisionasof": "喺$1嘅修訂",
-       "revision-info": "喺$1嘅修訂;修訂自$2",
+       "revision-info": "喺$1由$2嘅修訂 $7",
        "previousrevision": "←之前嘅修訂",
        "nextrevision": "新啲嘅修訂→",
        "currentrevisionlink": "最新嘅修訂版本",
        "histlegend": "選擇唔同版本:響兩個唔同版本嘅圓框分別撳一下,再撳最底的「比較被選修訂」掣以作比較。<br />\n說明:'''({{int:cur}})'''= 同最新修訂版本嘅差別,'''({{int:last}})'''= 同前一個修訂版本嘅差別,'''{{int:minoreditletter}}''' = 小修改。",
        "history-fieldset-title": "瀏覽歷史",
        "history-show-deleted": "只顯示刪除咗嘅",
-       "histfirst": "最",
+       "histfirst": "最",
        "histlast": "最新",
        "historysize": "($1 {{PLURAL:$1|byte|bytes}})",
        "historyempty": "(空)",
        "history-feed-description": "響哩個wiki嘅哩一頁嘅修訂歷史",
        "history-feed-item-nocomment": "$1 響 $2",
        "history-feed-empty": "要求嘅頁面並唔存在。\n佢可能響哩個 wiki 度刪除咗或者改咗名。\n試吓[[Special:Search|響哩個wiki度搵]]有關新頁面嘅資料。",
-       "rev-deleted-comment": "(評論已經移除咗)",
+       "rev-deleted-comment": "(編輯摘要已經移除咗)",
        "rev-deleted-user": "(用戶名已經移除咗)",
-       "rev-deleted-event": "(日誌動作已經移除咗)",
+       "rev-deleted-event": "(日誌詳情已經移除咗)",
        "rev-deleted-user-contribs": "[用戶名或IP地址拎走咗 - 響貢獻度隱藏咗編輯]",
        "rev-deleted-text-permission": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。",
-       "rev-deleted-text-unhide": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。\n作為管理員,如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
-       "rev-suppressed-text-unhide": "呢頁嘅修訂已經被'''廢止咗'''。\n喺[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。\n作為管理員,如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
-       "rev-deleted-text-view": "å\91¢é \81å\98\85ä¿®è¨\82å·²ç¶\93'''æ´\97å\92\97'''ã\80\82\nä½\9cç\82ºå\98\85管ç\90\86å\93¡ï¼\8cä½ å\8f¯ä»¥å\8e»ç\9d\87å\90\93ä½¢ï¼\9b\nå\96º[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} å\88ªé\99¤æ\97¥èª\8c]è£\8fé\9d¢å\8f¯ä»¥æ\90µå\88°æ\9b´è©³ç´°å\98\85è³\87æ\96\99ã\80\82",
-       "rev-suppressed-text-view": "å\91¢é \81å\98\85ä¿®è¨\82å·²ç¶\93'''廢止å\92\97'''ã\80\82\nä½\9cç\82ºå\98\85管ç\90\86å\93¡ï¼\8cä½ å\8f¯ä»¥å\8e»ç\9d\87å\90\93ä½¢ï¼\9b\nå\96º[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} å»¢æ­¢æ\97¥èª\8c]è£\8fé\9d¢å\8f¯ä»¥æ\90µå\88°æ\9b´è©³ç´°å\98\85è³\87æ\96\99ã\80\82",
+       "rev-deleted-text-unhide": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。\n如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
+       "rev-suppressed-text-unhide": "呢頁嘅修訂已經被'''廢止咗'''。\n喺[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。\n如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
+       "rev-deleted-text-view": "呢頁嘅修訂已經'''洗咗'''。\n你可以去睇吓佢;\n喺[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。",
+       "rev-suppressed-text-view": "呢頁嘅修訂已經'''廢止咗'''。\n你可以去睇吓佢;\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": "å\91¢å\80\8bå·®ç\95°å\98\85å\85¶ä¸­ä¸\80次修è¨\82å·²ç¶\93'''å\88ªé\99¤å\92\97'''ã\80\82\nä½\9cç\82ºç®¡ç\90\86å\93¡ä½ å\8f¯ä»¥å\8e»ç\9d\87å\91¢å\80\8bå·®ç\95°ï¼\9bå\96º[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} å\88ªé\99¤æ\97¥èª\8c]è£\8fé\9d¢å\8f¯ä»¥æ\90µå\88°æ\9b´è©³ç´°å\98\85è³\87æ\96\99ã\80\82",
-       "rev-suppressed-diff-view": "å\91¢å\80\8bå·®ç\95°å\98\85å\85¶ä¸­ä¸\80次修è¨\82å·²ç¶\93'''廢止å\92\97'''ã\80\82\nä½\9cç\82ºç®¡ç\90\86å\93¡ä½ å\8f¯ä»¥å\8e»ç\9d\87å\91¢å\80\8bå·®ç\95°ï¼\9bå\96º[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} å»¢æ­¢æ\97¥èª\8c]è£\8fé\9d¢å\8f¯ä»¥æ\90µå\88°æ\9b´è©³ç´°å\98\85è³\87æ\96\99ã\80\82",
+       "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}}/suppress|page={{FULLPAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。",
        "rev-delundel": "顯示/隱藏",
        "rev-showdeleted": "顯示",
        "revisiondelete": "刪除/反刪除修訂",
        "revdelete-no-file": "指定嘅檔案未存在。",
        "revdelete-show-file-confirm": "你係咪真係想去睇響$2 $3刪咗 \"$1\" 嘅檔案修訂?",
        "revdelete-show-file-submit": "係",
-       "logdelete-selected": "揀[[:$1]]嘅日誌事件:",
+       "logdelete-selected": "揀嘅日誌事件:",
        "revdelete-confirm": "請確認你肯定去做嘅話,你就要明白到後果,同埋呢個程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
-       "revdelete-suppress-text": "å£\93å\88¶'''å\8fª'''æ\87\89該é\9f¿ä¸\8bé\9d¢å\98\85æ\83\85æ³\81ä¹\8bä¸\8bé\80²è¡\8c:\n* å\94\94å\90\88é\81©å\98\85å\80\8b人è³\87æ\96\99\n*: ''å±\8bä¼\81å\9c°å\9d\80ã\80\81é\9b»è©±è\99\9f碼ã\80\81社群ä¿\9då®\89è\99\9f碼ç­\89ã\80\82''",
+       "revdelete-suppress-text": "å£\93å\88¶'''å\8fª'''æ\87\89該é\9f¿ä¸\8bé\9d¢å\98\85æ\83\85æ³\81ä¹\8bä¸\8bé\80²è¡\8c:\n* å\8f¯è\83½ä¿\82誹è¬\97å\98\85è³\87æ\96\99\n* å\94\94å\90\88é\81©å\98\85å\80\8b人è³\87æ\96\99\n*: ''å±\8bä¼\81å\9c°å\9d\80ã\80\81é\9b»è©±è\99\9f碼ã\80\81身份è­\89è\99\9f碼ç­\89ã\80\82''",
        "revdelete-legend": "設定可見性嘅限制",
-       "revdelete-hide-text": "隱藏修訂嘅文字",
+       "revdelete-hide-text": "修訂嘅文字",
        "revdelete-hide-image": "隱藏檔案內容",
-       "revdelete-hide-name": "隱藏動作同目標",
-       "revdelete-hide-comment": "隱藏編輯摘要",
-       "revdelete-hide-user": "隱藏編輯者嘅用戶名/IP地址",
+       "revdelete-hide-name": "隱藏目標同參數",
+       "revdelete-hide-comment": "隱藏摘要",
+       "revdelete-hide-user": "編輯者嘅用戶名/IP地址",
        "revdelete-hide-restricted": "同時壓制由操作員以及其他用戶的資料",
        "revdelete-radio-same": "(唔改)",
-       "revdelete-radio-set": "",
-       "revdelete-radio-unset": "唔好",
+       "revdelete-radio-set": "隱藏咗",
+       "revdelete-radio-unset": "顯示返",
        "revdelete-suppress": "同時壓制由操作員以及其他用戶的資料",
        "revdelete-unsuppress": "響已經恢復咗嘅修訂度移除限制",
        "revdelete-log": "原因:",
        "revdelete-no-change": "警告:響$1 $2嘅項目已經請求咗可見性設定。",
        "revdelete-concurrent-change": "改緊響$1 $2嘅項目錯誤:當我哋試吓改佢嘅設定嗰陣,已經畀另一啲人改過。請檢查紀錄。",
        "revdelete-only-restricted": "隱藏項目響$1 $2嘅項目:你唔可以廢止由管理員檢視,而唔同時再揀另外其中一個可見性選項。",
-       "revdelete-reason-dropdown": "*常用刪除原因\n** 侵犯版權\n** 唔合適嘅個人資料",
+       "revdelete-reason-dropdown": "*常用刪除原因\n** 侵犯版權\n** 唔合適嘅言論或者個人資料\n** 唔合適嘅用戶名\n** 可能係誹謗嘅資料",
        "revdelete-otherreason": "其它/附加的原因:",
        "revdelete-reasonotherlist": "其它原因",
        "revdelete-edit-reasonlist": "編輯刪除原因",
        "revdelete-offender": "修訂著者:",
        "suppressionlog": "廢止日誌",
-       "suppressionlogtext": "下面係刪除同埋由操作員牽涉到內容封鎖嘅一覽。\n睇吓[[Special:IPBlockList|IP封鎖一覽]]去睇現時進行緊嘅禁止同埋封鎖表。",
+       "suppressionlogtext": "下面係刪除同埋由操作員牽涉到內容封鎖嘅一覽。\n睇吓[[Special:BlockList|封鎖一覽]]去睇現時進行緊嘅禁止同埋封鎖表。",
        "mergehistory": "合併頁歷史",
        "mergehistory-header": "呢一版可以畀你去合併一個來源頁嘅修訂記錄到另一個新頁。\n請確認呢次更改會繼續保留嗰版之前嘅歷史版。",
        "mergehistory-box": "合併兩版嘅修訂:",
        "shown-title": "每版顯示$1項結果",
        "viewprevnext": "去睇 ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''響呢個wiki度有一版叫做\"[[:$1]]\"。'''",
-       "searchmenu-new": "'''響呢個wiki度開呢版\"[[:$1]]\"!'''",
+       "searchmenu-new": "<strong>響呢個wiki度開呢版「[[:$1]]」!</strong>睇埋搵到嘅結果。",
        "searchprofile-articles": "內容頁",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部嘢",
        "delete-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除呢類版嘅動作已經限制咗,以防止響{{SITENAME}}嘅意外擾亂。",
        "delete-warning-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除佢可能會擾亂{{SITENAME}}嘅資料庫操作;響繼續嗰陣請小心。",
        "rollback": "反轉修改",
-       "rollback_short": "反轉",
        "rollbacklink": "反轉",
        "rollbackfailed": "反轉唔到",
        "cantrollback": "反轉唔到;上一位貢獻者係唯一修改過呢版嘅人。",
        "watchlisttools-view": "睇吓有關嘅更改",
        "watchlisttools-edit": "睇吓同埋編輯監視清單",
        "watchlisttools-raw": "編輯原始監視清單",
-       "unknown_extension_tag": "未知嘅擴展標籤 \"$1\"",
        "duplicate-defaultsort": "警告: 預設嘅排序鍵 \"$2\" 覆蓋之前嘅預設排序鍵 \"$1\"。",
        "version": "版本",
        "version-extensions": "裝咗嘅擴展",
index 742f39d..cd5dc8b 100644 (file)
        "pool-queuefull": "请求队列已满",
        "pool-errorunknown": "未知错误",
        "pool-servererror": "池计数器服务不可用($1)。",
+       "poolcounter-usage-error": "用法错误:$1",
        "aboutsite": "关于{{SITENAME}}",
        "aboutpage": "Project:关于",
        "copyright": "除非另有声明,本网站内容采用$1授权。",
        "portal": "社区门户",
        "portal-url": "Project:社区门户",
        "privacy": "隐私政策",
-       "privacypage": "Project:é\9a\90ç§\81æ\9d\83æ\94¿ç­\96",
+       "privacypage": "Project:隐私政策",
        "badaccess": "权限错误",
        "badaccess-group0": "不允许您执行您所请求的操作。",
        "badaccess-groups": "您所请求的操作仅限于{{PLURAL:$2|该|这些}}用户组的用户使用:$1",
        "nosuchusershort": "没有名为“$1”的用户。请检查你的拼写。",
        "nouserspecified": "你必须指定用户名。",
        "login-userblocked": "该用户已被封禁,禁止登录。",
-       "wrongpassword": "输入的密码错误。请重试。",
+       "wrongpassword": "输入的密码错误。请重试。",
        "wrongpasswordempty": "密码输入为空。请重试。",
        "passwordtooshort": "您的密码至少需要$1个字符。",
        "password-name-match": "您的密码必须和您的用户名不相同。",
        "anoneditwarning": "<strong>警告:</strong>您没有登录。您做出任何编辑后您的IP地址会公开可见。如果您<strong>[$1 登陆]</strong>或<strong>[$2 注册]</strong>一个账户,您的编辑将归属于您的用户名,以及有其他好处。",
        "anonpreviewwarning": "<em>你没有登录。保存会记录你的IP地址于该页面的编辑历史中。</em>",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
-       "selfredirect": "<strong>è­¦å\91\8aï¼\9a</strong>æ\82¨æ­£å\9c¨å\88\9b建é\87\8då®\9aå\90\91å\88°å\90\8cä¸\80æ\9d¡ç\9b®ç\9a\84é\87\8då®\9aå\90\91ã\80\82\nå¦\82æ\9e\9cæ\82¨å\86\8d次ç\82¹å\87»â\80\9c{{int:savearticle}}â\80\9dï¼\8cé\87\8då®\9aå\90\91å°\86被创建。",
+       "selfredirect": "<strong>è­¦å\91\8aï¼\9a</strong>æ\82¨æ­£å\9c¨å°\86此页é\9d¢é\87\8då®\9aå\90\91è\87³å®\83è\87ªå·±ã\80\82\næ\82¨å\8f¯è\83½æ\8c\87å®\9aäº\86é\94\99误ç\9a\84é\87\8då®\9aå\90\91ç\9b®æ \87ï¼\8cæ\88\96è\80\85æ\82¨æ­£å\9c¨ç¼\96è¾\91é\94\99误ç\9a\84页é\9d¢ã\80\82\nå¦\82æ\9e\9cæ\82¨å\86\8d次ç\82¹å\87»â\80\9c{{int:savearticle}}â\80\9dï¼\8cé\87\8då®\9aå\90\91å°\86æ\97 è®ºå¦\82ä½\95被创建。",
        "missingcommenttext": "请在下面输入评论。",
        "missingcommentheader": "'''提示:''' 您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
        "summary-preview": "摘要预览:",
        "accmailtitle": "密码已寄出",
        "accmailtext": "为[[User talk:$1|$1]]随机生成的密码已送至$2。登录后可以在''[[Special:ChangePassword|更改密码]]''页面中修改。",
        "newarticle": "(新页面)",
-       "newarticletext": "你点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[$1 帮助页面])。如果你是错误地到达这里,请点击你的浏览器的'''返回'''按钮。",
+       "newarticletext": "你点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[$1 帮助页面])。如果你是错误地到达这里,请点击您的浏览器的<strong>返回</strong>按钮。",
        "anontalkpagetext": "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
        "noarticletext": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>",
        "noarticletext-nopermission": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但你没有权限创建本页面。",
        "editingcomment": "编辑“$1”(新段落)",
        "editconflict": "编辑冲突:$1",
        "explainconflict": "其他用户在你开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示你的更改。你必须把你的更改合并至现有文字。'''只有'''当你单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
-       "yourtext": "的文字",
+       "yourtext": "的文字",
        "storedversion": "已保存的版本",
        "nonunicodebrowser": "'''警告:您的浏览器不兼容Unicode编码。'''这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
        "editingold": "'''警告:你正在编辑的是本页面的旧版本。'''如果你保存该编辑,该版本后的所有更改都会丢失。",
        "content-model-text": "纯文本",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "空的对象",
+       "content-json-empty-array": "空的数组",
        "duplicate-args-category": "调用重复模板参数的页面",
        "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
        "history-feed-empty": "所请求的页面不存在。它可能已被删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关的新建页面。",
        "rev-deleted-comment": "(编辑摘要被删除)",
        "rev-deleted-user": "(用户名被删除)",
-       "rev-deleted-event": "(日志操作被删除)",
+       "rev-deleted-event": "(日志详情已移除)",
        "rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
        "rev-deleted-text-permission": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-text-permission": "此页面修订已经被<strong>监督隐藏</strong>。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "revdelete-legend": "设置可见性之限制",
        "revdelete-hide-text": "版本文字",
        "revdelete-hide-image": "隐藏文件内容",
-       "revdelete-hide-name": "隐藏动作和目标",
+       "revdelete-hide-name": "隐藏目标和参数",
        "revdelete-hide-comment": "编辑摘要",
        "revdelete-hide-user": "编者用户名/IP地址",
        "revdelete-hide-restricted": "同时阻止管理员与其他用户查看数据",
        "uploaderror": "上传出错",
        "upload-recreate-warning": "'''警告:一个相同名字的文件曾经被删除或者移动至别处。'''\n\n这个页面的删除和移动日志在这里提供以便参考:",
        "uploadtext": "请使用下面的表格上传文件。要查看或搜索以往上传的文件,请前往[[Special:FileList|上传的文件的列表]],(重新)上传也将记录在[[Special:Log/upload|上传日志]]中,删除将记录在[[Special:Log/delete|删除日志]]中。\n\n要在页面中包含文件,请使用一种以下形式的链接:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong>使用文件的完整版本\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替代文字]]</nowiki></code></strong>使用位于页面左边的框内的200像素宽的图片,以“替代文字”作为说明\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong>直接链接到文件而不显示文件",
-       "upload-permitted": "允许的文件类型:$1。",
-       "upload-preferred": "建议的文件类型:$1。",
-       "upload-prohibited": "禁止的文件类型:$1。",
+       "upload-permitted": "允许的文件{{PLURAL:$2|类型}}:$1。",
+       "upload-preferred": "建议的文件{{PLURAL:$2|类型}}:$1。",
+       "upload-prohibited": "禁止的文件{{PLURAL:$2|类型}}:$1。",
        "uploadlogpage": "上传日志",
        "uploadlogpagetext": "下面是最近的文件上传的列表。图像概览请见[[Special:NewFiles|新文件图库]]。",
        "filename": "文件名",
        "deleteprotected": "您不能删除此页面因为它被保护。",
        "deleting-backlinks-warning": "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
        "rollback": "回退编辑",
-       "rollback_short": "回退",
        "rollbacklink": "回退",
        "rollbacklinkcount": "回退$1次编辑",
        "rollbacklinkcount-morethan": "回退超过$1次的编辑",
        "restriction-level-all": "任何级别",
        "undelete": "查看被删除页面",
        "undeletepage": "查看和还原被删除的页面",
-       "undeletepagetitle": "'''以下包含[[:$1|$1]]的已删除之版本'''。",
+       "undeletepagetitle": "<strong>以下包含[[:$1|$1]]的已删除之版本</strong>。",
        "viewdeletedpage": "查看被删页面",
        "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
        "undelete-fieldset-title": "还原版本",
        "namespace": "名字空间:",
        "invert": "反选",
        "tooltip-invert": "请选择该框以隐藏指定名字空间(及相关名字空间,若被选择)的页面更改",
+       "tooltip-whatlinkshere-invert": "勾选此框以隐藏来自选定名字空间内页面的链接。",
        "namespace_association": "关联的名字空间",
        "tooltip-namespace_association": "选中此复选框可包括与选定名字空间相关的讨论页或子页面",
        "blanknamespace": "(主)",
        "thumbnail-temp-create": "无法创建临时缩略图文件",
        "thumbnail-dest-create": "无法将缩略图保存到目标地点",
        "thumbnail_invalid_params": "不正确的缩略图参数",
+       "thumbnail_toobigimagearea": "尺寸超过$1的文件",
        "thumbnail_dest_directory": "无法建立目标目录",
        "thumbnail_image-type": "图像类型不支持",
        "thumbnail_gd-library": "未完成的GD设置:功能遗失 $1",
        "import-logentry-interwiki": "跨wiki导入页面$1",
        "import-logentry-interwiki-detail": "来自$2的$1个{{PLURAL:$1|版本}}已导入",
        "javascripttest": "JavaScript测试",
-       "javascripttest-title": "运行$1测试",
        "javascripttest-pagetext-noframework": "本页面被保留进行JavaScript测试。",
        "javascripttest-pagetext-unknownframework": "未知的框架“$1”。",
+       "javascripttest-pagetext-unknownaction": "未知操作“$1”。",
        "javascripttest-pagetext-frameworks": "请选择以下的框架之一:$1",
        "javascripttest-pagetext-skins": "选择外观来运行测试:",
        "javascripttest-qunit-intro": "请见mediawiki.org的[$1 测试说明文件]。",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit 测试套件",
        "tooltip-pt-userpage": "你的用户页面",
        "tooltip-pt-anonuserpage": "你用于编辑的IP地址的用户页面",
        "tooltip-pt-mytalk": "你的讨论页面",
        "watchlisttools-edit": "查看并编辑监视列表",
        "watchlisttools-raw": "编辑原始监视列表",
        "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|讨论]])",
-       "unknown_extension_tag": "未知扩展标签“$1”",
        "duplicate-defaultsort": "'''警告:'''默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
        "duplicate-displaytitle": "<strong>警告:</strong>显示的标题“$2”重写了此前显示的标题“$1”。",
        "invalid-indicator-name": "<strong>错误:</strong>页面状态指示器的<code>name</code>属性必须不为空。",
        "version-ext-colheader-description": "说明",
        "version-ext-colheader-credits": "作者",
        "version-license-title": "$1的许可协议",
-       "version-license-not-found": "没æ\9c\89æ\89¾å\88°ä¸\8eæ­¤æ\8b\93å±\95ç\9b¸å\85³ç\9a\84授权信息。",
+       "version-license-not-found": "æ\9cªæ\89¾å\88°æ­¤æ\89©å±\95ç\9b¸å\85³ç\9a\84详ç»\86授权信息。",
        "version-credits-title": "$1贡献者名单",
-       "version-credits-not-found": "没æ\9c\89æ\89¾å\88°ä¸\8eæ­¤æ\8b\93å±\95ç\9b¸å\85³ç\9a\84ä¿¡ç\94¨信息。",
+       "version-credits-not-found": "æ\9cªæ\89¾å\88°æ­¤æ\89©å±\95ç\9b¸å\85³ç\9a\84详ç»\86å\88¶ä½\9c人信息。",
        "version-poweredby-credits": "本Wiki由'''[https://www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
        "version-poweredby-others": "其他",
        "version-poweredby-translators": "translatewiki.net上的翻译者",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 条目路径]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath 脚本路径]",
+       "version-libraries": "已安装的库",
+       "version-libraries-library": "库",
+       "version-libraries-version": "版本",
        "redirect": "重定向(按文件、用户、页面或版本ID)",
        "redirect-legend": "重定向至文件或页面",
        "redirect-summary": "本特殊页面可以跳转至一个文件(提供文件名)、页面(提供版本ID或页面ID)或用户页面(提供数字用户ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]]或[[{{#Special:Redirect}}/user/101]]。",
        "compare-revision-not-exists": "你指定的版本不存在。",
        "dberr-problems": "抱歉!本网站出现了一些技术问题。",
        "dberr-again": "请等待几分钟后重试。",
-       "dberr-info": "ï¼\88æ\97 æ³\95è¿\9eæ\8e¥å\88°æ\95°æ\8d®åº\93æ\9c\8då\8a¡å\99¨:$1)",
-       "dberr-info-hidden": "ï¼\88æ\97 æ³\95è¿\9eæ\8e¥å\88°æ\95°æ\8d®åº\93æ\9c\8då\8a¡å\99¨)",
+       "dberr-info": "ï¼\88æ\97 æ³\95访é\97®æ\95°æ\8d®åº\93:$1)",
+       "dberr-info-hidden": "ï¼\88æ\97 æ³\95访é\97®æ\95°æ\8d®åº\93)",
        "dberr-usegoogle": "在此期间您可以尝试用 Google 来搜索。",
        "dberr-outofdate": "须注意他们索引出来的内容可能不是最新的。",
        "dberr-cachederror": "这是所请求页面的缓存副本,可能不是最新的。",
index c11d392..376a4cd 100644 (file)
@@ -62,7 +62,7 @@
                ]
        },
        "tog-underline": "底線標示連結:",
-       "tog-hideminor": "隱藏近期變更以來的小編輯",
+       "tog-hideminor": "在近期變更隱藏小編輯",
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
        "qbedit": "編輯",
        "qbpageoptions": "此頁面",
        "qbmyoptions": "我的頁面",
-       "faq": "常見問",
+       "faq": "常見問",
        "faqpage": "Project:FAQ",
        "actions": "動作",
        "namespaces": "命名空間",
        "variants": "變體",
        "navigation-heading": "導覽選單",
        "errorpagetitle": "錯誤",
-       "returnto": "返回 $1。",
+       "returnto": "返回 $1。",
        "tagline": "出自 {{SITENAME}}",
        "help": "說明",
        "search": "搜尋",
        "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
        "mediawikipage": "檢視訊息頁面",
-       "templatepage": "檢è¦\96樣板頁面",
+       "templatepage": "檢è¦\96模板頁面",
        "viewhelppage": "檢視說明頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "pool-queuefull": "程序序列已滿",
        "pool-errorunknown": "不明錯誤",
        "pool-servererror": "無法使用程序計數服務 ($1)。",
+       "poolcounter-usage-error": "用法錯誤:$1",
        "aboutsite": "關於 {{SITENAME}}",
        "aboutpage": "Project:About",
        "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。",
        "portal": "社群入口",
        "portal-url": "Project:Community portal",
        "privacy": "隱私政策",
-       "privacypage": "Project:Privacy policy",
+       "privacypage": "Project:隱私政策",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
        "badaccess-groups": "您請求的操作只有{{PLURAL:$2|這個|這些}}群組的使用者能使用:$1",
        "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "樣板",
+       "nstab-template": "模板",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
        "nosuchaction": "無此動作",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "login-userblocked": "這位使用者已被封鎖,不允許登入。",
-       "wrongpassword": "您輸入的密碼錯誤,請再試一次。",
+       "wrongpassword": "您輸入的密碼有錯誤,請再嘗試一次。",
        "wrongpasswordempty": "輸入的密碼是空的。\n請再試一次。",
        "passwordtooshort": "您的密碼至少需要 $1 個字元。",
        "password-name-match": "您的密碼不可以跟使用者名稱相同。",
        "noemailcreate": "您需要提供一個有效的電子郵件位址。",
        "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件位址,\n請稍後收到信件後再登入。",
        "blocked-mailpassword": "您的 IP 位址已被封鎖不允許編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
-       "eauthentsent": "已寄出一封確認信到您所設定的電子郵件位址。\n在未收到其它電子郵件前,您必須先依照件中的指示,確認這個帳號確實是您本人。",
+       "eauthentsent": "已寄出一封確認信到您所設定的電子郵件位址。\n在未收到其它電子郵件前,您必須先依照件中的指示,確認這個帳號確實是您本人。",
        "throttled-mailpassword": "密碼重設的電子郵件已經在最近 $1 小時內寄出。\n為防止濫用,$1 小時內只能寄出一次密碼重設信件。",
        "mailerror": "傳送電子郵件錯誤:$1",
        "acct_creation_throttle_hit": "使用您目前的 IP 位址的訪客在最近一天建立了 {{PLURAL:$1|1 個帳號|$1 個帳號}},已超出系統允許的上限。\n因此,目前無法讓使用此 IP 位址的訪客建立帳號。",
        "anoneditwarning": "<strong>警告:</strong>您尚未登入。 若您進行任何的編輯您的 IP 位置將會被公開。 若您 <strong>[$1 登入]</strong> 或 <strong>[$2 建立帳號]</strong>,您的編輯將會以您的使用者名稱標示,擁有其他優點。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
-       "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
+       "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
        "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
        "summary-preview": "摘要預覽:",
        "semiprotectedpagewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可編輯。\n以下提供最近的日誌以便參考:",
        "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
-       "templatesused": "æ­¤é \81é\9d¢ä½¿ç\94¨äº\86以ä¸\8b{{PLURAL:$1|樣æ\9d¿}}:",
-       "templatesusedpreview": "æ­¤é \90覽使ç\94¨äº\86以ä¸\8b{{PLURAL:$1|樣板}}:",
-       "templatesusedsection": "此頁面使用了以下{{PLURAL:$1|樣板}}:",
+       "templatesused": "æ­¤é \81é\9d¢ä½¿ç\94¨äº\86以ä¸\8b{{PLURAL:$1|模æ\9d¿}}ï¼\9a",
+       "templatesusedpreview": "æ­¤é \90覽使ç\94¨äº\86以ä¸\8b{{PLURAL:$1|模板}}:",
+       "templatesusedsection": "此頁面使用了以下 {{PLURAL:$1|模板}} :",
        "template-protected": "(受保護)",
        "template-semiprotected": "(受半保護)",
        "hiddencategories": "此頁面屬於 {{PLURAL:$1|1 個隱藏分類|$1 個隱藏分類}}的成員:",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "空物件",
+       "content-json-empty-array": "空陣列",
        "duplicate-args-category": "樣板呼叫時使用重複的參數的頁面",
        "duplicate-args-category-desc": "該頁面包含重複使用參數的樣板呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "history-feed-empty": "請求的頁面不存在,\n可能已被刪除或重新命名。\n請嘗試 [[Special:Search|搜尋本站]] 取得其他相關的新頁面。",
        "rev-deleted-comment": "(已移除編輯摘要)",
        "rev-deleted-user": " (已移除使用者名稱)",
-       "rev-deleted-event": "(已移é\99¤æ\97¥èª\8cæ\93\8dä½\9c)",
+       "rev-deleted-event": "(已移é\99¤æ\97¥èª\8cæ\98\8eç´°)",
        "rev-deleted-user-contribs": "[使用者名稱或 IP 位址已移除 - 已隱藏貢獻清單中的編輯]",
        "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}}}} 禁止顯示日誌] 取得詳細資訊。",
        "revdelete-legend": "設定顯示限制",
        "revdelete-hide-text": "修訂文字",
        "revdelete-hide-image": "隱藏檔案內容",
-       "revdelete-hide-name": "隱藏動作和目標",
+       "revdelete-hide-name": "隱藏目標與參數",
        "revdelete-hide-comment": "編輯摘要",
        "revdelete-hide-user": "編輯者的使用者名稱/IP 位址",
        "revdelete-hide-restricted": "禁止顯示資料給管理者及其他使用者",
        "searchprofile-advanced-tooltip": "搜尋自訂命名空間",
        "search-result-size": "$1 ($2 個字)",
        "search-result-category-size": "$1 位成員 ($2 個子分類,$3 個檔案)",
-       "search-redirect": " (重新導向自 $1 )",
+       "search-redirect": "(重新導向自 $1)",
        "search-section": "(章節 $1)",
        "search-category": "(分類 $1)",
        "search-file-match": "(符合檔案內容)",
        "recentchanges-label-unpatrolled": "該編輯尚未巡查",
        "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考 [[Special:NewPages|最新頁面]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的近期變更",
        "listduplicatedfiles-summary": "此清單中包含最新版本的檔案與其他檔案重複的清單,本清單只顯示本地檔案。",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
        "unusedtemplates": "未使用的樣板",
-       "unusedtemplatestext": "æ­¤é \81é\9d¢å\88\97å\87ºæ\89\80æ\9c\89æ\96¼ {{ns:template}} å\91½å\90\8d空é\96\93ä¸\8bæ\9cªè¢«å\85¶ä»\96é \81é\9d¢å¼\95ç\94¨ç\9a\84樣æ\9d¿ã\80\82\nå\9c¨å\88ªé\99¤å\89\8dï¼\8cä»\8dé\9c\80檢æ\9f¥æ\98¯å\90¦æ\9c\89é\80£çµ\90é\80\99äº\9b樣板的其他頁面。",
+       "unusedtemplatestext": "æ­¤é \81é\9d¢å\88\97å\87ºæ\89\80æ\9c\89æ\96¼ {{ns:template}} å\91½å\90\8d空é\96\93ä¸\8bæ\9cªè¢«å\85¶ä»\96é \81é\9d¢å¼\95ç\94¨ç\9a\84模æ\9d¿ã\80\82\nå\9c¨å\88ªé\99¤å\89\8dï¼\8cä»\8dé\9c\80檢æ\9f¥æ\98¯å\90¦æ\9c\89é\80£çµ\90é\80\99äº\9b模板的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "randompage-nopages": "在{{PLURAL:$2|命名空間}}中沒有任何頁面:$1。",
        "uncategorizedpages": "未分類的頁面",
        "uncategorizedcategories": "未分類的分類",
        "uncategorizedimages": "未分類的檔案",
-       "uncategorizedtemplates": "å¾\85å\88\86é¡\9e樣板",
+       "uncategorizedtemplates": "å¾\85å\88\86é¡\9e模板",
        "unusedcategories": "未使用的分類",
        "unusedimages": "未使用的檔案",
        "wantedcategories": "需要的分類",
        "wantedfiletext-cat-noforeign": "下列檔案已被使用但不存在。 除此之外,頁面已內嵌但不存在的檔案列於 [[:$1]]。",
        "wantedfiletext-nocat": "下列檔案被時用,但檔案不存在。 外部儲存庫的檔案儘管存在,但此清單仍會列出。 這類誤報的項目會以 <del>刪除線</del> 標示。",
        "wantedfiletext-nocat-noforeign": "下列檔案已被使用但不存在。",
-       "wantedtemplates": "é\9c\80è¦\81ç\9a\84樣板",
+       "wantedtemplates": "é\9c\80è¦\81ç\9a\84模板",
        "mostlinked": "被連結最多的頁面",
        "mostlinkedcategories": "被連結最多的分類",
        "mostlinkedtemplates": "被引用最多的頁面",
        "deleteprotected": "此頁面已受保護,您無法刪除此頁面。",
        "deleting-backlinks-warning": "<strong>警告:</strong>您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。",
        "rollback": "還原編輯",
-       "rollback_short": "還原",
        "rollbacklink": "還原",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "還原超過 $1 次{{PLURAL:$1|編輯}}",
        "restriction-level-all": "任何層級",
        "undelete": "檢視已刪除的頁面",
        "undeletepage": "檢視與還原已刪除的頁面",
-       "undeletepagetitle": "<strong>下列為 [[:$1]] 已刪除的修訂版本</strong>。",
+       "undeletepagetitle": "<strong>下列為 [[:$1|$1]] 已刪除的修訂版本</strong>。",
        "viewdeletedpage": "檢視已刪除頁面",
        "undeletepagetext": "下列 {{PLURAL:$1|1 個頁面已刪除|$1 個頁面已刪除}}但尚在封存,仍可還原。\n封存的檔案可能會定時清理。",
        "undelete-fieldset-title": "還原修訂",
        "namespace": "命名空間:",
        "invert": "反向選擇",
        "tooltip-invert": "勾選此核選方塊以隱藏選擇命名空間中的頁面變更 (若勾選相關命名空間,則會同時隱藏相關命名空間)",
+       "tooltip-whatlinkshere-invert": "勾選此核選方塊以隱藏選擇命名空間中的頁面連結。",
        "namespace_association": "相關命名空間",
        "tooltip-namespace_association": "勾選此核選方塊以包含與選擇命名空間相關的對話或主題命名空間",
        "blanknamespace": "(主要)",
        "istemplate": "引用",
        "isimage": "檔案連結",
        "whatlinkshere-prev": "前 $1 筆",
-       "whatlinkshere-next": "後 $1 筆",
+       "whatlinkshere-next": "{{PLURAL:$1|後筆|後 $1 筆}}",
        "whatlinkshere-links": "← 連結",
        "whatlinkshere-hideredirs": "$1 重新導向頁面",
        "whatlinkshere-hidetrans": "$1 引用",
        "expiringblock": "$1 $2 到期",
        "anononlyblock": "限匿名使用者",
        "noautoblockblock": "停用自動封鎖",
-       "createaccountblock": "å\81\9cç\94¨å¸³è\99\9f建ç«\8b",
+       "createaccountblock": "帳è\99\9f建ç«\8bå\81\9cç\94¨",
        "emailblock": "停用電子郵件",
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
        "ipblocklist-empty": "封鎖清單無任何資訊。",
        "thumbnail-temp-create": "無法建立暫存縮圖檔案",
        "thumbnail-dest-create": "無法儲存縮圖至目標",
        "thumbnail_invalid_params": "無效的縮圖參數",
+       "thumbnail_toobigimagearea": "檔案的尺寸超過 $1",
        "thumbnail_dest_directory": "無法建立目標目錄",
        "thumbnail_image-type": "不支援的圖片類型",
        "thumbnail_gd-library": "未完成 GD 設定:缺少函數 $1",
        "import-logentry-interwiki": "Transwiki 頁面 $1",
        "import-logentry-interwiki-detail": "已從 $2 匯入 $1 筆{{PLURAL:$1|修訂}}",
        "javascripttest": "JavaScript 測試",
-       "javascripttest-title": "執行 $1 測試。",
        "javascripttest-pagetext-noframework": "此頁面保留用來作為 JavaScript 測試使用。",
        "javascripttest-pagetext-unknownframework": "不明的測試 Framework \"$1\"。",
+       "javascripttest-pagetext-unknownaction": "未知操作「$1」。",
        "javascripttest-pagetext-frameworks": "請選擇下列一種測試 Framework:$1",
        "javascripttest-pagetext-skins": "選擇執行測試的外觀:",
        "javascripttest-qunit-intro": "請參考 mediawiki.org 的 [$1 測試說明文件]。",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit 測試工具",
        "tooltip-pt-userpage": "您的使用者頁面",
        "tooltip-pt-anonuserpage": "您編輯使用的 IP 位址所對應的使用者頁面",
        "tooltip-pt-mytalk": "您的對話頁面",
        "pageinfo-recent-authors": "最近作者數",
        "pageinfo-magic-words": "魔術{{PLURAL:$1|字}} ($1)",
        "pageinfo-hidden-categories": "隱藏分類 ($1)",
-       "pageinfo-templates": "å¼\95ç\94¨æ¨£板 ($1)",
+       "pageinfo-templates": "å¼\95ç\94¨æ¨¡板 ($1)",
        "pageinfo-transclusions": "頁面被引用於 ($1)",
        "pageinfo-toolboxlink": "頁面資訊",
        "pageinfo-redirectsto": "重新導向至",
        "variantname-zh": "不轉換",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
-       "metadata": "資料定義",
+       "metadata": "後設資料",
        "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n若修改此檔案,部份資訊將無法保留。",
        "metadata-expand": "顯示詳細資料",
        "metadata-collapse": "隱藏詳細資料",
        "watchlisttools-edit": "檢視並編輯監視清單",
        "watchlisttools-raw": "編輯原始監視清單",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|對話]])",
-       "unknown_extension_tag": "不明的擴充標籤 \"$1\"",
        "duplicate-defaultsort": "<strong>警告:</strong>預設的排序鍵 \"$2\" 會覆蓋先前預設的排序鍵 \"$1\"。",
        "duplicate-displaytitle": "<strong>警告:</strong> 顯示標題 \"$2\" 覆蓋之前的顯示標題 \"$1\"。",
        "invalid-indicator-name": "<strong>錯誤:</strong>頁面狀態指示器的<code>name</code> 屬性不能為空。",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 文章路徑]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script 路徑]",
+       "version-libraries": "已安裝的程式庫",
+       "version-libraries-library": "程式庫",
+       "version-libraries-version": "版本",
        "redirect": "重新導向至檔案、使用者、頁面或修訂 ID",
        "redirect-legend": "重新導向至檔案或頁面",
        "redirect-summary": "此特殊頁面可用來重新導向至檔案 (指定檔案名稱)、頁面 (指定修訂 ID 或頁面 ID) 或使用者頁面 (指定使用者 ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]] 或 [[{{#Special:Redirect}}/user/101]]。",
        "compare-revision-not-exists": "您所指定的修訂不存在。",
        "dberr-problems": "抱歉!這個網站出現了一些技術上的問題。",
        "dberr-again": "嘗試等候數分鐘後,然後再試。",
-       "dberr-info": "(無法連線資料庫伺服器:$1)",
-       "dberr-info-hidden": "(無法連線資料庫伺服器)",
+       "dberr-info": "(無法連接資料庫:$1)",
+       "dberr-info-hidden": "(無法連接資料庫)",
        "dberr-usegoogle": "您可以嘗試在此期間使用 Google 搜尋。",
        "dberr-outofdate": "注意,它們用來建立索引的內容可能不是最新的。",
        "dberr-cachederror": "這是請求面頁面的快取複本,可能不是最新的。",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
        "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
-       "expandtemplates": "å±\95é\96\8b樣板",
+       "expandtemplates": "å±\95é\96\8b模板",
        "expand_templates_intro": "本特殊頁面會將文字中的樣板展開,可以包含支援的解析器語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
diff --git a/languages/messages/MessagesBgn.php b/languages/messages/MessagesBgn.php
new file mode 100644 (file)
index 0000000..5c01273
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/** Western Balochi
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fa';
+$rtl = true;
index 8d0d14c..9ac1332 100644 (file)
 
 $fallback = 'cdo, zh-hant';
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Mûi-thé',
+       NS_SPECIAL          => 'Tek-pia̍t',
+       NS_TALK             => 'Thó-lūn',
+       NS_USER             => 'Iōng-chiá',
+       NS_USER_TALK        => 'Iōng-chiá_thó-lūn',
+       NS_PROJECT_TALK     => '$1_thó-lūn',
+       NS_FILE             => 'tóng-àn',
+       NS_FILE_TALK        => 'tóng-àn_thó-lūn',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_thó-lūn',
+       NS_TEMPLATE         => 'Pang-bô͘',
+       NS_TEMPLATE_TALK    => 'Pang-bô͘_thó-lūn',
+       NS_HELP             => 'Pang-chān',
+       NS_HELP_TALK        => 'Pang-chān_thó-lūn',
+       NS_CATEGORY         => 'Lūi-pia̍t',
+       NS_CATEGORY_TALK    => 'Lūi-pia̍t_thó-lūn',
+);
+
+$namespaceAliases = array(
+       '媒體' => NS_MEDIA,
+       '特殊' => NS_SPECIAL,
+       '討論' => NS_TALK,
+       '用戶' => NS_USER,
+       '用戶討論' => NS_USER_TALK,
+       '$1討論' => NS_PROJECT_TALK,
+       '文件' => NS_FILE,
+       '文件討論' => NS_FILE_TALK,
+       '媒體維基' => NS_MEDIAWIKI,
+       '媒體維基討論' => NS_MEDIAWIKI_TALK,
+       '模板' => NS_TEMPLATE,
+       '模板討論' => NS_TEMPLATE_TALK,
+       '幫助' => NS_HELP,
+       '幫助討論' => NS_HELP_TALK,
+       '分類' => NS_CATEGORY,
+       '分類討論' => NS_CATEGORY_TALK,
+);
+
 $datePreferences = array(
        'default',
        'ISO 8601',
index f3f2ef5..14a7f99 100644 (file)
@@ -305,7 +305,7 @@ $magicWords = array(
        'padleft'                   => array( '0', 'DOLEWEJ', 'PADLEFT' ),
        'padright'                  => array( '0', 'DOPRAWEJ', 'PADRIGHT' ),
        'special'                   => array( '0', 'specjalna', 'special' ),
-       'defaultsort'               => array( '1', 'DOMYŚLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'defaultsort'               => array( '1', 'SORTUJ', 'DOMYŚLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'ŚCIEŻKAPLIKU', 'FILEPATH:' ),
        'hiddencat'                 => array( '1', '__KATEGORIAUKRYTA__', '__HIDDENCAT__' ),
        'pagesincategory'           => array( '1', 'STRONYWKATEGORII', 'PAGESINCATEGORY', 'PAGESINCAT' ),
index 8b23909..f66cd5a 100644 (file)
--- a/load.php
+++ b/load.php
@@ -31,7 +31,6 @@ if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3
 
 require __DIR__ . '/includes/WebStart.php';
 
-wfProfileIn( 'load.php' );
 
 // URL safety checks
 if ( !$wgRequest->checkUrlExtension() ) {
@@ -44,7 +43,6 @@ $configFactory = ConfigFactory::getDefaultInstance();
 $resourceLoader = new ResourceLoader( $configFactory->makeConfig( 'main' ) );
 $resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
 
-wfProfileOut( 'load.php' );
 wfLogProfilingData();
 
 // Shut down the database.
index 3fda23a..9b98b20 100644 (file)
@@ -102,7 +102,7 @@ abstract class Maintenance {
        private $mDependantParameters = array();
 
        /**
-        * Used by getDD() / setDB()
+        * Used by getDB() / setDB()
         * @var DatabaseBase
         */
        private $mDb = null;
@@ -604,7 +604,7 @@ abstract class Maintenance {
                global $wgProfiler;
 
                $output = $this->getOption( 'profiler' );
-               if ( $output && is_array( $wgProfiler ) ) {
+               if ( $output && is_array( $wgProfiler ) && isset( $wgProfiler['class'] ) ) {
                        $class = $wgProfiler['class'];
                        $profiler = new $class(
                                array( 'sampling' => 1, 'output' => $output ) + $wgProfiler
@@ -944,8 +944,8 @@ abstract class Maintenance {
 
                $wgShowSQLErrors = true;
 
-               // @codingStandardsIgnoreStart Allow error supppression. wfSuppressWarnings()
-               // is not avaiable.
+               // @codingStandardsIgnoreStart Allow error suppression. wfSuppressWarnings()
+               // is not available.
                @set_time_limit( 0 );
                // @codingStandardsIgnoreStart
 
@@ -1073,7 +1073,7 @@ abstract class Maintenance {
         *
         * @return DatabaseBase
         */
-       protected function &getDB( $db, $groups = array(), $wiki = false ) {
+       protected function getDB( $db, $groups = array(), $wiki = false ) {
                if ( is_null( $this->mDb ) ) {
                        return wfGetDB( $db, $groups, $wiki );
                } else {
@@ -1086,7 +1086,7 @@ abstract class Maintenance {
         *
         * @param DatabaseBase $db Database object to be used
         */
-       public function setDB( &$db ) {
+       public function setDB( $db ) {
                $this->mDb = $db;
        }
 
@@ -1094,7 +1094,7 @@ abstract class Maintenance {
         * Lock the search index
         * @param DatabaseBase &$db
         */
-       private function lockSearchindex( &$db ) {
+       private function lockSearchindex( $db ) {
                $write = array( 'searchindex' );
                $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user' );
                $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
@@ -1104,7 +1104,7 @@ abstract class Maintenance {
         * Unlock the tables
         * @param DatabaseBase &$db
         */
-       private function unlockSearchindex( &$db ) {
+       private function unlockSearchindex( $db ) {
                $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
        }
 
@@ -1113,7 +1113,7 @@ abstract class Maintenance {
         * Since the lock is low-priority, queued reads will be able to complete
         * @param DatabaseBase &$db
         */
-       private function relockSearchindex( &$db ) {
+       private function relockSearchindex( $db ) {
                $this->unlockSearchindex( $db );
                $this->lockSearchindex( $db );
        }
@@ -1321,7 +1321,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
        }
 
        /**
-        * Message to show the the update log was unable to log the completion of this update
+        * Message to show that the update log was unable to log the completion of this update
         * @return string
         */
        protected function updatelogFailedMessage() {
diff --git a/maintenance/archives/patch-drop-page_counter.sql b/maintenance/archives/patch-drop-page_counter.sql
new file mode 100644 (file)
index 0000000..1d8e701
--- /dev/null
@@ -0,0 +1,2 @@
+-- field is deprecated and no longer updated as of 1.25
+ALTER TABLE /*_*/page DROP COLUMN page_counter;
diff --git a/maintenance/archives/patch-drop-ss_total_views.sql b/maintenance/archives/patch-drop-ss_total_views.sql
new file mode 100644 (file)
index 0000000..0059193
--- /dev/null
@@ -0,0 +1,2 @@
+-- field is deprecated and no longer updated as of 1.24
+ALTER TABLE /*_*/site_stats DROP COLUMN ss_total_views;
\ No newline at end of file
diff --git a/maintenance/checkComposerLockUpToDate.php b/maintenance/checkComposerLockUpToDate.php
new file mode 100644 (file)
index 0000000..0b77578
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Checks whether your composer-installed dependencies are up to date
+ *
+ * Composer creates a "composer.lock" file which specifies which versions are installed
+ * (via `composer install`). It has a hash, which can be compared to the value of
+ * the composer.json file to see if dependencies are up to date.
+ */
+class CheckComposerLockUpToDate extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Checks whether your composer.lock file is up to date with the current composer.json';
+       }
+
+       public function execute() {
+               global $IP;
+               $lockLocation = "$IP/composer.lock";
+               $jsonLocation = "$IP/composer.json";
+               if ( !file_exists( $lockLocation ) ) {
+                       // Maybe they're using mediawiki/vendor?
+                       $lockLocation = "$IP/vendor/composer.lock";
+                       if ( !file_exists( $lockLocation ) ) {
+                               $this->error( 'Could not find composer.lock file. Have you run "composer install"?', 1 );
+                       }
+               }
+
+               $lock = new ComposerLock( $lockLocation );
+               $json = new ComposerJson( $jsonLocation );
+
+               if ( $lock->getHash() === $json->getHash() ) {
+                       $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
+                       return;
+               }
+               // Out of date, lets figure out which dependencies are old
+               $found = false;
+               $installed = $lock->getInstalledDependencies();
+               foreach ( $json->getRequiredDependencies() as $name => $version ) {
+                       if ( isset( $installed[$name] ) ) {
+                               if ( $installed[$name]['version'] !== $version ) {
+                                       $this->output( "$name: {$installed[$name]['version']} installed, $version required.\n" );
+                                       $found = true;
+                               }
+                       } else {
+                               $this->output( "$name: not installed, $version required.\n" );
+                               $found = true;
+                       }
+               }
+               if ( $found ) {
+                       $this->error( 'Error: your composer.lock file is not up to date, run "composer update" to install newer dependencies', 1 );
+               } else {
+                       // The hash is the entire composer.json file, so it can be updated without any of the dependencies changing
+                       // We couldn't find any out-of-date dependencies, so assume everything is ok!
+                       $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
+               }
+
+       }
+}
+
+$maintClass = 'CheckComposerLockUpToDate';
+require_once RUN_MAINTENANCE_IF_MAIN;
\ No newline at end of file
diff --git a/maintenance/convertExtensionToRegistration.php b/maintenance/convertExtensionToRegistration.php
new file mode 100644 (file)
index 0000000..75500c2
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+class ConvertExtensionToRegistration extends Maintenance {
+
+       protected $custom = array(
+               'MessagesDirs' => 'handleMessagesDirs',
+               'ExtensionMessagesFiles' => 'removeAbsolutePath',
+               'AutoloadClasses' => 'removeAbsolutePath',
+               'ExtensionCredits' => 'handleCredits',
+               'ResourceModules' => 'handleResourceModules',
+               'Hooks' => 'handleHooks',
+               'ExtensionFunctions' => 'handleExtensionFunctions',
+       );
+
+       private $json, $dir;
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Converts extension entry points to the new JSON registration format';
+       }
+
+       protected function getAllGlobals() {
+               $processor = new ReflectionClass( 'ExtensionProcessor' );
+               $settings = $processor->getProperty( 'globalSettings' );
+               $settings->setAccessible( true );
+               return $settings->getValue();
+       }
+
+       public function execute() {
+               // Extensions will do stuff like $wgResourceModules += array(...) which is a
+               // fatal unless an array is already set. So set an empty value.
+               foreach ( array_merge( $this->getAllGlobals(), array_keys( $this->custom ) ) as $var ) {
+                       $var = 'wg' . $var;
+                       $$var = array();
+               }
+               unset( $var );
+               require $this->getArg( 0 );
+               // Try not to create any local variables before this line
+               $vars = get_defined_vars();
+               unset( $vars['this'] );
+               $this->dir = dirname( realpath( $this->getArg( 0 ) ) );
+               $this->json = array();
+               $globalSettings = $this->getAllGlobals();
+               foreach ( $vars as $name => $value ) {
+                       // If an empty array, assume it's the default we set, so skip it
+                       if ( is_array( $value ) && count( $value ) === 0 ) {
+                               continue;
+                       }
+                       $realName = substr( $name, 2 ); // Strip 'wg'
+                       if ( isset( $this->custom[$realName] ) ) {
+                               call_user_func_array( array( $this, $this->custom[$realName] ), array( $realName, $value ) );
+                       } elseif ( in_array( $realName, $globalSettings ) ) {
+                               $this->json[$realName] = $value;
+                       } elseif ( strpos( $name, 'wg' ) === 0 ) {
+                               // Most likely a config setting
+                               $this->json['config'][$realName] = $value;
+                       }
+               }
+
+               $fname = "{$this->dir}/extension.json";
+               $prettyJSON = FormatJson::encode( $this->json, "\t", FormatJson::ALL_OK );
+               file_put_contents( $fname, $prettyJSON . "\n" );
+               $this->output( "Wrote output to $fname.\n" );
+       }
+
+       protected function handleExtensionFunctions( $realName, $value ) {
+               foreach ( $value as $func ) {
+                       if ( $func instanceof Closure ) {
+                               $this->error( "Error: Closures cannot be converted to JSON. Please move your extension function somewhere else.", 1 );
+                       }
+               }
+
+               $this->json[$realName] = $value;
+       }
+
+       protected function handleMessagesDirs( $realName, $value ) {
+               foreach ( $value as $key => $dirs ) {
+                       foreach ( (array)$dirs as $dir ) {
+                               $this->json[$realName][$key][] = $this->stripPath( $dir, $this->dir );
+                       }
+               }
+       }
+
+       private function stripPath( $val, $dir ) {
+               if ( $val === $dir ) {
+                       $val = '';
+               } elseif ( strpos( $val, $dir ) === 0 ) {
+                       // +1 is for the trailing / that won't be in $this->dir
+                       $val = substr( $val, strlen( $dir ) + 1 );
+               }
+
+               return $val;
+       }
+
+       protected function removeAbsolutePath( $realName, $value ) {
+               $out = array();
+               foreach ( $value as $key => $val ) {
+                       $out[$key] = $this->stripPath( $val, $this->dir );
+               }
+               $this->json[$realName] = $out;
+       }
+
+       protected function handleCredits( $realName, $value) {
+               $keys = array_keys( $value );
+               $this->json['type'] = $keys[0];
+               $values = array_values( $value );
+               foreach ( $values[0][0] as $name => $val ) {
+                       if ( $name !== 'path' ) {
+                               $this->json[$name] = $val;
+                       }
+               }
+       }
+
+       public function handleHooks( $realName, $value ) {
+               foreach ( $value as $hookName => $handlers ) {
+                       foreach ( $handlers as $func ) {
+                               if ( $func instanceof Closure ) {
+                                       $this->error( "Error: Closures cannot be converted to JSON. Please move the handler for $hookName somewhere else.", 1 );
+                               }
+                       }
+               }
+               $this->json[$realName] = $value;
+       }
+
+       protected function handleResourceModules( $realName, $value ) {
+               foreach ( $value as $name => $data ) {
+                       if ( isset( $data['localBasePath'] ) ) {
+                               $data['localBasePath'] = $this->stripPath( $data['localBasePath'], $this->dir );
+                       }
+                       $this->json[$realName][$name] = $data;
+               }
+       }
+}
+
+$maintClass = 'ConvertExtensionToRegistration';
+require_once RUN_MAINTENANCE_IF_MAIN;
index ad8b004..dd27c8c 100644 (file)
@@ -1811,7 +1811,6 @@ historysubmit
 historywarning
 hit
 hitcount
-hitcounter
 hits
 hlist
 hmac
@@ -4514,7 +4513,7 @@ what
 whatlinkshere
 whatwg
 wheely
-wheter
+whether
 whitelist
 whitelisted
 whitelistedittext
index e4380a7..c93a971 100644 (file)
@@ -68,6 +68,7 @@ if ( file_exists( "$IP/StartProfiler.php" ) ) {
 // Some other requires
 require_once "$IP/includes/Defines.php";
 require_once "$IP/includes/DefaultSettings.php";
+require_once "$IP/includes/GlobalFunctions.php";
 
 # Load composer's autoloader if present
 if ( is_readable( "$IP/vendor/autoload.php" ) ) {
@@ -113,7 +114,7 @@ try {
        $factory = wfGetLBFactory();
        $factory->commitMasterChanges();
        $factory->shutdown();
-} catch ( MWException $mwe ) {
+} catch ( Exception $mwe ) {
        echo $mwe->getText();
        exit( 1 );
 }
index 25ecc09..e20c477 100644 (file)
@@ -49,9 +49,6 @@ if ( isset( $options['d'] ) ) {
                        $lb->setServerInfo( $i, $server );
                }
        }
-       if ( $d > 2 ) {
-               $wgDebugFunctionEntry = true;
-       }
 }
 
 $__useReadline = function_exists( 'readline_add_history' )
index 3e2c6c9..dd4f760 100644 (file)
@@ -44,7 +44,7 @@ class FetchText extends Maintenance {
         *   \n
         *   text  (may be empty)
         *
-        * note that that the text string itself is *not* followed by newline
+        * note that the text string itself is *not* followed by newline
         */
        public function execute() {
                $db = wfGetDB( DB_SLAVE );
index 7dc4afa..0792c24 100644 (file)
@@ -3,14 +3,14 @@
 <head>
        <meta charset="utf-8">
        <title>MediaWiki Code Example</title>
-       <script src="modules/startup.js"></script>
+       <script src="modules/src/startup.js"></script>
        <script>
                function startUp() {
                        mw.config = new mw.Map();
                }
        </script>
-       <script src="modules/jquery/jquery.js"></script>
-       <script src="modules/mediawiki/mediawiki.js"></script>
+       <script src="modules/lib/jquery/jquery.js"></script>
+       <script src="modules/src/mediawiki/mediawiki.js"></script>
        <style>
                .mw-jsduck-log {
                        position: relative;
@@ -78,7 +78,7 @@
                        eval( code );
                        callback && callback( true );
                } catch ( e ) {
-                       mw.log( 'Uncaught exception: ' + e );
+                       mw.log( 'Uncaught ' + e );
                        callback && callback( false, e );
                        throw e;
                }
index 31ce702..257fe14 100644 (file)
@@ -23,7 +23,7 @@
  * @author Antoine Musso <hashar at free dot fr>
  */
 
-/** A general output object. Need to be overriden */
+/** A general output object. Need to be overridden */
 class StatsOutput {
        function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
                wfSuppressWarnings();
index ec6e122..bd9f9af 100644 (file)
@@ -29,6 +29,6 @@ $cli = new CheckLanguageCLI( $options );
 
 try {
        $cli->execute();
-} catch ( MWException $e ) {
+} catch ( Exception $e ) {
        print 'Error: ' . $e->getMessage() . "\n";
 }
index b9cd715..5b09ffd 100644 (file)
@@ -111,7 +111,6 @@ CREATE TABLE /*_*/page (
    page_namespace INT          NOT NULL,
    page_title     NVARCHAR(255)  NOT NULL,
    page_restrictions NVARCHAR(255) NOT NULL,
-   page_counter BIGINT            NOT NULL DEFAULT 0,
    page_is_redirect BIT           NOT NULL DEFAULT 0,
    page_is_new BIT                NOT NULL DEFAULT 0,
    page_random real     NOT NULL DEFAULT RAND(),
@@ -422,9 +421,6 @@ CREATE TABLE /*_*/site_stats (
   -- The single row should contain 1 here.
   ss_row_id int NOT NULL,
 
-  -- Total number of page views, if hit counters are enabled.
-  ss_total_views bigint default 0,
-
   -- Total number of edits performed.
   ss_total_edits bigint default 0,
 
@@ -452,18 +448,6 @@ CREATE TABLE /*_*/site_stats (
 CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
 
 
---
--- Stores an ID for every time any article is visited;
--- depending on $wgHitcounterUpdateFreq, it is
--- periodically cleared and the page_counter column
--- in the page table updated for all the articles
--- that have been visited.)
---
-CREATE TABLE /*_*/hitcounter (
-  hc_id int NOT NULL
-);
-
-
 --
 -- The internet is full of jerks, alas. Sometimes it's handy
 -- to block a vandal or troll account.
index 36be16e..12f6518 100644 (file)
@@ -69,7 +69,6 @@ CREATE TABLE &mw_prefix.page (
   page_namespace     NUMBER       DEFAULT 0 NOT NULL,
   page_title         VARCHAR2(255)           NOT NULL,
   page_restrictions  VARCHAR2(255),
-  page_counter       NUMBER         DEFAULT 0 NOT NULL,
   page_is_redirect   CHAR(1)           DEFAULT '0' NOT NULL,
   page_is_new        CHAR(1)           DEFAULT '0' NOT NULL,
   page_random        NUMBER(15,14) NOT NULL,
@@ -247,7 +246,6 @@ CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, i
 
 CREATE TABLE &mw_prefix.site_stats (
   ss_row_id         NUMBER  NOT NULL ,
-  ss_total_views    NUMBER            DEFAULT 0,
   ss_total_edits    NUMBER            DEFAULT 0,
   ss_good_articles  NUMBER            DEFAULT 0,
   ss_total_pages    NUMBER            DEFAULT -1,
@@ -257,10 +255,6 @@ CREATE TABLE &mw_prefix.site_stats (
 );
 CREATE UNIQUE INDEX &mw_prefix.site_stats_u01 ON &mw_prefix.site_stats (ss_row_id);
 
-CREATE TABLE &mw_prefix.hitcounter (
-  hc_id  NUMBER  NOT NULL
-);
-
 CREATE SEQUENCE ipblocks_ipb_id_seq;
 CREATE TABLE &mw_prefix.ipblocks (
   ipb_id                NUMBER      NOT NULL,
index 638d7c5..7b05cb7 100644 (file)
@@ -3,7 +3,7 @@
  * Parse some wikitext.
  *
  * Wikitext can be given by stdin or using a file. The wikitext will be parsed
- * using 'CLIParser' as a title. This can be overriden with --title option.
+ * using 'CLIParser' as a title. This can be overridden with --title option.
  *
  * Example1:
  * @code
@@ -110,7 +110,7 @@ class CLIParser extends Maintenance {
 
        /**
         * Title object to use for CLI parsing.
-        * Default title is 'CLIParser', it can be overriden with the option
+        * Default title is 'CLIParser', it can be overridden with the option
         * --title <Your:Title>
         *
         * @return Title
index f77978f..686d9f2 100644 (file)
@@ -84,7 +84,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                                                "rev_id < " . intval( $row->rev_id ) ),
                                        __METHOD__,
                                        array( 'ORDER BY' => 'rev_id DESC' ) );
-                               # If there are none, check the the highest ID with a lower timestamp
+                               # If there are none, check the highest ID with a lower timestamp
                                if ( !$previousID ) {
                                        # Get the highest older timestamp
                                        $lastTimestamp = $db->selectField(
index f06b56b..b401db0 100644 (file)
@@ -153,7 +153,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                ? Revision::newFromArchiveRow( $row )
                                : new Revision( $row );
                        $text = $rev->getSerializedData();
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
                        return false; // bug 22624?
@@ -182,7 +182,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                $db = $this->getDB( DB_MASTER );
                try {
                        $rev = Revision::newFromArchiveRow( $row );
-               } catch ( MWException $e ) {
+               } catch ( Exception $e ) {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
                        return false; // bug 22624?
index 53aeb14..bb08237 100755 (executable)
@@ -395,7 +395,6 @@ ss_active_users  bigint INTEGER
 ss_good_articles bigint INTEGER
 ss_total_edits   bigint INTEGER
 ss_total_pages   bigint INTEGER
-ss_total_views   bigint INTEGER
 ss_users         bigint INTEGER
 
 ## True IP - keep an eye on these, coders tend to make textual assumptions
index 400050e..5391bd9 100644 (file)
@@ -81,7 +81,6 @@ CREATE TABLE page (
   page_namespace     SMALLINT       NOT NULL,
   page_title         TEXT           NOT NULL,
   page_restrictions  TEXT,
-  page_counter       BIGINT         NOT NULL  DEFAULT 0,
   page_is_redirect   SMALLINT       NOT NULL  DEFAULT 0,
   page_is_new        SMALLINT       NOT NULL  DEFAULT 0,
   page_random        NUMERIC(15,14) NOT NULL  DEFAULT RANDOM(),
@@ -262,7 +261,6 @@ CREATE INDEX langlinks_lang_title    ON langlinks (ll_lang,ll_title);
 
 CREATE TABLE site_stats (
   ss_row_id         INTEGER  NOT NULL  UNIQUE,
-  ss_total_views    INTEGER            DEFAULT 0,
   ss_total_edits    INTEGER            DEFAULT 0,
   ss_good_articles  INTEGER            DEFAULT 0,
   ss_total_pages    INTEGER            DEFAULT -1,
@@ -272,10 +270,6 @@ CREATE TABLE site_stats (
   ss_images         INTEGER            DEFAULT 0
 );
 
-CREATE TABLE hitcounter (
-  hc_id  BIGINT  NOT NULL
-);
-
 
 CREATE SEQUENCE ipblocks_ipb_id_seq;
 CREATE TABLE ipblocks (
index cb55f0f..e1710c1 100644 (file)
@@ -64,7 +64,7 @@ class PPFuzzTester {
                                self::$currentTest = new PPFuzzTest( $this );
                                self::$currentTest->execute();
                                $passed = 'passed';
-                       } catch ( MWException $e ) {
+                       } catch ( Exception $e ) {
                                $testReport = self::$currentTest->getReport();
                                $exceptionReport = $e->getText();
                                $hash = md5( $testReport );
index a20b83b..88d9f87 100755 (executable)
@@ -15,6 +15,7 @@ NPM_DIR=$(mktemp -d 2>/dev/null || mktemp -d -t 'update-oojs-ui') # e.g. /tmp/up
 
 # Prepare working tree
 cd "$REPO_DIR" &&
+git reset composer.json && git checkout composer.json &&
 git reset $TARGET_DIR && git checkout $TARGET_DIR && git fetch origin &&
 git checkout -B upstream-oojs-ui origin/master || exit 1
 
@@ -34,9 +35,15 @@ then
        exit 1
 fi
 
-# Copy files
-# - Exclude the minimised distribution files and RTL sheets for non-CSSJanus environments
-rsync --force --recursive --delete --exclude 'oojs-ui*.min.*' --exclude 'oojs-ui*.rtl.css' ./node_modules/oojs-ui/dist/ "$REPO_DIR/$TARGET_DIR" || exit 1
+# Copy files, excluding:
+# * the Apex theme files,
+# * the minimised distribution files, and
+# * the RTL sheets for non-CSSJanus environments
+rsync --force --recursive --delete \
+       --exclude '*apex*' \
+       --exclude 'oojs-ui*.min.*' \
+       --exclude 'oojs-ui*.rtl.css' \
+       ./node_modules/oojs-ui/dist/ "$REPO_DIR/$TARGET_DIR" || exit 1
 
 # Clean up temporary area
 rm -rf "$NPM_DIR"
@@ -52,5 +59,8 @@ Release notes:
 END
 )
 
+# Update composer.json as well
+composer require oojs/oojs-ui $OOJSUI_VERSION --no-update
+
 # Stage deletion, modification and creation of files. Then commit.
-git add --update $TARGET_DIR && git add $TARGET_DIR && git commit -m "$COMMITMSG" || exit 1
+git add --update $TARGET_DIR && git add $TARGET_DIR && git add composer.json && git commit -m "$COMMITMSG" || exit 1
index 954c85d..f322a03 100644 (file)
@@ -69,7 +69,6 @@ CREATE TABLE /*_*/page_tmp (
   page_namespace int NOT NULL,
   page_title varchar(255) binary NOT NULL,
   page_restrictions tinyblob NOT NULL,
-  page_counter bigint unsigned NOT NULL default 0,
   page_is_redirect tinyint unsigned NOT NULL default 0,
   page_is_new tinyint unsigned NOT NULL default 0,
   page_random real unsigned NOT NULL,
@@ -164,7 +163,6 @@ CREATE INDEX /*i*/ll_lang_title ON /*_*/langlinks_tmp (ll_lang, ll_title);
 
 CREATE TABLE /*_*/site_stats_tmp (
   ss_row_id int unsigned NOT NULL,
-  ss_total_views bigint unsigned default 0,
   ss_total_edits bigint unsigned default 0,
   ss_good_articles bigint unsigned default 0,
   ss_total_pages bigint default '-1',
diff --git a/maintenance/sqlite/archives/patch-drop-page_counter.sql b/maintenance/sqlite/archives/patch-drop-page_counter.sql
new file mode 100644 (file)
index 0000000..ac8151d
--- /dev/null
@@ -0,0 +1,31 @@
+-- field is deprecated and no longer updated as of 1.25
+CREATE TABLE /*_*/page_tmp (
+  page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  page_namespace int NOT NULL,
+  page_title varchar(255) binary NOT NULL,
+  page_restrictions tinyblob NOT NULL,
+  page_is_redirect tinyint unsigned NOT NULL default 0,
+  page_is_new tinyint unsigned NOT NULL default 0,
+  page_random real unsigned NOT NULL,
+  page_touched binary(14) NOT NULL default '',
+  page_links_updated varbinary(14) NULL default NULL,
+  page_latest int unsigned NOT NULL,
+  page_len int unsigned NOT NULL,
+  page_content_model varbinary(32) DEFAULT NULL,
+  page_lang varbinary(35) DEFAULT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/page_tmp
+  SELECT page_id, page_namespace, page_title, page_restrictions, page_is_redirect,
+    page_is_new, page_random, page_touched, page_links_updated, page_latest, page_len,
+    page_content_model, page_lang
+  FROM /*_*/page;
+
+DROP TABLE /*_*/page;
+
+ALTER TABLE /*_*/page_tmp RENAME TO /*_*/page;
+
+CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
+CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
+CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
+CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
index 9951e17..3960663 100644 (file)
@@ -1,7 +1,6 @@
 -- field is deprecated and no longer updated as of 1.5
 CREATE TABLE /*_*/site_stats_tmp (
   ss_row_id int unsigned NOT NULL,
-  ss_total_views bigint unsigned default 0,
   ss_total_edits bigint unsigned default 0,
   ss_good_articles bigint unsigned default 0,
   ss_total_pages bigint default '-1',
@@ -11,7 +10,7 @@ CREATE TABLE /*_*/site_stats_tmp (
 ) /*$wgDBTableOptions*/;
 
 INSERT INTO /*_*/site_stats_tmp
-       SELECT ss_row_id, ss_total_views, ss_total_edits, ss_good_articles,
+       SELECT ss_row_id, ss_total_edits, ss_good_articles,
                ss_total_pages, ss_users, ss_active_users, ss_images
                FROM /*_*/site_stats;
 
diff --git a/maintenance/sqlite/archives/patch-drop-ss_total_views.sql b/maintenance/sqlite/archives/patch-drop-ss_total_views.sql
new file mode 100644 (file)
index 0000000..ad80988
--- /dev/null
@@ -0,0 +1,21 @@
+-- field is deprecated and no longer updated as of 1.25
+CREATE TABLE /*_*/site_stats_tmp (
+  ss_row_id int unsigned NOT NULL,
+  ss_total_edits bigint unsigned default 0,
+  ss_good_articles bigint unsigned default 0,
+  ss_total_pages bigint default '-1',
+  ss_users bigint default '-1',
+  ss_active_users bigint default '-1',
+  ss_images int default 0
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/site_stats_tmp
+  SELECT ss_row_id, ss_total_edits, ss_good_articles, ss_total_pages,
+    ss_users, ss_active_users, ss_images
+  FROM /*_*/site_stats;
+
+DROP TABLE /*_*/site_stats;
+
+ALTER TABLE /*_*/site_stats_tmp RENAME TO /*_*/site_stats;
+
+CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
index 45cc339..eb7eca1 100644 (file)
@@ -141,7 +141,7 @@ class RecompressTracked {
                        $header .= "({$this->slaveId})";
                }
                $header .= ' ' . wfWikiID();
-               wfErrorLog( sprintf( "%-50s %s\n", $header, $msg ), $file );
+               MWLoggerLegacyLogger::emit( sprintf( "%-50s %s\n", $header, $msg ), $file );
        }
 
        /**
index 0228684..112ac05 100644 (file)
@@ -241,9 +241,6 @@ CREATE TABLE /*_*/page (
   -- can move or edit the page.
   page_restrictions tinyblob NOT NULL,
 
-  -- Number of times this page has been viewed.
-  page_counter bigint unsigned NOT NULL default 0,
-
   -- 1 indicates the article is a redirect.
   page_is_redirect tinyint unsigned NOT NULL default 0,
 
@@ -374,13 +371,20 @@ CREATE TABLE /*_*/text (
 
   -- Comma-separated list of flags:
   -- gzip: text is compressed with PHP's gzdeflate() function.
-  -- utf8: text was stored as UTF-8.
-  --       If $wgLegacyEncoding option is on, rows *without* this flag
-  --       will be converted to UTF-8 transparently at load time.
+  -- utf-8: text was stored as UTF-8.
+  --        If $wgLegacyEncoding option is on, rows *without* this flag
+  --        will be converted to UTF-8 transparently at load time. Note
+  --        that due to a bug in a maintenance script, this flag may
+  --        have been stored as 'utf8' in some cases (T18841).
   -- object: text field contained a serialized PHP object.
   --         The object either contains multiple versions compressed
   --         together to achieve a better compression ratio, or it refers
   --         to another row where the text can be found.
+  -- external: text was stored in an external location specified by old_text.
+  --           Any additional flags apply to the data stored at that URL, not
+  --           the URL itself. The 'object' flag is *not* set for URLs of the
+  --           form 'DB://cluster/id/itemid', because the external storage
+  --           system itself decompresses these.
   old_flags tinyblob NOT NULL
 ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
 -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
@@ -697,9 +701,6 @@ CREATE TABLE /*_*/site_stats (
   -- The single row should contain 1 here.
   ss_row_id int unsigned NOT NULL,
 
-  -- Total number of page views, if hit counters are enabled.
-  ss_total_views bigint unsigned default 0,
-
   -- Total number of edits performed.
   ss_total_edits bigint unsigned default 0,
 
@@ -726,19 +727,6 @@ CREATE TABLE /*_*/site_stats (
 -- Pointless index to assuage developer superstitions
 CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
 
-
---
--- Stores an ID for every time any article is visited;
--- depending on $wgHitcounterUpdateFreq, it is
--- periodically cleared and the page_counter column
--- in the page table updated for all the articles
--- that have been visited.)
---
-CREATE TABLE /*_*/hitcounter (
-  hc_id int unsigned NOT NULL
-) ENGINE=MEMORY MAX_ROWS=25000;
-
-
 --
 -- The internet is full of jerks, alas. Sometimes it's handy
 -- to block a vandal or troll account.
diff --git a/maintenance/validateRegistrationFile.php b/maintenance/validateRegistrationFile.php
new file mode 100644 (file)
index 0000000..e764661
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+class ValidateRegistrationFile extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addArg( 'path', 'Path to extension.json/skin.json file.', true );
+       }
+       public function execute() {
+               if ( !class_exists( 'JsonSchema\Uri\UriRetriever' ) ) {
+                       $this->error( 'The JsonSchema library cannot be found, please install it through composer.', 1 );
+               }
+
+               $retriever = new JsonSchema\Uri\UriRetriever();
+               $schema = $retriever->retrieve('file://' . dirname( __DIR__ ) . '/docs/extension.schema.json' );
+               $path = $this->getArg( 0 );
+               $data = json_decode( file_get_contents( $path ) );
+               if ( !is_object( $data ) ) {
+                       $this->error( "$path is not a valid JSON file.", 1 );
+               }
+
+               $validator = new JsonSchema\Validator();
+               $validator->check( $data, $schema );
+               if ( $validator->isValid() ) {
+                       $this->output( "$path validates against the schema!\n" );
+               } else {
+                       foreach ( $validator->getErrors() as $error ) {
+                               $this->output( "[{$error['property']}] {$error['message']}\n" );
+                       }
+                       $this->error( "$path does not validate.", 1 );
+               }
+       }
+}
+
+$maintClass = 'ValidateRegistrationFile';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/package.json b/package.json
new file mode 100644 (file)
index 0000000..101fcd9
--- /dev/null
@@ -0,0 +1,21 @@
+{
+  "name": "mediawiki",
+  "version": "0.0.0",
+  "scripts": {
+    "test": "grunt test"
+  },
+  "devDependencies": {
+    "grunt": "0.4.2",
+    "grunt-banana-checker": "0.2.0",
+    "grunt-contrib-jshint": "0.10.0",
+    "grunt-contrib-watch": "0.6.1",
+    "grunt-jscs": "0.8.1",
+    "grunt-jsonlint": "1.0.4",
+    "grunt-karma": "0.9.0",
+    "karma": "0.12.28",
+    "karma-chrome-launcher": "0.1.7",
+    "karma-firefox-launcher": "0.1.3",
+    "karma-qunit": "0.1.4",
+    "qunitjs": "1.15.0"
+  }
+}
index 1eda5d6..6e8cd99 100644 (file)
@@ -307,6 +307,7 @@ return array(
        ),
        'jquery.throttle-debounce' => array(
                'scripts' => 'resources/lib/jquery/jquery.ba-throttle-debounce.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.validate' => array(
                'scripts' => 'resources/lib/jquery/jquery.validate.js',
@@ -1011,6 +1012,7 @@ return array(
                'class' => 'ResourceLoaderEditToolbarModule',
                'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
                'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
+               'position' => 'top',
        ),
 
        /* MediaWiki Action */
@@ -1020,7 +1022,6 @@ return array(
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.css',
                'dependencies' => array(
                        'mediawiki.action.edit.styles',
-                       'mediawiki.toolbar',
                        'jquery.textSelection',
                        'jquery.byteLimit',
                ),
@@ -1044,6 +1045,7 @@ return array(
                'dependencies' => array(
                        'jquery.form',
                        'jquery.spinner',
+                       'jquery.textSelection',
                        'mediawiki.api',
                        'mediawiki.action.history.diff',
                        'mediawiki.util',
@@ -1220,6 +1222,9 @@ return array(
 
        'mediawiki.page.gallery' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.gallery.js',
+               'dependencies' => array(
+                       'jquery.throttle-debounce',
+               )
        ),
        'mediawiki.page.ready' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
@@ -1462,7 +1467,9 @@ return array(
                        'colon-separator',
                        'javascripttest-pagetext-skins',
                ) ),
-               'dependencies' => array( 'jquery.qunit' ),
+               'dependencies' => array(
+                       'mediawiki.Uri',
+               ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1628,12 +1635,12 @@ return array(
                        'resources/lib/oojs-ui/oojs-ui.js',
                ),
                'skinScripts' => array(
-                       'default' => 'resources/lib/oojs-ui/oojs-ui-apex.js',
-                       'minerva' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.js',
+                       'default' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.js',
                ),
-               'skinStyles' => array(
-                       'default' => 'resources/lib/oojs-ui/oojs-ui-apex.svg.css',
-                       'minerva' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css',
+               'dependencies' => array(
+                       'es5-shim',
+                       'oojs',
+                       'oojs-ui.styles',
                ),
                'messages' => array(
                        'ooui-dialog-message-accept',
@@ -1649,9 +1656,13 @@ return array(
                        'ooui-toolgroup-collapse',
                        'ooui-toolgroup-expand',
                ),
-               'dependencies' => array(
-                       'es5-shim',
-                       'oojs',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+
+       'oojs-ui.styles' => array(
+               'position' => 'top',
+               'skinStyles' => array(
+                       'default' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
index 136530a..19a775a 100644 (file)
@@ -1,4 +1,4 @@
-The icons used here are derived from the crystalsvg icons in the the
+The icons used here are derived from the crystalsvg icons in the
 pics/crystalsvg/ directory of kdelibs-3.4.0 they were modified on 2005-05-15
 by Ævar Arnfjörð Bjarmason for use in MediaWiki.
 
diff --git a/resources/lib/jquery.ui/themes/smoothness/PATCHES b/resources/lib/jquery.ui/themes/smoothness/PATCHES
new file mode 100644 (file)
index 0000000..53fbe1f
--- /dev/null
@@ -0,0 +1,3 @@
+jquery.ui.theme.css
+* Removed ".ui-widget-content a { color: #222222; }" and
+  ".ui-widget-header a { color: #222222; }" due to bug T85857.
index d170081..1d8b8a8 100644 (file)
@@ -18,9 +18,7 @@
 .ui-widget .ui-widget { font-size: 1em; }
 .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
 .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x; color: #222222; }
-.ui-widget-content a { color: #222222; }
 .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; }
-.ui-widget-header a { color: #222222; }
 
 /* Interaction states
 ----------------------------------*/
 
 /* Overlays */
 .ui-widget-overlay { background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); }
-.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
index d4b67f7..1c3aa82 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.11.1
+ * jQuery JavaScript Library v1.11.2
  * http://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-05-01T17:42Z
+ * Date: 2014-12-17T15:27Z
  */
 
 (function( global, factory ) {
@@ -64,7 +64,7 @@ var support = {};
 
 
 var
-       version = "1.11.1",
+       version = "1.11.2",
 
        // Define a local copy of jQuery
        jQuery = function( selector, context ) {
@@ -269,7 +269,8 @@ jQuery.extend({
                // parseFloat NaNs numeric-cast false positives (null|true|false|"")
                // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
                // subtraction forces infinities to NaN
-               return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+               // adding 1 corrects loss of precision from parseFloat (#15100)
+               return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
        },
 
        isEmptyObject: function( obj ) {
@@ -584,14 +585,14 @@ function isArraylike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v1.10.19
+ * Sizzle CSS Selector Engine v2.2.0-pre
  * http://sizzlejs.com/
  *
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-04-18
+ * Date: 2014-12-16
  */
 (function( window ) {
 
@@ -618,7 +619,7 @@ var i,
        contains,
 
        // Instance-specific data
-       expando = "sizzle" + -(new Date()),
+       expando = "sizzle" + 1 * new Date(),
        preferredDoc = window.document,
        dirruns = 0,
        done = 0,
@@ -633,7 +634,6 @@ var i,
        },
 
        // General-purpose constants
-       strundefined = typeof undefined,
        MAX_NEGATIVE = 1 << 31,
 
        // Instance methods
@@ -643,12 +643,13 @@ var i,
        push_native = arr.push,
        push = arr.push,
        slice = arr.slice,
-       // Use a stripped-down indexOf if we can't use a native one
-       indexOf = arr.indexOf || function( elem ) {
+       // Use a stripped-down indexOf as it's faster than native
+       // http://jsperf.com/thor-indexof-vs-for/5
+       indexOf = function( list, elem ) {
                var i = 0,
-                       len = this.length;
+                       len = list.length;
                for ( ; i < len; i++ ) {
-                       if ( this[i] === elem ) {
+                       if ( list[i] === elem ) {
                                return i;
                        }
                }
@@ -688,6 +689,7 @@ var i,
                ")\\)|)",
 
        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rwhitespace = new RegExp( whitespace + "+", "g" ),
        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
 
        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
@@ -739,6 +741,14 @@ var i,
                                String.fromCharCode( high + 0x10000 ) :
                                // Supplemental Plane codepoint (surrogate pair)
                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       },
+
+       // Used for iframes
+       // See setDocument()
+       // Removing the function wrapper causes a "Permission Denied"
+       // error in IE
+       unloadHandler = function() {
+               setDocument();
        };
 
 // Optimize for push.apply( _, NodeList )
@@ -781,19 +791,18 @@ function Sizzle( selector, context, results, seed ) {
 
        context = context || document;
        results = results || [];
+       nodeType = context.nodeType;
 
-       if ( !selector || typeof selector !== "string" ) {
-               return results;
-       }
+       if ( typeof selector !== "string" || !selector ||
+               nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
 
-       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
-               return [];
+               return results;
        }
 
-       if ( documentIsHTML && !seed ) {
+       if ( !seed && documentIsHTML ) {
 
-               // Shortcuts
-               if ( (match = rquickExpr.exec( selector )) ) {
+               // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+               if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
                        // Speed-up: Sizzle("#ID")
                        if ( (m = match[1]) ) {
                                if ( nodeType === 9 ) {
@@ -825,7 +834,7 @@ function Sizzle( selector, context, results, seed ) {
                                return results;
 
                        // Speed-up: Sizzle(".CLASS")
-                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                       } else if ( (m = match[3]) && support.getElementsByClassName ) {
                                push.apply( results, context.getElementsByClassName( m ) );
                                return results;
                        }
@@ -835,7 +844,7 @@ function Sizzle( selector, context, results, seed ) {
                if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
                        nid = old = expando;
                        newContext = context;
-                       newSelector = nodeType === 9 && selector;
+                       newSelector = nodeType !== 1 && selector;
 
                        // qSA works strangely on Element-rooted queries
                        // We can work around this by specifying an extra ID on the root
@@ -1022,7 +1031,7 @@ function createPositionalPseudo( fn ) {
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
  */
 function testContext( context ) {
-       return context && typeof context.getElementsByTagName !== strundefined && context;
+       return context && typeof context.getElementsByTagName !== "undefined" && context;
 }
 
 // Expose support vars for convenience
@@ -1046,9 +1055,8 @@ isXML = Sizzle.isXML = function( elem ) {
  * @returns {Object} Returns the current document
  */
 setDocument = Sizzle.setDocument = function( node ) {
-       var hasCompare,
-               doc = node ? node.ownerDocument || node : preferredDoc,
-               parent = doc.defaultView;
+       var hasCompare, parent,
+               doc = node ? node.ownerDocument || node : preferredDoc;
 
        // If no document and documentElement is available, return
        if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
@@ -1058,9 +1066,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Set our document
        document = doc;
        docElem = doc.documentElement;
-
-       // Support tests
-       documentIsHTML = !isXML( doc );
+       parent = doc.defaultView;
 
        // Support: IE>8
        // If iframe document is assigned to "document" variable and if iframe has been reloaded,
@@ -1069,21 +1075,22 @@ setDocument = Sizzle.setDocument = function( node ) {
        if ( parent && parent !== parent.top ) {
                // IE11 does not have attachEvent, so all must suffer
                if ( parent.addEventListener ) {
-                       parent.addEventListener( "unload", function() {
-                               setDocument();
-                       }, false );
+                       parent.addEventListener( "unload", unloadHandler, false );
                } else if ( parent.attachEvent ) {
-                       parent.attachEvent( "onunload", function() {
-                               setDocument();
-                       });
+                       parent.attachEvent( "onunload", unloadHandler );
                }
        }
 
+       /* Support tests
+       ---------------------------------------------------------------------- */
+       documentIsHTML = !isXML( doc );
+
        /* Attributes
        ---------------------------------------------------------------------- */
 
        // Support: IE<8
-       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       // Verify that getAttribute really returns attributes and not properties
+       // (excepting IE8 booleans)
        support.attributes = assert(function( div ) {
                div.className = "i";
                return !div.getAttribute("className");
@@ -1098,17 +1105,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                return !div.getElementsByTagName("*").length;
        });
 
-       // Check if getElementsByClassName can be trusted
-       support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
-               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
-
-               // Support: Safari<4
-               // Catch class over-caching
-               div.firstChild.className = "i";
-               // Support: Opera<10
-               // Catch gEBCN failure to find non-leading classes
-               return div.getElementsByClassName("i").length === 2;
-       });
+       // Support: IE<9
+       support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
 
        // Support: IE<10
        // Check if getElementById returns elements by name
@@ -1122,7 +1120,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        // ID find and filter
        if ( support.getById ) {
                Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
                                var m = context.getElementById( id );
                                // Check parentNode to catch when Blackberry 4.6 returns
                                // nodes that are no longer in the document #6963
@@ -1143,7 +1141,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                Expr.filter["ID"] =  function( id ) {
                        var attrId = id.replace( runescape, funescape );
                        return function( elem ) {
-                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
                                return node && node.value === attrId;
                        };
                };
@@ -1152,14 +1150,20 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Tag
        Expr.find["TAG"] = support.getElementsByTagName ?
                function( tag, context ) {
-                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
                                return context.getElementsByTagName( tag );
+
+                       // DocumentFragment nodes don't have gEBTN
+                       } else if ( support.qsa ) {
+                               return context.querySelectorAll( tag );
                        }
                } :
+
                function( tag, context ) {
                        var elem,
                                tmp = [],
                                i = 0,
+                               // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
                                results = context.getElementsByTagName( tag );
 
                        // Filter out possible comments
@@ -1177,7 +1181,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
        // Class
        Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+               if ( documentIsHTML ) {
                        return context.getElementsByClassName( className );
                }
        };
@@ -1206,13 +1210,15 @@ setDocument = Sizzle.setDocument = function( node ) {
                        // setting a boolean content attribute,
                        // since its presence should be enough
                        // http://bugs.jquery.com/ticket/12359
-                       div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+                       docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+                               "<select id='" + expando + "-\f]' msallowcapture=''>" +
+                               "<option selected=''></option></select>";
 
                        // Support: IE8, Opera 11-12.16
                        // Nothing should be selected when empty strings follow ^= or $= or *=
                        // The test attribute must be unknown in Opera but "safe" for WinRT
                        // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-                       if ( div.querySelectorAll("[msallowclip^='']").length ) {
+                       if ( div.querySelectorAll("[msallowcapture^='']").length ) {
                                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
                        }
 
@@ -1222,12 +1228,24 @@ setDocument = Sizzle.setDocument = function( node ) {
                                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
                        }
 
+                       // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+                       if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+                               rbuggyQSA.push("~=");
+                       }
+
                        // Webkit/Opera - :checked should return selected option elements
                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        // IE8 throws error here and will not see later tests
                        if ( !div.querySelectorAll(":checked").length ) {
                                rbuggyQSA.push(":checked");
                        }
+
+                       // Support: Safari 8+, iOS 8+
+                       // https://bugs.webkit.org/show_bug.cgi?id=136851
+                       // In-page `selector#id sibing-combinator selector` fails
+                       if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+                               rbuggyQSA.push(".#.+[+~]");
+                       }
                });
 
                assert(function( div ) {
@@ -1344,7 +1362,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
                        // Maintain original order
                        return sortInput ?
-                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
                                0;
                }
 
@@ -1371,7 +1389,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                                aup ? -1 :
                                bup ? 1 :
                                sortInput ?
-                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
                                0;
 
                // If the nodes are siblings, we can do a quick check
@@ -1434,7 +1452,7 @@ Sizzle.matchesSelector = function( elem, expr ) {
                                        elem.document && elem.document.nodeType !== 11 ) {
                                return ret;
                        }
-               } catch(e) {}
+               } catch (e) {}
        }
 
        return Sizzle( expr, document, null, [ elem ] ).length > 0;
@@ -1653,7 +1671,7 @@ Expr = Sizzle.selectors = {
                        return pattern ||
                                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
                                classCache( className, function( elem ) {
-                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
                                });
                },
 
@@ -1675,7 +1693,7 @@ Expr = Sizzle.selectors = {
                                        operator === "^=" ? check && result.indexOf( check ) === 0 :
                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
                                        operator === "$=" ? check && result.slice( -check.length ) === check :
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
                                        operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
                                        false;
                        };
@@ -1795,7 +1813,7 @@ Expr = Sizzle.selectors = {
                                                        matched = fn( seed, argument ),
                                                        i = matched.length;
                                                while ( i-- ) {
-                                                       idx = indexOf.call( seed, matched[i] );
+                                                       idx = indexOf( seed, matched[i] );
                                                        seed[ idx ] = !( matches[ idx ] = matched[i] );
                                                }
                                        }) :
@@ -1834,6 +1852,8 @@ Expr = Sizzle.selectors = {
                                function( elem, context, xml ) {
                                        input[0] = elem;
                                        matcher( input, null, xml, results );
+                                       // Don't keep the element (issue #299)
+                                       input[0] = null;
                                        return !results.pop();
                                };
                }),
@@ -1845,6 +1865,7 @@ Expr = Sizzle.selectors = {
                }),
 
                "contains": markFunction(function( text ) {
+                       text = text.replace( runescape, funescape );
                        return function( elem ) {
                                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
                        };
@@ -2266,7 +2287,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
                                i = matcherOut.length;
                                while ( i-- ) {
                                        if ( (elem = matcherOut[i]) &&
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+                                               (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
 
                                                seed[temp] = !(results[temp] = elem);
                                        }
@@ -2301,13 +2322,16 @@ function matcherFromTokens( tokens ) {
                        return elem === checkContext;
                }, implicitRelative, true ),
                matchAnyContext = addCombinator( function( elem ) {
-                       return indexOf.call( checkContext, elem ) > -1;
+                       return indexOf( checkContext, elem ) > -1;
                }, implicitRelative, true ),
                matchers = [ function( elem, context, xml ) {
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                       var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
                                (checkContext = context).nodeType ?
                                        matchContext( elem, context, xml ) :
                                        matchAnyContext( elem, context, xml ) );
+                       // Avoid hanging onto element (issue #299)
+                       checkContext = null;
+                       return ret;
                } ];
 
        for ( ; i < len; i++ ) {
@@ -2557,7 +2581,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
 // Sort stability
 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
 
-// Support: Chrome<14
+// Support: Chrome 14-35+
 // Always assume duplicates if they aren't passed to the comparison function
 support.detectDuplicates = !!hasDuplicate;
 
@@ -6115,7 +6139,14 @@ var getStyles, curCSS,
 
 if ( window.getComputedStyle ) {
        getStyles = function( elem ) {
-               return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+               // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+               // IE throws on elements created in popups
+               // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+               if ( elem.ownerDocument.defaultView.opener ) {
+                       return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+               }
+
+               return window.getComputedStyle( elem, null );
        };
 
        curCSS = function( elem, name, computed ) {
@@ -6363,6 +6394,8 @@ function addGetHookIf( conditionFn, hookFn ) {
 
                        reliableMarginRightVal =
                                !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
+
+                       div.removeChild( contents );
                }
 
                // Support: IE8
@@ -9070,7 +9103,8 @@ jQuery.extend({
                }
 
                // We can fire global events as of now if asked to
-               fireGlobals = s.global;
+               // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+               fireGlobals = jQuery.event && s.global;
 
                // Watch for a new set of requests
                if ( fireGlobals && jQuery.active++ === 0 ) {
@@ -9329,13 +9363,6 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
        };
 });
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
-       jQuery.fn[ type ] = function( fn ) {
-               return this.on( type, fn );
-       };
-});
-
 
 jQuery._evalUrl = function( url ) {
        return jQuery.ajax({
@@ -9561,8 +9588,9 @@ var xhrId = 0,
 
 // Support: IE<10
 // Open requests must be manually aborted on unload (#5280)
-if ( window.ActiveXObject ) {
-       jQuery( window ).on( "unload", function() {
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+       window.attachEvent( "onunload", function() {
                for ( var key in xhrCallbacks ) {
                        xhrCallbacks[ key ]( undefined, true );
                }
@@ -9996,6 +10024,16 @@ jQuery.fn.load = function( url, params, callback ) {
 
 
 
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
+       };
+});
+
+
+
+
 jQuery.expr.filters.animated = function( elem ) {
        return jQuery.grep(jQuery.timers, function( fn ) {
                return elem === fn.elem;
index 93026e3..385a1ce 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 1.14.0
+ * QUnit 1.16.0
  * http://qunitjs.com/
  *
- * Copyright 2013 jQuery Foundation and other contributors
+ * Copyright 2006, 2014 jQuery Foundation and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-01-31T16:40Z
+ * Date: 2014-12-03T16:32Z
  */
 
 /** Font Family and Sizes */
 }
 
 #qunit-testrunner-toolbar {
-       padding: 0.5em 0 0.5em 2em;
+       padding: 0.5em 1em 0.5em 1em;
        color: #5E740B;
        background-color: #EEE;
        overflow: hidden;
 }
 
 #qunit-userAgent {
-       padding: 0.5em 0 0.5em 2.5em;
+       padding: 0.5em 1em 0.5em 1em;
        background-color: #2B81AF;
        color: #FFF;
        text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
 }
 
 #qunit-tests li {
-       padding: 0.4em 0.5em 0.4em 2.5em;
+       padding: 0.4em 1em 0.4em 1em;
        border-bottom: 1px solid #FFF;
        list-style-position: inside;
 }
 
+#qunit-tests > li {
+       display: none;
+}
+
+#qunit-tests li.pass, #qunit-tests li.running, #qunit-tests li.fail {
+       display: list-item;
+}
+
 #qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
        display: none;
 }
        cursor: pointer;
 }
 
+#qunit-tests li.skipped strong {
+       cursor: default;
+}
+
 #qunit-tests li a {
        padding: 0.5em;
        color: #C2CCD1;
 
 #qunit-banner.qunit-fail                    { background-color: #EE5757; }
 
+/*** Skipped tests */
+
+#qunit-tests .skipped {
+       background-color: #EBECE9;
+}
+
+#qunit-tests .qunit-skipped-label {
+       background-color: #F4FF77;
+       display: inline-block;
+       font-style: normal;
+       color: #366097;
+       line-height: 1.8em;
+       padding: 0 0.5em;
+       margin: -0.4em 0.4em -0.4em 0;
+}
 
 /** Result */
 
 #qunit-testresult {
-       padding: 0.5em 0.5em 0.5em 2.5em;
+       padding: 0.5em 1em 0.5em 1em;
 
        color: #2B81AF;
        background-color: #D2E0E6;
index 0e279fd..82020d4 100644 (file)
@@ -1,38 +1,42 @@
 /*!
- * QUnit 1.14.0
+ * QUnit 1.16.0
  * http://qunitjs.com/
  *
- * Copyright 2013 jQuery Foundation and other contributors
+ * Copyright 2006, 2014 jQuery Foundation and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-01-31T16:40Z
+ * Date: 2014-12-03T16:32Z
  */
 
 (function( window ) {
 
 var QUnit,
-       assert,
        config,
        onErrorFnPrev,
-       testId = 0,
-       fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
+       loggingCallbacks = {},
+       fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" ),
        toString = Object.prototype.toString,
        hasOwn = Object.prototype.hasOwnProperty,
        // Keep a local reference to Date (GH-283)
        Date = window.Date,
+       now = Date.now || function() {
+               return new Date().getTime();
+       },
+       globalStartCalled = false,
+       runStarted = false,
        setTimeout = window.setTimeout,
        clearTimeout = window.clearTimeout,
        defined = {
-               document: typeof window.document !== "undefined",
-               setTimeout: typeof window.setTimeout !== "undefined",
+               document: window.document !== undefined,
+               setTimeout: window.setTimeout !== undefined,
                sessionStorage: (function() {
                        var x = "qunit-test-string";
                        try {
                                sessionStorage.setItem( x, x );
                                sessionStorage.removeItem( x );
                                return true;
-                       } catch( e ) {
+                       } catch ( e ) {
                                return false;
                        }
                }())
@@ -74,147 +78,18 @@ var QUnit,
         * @return {Object} New object with only the own properties (recursively).
         */
        objectValues = function( obj ) {
-               // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-               /*jshint newcap: false */
                var key, val,
                        vals = QUnit.is( "array", obj ) ? [] : {};
                for ( key in obj ) {
                        if ( hasOwn.call( obj, key ) ) {
-                               val = obj[key];
-                               vals[key] = val === Object(val) ? objectValues(val) : val;
+                               val = obj[ key ];
+                               vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
                        }
                }
                return vals;
        };
 
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-       // call on start of module test to prepend name to all tests
-       module: function( name, testEnvironment ) {
-               config.currentModule = name;
-               config.currentModuleTestEnvironment = testEnvironment;
-               config.modules[name] = true;
-       },
-
-       asyncTest: function( testName, expected, callback ) {
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
-               }
-
-               QUnit.test( testName, expected, callback, true );
-       },
-
-       test: function( testName, expected, callback, async ) {
-               var test,
-                       nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
-               }
-
-               if ( config.currentModule ) {
-                       nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-               }
-
-               test = new Test({
-                       nameHtml: nameHtml,
-                       testName: testName,
-                       expected: expected,
-                       async: async,
-                       callback: callback,
-                       module: config.currentModule,
-                       moduleTestEnvironment: config.currentModuleTestEnvironment,
-                       stack: sourceFromStacktrace( 2 )
-               });
-
-               if ( !validTest( test ) ) {
-                       return;
-               }
-
-               test.queue();
-       },
-
-       // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-       expect: function( asserts ) {
-               if (arguments.length === 1) {
-                       config.current.expected = asserts;
-               } else {
-                       return config.current.expected;
-               }
-       },
-
-       start: function( count ) {
-               // QUnit hasn't been initialized yet.
-               // Note: RequireJS (et al) may delay onLoad
-               if ( config.semaphore === undefined ) {
-                       QUnit.begin(function() {
-                               // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-                               setTimeout(function() {
-                                       QUnit.start( count );
-                               });
-                       });
-                       return;
-               }
-
-               config.semaphore -= count || 1;
-               // don't start until equal number of stop-calls
-               if ( config.semaphore > 0 ) {
-                       return;
-               }
-               // ignore if start is called more often then stop
-               if ( config.semaphore < 0 ) {
-                       config.semaphore = 0;
-                       QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-                       return;
-               }
-               // A slight delay, to avoid any current callbacks
-               if ( defined.setTimeout ) {
-                       setTimeout(function() {
-                               if ( config.semaphore > 0 ) {
-                                       return;
-                               }
-                               if ( config.timeout ) {
-                                       clearTimeout( config.timeout );
-                               }
-
-                               config.blocking = false;
-                               process( true );
-                       }, 13);
-               } else {
-                       config.blocking = false;
-                       process( true );
-               }
-       },
-
-       stop: function( count ) {
-               config.semaphore += count || 1;
-               config.blocking = true;
-
-               if ( config.testTimeout && defined.setTimeout ) {
-                       clearTimeout( config.timeout );
-                       config.timeout = setTimeout(function() {
-                               QUnit.ok( false, "Test timed out" );
-                               config.semaphore = 1;
-                               QUnit.start();
-                       }, config.testTimeout );
-               }
-       }
-};
-
-// We use the prototype to distinguish between properties that should
-// be exposed as globals (and in exports) and those that shouldn't
-(function() {
-       function F() {}
-       F.prototype = QUnit;
-       QUnit = new F();
-       // Make F QUnit's constructor so that we can add to the prototype later
-       QUnit.constructor = F;
-}());
+QUnit = {};
 
 /**
  * Config object: Maintain internal state
@@ -248,31 +123,40 @@ config = {
        // add checkboxes that are persisted in the query-string
        // when enabled, the id is set to `true` as a `QUnit.config` property
        urlConfig: [
+               {
+                       id: "hidepassed",
+                       label: "Hide passed tests",
+                       tooltip: "Only show tests and assertions that fail. Stored as query-strings."
+               },
                {
                        id: "noglobals",
                        label: "Check for Globals",
-                       tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
+                       tooltip: "Enabling this will test if any test introduces new properties on the " +
+                               "`window` object. Stored as query-strings."
                },
                {
                        id: "notrycatch",
                        label: "No try-catch",
-                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
+                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
+                               "exceptions in IE reasonable. Stored as query-strings."
                }
        ],
 
        // Set of all modules.
-       modules: {},
-
-       // logging callback queues
-       begin: [],
-       done: [],
-       log: [],
-       testStart: [],
-       testDone: [],
-       moduleStart: [],
-       moduleDone: []
+       modules: [],
+
+       // The first unnamed module
+       currentModule: {
+               name: "",
+               tests: []
+       },
+
+       callbacks: {}
 };
 
+// Push a loose unnamed module to the modules collection
+config.modules.push( config.currentModule );
+
 // Initialize more QUnit.config and QUnit.urlParams
 (function() {
        var i, current,
@@ -301,17 +185,13 @@ config = {
        // String search anywhere in moduleName+testName
        config.filter = urlParams.filter;
 
-       // Exact match of the module name
-       config.module = urlParams.module;
-
-       config.testNumber = [];
-       if ( urlParams.testNumber ) {
+       config.testId = [];
+       if ( urlParams.testId ) {
 
-               // Ensure that urlParams.testNumber is an array
-               urlParams.testNumber = [].concat( urlParams.testNumber );
-               for ( i = 0; i < urlParams.testNumber.length; i++ ) {
-                       current = urlParams.testNumber[ i ];
-                       config.testNumber.push( parseInt( current, 10 ) );
+               // Ensure that urlParams.testId is an array
+               urlParams.testId = [].concat( urlParams.testId );
+               for ( i = 0; i < urlParams.testId.length; i++ ) {
+                       config.testId.push( urlParams.testId[ i ] );
                }
        }
 
@@ -319,75 +199,132 @@ config = {
        QUnit.isLocal = location.protocol === "file:";
 }());
 
+// Root QUnit object.
+// `QUnit` initialized at top of scope
 extend( QUnit, {
 
-       config: config,
+       // call on start of module test to prepend name to all tests
+       module: function( name, testEnvironment ) {
+               var currentModule = {
+                       name: name,
+                       testEnvironment: testEnvironment,
+                       tests: []
+               };
 
-       // Initialize the configuration options
-       init: function() {
-               extend( config, {
-                       stats: { all: 0, bad: 0 },
-                       moduleStats: { all: 0, bad: 0 },
-                       started: +new Date(),
-                       updateRate: 1000,
-                       blocking: false,
-                       autostart: true,
-                       autorun: false,
-                       filter: "",
-                       queue: [],
-                       semaphore: 1
-               });
+               // DEPRECATED: handles setup/teardown functions,
+               // beforeEach and afterEach should be used instead
+               if ( testEnvironment && testEnvironment.setup ) {
+                       testEnvironment.beforeEach = testEnvironment.setup;
+                       delete testEnvironment.setup;
+               }
+               if ( testEnvironment && testEnvironment.teardown ) {
+                       testEnvironment.afterEach = testEnvironment.teardown;
+                       delete testEnvironment.teardown;
+               }
 
-               var tests, banner, result,
-                       qunit = id( "qunit" );
+               config.modules.push( currentModule );
+               config.currentModule = currentModule;
+       },
 
-               if ( qunit ) {
-                       qunit.innerHTML =
-                               "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-                               "<h2 id='qunit-banner'></h2>" +
-                               "<div id='qunit-testrunner-toolbar'></div>" +
-                               "<h2 id='qunit-userAgent'></h2>" +
-                               "<ol id='qunit-tests'></ol>";
+       // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
+       asyncTest: function( testName, expected, callback ) {
+               if ( arguments.length === 2 ) {
+                       callback = expected;
+                       expected = null;
                }
 
-               tests = id( "qunit-tests" );
-               banner = id( "qunit-banner" );
-               result = id( "qunit-testresult" );
+               QUnit.test( testName, expected, callback, true );
+       },
 
-               if ( tests ) {
-                       tests.innerHTML = "";
-               }
+       test: function( testName, expected, callback, async ) {
+               var test;
 
-               if ( banner ) {
-                       banner.className = "";
+               if ( arguments.length === 2 ) {
+                       callback = expected;
+                       expected = null;
                }
 
-               if ( result ) {
-                       result.parentNode.removeChild( result );
-               }
+               test = new Test({
+                       testName: testName,
+                       expected: expected,
+                       async: async,
+                       callback: callback
+               });
+
+               test.queue();
+       },
+
+       skip: function( testName ) {
+               var test = new Test({
+                       testName: testName,
+                       skip: true
+               });
+
+               test.queue();
+       },
+
+       // DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.
+       // In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.
+       start: function( count ) {
+               var globalStartAlreadyCalled = globalStartCalled;
+
+               if ( !config.current ) {
+                       globalStartCalled = true;
+
+                       if ( runStarted ) {
+                               throw new Error( "Called start() outside of a test context while already started" );
+                       } else if ( globalStartAlreadyCalled || count > 1 ) {
+                               throw new Error( "Called start() outside of a test context too many times" );
+                       } else if ( config.autostart ) {
+                               throw new Error( "Called start() outside of a test context when " +
+                                       "QUnit.config.autostart was true" );
+                       } else if ( !config.pageLoaded ) {
+
+                               // The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it
+                               config.autostart = true;
+                               return;
+                       }
+               } else {
+
+                       // If a test is running, adjust its semaphore
+                       config.current.semaphore -= count || 1;
+
+                       // Don't start until equal number of stop-calls
+                       if ( config.current.semaphore > 0 ) {
+                               return;
+                       }
 
-               if ( tests ) {
-                       result = document.createElement( "p" );
-                       result.id = "qunit-testresult";
-                       result.className = "result";
-                       tests.parentNode.insertBefore( result, tests );
-                       result.innerHTML = "Running...<br/>&nbsp;";
+                       // throw an Error if start is called more often than stop
+                       if ( config.current.semaphore < 0 ) {
+                               config.current.semaphore = 0;
+
+                               QUnit.pushFailure(
+                                       "Called start() while already started (test's semaphore was 0 already)",
+                                       sourceFromStacktrace( 2 )
+                               );
+                               return;
+                       }
                }
+
+               resumeProcessing();
        },
 
-       // Resets the test setup. Useful for tests that modify the DOM.
-       /*
-       DEPRECATED: Use multiple tests instead of resetting inside a test.
-       Use testStart or testDone for custom cleanup.
-       This method will throw an error in 2.0, and will be removed in 2.1
-       */
-       reset: function() {
-               var fixture = id( "qunit-fixture" );
-               if ( fixture ) {
-                       fixture.innerHTML = config.fixture;
+       // DEPRECATED: QUnit.stop() will be removed in QUnit 2.0.
+       stop: function( count ) {
+
+               // If there isn't a test running, don't allow QUnit.stop() to be called
+               if ( !config.current ) {
+                       throw new Error( "Called stop() outside of a test context" );
                }
+
+               // If a test is running, adjust its semaphore
+               config.current.semaphore += count || 1;
+
+               pauseProcessing();
        },
 
+       config: config,
+
        // Safe object type checking
        is: function( type, obj ) {
                return QUnit.objectType( obj ) === type;
@@ -403,12 +340,12 @@ extend( QUnit, {
                        return "null";
                }
 
-               var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-                       type = match && match[1] || "";
+               var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
+                       type = match && match[ 1 ] || "";
 
                switch ( type ) {
                        case "Number":
-                               if ( isNaN(obj) ) {
+                               if ( isNaN( obj ) ) {
                                        return "nan";
                                }
                                return "number";
@@ -426,517 +363,161 @@ extend( QUnit, {
                return undefined;
        },
 
-       push: function( result, actual, expected, message ) {
-               if ( !config.current ) {
-                       throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-               }
-
-               var output, source,
-                       details = {
-                               module: config.current.module,
-                               name: config.current.testName,
-                               result: result,
-                               message: message,
-                               actual: actual,
-                               expected: expected
-                       };
-
-               message = escapeText( message ) || ( result ? "okay" : "failed" );
-               message = "<span class='test-message'>" + message + "</span>";
-               output = message;
-
-               if ( !result ) {
-                       expected = escapeText( QUnit.jsDump.parse(expected) );
-                       actual = escapeText( QUnit.jsDump.parse(actual) );
-                       output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-                       if ( actual !== expected ) {
-                               output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-                               output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-                       }
-
-                       source = sourceFromStacktrace();
+       url: function( params ) {
+               params = extend( extend( {}, QUnit.urlParams ), params );
+               var key,
+                       querystring = "?";
 
-                       if ( source ) {
-                               details.source = source;
-                               output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
+               for ( key in params ) {
+                       if ( hasOwn.call( params, key ) ) {
+                               querystring += encodeURIComponent( key );
+                               if ( params[ key ] !== true ) {
+                                       querystring += "=" + encodeURIComponent( params[ key ] );
+                               }
+                               querystring += "&";
                        }
-
-                       output += "</table>";
                }
-
-               runLoggingCallbacks( "log", QUnit, details );
-
-               config.current.assertions.push({
-                       result: !!result,
-                       message: output
-               });
+               return location.protocol + "//" + location.host +
+                       location.pathname + querystring.slice( 0, -1 );
        },
 
-       pushFailure: function( message, source, actual ) {
-               if ( !config.current ) {
-                       throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-               }
+       extend: extend,
 
-               var output,
-                       details = {
-                               module: config.current.module,
-                               name: config.current.testName,
-                               result: false,
-                               message: message
-                       };
+       load: function() {
+               config.pageLoaded = true;
 
-               message = escapeText( message ) || "error";
-               message = "<span class='test-message'>" + message + "</span>";
-               output = message;
+               // Initialize the configuration options
+               extend( config, {
+                       stats: { all: 0, bad: 0 },
+                       moduleStats: { all: 0, bad: 0 },
+                       started: 0,
+                       updateRate: 1000,
+                       autostart: true,
+                       filter: ""
+               }, true );
 
-               output += "<table>";
+               config.blocking = false;
 
-               if ( actual ) {
-                       output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
+               if ( config.autostart ) {
+                       resumeProcessing();
                }
+       }
+});
 
-               if ( source ) {
-                       details.source = source;
-                       output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-               }
+// Register logging callbacks
+(function() {
+       var i, l, key,
+               callbacks = [ "begin", "done", "log", "testStart", "testDone",
+                       "moduleStart", "moduleDone" ];
+
+       function registerLoggingCallback( key ) {
+               var loggingCallback = function( callback ) {
+                       if ( QUnit.objectType( callback ) !== "function" ) {
+                               throw new Error(
+                                       "QUnit logging methods require a callback function as their first parameters."
+                               );
+                       }
 
-               output += "</table>";
+                       config.callbacks[ key ].push( callback );
+               };
 
-               runLoggingCallbacks( "log", QUnit, details );
+               // DEPRECATED: This will be removed on QUnit 2.0.0+
+               // Stores the registered functions allowing restoring
+               // at verifyLoggingCallbacks() if modified
+               loggingCallbacks[ key ] = loggingCallback;
 
-               config.current.assertions.push({
-                       result: false,
-                       message: output
-               });
-       },
+               return loggingCallback;
+       }
 
-       url: function( params ) {
-               params = extend( extend( {}, QUnit.urlParams ), params );
-               var key,
-                       querystring = "?";
+       for ( i = 0, l = callbacks.length; i < l; i++ ) {
+               key = callbacks[ i ];
 
-               for ( key in params ) {
-                       if ( hasOwn.call( params, key ) ) {
-                               querystring += encodeURIComponent( key ) + "=" +
-                                       encodeURIComponent( params[ key ] ) + "&";
-                       }
+               // Initialize key collection of logging callback
+               if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) {
+                       config.callbacks[ key ] = [];
                }
-               return window.location.protocol + "//" + window.location.host +
-                       window.location.pathname + querystring.slice( 0, -1 );
-       },
 
-       extend: extend,
-       id: id,
-       addEvent: addEvent,
-       addClass: addClass,
-       hasClass: hasClass,
-       removeClass: removeClass
-       // load, equiv, jsDump, diff: Attached later
-});
+               QUnit[ key ] = registerLoggingCallback( key );
+       }
+})();
 
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
+// `onErrorFnPrev` initialized at top of scope
+// Preserve other handlers
+onErrorFnPrev = window.onerror;
 
-       // Logging callbacks; all receive a single argument with the listed properties
-       // run test/logs.html for any related changes
-       begin: registerLoggingCallback( "begin" ),
+// Cover uncaught exceptions
+// Returning true will suppress the default browser handler,
+// returning false will let it run.
+window.onerror = function( error, filePath, linerNr ) {
+       var ret = false;
+       if ( onErrorFnPrev ) {
+               ret = onErrorFnPrev( error, filePath, linerNr );
+       }
 
-       // done: { failed, passed, total, runtime }
-       done: registerLoggingCallback( "done" ),
+       // Treat return value as window.onerror itself does,
+       // Only do our handling if not suppressed.
+       if ( ret !== true ) {
+               if ( QUnit.config.current ) {
+                       if ( QUnit.config.current.ignoreGlobalErrors ) {
+                               return true;
+                       }
+                       QUnit.pushFailure( error, filePath + ":" + linerNr );
+               } else {
+                       QUnit.test( "global failure", extend(function() {
+                               QUnit.pushFailure( error, filePath + ":" + linerNr );
+                       }, { validTest: true } ) );
+               }
+               return false;
+       }
 
-       // log: { result, actual, expected, message }
-       log: registerLoggingCallback( "log" ),
+       return ret;
+};
 
-       // testStart: { name }
-       testStart: registerLoggingCallback( "testStart" ),
+function done() {
+       var runtime, passed;
 
-       // testDone: { name, failed, passed, total, runtime }
-       testDone: registerLoggingCallback( "testDone" ),
+       config.autorun = true;
 
-       // moduleStart: { name }
-       moduleStart: registerLoggingCallback( "moduleStart" ),
+       // Log the last module results
+       if ( config.previousModule ) {
+               runLoggingCallbacks( "moduleDone", {
+                       name: config.previousModule.name,
+                       tests: config.previousModule.tests,
+                       failed: config.moduleStats.bad,
+                       passed: config.moduleStats.all - config.moduleStats.bad,
+                       total: config.moduleStats.all,
+                       runtime: now() - config.moduleStats.started
+               });
+       }
+       delete config.previousModule;
 
-       // moduleDone: { name, failed, passed, total }
-       moduleDone: registerLoggingCallback( "moduleDone" )
-});
+       runtime = now() - config.started;
+       passed = config.stats.all - config.stats.bad;
 
-if ( !defined.document || document.readyState === "complete" ) {
-       config.autorun = true;
+       runLoggingCallbacks( "done", {
+               failed: config.stats.bad,
+               passed: passed,
+               total: config.stats.all,
+               runtime: runtime
+       });
 }
 
-QUnit.load = function() {
-       runLoggingCallbacks( "begin", QUnit, {} );
-
-       // Initialize the config, saving the execution queue
-       var banner, filter, i, j, label, len, main, ol, toolbar, val, selection,
-               urlConfigContainer, moduleFilter, userAgent,
-               numModules = 0,
-               moduleNames = [],
-               moduleFilterHtml = "",
-               urlConfigHtml = "",
-               oldconfig = extend( {}, config );
+// Doesn't support IE6 to IE9
+// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
+function extractStacktrace( e, offset ) {
+       offset = offset === undefined ? 4 : offset;
 
-       QUnit.init();
-       extend(config, oldconfig);
+       var stack, include, i;
 
-       config.blocking = false;
+       if ( e.stacktrace ) {
 
-       len = config.urlConfig.length;
+               // Opera 12.x
+               return e.stacktrace.split( "\n" )[ offset + 3 ];
+       } else if ( e.stack ) {
 
-       for ( i = 0; i < len; i++ ) {
-               val = config.urlConfig[i];
-               if ( typeof val === "string" ) {
-                       val = {
-                               id: val,
-                               label: val
-                       };
-               }
-               config[ val.id ] = QUnit.urlParams[ val.id ];
-               if ( !val.value || typeof val.value === "string" ) {
-                       urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-                               "' name='" + escapeText( val.id ) +
-                               "' type='checkbox'" +
-                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
-                               ( config[ val.id ] ? " checked='checked'" : "" ) +
-                               " title='" + escapeText( val.tooltip ) +
-                               "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-                               "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-               } else {
-                       urlConfigHtml += "<label for='qunit-urlconfig-" + escapeText( val.id ) +
-                               "' title='" + escapeText( val.tooltip ) +
-                               "'>" + val.label +
-                               ": </label><select id='qunit-urlconfig-" + escapeText( val.id ) +
-                               "' name='" + escapeText( val.id ) +
-                               "' title='" + escapeText( val.tooltip ) +
-                               "'><option></option>";
-                       selection = false;
-                       if ( QUnit.is( "array", val.value ) ) {
-                               for ( j = 0; j < val.value.length; j++ ) {
-                                       urlConfigHtml += "<option value='" + escapeText( val.value[j] ) + "'" +
-                                               ( config[ val.id ] === val.value[j] ?
-                                                       (selection = true) && " selected='selected'" :
-                                                       "" ) +
-                                               ">" + escapeText( val.value[j] ) + "</option>";
-                               }
-                       } else {
-                               for ( j in val.value ) {
-                                       if ( hasOwn.call( val.value, j ) ) {
-                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
-                                                       ( config[ val.id ] === j ?
-                                                               (selection = true) && " selected='selected'" :
-                                                               "" ) +
-                                                       ">" + escapeText( val.value[j] ) + "</option>";
-                                       }
-                               }
-                       }
-                       if ( config[ val.id ] && !selection ) {
-                               urlConfigHtml += "<option value='" + escapeText( config[ val.id ] ) +
-                                       "' selected='selected' disabled='disabled'>" +
-                                       escapeText( config[ val.id ] ) +
-                                       "</option>";
-                       }
-                       urlConfigHtml += "</select>";
-               }
-       }
-       for ( i in config.modules ) {
-               if ( config.modules.hasOwnProperty( i ) ) {
-                       moduleNames.push(i);
-               }
-       }
-       numModules = moduleNames.length;
-       moduleNames.sort( function( a, b ) {
-               return a.localeCompare( b );
-       });
-       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-               ( config.module === undefined  ? "selected='selected'" : "" ) +
-               ">< All Modules ></option>";
-
-
-       for ( i = 0; i < numModules; i++) {
-                       moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-                               ( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-                               ">" + escapeText(moduleNames[i]) + "</option>";
-       }
-       moduleFilterHtml += "</select>";
-
-       // `userAgent` initialized at top of scope
-       userAgent = id( "qunit-userAgent" );
-       if ( userAgent ) {
-               userAgent.innerHTML = navigator.userAgent;
-       }
-
-       // `banner` initialized at top of scope
-       banner = id( "qunit-header" );
-       if ( banner ) {
-               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-       }
-
-       // `toolbar` initialized at top of scope
-       toolbar = id( "qunit-testrunner-toolbar" );
-       if ( toolbar ) {
-               // `filter` initialized at top of scope
-               filter = document.createElement( "input" );
-               filter.type = "checkbox";
-               filter.id = "qunit-filter-pass";
-
-               addEvent( filter, "click", function() {
-                       var tmp,
-                               ol = id( "qunit-tests" );
-
-                       if ( filter.checked ) {
-                               ol.className = ol.className + " hidepass";
-                       } else {
-                               tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-                               ol.className = tmp.replace( / hidepass /, " " );
-                       }
-                       if ( defined.sessionStorage ) {
-                               if (filter.checked) {
-                                       sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-                               } else {
-                                       sessionStorage.removeItem( "qunit-filter-passed-tests" );
-                               }
-                       }
-               });
-
-               if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-                       filter.checked = true;
-                       // `ol` initialized at top of scope
-                       ol = id( "qunit-tests" );
-                       ol.className = ol.className + " hidepass";
-               }
-               toolbar.appendChild( filter );
-
-               // `label` initialized at top of scope
-               label = document.createElement( "label" );
-               label.setAttribute( "for", "qunit-filter-pass" );
-               label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-               label.innerHTML = "Hide passed tests";
-               toolbar.appendChild( label );
-
-               urlConfigContainer = document.createElement("span");
-               urlConfigContainer.innerHTML = urlConfigHtml;
-               // For oldIE support:
-               // * Add handlers to the individual elements instead of the container
-               // * Use "click" instead of "change" for checkboxes
-               // * Fallback from event.target to event.srcElement
-               addEvents( urlConfigContainer.getElementsByTagName("input"), "click", function( event ) {
-                       var params = {},
-                               target = event.target || event.srcElement;
-                       params[ target.name ] = target.checked ?
-                               target.defaultValue || true :
-                               undefined;
-                       window.location = QUnit.url( params );
-               });
-               addEvents( urlConfigContainer.getElementsByTagName("select"), "change", function( event ) {
-                       var params = {},
-                               target = event.target || event.srcElement;
-                       params[ target.name ] = target.options[ target.selectedIndex ].value || undefined;
-                       window.location = QUnit.url( params );
-               });
-               toolbar.appendChild( urlConfigContainer );
-
-               if (numModules > 1) {
-                       moduleFilter = document.createElement( "span" );
-                       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-                       moduleFilter.innerHTML = moduleFilterHtml;
-                       addEvent( moduleFilter.lastChild, "change", function() {
-                               var selectBox = moduleFilter.getElementsByTagName("select")[0],
-                                       selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-                               window.location = QUnit.url({
-                                       module: ( selectedModule === "" ) ? undefined : selectedModule,
-                                       // Remove any existing filters
-                                       filter: undefined,
-                                       testNumber: undefined
-                               });
-                       });
-                       toolbar.appendChild(moduleFilter);
-               }
-       }
-
-       // `main` initialized at top of scope
-       main = id( "qunit-fixture" );
-       if ( main ) {
-               config.fixture = main.innerHTML;
-       }
-
-       if ( config.autostart ) {
-               QUnit.start();
-       }
-};
-
-if ( defined.document ) {
-       addEvent( window, "load", QUnit.load );
-}
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-       var ret = false;
-       if ( onErrorFnPrev ) {
-               ret = onErrorFnPrev( error, filePath, linerNr );
-       }
-
-       // Treat return value as window.onerror itself does,
-       // Only do our handling if not suppressed.
-       if ( ret !== true ) {
-               if ( QUnit.config.current ) {
-                       if ( QUnit.config.current.ignoreGlobalErrors ) {
-                               return true;
-                       }
-                       QUnit.pushFailure( error, filePath + ":" + linerNr );
-               } else {
-                       QUnit.test( "global failure", extend( function() {
-                               QUnit.pushFailure( error, filePath + ":" + linerNr );
-                       }, { validTest: validTest } ) );
-               }
-               return false;
-       }
-
-       return ret;
-};
-
-function done() {
-       config.autorun = true;
-
-       // Log the last module results
-       if ( config.previousModule ) {
-               runLoggingCallbacks( "moduleDone", QUnit, {
-                       name: config.previousModule,
-                       failed: config.moduleStats.bad,
-                       passed: config.moduleStats.all - config.moduleStats.bad,
-                       total: config.moduleStats.all
-               });
-       }
-       delete config.previousModule;
-
-       var i, key,
-               banner = id( "qunit-banner" ),
-               tests = id( "qunit-tests" ),
-               runtime = +new Date() - config.started,
-               passed = config.stats.all - config.stats.bad,
-               html = [
-                       "Tests completed in ",
-                       runtime,
-                       " milliseconds.<br/>",
-                       "<span class='passed'>",
-                       passed,
-                       "</span> assertions of <span class='total'>",
-                       config.stats.all,
-                       "</span> passed, <span class='failed'>",
-                       config.stats.bad,
-                       "</span> failed."
-               ].join( "" );
-
-       if ( banner ) {
-               banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-       }
-
-       if ( tests ) {
-               id( "qunit-testresult" ).innerHTML = html;
-       }
-
-       if ( config.altertitle && defined.document && document.title ) {
-               // show ✖ for good, ✔ for bad suite result in title
-               // use escape sequences in case file gets loaded with non-utf-8-charset
-               document.title = [
-                       ( config.stats.bad ? "\u2716" : "\u2714" ),
-                       document.title.replace( /^[\u2714\u2716] /i, "" )
-               ].join( " " );
-       }
-
-       // clear own sessionStorage items if all tests passed
-       if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-               // `key` & `i` initialized at top of scope
-               for ( i = 0; i < sessionStorage.length; i++ ) {
-                       key = sessionStorage.key( i++ );
-                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
-                               sessionStorage.removeItem( key );
-                       }
-               }
-       }
-
-       // scroll back to top to show results
-       if ( config.scrolltop && window.scrollTo ) {
-               window.scrollTo(0, 0);
-       }
-
-       runLoggingCallbacks( "done", QUnit, {
-               failed: config.stats.bad,
-               passed: passed,
-               total: config.stats.all,
-               runtime: runtime
-       });
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-       var include,
-               filter = config.filter && config.filter.toLowerCase(),
-               module = config.module && config.module.toLowerCase(),
-               fullName = ( test.module + ": " + test.testName ).toLowerCase();
-
-       // Internally-generated tests are always valid
-       if ( test.callback && test.callback.validTest === validTest ) {
-               delete test.callback.validTest;
-               return true;
-       }
-
-       if ( config.testNumber.length > 0 ) {
-               if ( inArray( test.testNumber, config.testNumber ) < 0 ) {
-                       return false;
-               }
-       }
-
-       if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-               return false;
-       }
-
-       if ( !filter ) {
-               return true;
-       }
-
-       include = filter.charAt( 0 ) !== "!";
-       if ( !include ) {
-               filter = filter.slice( 1 );
-       }
-
-       // If the filter matches, we need to honour include
-       if ( fullName.indexOf( filter ) !== -1 ) {
-               return include;
-       }
-
-       // Otherwise, do the opposite
-       return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-       offset = offset === undefined ? 3 : offset;
-
-       var stack, include, i;
-
-       if ( e.stacktrace ) {
-               // Opera
-               return e.stacktrace.split( "\n" )[ offset + 3 ];
-       } else if ( e.stack ) {
-               // Firefox, Chrome
+               // Firefox, Chrome, Safari 6+, IE10+, PhantomJS and Node
                stack = e.stack.split( "\n" );
-               if (/^error$/i.test( stack[0] ) ) {
+               if ( /^error$/i.test( stack[ 0 ] ) ) {
                        stack.shift();
                }
                if ( fileName ) {
@@ -953,50 +534,38 @@ function extractStacktrace( e, offset ) {
                }
                return stack[ offset ];
        } else if ( e.sourceURL ) {
-               // Safari, PhantomJS
-               // hopefully one day Safari provides actual stacktraces
+
+               // Safari < 6
                // exclude useless self-reference for generated Error objects
                if ( /qunit.js$/.test( e.sourceURL ) ) {
                        return;
                }
+
                // for actual exceptions, this is useful
                return e.sourceURL + ":" + e.line;
        }
 }
-function sourceFromStacktrace( offset ) {
-       try {
-               throw new Error();
-       } catch ( e ) {
-               return extractStacktrace( e, offset );
-       }
-}
 
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-       if ( !s ) {
-               return "";
-       }
-       s = s + "";
-       // Both single quotes and double quotes (for attributes)
-       return s.replace( /['"<>&]/g, function( s ) {
-               switch( s ) {
-                       case "'":
-                               return "&#039;";
-                       case "\"":
-                               return "&quot;";
-                       case "<":
-                               return "&lt;";
-                       case ">":
-                               return "&gt;";
-                       case "&":
-                               return "&amp;";
+function sourceFromStacktrace( offset ) {
+       var e = new Error();
+       if ( !e.stack ) {
+               try {
+                       throw e;
+               } catch ( err ) {
+                       // This should already be true in most browsers
+                       e = err;
                }
-       });
+       }
+       return extractStacktrace( e, offset );
 }
 
 function synchronize( callback, last ) {
+       if ( QUnit.objectType( callback ) === "array" ) {
+               while ( callback.length ) {
+                       synchronize( callback.shift() );
+               }
+               return;
+       }
        config.queue.push( callback );
 
        if ( config.autorun && !config.blocking ) {
@@ -1008,11 +577,17 @@ function process( last ) {
        function next() {
                process( last );
        }
-       var start = new Date().getTime();
+       var start = now();
        config.depth = config.depth ? config.depth + 1 : 1;
 
        while ( config.queue.length && !config.blocking ) {
-               if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
+               if ( !defined.setTimeout || config.updateRate <= 0 ||
+                               ( ( now() - start ) < config.updateRate ) ) {
+                       if ( config.current ) {
+
+                               // Reset async tracking for each phase of the Test lifecycle
+                               config.current.usedAsync = false;
+                       }
                        config.queue.shift()();
                } else {
                        setTimeout( next, 13 );
@@ -1025,6 +600,79 @@ function process( last ) {
        }
 }
 
+function begin() {
+       var i, l,
+               modulesLog = [];
+
+       // If the test run hasn't officially begun yet
+       if ( !config.started ) {
+
+               // Record the time of the test run's beginning
+               config.started = now();
+
+               verifyLoggingCallbacks();
+
+               // Delete the loose unnamed module if unused.
+               if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) {
+                       config.modules.shift();
+               }
+
+               // Avoid unnecessary information by not logging modules' test environments
+               for ( i = 0, l = config.modules.length; i < l; i++ ) {
+                       modulesLog.push({
+                               name: config.modules[ i ].name,
+                               tests: config.modules[ i ].tests
+                       });
+               }
+
+               // The test run is officially beginning now
+               runLoggingCallbacks( "begin", {
+                       totalTests: Test.count,
+                       modules: modulesLog
+               });
+       }
+
+       config.blocking = false;
+       process( true );
+}
+
+function resumeProcessing() {
+       runStarted = true;
+
+       // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)
+       if ( defined.setTimeout ) {
+               setTimeout(function() {
+                       if ( config.current && config.current.semaphore > 0 ) {
+                               return;
+                       }
+                       if ( config.timeout ) {
+                               clearTimeout( config.timeout );
+                       }
+
+                       begin();
+               }, 13 );
+       } else {
+               begin();
+       }
+}
+
+function pauseProcessing() {
+       config.blocking = true;
+
+       if ( config.testTimeout && defined.setTimeout ) {
+               clearTimeout( config.timeout );
+               config.timeout = setTimeout(function() {
+                       if ( config.current ) {
+                               config.current.semaphore = 0;
+                               QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
+                       } else {
+                               throw new Error( "Test timed out" );
+                       }
+                       resumeProcessing();
+               }, config.testTimeout );
+       }
+}
+
 function saveGlobal() {
        config.pollution = [];
 
@@ -1050,12 +698,12 @@ function checkPollution() {
 
        newGlobals = diff( config.pollution, old );
        if ( newGlobals.length > 0 ) {
-               QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
+               QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
        }
 
        deletedGlobals = diff( old, config.pollution );
        if ( deletedGlobals.length > 0 ) {
-               QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
+               QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
        }
 }
 
@@ -1066,7 +714,7 @@ function diff( a, b ) {
 
        for ( i = 0; i < result.length; i++ ) {
                for ( j = 0; j < b.length; j++ ) {
-                       if ( result[i] === b[j] ) {
+                       if ( result[ i ] === b[ j ] ) {
                                result.splice( i, 1 );
                                i--;
                                break;
@@ -1076,14 +724,15 @@ function diff( a, b ) {
        return result;
 }
 
-function extend( a, b ) {
+function extend( a, b, undefOnly ) {
        for ( var prop in b ) {
                if ( hasOwn.call( b, prop ) ) {
+
                        // Avoid "Member not found" error in IE8 caused by messing with window.constructor
                        if ( !( prop === "constructor" && a === window ) ) {
                                if ( b[ prop ] === undefined ) {
                                        delete a[ prop ];
-                               } else {
+                               } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
                                        a[ prop ] = b[ prop ];
                                }
                        }
@@ -1093,78 +742,39 @@ function extend( a, b ) {
        return a;
 }
 
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-       if ( elem.addEventListener ) {
-
-               // Standards-based browsers
-               elem.addEventListener( type, fn, false );
-       } else if ( elem.attachEvent ) {
-
-               // support: IE <9
-               elem.attachEvent( "on" + type, fn );
-       } else {
+function runLoggingCallbacks( key, args ) {
+       var i, l, callbacks;
 
-               // Caller must ensure support for event listeners is present
-               throw new Error( "addEvent() was called in a context without event listener support" );
+       callbacks = config.callbacks[ key ];
+       for ( i = 0, l = callbacks.length; i < l; i++ ) {
+               callbacks[ i ]( args );
        }
 }
 
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-       var i = elems.length;
-       while ( i-- ) {
-               addEvent( elems[i], type, fn );
-       }
-}
-
-function hasClass( elem, name ) {
-       return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
+// DEPRECATED: This will be removed on 2.0.0+
+// This function verifies if the loggingCallbacks were modified by the user
+// If so, it will restore it, assign the given callback and print a console warning
+function verifyLoggingCallbacks() {
+       var loggingCallback, userCallback;
 
-function addClass( elem, name ) {
-       if ( !hasClass( elem, name ) ) {
-               elem.className += (elem.className ? " " : "") + name;
-       }
-}
+       for ( loggingCallback in loggingCallbacks ) {
+               if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
 
-function removeClass( elem, name ) {
-       var set = " " + elem.className + " ";
-       // Class name may appear multiple times
-       while ( set.indexOf(" " + name + " ") > -1 ) {
-               set = set.replace(" " + name + " " , " ");
-       }
-       // If possible, trim it for prettiness, but not necessarily
-       elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
+                       userCallback = QUnit[ loggingCallback ];
 
-function id( name ) {
-       return defined.document && document.getElementById && document.getElementById( name );
-}
+                       // Restore the callback function
+                       QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
 
-function registerLoggingCallback( key ) {
-       return function( callback ) {
-               config[key].push( callback );
-       };
-}
+                       // Assign the deprecated given callback
+                       QUnit[ loggingCallback ]( userCallback );
 
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-       var i, callbacks;
-       if ( QUnit.hasOwnProperty( key ) ) {
-               QUnit[ key ].call(scope, args );
-       } else {
-               callbacks = config[ key ];
-               for ( i = 0; i < callbacks.length; i++ ) {
-                       callbacks[ i ].call( scope, args );
+                       if ( window.console && window.console.warn ) {
+                               window.console.warn(
+                                       "QUnit." + loggingCallback + " was replaced with a new value.\n" +
+                                       "Please, check out the documentation on how to apply logging callbacks.\n" +
+                                       "Reference: http://api.qunitjs.com/category/callbacks/"
+                               );
+                       }
                }
        }
 }
@@ -1185,40 +795,51 @@ function inArray( elem, array ) {
 }
 
 function Test( settings ) {
+       var i, l;
+
+       ++Test.count;
+
        extend( this, settings );
        this.assertions = [];
-       this.testNumber = ++Test.count;
-}
+       this.semaphore = 0;
+       this.usedAsync = false;
+       this.module = config.currentModule;
+       this.stack = sourceFromStacktrace( 3 );
 
-Test.count = 0;
+       // Register unique strings
+       for ( i = 0, l = this.module.tests; i < l.length; i++ ) {
+               if ( this.module.tests[ i ].name === this.testName ) {
+                       this.testName += " ";
+               }
+       }
 
-Test.prototype = {
-       init: function() {
-               var a, b, li,
-                       tests = id( "qunit-tests" );
+       this.testId = generateHash( this.module.name, this.testName );
+
+       this.module.tests.push({
+               name: this.testName,
+               testId: this.testId
+       });
 
-               if ( tests ) {
-                       b = document.createElement( "strong" );
-                       b.innerHTML = this.nameHtml;
+       if ( settings.skip ) {
 
-                       // `a` initialized at top of scope
-                       a = document.createElement( "a" );
-                       a.innerHTML = "Rerun";
-                       a.href = QUnit.url({ testNumber: this.testNumber });
+               // Skipped tests will fully ignore any sent callback
+               this.callback = function() {};
+               this.async = false;
+               this.expected = 0;
+       } else {
+               this.assert = new Assert( this );
+       }
+}
 
-                       li = document.createElement( "li" );
-                       li.appendChild( b );
-                       li.appendChild( a );
-                       li.className = "running";
-                       li.id = this.id = "qunit-test-output" + testId++;
+Test.count = 0;
 
-                       tests.appendChild( li );
-               }
-       },
-       setup: function() {
+Test.prototype = {
+       before: function() {
                if (
+
                        // Emit moduleStart when we're switching from one module to another
                        this.module !== config.previousModule ||
+
                                // They could be equal (both undefined) but if the previousModule property doesn't
                                // yet exist it means this is the first test in a suite that isn't wrapped in a
                                // module, in which case we'll just emit a moduleStart event for 'undefined'.
@@ -1226,86 +847,65 @@ Test.prototype = {
                                !hasOwn.call( config, "previousModule" )
                ) {
                        if ( hasOwn.call( config, "previousModule" ) ) {
-                               runLoggingCallbacks( "moduleDone", QUnit, {
-                                       name: config.previousModule,
+                               runLoggingCallbacks( "moduleDone", {
+                                       name: config.previousModule.name,
+                                       tests: config.previousModule.tests,
                                        failed: config.moduleStats.bad,
                                        passed: config.moduleStats.all - config.moduleStats.bad,
-                                       total: config.moduleStats.all
+                                       total: config.moduleStats.all,
+                                       runtime: now() - config.moduleStats.started
                                });
                        }
                        config.previousModule = this.module;
-                       config.moduleStats = { all: 0, bad: 0 };
-                       runLoggingCallbacks( "moduleStart", QUnit, {
-                               name: this.module
+                       config.moduleStats = { all: 0, bad: 0, started: now() };
+                       runLoggingCallbacks( "moduleStart", {
+                               name: this.module.name,
+                               tests: this.module.tests
                        });
                }
 
                config.current = this;
 
-               this.testEnvironment = extend({
-                       setup: function() {},
-                       teardown: function() {}
-               }, this.moduleTestEnvironment );
+               this.testEnvironment = extend( {}, this.module.testEnvironment );
+               delete this.testEnvironment.beforeEach;
+               delete this.testEnvironment.afterEach;
 
-               this.started = +new Date();
-               runLoggingCallbacks( "testStart", QUnit, {
+               this.started = now();
+               runLoggingCallbacks( "testStart", {
                        name: this.testName,
-                       module: this.module
+                       module: this.module.name,
+                       testId: this.testId
                });
 
-               /*jshint camelcase:false */
-
-
-               /**
-                * Expose the current test environment.
-                *
-                * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-                */
-               QUnit.current_testEnvironment = this.testEnvironment;
-
-               /*jshint camelcase:true */
-
                if ( !config.pollution ) {
                        saveGlobal();
                }
-               if ( config.notrycatch ) {
-                       this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-                       return;
-               }
-               try {
-                       this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-               } catch( e ) {
-                       QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-               }
        },
-       run: function() {
-               config.current = this;
 
-               var running = id( "qunit-testresult" );
+       run: function() {
+               var promise;
 
-               if ( running ) {
-                       running.innerHTML = "Running: <br/>" + this.nameHtml;
-               }
+               config.current = this;
 
                if ( this.async ) {
                        QUnit.stop();
                }
 
-               this.callbackStarted = +new Date();
+               this.callbackStarted = now();
 
                if ( config.notrycatch ) {
-                       this.callback.call( this.testEnvironment, QUnit.assert );
-                       this.callbackRuntime = +new Date() - this.callbackStarted;
+                       promise = this.callback.call( this.testEnvironment, this.assert );
+                       this.resolvePromise( promise );
                        return;
                }
 
                try {
-                       this.callback.call( this.testEnvironment, QUnit.assert );
-                       this.callbackRuntime = +new Date() - this.callbackStarted;
-               } catch( e ) {
-                       this.callbackRuntime = +new Date() - this.callbackStarted;
+                       promise = this.callback.call( this.testEnvironment, this.assert );
+                       this.resolvePromise( promise );
+               } catch ( e ) {
+                       this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
+                               this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
 
-                       QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
                        // else next test will carry the responsibility
                        saveGlobal();
 
@@ -1315,133 +915,96 @@ Test.prototype = {
                        }
                }
        },
-       teardown: function() {
-               config.current = this;
-               if ( config.notrycatch ) {
-                       if ( typeof this.callbackRuntime === "undefined" ) {
-                               this.callbackRuntime = +new Date() - this.callbackStarted;
+
+       after: function() {
+               checkPollution();
+       },
+
+       queueHook: function( hook, hookName ) {
+               var promise,
+                       test = this;
+               return function runHook() {
+                       config.current = test;
+                       if ( config.notrycatch ) {
+                               promise = hook.call( test.testEnvironment, test.assert );
+                               test.resolvePromise( promise, hookName );
+                               return;
                        }
-                       this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-                       return;
-               } else {
                        try {
-                               this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-                       } catch( e ) {
-                               QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
+                               promise = hook.call( test.testEnvironment, test.assert );
+                               test.resolvePromise( promise, hookName );
+                       } catch ( error ) {
+                               test.pushFailure( hookName + " failed on " + test.testName + ": " +
+                                       ( error.message || error ), extractStacktrace( error, 0 ) );
                        }
+               };
+       },
+
+       // Currently only used for module level hooks, can be used to add global level ones
+       hooks: function( handler ) {
+               var hooks = [];
+
+               // Hooks are ignored on skipped tests
+               if ( this.skip ) {
+                       return hooks;
                }
-               checkPollution();
+
+               if ( this.module.testEnvironment &&
+                               QUnit.objectType( this.module.testEnvironment[ handler ] ) === "function" ) {
+                       hooks.push( this.queueHook( this.module.testEnvironment[ handler ], handler ) );
+               }
+
+               return hooks;
        },
+
        finish: function() {
                config.current = this;
                if ( config.requireExpects && this.expected === null ) {
-                       QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
+                       this.pushFailure( "Expected number of assertions to be defined, but expect() was " +
+                               "not called.", this.stack );
                } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-                       QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
+                       this.pushFailure( "Expected " + this.expected + " assertions, but " +
+                               this.assertions.length + " were run", this.stack );
                } else if ( this.expected === null && !this.assertions.length ) {
-                       QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
+                       this.pushFailure( "Expected at least one assertion, but none were run - call " +
+                               "expect(0) to accept zero assertions.", this.stack );
                }
 
-               var i, assertion, a, b, time, li, ol,
-                       test = this,
-                       good = 0,
-                       bad = 0,
-                       tests = id( "qunit-tests" );
+               var i,
+                       bad = 0;
 
-               this.runtime = +new Date() - this.started;
+               this.runtime = now() - this.started;
                config.stats.all += this.assertions.length;
                config.moduleStats.all += this.assertions.length;
 
-               if ( tests ) {
-                       ol = document.createElement( "ol" );
-                       ol.className = "qunit-assert-list";
-
-                       for ( i = 0; i < this.assertions.length; i++ ) {
-                               assertion = this.assertions[i];
-
-                               li = document.createElement( "li" );
-                               li.className = assertion.result ? "pass" : "fail";
-                               li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-                               ol.appendChild( li );
-
-                               if ( assertion.result ) {
-                                       good++;
-                               } else {
-                                       bad++;
-                                       config.stats.bad++;
-                                       config.moduleStats.bad++;
-                               }
-                       }
-
-                       // store result when possible
-                       if ( QUnit.config.reorder && defined.sessionStorage ) {
-                               if ( bad ) {
-                                       sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-                               } else {
-                                       sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-                               }
-                       }
-
-                       if ( bad === 0 ) {
-                               addClass( ol, "qunit-collapsed" );
-                       }
-
-                       // `b` initialized at top of scope
-                       b = document.createElement( "strong" );
-                       b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-                       addEvent(b, "click", function() {
-                               var next = b.parentNode.lastChild,
-                                       collapsed = hasClass( next, "qunit-collapsed" );
-                               ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-                       });
-
-                       addEvent(b, "dblclick", function( e ) {
-                               var target = e && e.target ? e.target : window.event.srcElement;
-                               if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-                                       target = target.parentNode;
-                               }
-                               if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-                                       window.location = QUnit.url({ testNumber: test.testNumber });
-                               }
-                       });
-
-                       // `time` initialized at top of scope
-                       time = document.createElement( "span" );
-                       time.className = "runtime";
-                       time.innerHTML = this.runtime + " ms";
-
-                       // `li` initialized at top of scope
-                       li = id( this.id );
-                       li.className = bad ? "fail" : "pass";
-                       li.removeChild( li.firstChild );
-                       a = li.firstChild;
-                       li.appendChild( b );
-                       li.appendChild( a );
-                       li.appendChild( time );
-                       li.appendChild( ol );
-
-               } else {
-                       for ( i = 0; i < this.assertions.length; i++ ) {
-                               if ( !this.assertions[i].result ) {
-                                       bad++;
-                                       config.stats.bad++;
-                                       config.moduleStats.bad++;
-                               }
+               for ( i = 0; i < this.assertions.length; i++ ) {
+                       if ( !this.assertions[ i ].result ) {
+                               bad++;
+                               config.stats.bad++;
+                               config.moduleStats.bad++;
                        }
                }
 
-               runLoggingCallbacks( "testDone", QUnit, {
+               runLoggingCallbacks( "testDone", {
                        name: this.testName,
-                       module: this.module,
+                       module: this.module.name,
+                       skipped: !!this.skip,
                        failed: bad,
                        passed: this.assertions.length - bad,
                        total: this.assertions.length,
                        runtime: this.runtime,
+
+                       // HTML Reporter use
+                       assertions: this.assertions,
+                       testId: this.testId,
+
                        // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
                        duration: this.runtime
                });
 
+               // QUnit.reset() is deprecated and will be replaced for a new
+               // fixture reset function on QUnit 2.0/2.1.
+               // It's still called here for backwards compatibility handling
                QUnit.reset();
 
                config.current = undefined;
@@ -1451,93 +1014,316 @@ Test.prototype = {
                var bad,
                        test = this;
 
-               synchronize(function() {
-                       test.init();
-               });
+               if ( !this.valid() ) {
+                       return;
+               }
+
                function run() {
+
                        // each of these can by async
-                       synchronize(function() {
-                               test.setup();
-                       });
-                       synchronize(function() {
-                               test.run();
-                       });
-                       synchronize(function() {
-                               test.teardown();
-                       });
-                       synchronize(function() {
-                               test.finish();
-                       });
+                       synchronize([
+                               function() {
+                                       test.before();
+                               },
+
+                               test.hooks( "beforeEach" ),
+
+                               function() {
+                                       test.run();
+                               },
+
+                               test.hooks( "afterEach" ).reverse(),
+
+                               function() {
+                                       test.after();
+                               },
+                               function() {
+                                       test.finish();
+                               }
+                       ]);
                }
 
                // `bad` initialized at top of scope
                // defer when previous test run passed, if storage is available
                bad = QUnit.config.reorder && defined.sessionStorage &&
-                                               +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
+                               +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
 
                if ( bad ) {
                        run();
                } else {
                        synchronize( run, true );
                }
-       }
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-assert = QUnit.assert = {
-       /**
-        * Asserts rough true-ish result.
-        * @name ok
-        * @function
-        * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-        */
-       ok: function( result, msg ) {
-               if ( !config.current ) {
-                       throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-               }
-               result = !!result;
-               msg = msg || ( result ? "okay" : "failed" );
+       },
 
+       push: function( result, actual, expected, message ) {
                var source,
                        details = {
-                               module: config.current.module,
-                               name: config.current.testName,
+                               module: this.module.name,
+                               name: this.testName,
                                result: result,
-                               message: msg
+                               message: message,
+                               actual: actual,
+                               expected: expected,
+                               testId: this.testId,
+                               runtime: now() - this.started
                        };
 
-               msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
                if ( !result ) {
-                       source = sourceFromStacktrace( 2 );
+                       source = sourceFromStacktrace();
+
                        if ( source ) {
                                details.source = source;
-                               msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" +
-                                       escapeText( source ) +
-                                       "</pre></td></tr></table>";
                        }
                }
-               runLoggingCallbacks( "log", QUnit, details );
-               config.current.assertions.push({
-                       result: result,
-                       message: msg
+
+               runLoggingCallbacks( "log", details );
+
+               this.assertions.push({
+                       result: !!result,
+                       message: message
+               });
+       },
+
+       pushFailure: function( message, source, actual ) {
+               if ( !this instanceof Test ) {
+                       throw new Error( "pushFailure() assertion outside test context, was " +
+                               sourceFromStacktrace( 2 ) );
+               }
+
+               var details = {
+                               module: this.module.name,
+                               name: this.testName,
+                               result: false,
+                               message: message || "error",
+                               actual: actual || null,
+                               testId: this.testId,
+                               runtime: now() - this.started
+                       };
+
+               if ( source ) {
+                       details.source = source;
+               }
+
+               runLoggingCallbacks( "log", details );
+
+               this.assertions.push({
+                       result: false,
+                       message: message
                });
        },
 
+       resolvePromise: function( promise, phase ) {
+               var then, message,
+                       test = this;
+               if ( promise != null ) {
+                       then = promise.then;
+                       if ( QUnit.objectType( then ) === "function" ) {
+                               QUnit.stop();
+                               then.call(
+                                       promise,
+                                       QUnit.start,
+                                       function( error ) {
+                                               message = "Promise rejected " +
+                                                       ( !phase ? "during" : phase.replace( /Each$/, "" ) ) +
+                                                       " " + test.testName + ": " + ( error.message || error );
+                                               test.pushFailure( message, extractStacktrace( error, 0 ) );
+
+                                               // else next test will carry the responsibility
+                                               saveGlobal();
+
+                                               // Unblock
+                                               QUnit.start();
+                                       }
+                               );
+                       }
+               }
+       },
+
+       valid: function() {
+               var include,
+                       filter = config.filter && config.filter.toLowerCase(),
+                       module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(),
+                       fullName = ( this.module.name + ": " + this.testName ).toLowerCase();
+
+               // Internally-generated tests are always valid
+               if ( this.callback && this.callback.validTest ) {
+                       return true;
+               }
+
+               if ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) {
+                       return false;
+               }
+
+               if ( module && ( !this.module.name || this.module.name.toLowerCase() !== module ) ) {
+                       return false;
+               }
+
+               if ( !filter ) {
+                       return true;
+               }
+
+               include = filter.charAt( 0 ) !== "!";
+               if ( !include ) {
+                       filter = filter.slice( 1 );
+               }
+
+               // If the filter matches, we need to honour include
+               if ( fullName.indexOf( filter ) !== -1 ) {
+                       return include;
+               }
+
+               // Otherwise, do the opposite
+               return !include;
+       }
+
+};
+
+// Resets the test setup. Useful for tests that modify the DOM.
+/*
+DEPRECATED: Use multiple tests instead of resetting inside a test.
+Use testStart or testDone for custom cleanup.
+This method will throw an error in 2.0, and will be removed in 2.1
+*/
+QUnit.reset = function() {
+
+       // Return on non-browser environments
+       // This is necessary to not break on node tests
+       if ( typeof window === "undefined" ) {
+               return;
+       }
+
+       var fixture = defined.document && document.getElementById &&
+                       document.getElementById( "qunit-fixture" );
+
+       if ( fixture ) {
+               fixture.innerHTML = config.fixture;
+       }
+};
+
+QUnit.pushFailure = function() {
+       if ( !QUnit.config.current ) {
+               throw new Error( "pushFailure() assertion outside test context, in " +
+                       sourceFromStacktrace( 2 ) );
+       }
+
+       // Gets current test obj
+       var currentTest = QUnit.config.current;
+
+       return currentTest.pushFailure.apply( currentTest, arguments );
+};
+
+// Based on Java's String.hashCode, a simple but not
+// rigorously collision resistant hashing function
+function generateHash( module, testName ) {
+       var hex,
+               i = 0,
+               hash = 0,
+               str = module + "\x1C" + testName,
+               len = str.length;
+
+       for ( ; i < len; i++ ) {
+               hash  = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );
+               hash |= 0;
+       }
+
+       // Convert the possibly negative integer hash code into an 8 character hex string, which isn't
+       // strictly necessary but increases user understanding that the id is a SHA-like hash
+       hex = ( 0x100000000 + hash ).toString( 16 );
+       if ( hex.length < 8 ) {
+               hex = "0000000" + hex;
+       }
+
+       return hex.slice( -8 );
+}
+
+function Assert( testContext ) {
+       this.test = testContext;
+}
+
+// Assert helpers
+QUnit.assert = Assert.prototype = {
+
+       // Specify the number of expected assertions to guarantee that failed test
+       // (no assertions are run at all) don't slip through.
+       expect: function( asserts ) {
+               if ( arguments.length === 1 ) {
+                       this.test.expected = asserts;
+               } else {
+                       return this.test.expected;
+               }
+       },
+
+       // Increment this Test's semaphore counter, then return a single-use function that
+       // decrements that counter a maximum of once.
+       async: function() {
+               var test = this.test,
+                       popped = false;
+
+               test.semaphore += 1;
+               test.usedAsync = true;
+               pauseProcessing();
+
+               return function done() {
+                       if ( !popped ) {
+                               test.semaphore -= 1;
+                               popped = true;
+                               resumeProcessing();
+                       } else {
+                               test.pushFailure( "Called the callback returned from `assert.async` more than once",
+                                       sourceFromStacktrace( 2 ) );
+                       }
+               };
+       },
+
+       // Exports test.push() to the user API
+       push: function( /* result, actual, expected, message */ ) {
+               var assert = this,
+                       currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
+
+               // Backwards compatibility fix.
+               // Allows the direct use of global exported assertions and QUnit.assert.*
+               // Although, it's use is not recommended as it can leak assertions
+               // to other tests from async tests, because we only get a reference to the current test,
+               // not exactly the test where assertion were intended to be called.
+               if ( !currentTest ) {
+                       throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) );
+               }
+
+               if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {
+                       currentTest.pushFailure( "Assertion after the final `assert.async` was resolved",
+                               sourceFromStacktrace( 2 ) );
+
+                       // Allow this assertion to continue running anyway...
+               }
+
+               if ( !( assert instanceof Assert ) ) {
+                       assert = currentTest.assert;
+               }
+               return assert.test.push.apply( assert.test, arguments );
+       },
+
+       /**
+        * Asserts rough true-ish result.
+        * @name ok
+        * @function
+        * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
+        */
+       ok: function( result, message ) {
+               message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
+                       QUnit.dump.parse( result ) );
+               this.push( !!result, result, true, message );
+       },
+
        /**
         * Assert that the first two arguments are equal, with an optional message.
         * Prints out both actual and expected values.
         * @name equal
         * @function
-        * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
+        * @example equal( format( "{0} bytes.", 2), "2 bytes.", "replaces {0} with next argument" );
         */
        equal: function( actual, expected, message ) {
                /*jshint eqeqeq:false */
-               QUnit.push( expected == actual, actual, expected, message );
+               this.push( expected == actual, actual, expected, message );
        },
 
        /**
@@ -1546,7 +1332,7 @@ assert = QUnit.assert = {
         */
        notEqual: function( actual, expected, message ) {
                /*jshint eqeqeq:false */
-               QUnit.push( expected != actual, actual, expected, message );
+               this.push( expected != actual, actual, expected, message );
        },
 
        /**
@@ -1554,9 +1340,9 @@ assert = QUnit.assert = {
         * @function
         */
        propEqual: function( actual, expected, message ) {
-               actual = objectValues(actual);
-               expected = objectValues(expected);
-               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+               actual = objectValues( actual );
+               expected = objectValues( expected );
+               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
        /**
@@ -1564,9 +1350,9 @@ assert = QUnit.assert = {
         * @function
         */
        notPropEqual: function( actual, expected, message ) {
-               actual = objectValues(actual);
-               expected = objectValues(expected);
-               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+               actual = objectValues( actual );
+               expected = objectValues( expected );
+               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
        /**
@@ -1574,7 +1360,7 @@ assert = QUnit.assert = {
         * @function
         */
        deepEqual: function( actual, expected, message ) {
-               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
        /**
@@ -1582,7 +1368,7 @@ assert = QUnit.assert = {
         * @function
         */
        notDeepEqual: function( actual, expected, message ) {
-               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
        /**
@@ -1590,7 +1376,7 @@ assert = QUnit.assert = {
         * @function
         */
        strictEqual: function( actual, expected, message ) {
-               QUnit.push( expected === actual, actual, expected, message );
+               this.push( expected === actual, actual, expected, message );
        },
 
        /**
@@ -1598,90 +1384,73 @@ assert = QUnit.assert = {
         * @function
         */
        notStrictEqual: function( actual, expected, message ) {
-               QUnit.push( expected !== actual, actual, expected, message );
+               this.push( expected !== actual, actual, expected, message );
        },
 
        "throws": function( block, expected, message ) {
-               var actual,
+               var actual, expectedType,
                        expectedOutput = expected,
                        ok = false;
 
-               // 'expected' is optional
-               if ( !message && typeof expected === "string" ) {
+               // 'expected' is optional unless doing string comparison
+               if ( message == null && typeof expected === "string" ) {
                        message = expected;
                        expected = null;
                }
 
-               config.current.ignoreGlobalErrors = true;
+               this.test.ignoreGlobalErrors = true;
                try {
-                       block.call( config.current.testEnvironment );
+                       block.call( this.test.testEnvironment );
                } catch (e) {
                        actual = e;
                }
-               config.current.ignoreGlobalErrors = false;
+               this.test.ignoreGlobalErrors = false;
 
                if ( actual ) {
+                       expectedType = QUnit.objectType( expected );
 
                        // we don't want to validate thrown error
                        if ( !expected ) {
                                ok = true;
                                expectedOutput = null;
 
-                       // expected is an Error object
-                       } else if ( expected instanceof Error ) {
-                               ok = actual instanceof Error &&
-                                        actual.name === expected.name &&
-                                        actual.message === expected.message;
-
                        // expected is a regexp
-                       } else if ( QUnit.objectType( expected ) === "regexp" ) {
+                       } else if ( expectedType === "regexp" ) {
                                ok = expected.test( errorString( actual ) );
 
                        // expected is a string
-                       } else if ( QUnit.objectType( expected ) === "string" ) {
+                       } else if ( expectedType === "string" ) {
                                ok = expected === errorString( actual );
 
-                       // expected is a constructor
-                       } else if ( actual instanceof expected ) {
+                       // expected is a constructor, maybe an Error constructor
+                       } else if ( expectedType === "function" && actual instanceof expected ) {
                                ok = true;
 
-                       // expected is a validation function which returns true is validation passed
-                       } else if ( expected.call( {}, actual ) === true ) {
+                       // expected is an Error object
+                       } else if ( expectedType === "object" ) {
+                               ok = actual instanceof expected.constructor &&
+                                       actual.name === expected.name &&
+                                       actual.message === expected.message;
+
+                       // expected is a validation function which returns true if validation passed
+                       } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
                                expectedOutput = null;
                                ok = true;
                        }
 
-                       QUnit.push( ok, actual, expectedOutput, message );
+                       this.push( ok, actual, expectedOutput, message );
                } else {
-                       QUnit.pushFailure( message, null, "No exception was thrown." );
+                       this.test.pushFailure( message, null, "No exception was thrown." );
                }
        }
 };
 
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit.constructor.prototype, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.constructor.prototype.raises = function() {
-       QUnit.push( false, false, false, "QUnit.raises has been deprecated since 2012 (fad3c1ea), use QUnit.throws instead" );
-};
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.constructor.prototype.equals = function() {
-       QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.constructor.prototype.same = function() {
-       QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
+// Provide an alternative to assert.throws(), for enviroments that consider throws a reserved word
+// Known to us are: Closure Compiler, Narwhal
+(function() {
+       /*jshint sub:true */
+       Assert.prototype.raises = Assert.prototype[ "throws" ];
+}());
 
 // Test for equality any JavaScript type.
 // Author: Philippe Rathé <prathe@gmail.com>
@@ -1701,22 +1470,26 @@ QUnit.equiv = (function() {
 
        // the real equiv function
        var innerEquiv,
+
                // stack to decide between skip/abort functions
                callers = [],
+
                // stack to avoiding loops from circular referencing
                parents = [],
                parentsB = [],
 
-               getProto = Object.getPrototypeOf || function ( obj ) {
-                       /*jshint camelcase:false */
+               getProto = Object.getPrototypeOf || function( obj ) {
+                       /* jshint camelcase: false, proto: true */
                        return obj.__proto__;
                },
-               callbacks = (function () {
+               callbacks = (function() {
 
                        // for string, boolean, number and null
                        function useStrictEquality( b, a ) {
+
                                /*jshint eqeqeq:false */
                                if ( b instanceof a.constructor || a instanceof b.constructor ) {
+
                                        // to catch short annotation VS 'new' annotation of a
                                        // declaration
                                        // e.g. var i = 1;
@@ -1744,10 +1517,13 @@ QUnit.equiv = (function() {
 
                                "regexp": function( b, a ) {
                                        return QUnit.objectType( b ) === "regexp" &&
+
                                                // the regex itself
                                                a.source === b.source &&
+
                                                // and its modifiers
                                                a.global === b.global &&
+
                                                // (gmi) ...
                                                a.ignoreCase === b.ignoreCase &&
                                                a.multiline === b.multiline &&
@@ -1758,7 +1534,7 @@ QUnit.equiv = (function() {
                                // - abort otherwise,
                                // initial === would have catch identical references anyway
                                "function": function() {
-                                       var caller = callers[callers.length - 1];
+                                       var caller = callers[ callers.length - 1 ];
                                        return caller !== Object && typeof caller !== "undefined";
                                },
 
@@ -1782,10 +1558,10 @@ QUnit.equiv = (function() {
                                        for ( i = 0; i < len; i++ ) {
                                                loop = false;
                                                for ( j = 0; j < parents.length; j++ ) {
-                                                       aCircular = parents[j] === a[i];
-                                                       bCircular = parentsB[j] === b[i];
+                                                       aCircular = parents[ j ] === a[ i ];
+                                                       bCircular = parentsB[ j ] === b[ i ];
                                                        if ( aCircular || bCircular ) {
-                                                               if ( a[i] === b[i] || aCircular && bCircular ) {
+                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
                                                                        loop = true;
                                                                } else {
                                                                        parents.pop();
@@ -1794,7 +1570,7 @@ QUnit.equiv = (function() {
                                                                }
                                                        }
                                                }
-                                               if ( !loop && !innerEquiv(a[i], b[i]) ) {
+                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
                                                        parents.pop();
                                                        parentsB.pop();
                                                        return false;
@@ -1806,6 +1582,7 @@ QUnit.equiv = (function() {
                                },
 
                                "object": function( b, a ) {
+
                                        /*jshint forin:false */
                                        var i, j, loop, aCircular, bCircular,
                                                // Default to true
@@ -1816,11 +1593,12 @@ QUnit.equiv = (function() {
                                        // comparing constructors is more strict than using
                                        // instanceof
                                        if ( a.constructor !== b.constructor ) {
+
                                                // Allow objects with no prototype to be equivalent to
                                                // objects with Object as their constructor.
-                                               if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-                                                       ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-                                                               return false;
+                                               if ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) ||
+                                                       ( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) {
+                                                       return false;
                                                }
                                        }
 
@@ -1835,10 +1613,10 @@ QUnit.equiv = (function() {
                                        for ( i in a ) {
                                                loop = false;
                                                for ( j = 0; j < parents.length; j++ ) {
-                                                       aCircular = parents[j] === a[i];
-                                                       bCircular = parentsB[j] === b[i];
+                                                       aCircular = parents[ j ] === a[ i ];
+                                                       bCircular = parentsB[ j ] === b[ i ];
                                                        if ( aCircular || bCircular ) {
-                                                               if ( a[i] === b[i] || aCircular && bCircular ) {
+                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
                                                                        loop = true;
                                                                } else {
                                                                        eq = false;
@@ -1846,8 +1624,8 @@ QUnit.equiv = (function() {
                                                                }
                                                        }
                                                }
-                                               aProperties.push(i);
-                                               if ( !loop && !innerEquiv(a[i], b[i]) ) {
+                                               aProperties.push( i );
+                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
                                                        eq = false;
                                                        break;
                                                }
@@ -1873,35 +1651,30 @@ QUnit.equiv = (function() {
                        return true; // end transition
                }
 
-               return (function( a, b ) {
+               return ( (function( a, b ) {
                        if ( a === b ) {
                                return true; // catch the most you can
                        } else if ( a === null || b === null || typeof a === "undefined" ||
                                        typeof b === "undefined" ||
-                                       QUnit.objectType(a) !== QUnit.objectType(b) ) {
-                               return false; // don't lose time with error prone cases
-                       } else {
-                               return bindCallbacks(a, callbacks, [ b, a ]);
+                                       QUnit.objectType( a ) !== QUnit.objectType( b ) ) {
+
+                               // don't lose time with error prone cases
+                               return false;
+                       } else {
+                               return bindCallbacks( a, callbacks, [ b, a ] );
                        }
 
                        // apply transition with (1..n) arguments
-               }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
+               }( args[ 0 ], args[ 1 ] ) ) &&
+                       innerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) );
        };
 
        return innerEquiv;
 }());
 
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
+// Based on jsDump by Ariel Flesler
+// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
+QUnit.dump = (function() {
        function quote( str ) {
                return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
        }
@@ -1909,48 +1682,57 @@ QUnit.jsDump = (function() {
                return o + "";
        }
        function join( pre, arr, post ) {
-               var s = jsDump.separator(),
-                       base = jsDump.indent(),
-                       inner = jsDump.indent(1);
+               var s = dump.separator(),
+                       base = dump.indent(),
+                       inner = dump.indent( 1 );
                if ( arr.join ) {
                        arr = arr.join( "," + s + inner );
                }
                if ( !arr ) {
                        return pre + post;
                }
-               return [ pre, inner + arr, base + post ].join(s);
+               return [ pre, inner + arr, base + post ].join( s );
        }
        function array( arr, stack ) {
-               var i = arr.length, ret = new Array(i);
+               var i = arr.length,
+                       ret = new Array( i );
+
+               if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
+                       return "[object Array]";
+               }
+
                this.up();
                while ( i-- ) {
-                       ret[i] = this.parse( arr[i] , undefined , stack);
+                       ret[ i ] = this.parse( arr[ i ], undefined, stack );
                }
                this.down();
                return join( "[", ret, "]" );
        }
 
        var reName = /^function (\w+)/,
-               jsDump = {
-                       // type is used mostly internally, you can fix a (custom)type in advance
-                       parse: function( obj, type, stack ) {
-                               stack = stack || [ ];
-                               var inStack, res,
-                                       parser = this.parsers[ type || this.typeOf(obj) ];
+               dump = {
 
-                               type = typeof parser;
-                               inStack = inArray( obj, stack );
+                       // objType is used mostly internally, you can fix a (custom) type in advance
+                       parse: function( obj, objType, stack ) {
+                               stack = stack || [];
+                               var res, parser, parserType,
+                                       inStack = inArray( obj, stack );
 
                                if ( inStack !== -1 ) {
-                                       return "recursion(" + (inStack - stack.length) + ")";
+                                       return "recursion(" + ( inStack - stack.length ) + ")";
                                }
-                               if ( type === "function" )  {
+
+                               objType = objType || this.typeOf( obj  );
+                               parser = this.parsers[ objType ];
+                               parserType = typeof parser;
+
+                               if ( parserType === "function" ) {
                                        stack.push( obj );
                                        res = parser.call( this, obj, stack );
                                        stack.pop();
                                        return res;
                                }
-                               return ( type === "string" ) ? parser : this.parsers.error;
+                               return ( parserType === "string" ) ? parser : this.parsers.error;
                        },
                        typeOf: function( obj ) {
                                var type;
@@ -1958,23 +1740,29 @@ QUnit.jsDump = (function() {
                                        type = "null";
                                } else if ( typeof obj === "undefined" ) {
                                        type = "undefined";
-                               } else if ( QUnit.is( "regexp", obj) ) {
+                               } else if ( QUnit.is( "regexp", obj ) ) {
                                        type = "regexp";
-                               } else if ( QUnit.is( "date", obj) ) {
+                               } else if ( QUnit.is( "date", obj ) ) {
                                        type = "date";
-                               } else if ( QUnit.is( "function", obj) ) {
+                               } else if ( QUnit.is( "function", obj ) ) {
                                        type = "function";
-                               } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
+                               } else if ( obj.setInterval !== undefined &&
+                                               obj.document !== undefined &&
+                                               obj.nodeType === undefined ) {
                                        type = "window";
                                } else if ( obj.nodeType === 9 ) {
                                        type = "document";
                                } else if ( obj.nodeType ) {
                                        type = "node";
                                } else if (
+
                                        // native arrays
                                        toString.call( obj ) === "[object Array]" ||
+
                                        // NodeList objects
-                                       ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
+                                       ( typeof obj.length === "number" && obj.item !== undefined &&
+                                       ( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null &&
+                                       obj[ 0 ] === undefined ) ) )
                                ) {
                                        type = "array";
                                } else if ( obj.constructor === Error.prototype.constructor ) {
@@ -1985,7 +1773,7 @@ QUnit.jsDump = (function() {
                                return type;
                        },
                        separator: function() {
-                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
+                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
                        },
                        // extra can be a number, shortcut for increasing-calling-decreasing
                        indent: function( extra ) {
@@ -1994,9 +1782,9 @@ QUnit.jsDump = (function() {
                                }
                                var chr = this.indentChar;
                                if ( this.HTML ) {
-                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
+                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&#160;" );
                                }
-                               return new Array( this.depth + ( extra || 0 ) ).join(chr);
+                               return new Array( this.depth + ( extra || 0 ) ).join( chr );
                        },
                        up: function( a ) {
                                this.depth += a || 1;
@@ -2005,7 +1793,7 @@ QUnit.jsDump = (function() {
                                this.depth -= a || 1;
                        },
                        setParser: function( name, parser ) {
-                               this.parsers[name] = parser;
+                               this.parsers[ name ] = parser;
                        },
                        // The next 3 are exposed so you can use them
                        quote: quote,
@@ -2013,11 +1801,13 @@ QUnit.jsDump = (function() {
                        join: join,
                        //
                        depth: 1,
-                       // This is the list of parsers, to modify them, use jsDump.setParser
+                       maxDepth: 5,
+
+                       // This is the list of parsers, to modify them, use dump.setParser
                        parsers: {
                                window: "[Window]",
                                document: "[Document]",
-                               error: function(error) {
+                               error: function( error ) {
                                        return "Error(\"" + error.message + "\")";
                                },
                                unknown: "[Unknown]",
@@ -2025,52 +1815,71 @@ QUnit.jsDump = (function() {
                                "undefined": "undefined",
                                "function": function( fn ) {
                                        var ret = "function",
+
                                                // functions never have name in IE
-                                               name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
+                                               name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
 
                                        if ( name ) {
                                                ret += " " + name;
                                        }
                                        ret += "( ";
 
-                                       ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-                                       return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
+                                       ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
+                                       return join( ret, dump.parse( fn, "functionCode" ), "}" );
                                },
                                array: array,
                                nodelist: array,
                                "arguments": array,
                                object: function( map, stack ) {
-                                       /*jshint forin:false */
-                                       var ret = [ ], keys, key, val, i;
-                                       QUnit.jsDump.up();
+                                       var keys, key, val, i, nonEnumerableProperties,
+                                               ret = [];
+
+                                       if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
+                                               return "[object Object]";
+                                       }
+
+                                       dump.up();
                                        keys = [];
                                        for ( key in map ) {
                                                keys.push( key );
                                        }
+
+                                       // Some properties are not always enumerable on Error objects.
+                                       nonEnumerableProperties = [ "message", "name" ];
+                                       for ( i in nonEnumerableProperties ) {
+                                               key = nonEnumerableProperties[ i ];
+                                               if ( key in map && !( key in keys ) ) {
+                                                       keys.push( key );
+                                               }
+                                       }
                                        keys.sort();
                                        for ( i = 0; i < keys.length; i++ ) {
                                                key = keys[ i ];
                                                val = map[ key ];
-                                               ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
+                                               ret.push( dump.parse( key, "key" ) + ": " +
+                                                       dump.parse( val, undefined, stack ) );
                                        }
-                                       QUnit.jsDump.down();
+                                       dump.down();
                                        return join( "{", ret, "}" );
                                },
                                node: function( node ) {
                                        var len, i, val,
-                                               open = QUnit.jsDump.HTML ? "&lt;" : "<",
-                                               close = QUnit.jsDump.HTML ? "&gt;" : ">",
+                                               open = dump.HTML ? "&lt;" : "<",
+                                               close = dump.HTML ? "&gt;" : ">",
                                                tag = node.nodeName.toLowerCase(),
                                                ret = open + tag,
                                                attrs = node.attributes;
 
                                        if ( attrs ) {
                                                for ( i = 0, len = attrs.length; i < len; i++ ) {
-                                                       val = attrs[i].nodeValue;
-                                                       // IE6 includes all attributes in .attributes, even ones not explicitly set.
-                                                       // Those have values like undefined, null, 0, false, "" or "inherit".
+                                                       val = attrs[ i ].nodeValue;
+
+                                                       // IE6 includes all attributes in .attributes, even ones not explicitly
+                                                       // set. Those have values like undefined, null, 0, false, "" or
+                                                       // "inherit".
                                                        if ( val && val !== "inherit" ) {
-                                                               ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
+                                                               ret += " " + attrs[ i ].nodeName + "=" +
+                                                                       dump.parse( val, "attribute" );
                                                        }
                                                }
                                        }
@@ -2083,6 +1892,7 @@ QUnit.jsDump = (function() {
 
                                        return ret + open + "/" + tag + close;
                                },
+
                                // function calls it internally, it's the arguments part of the function
                                functionArgs: function( fn ) {
                                        var args,
@@ -2092,10 +1902,11 @@ QUnit.jsDump = (function() {
                                                return "";
                                        }
 
-                                       args = new Array(l);
+                                       args = new Array( l );
                                        while ( l-- ) {
+
                                                // 97 is 'a'
-                                               args[l] = String.fromCharCode(97+l);
+                                               args[ l ] = String.fromCharCode( 97 + l );
                                        }
                                        return " " + args.join( ", " ) + " ";
                                },
@@ -2119,9 +1930,79 @@ QUnit.jsDump = (function() {
                        multiline: true
                };
 
-       return jsDump;
+       return dump;
 }());
 
+// back compat
+QUnit.jsDump = QUnit.dump;
+
+// For browser, export only select globals
+if ( typeof window !== "undefined" ) {
+
+       // Deprecated
+       // Extend assert methods to QUnit and Global scope through Backwards compatibility
+       (function() {
+               var i,
+                       assertions = Assert.prototype;
+
+               function applyCurrent( current ) {
+                       return function() {
+                               var assert = new Assert( QUnit.config.current );
+                               current.apply( assert, arguments );
+                       };
+               }
+
+               for ( i in assertions ) {
+                       QUnit[ i ] = applyCurrent( assertions[ i ] );
+               }
+       })();
+
+       (function() {
+               var i, l,
+                       keys = [
+                               "test",
+                               "module",
+                               "expect",
+                               "asyncTest",
+                               "start",
+                               "stop",
+                               "ok",
+                               "equal",
+                               "notEqual",
+                               "propEqual",
+                               "notPropEqual",
+                               "deepEqual",
+                               "notDeepEqual",
+                               "strictEqual",
+                               "notStrictEqual",
+                               "throws"
+                       ];
+
+               for ( i = 0, l = keys.length; i < l; i++ ) {
+                       window[ keys[ i ] ] = QUnit[ keys[ i ] ];
+               }
+       })();
+
+       window.QUnit = QUnit;
+}
+
+// For nodejs
+if ( typeof module !== "undefined" && module.exports ) {
+       module.exports = QUnit;
+}
+
+// For CommonJS with exports, but without module.exports, like Rhino
+if ( typeof exports !== "undefined" ) {
+       exports.QUnit = QUnit;
+}
+
+// Get a reference to the global object, like window in browsers
+}( (function() {
+       return this;
+})() ));
+
+/*istanbul ignore next */
+// jscs:disable maximumLineLength
 /*
  * Javascript Diff Algorithm
  *  By John Resig (http://ejohn.org/)
@@ -2137,6 +2018,8 @@ QUnit.jsDump = (function() {
  * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
  */
 QUnit.diff = (function() {
+       var hasOwn = Object.prototype.hasOwnProperty;
+
        /*jshint eqeqeq:false, eqnull:true */
        function diff( o, n ) {
                var i,
@@ -2144,65 +2027,65 @@ QUnit.diff = (function() {
                        os = {};
 
                for ( i = 0; i < n.length; i++ ) {
-                       if ( !hasOwn.call( ns, n[i] ) ) {
-                               ns[ n[i] ] = {
+                       if ( !hasOwn.call( ns, n[ i ] ) ) {
+                               ns[ n[ i ] ] = {
                                        rows: [],
                                        o: null
                                };
                        }
-                       ns[ n[i] ].rows.push( i );
+                       ns[ n[ i ] ].rows.push( i );
                }
 
                for ( i = 0; i < o.length; i++ ) {
-                       if ( !hasOwn.call( os, o[i] ) ) {
-                               os[ o[i] ] = {
+                       if ( !hasOwn.call( os, o[ i ] ) ) {
+                               os[ o[ i ] ] = {
                                        rows: [],
                                        n: null
                                };
                        }
-                       os[ o[i] ].rows.push( i );
+                       os[ o[ i ] ].rows.push( i );
                }
 
                for ( i in ns ) {
                        if ( hasOwn.call( ns, i ) ) {
-                               if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-                                       n[ ns[i].rows[0] ] = {
-                                               text: n[ ns[i].rows[0] ],
-                                               row: os[i].rows[0]
+                               if ( ns[ i ].rows.length === 1 && hasOwn.call( os, i ) && os[ i ].rows.length === 1 ) {
+                                       n[ ns[ i ].rows[ 0 ] ] = {
+                                               text: n[ ns[ i ].rows[ 0 ] ],
+                                               row: os[ i ].rows[ 0 ]
                                        };
-                                       o[ os[i].rows[0] ] = {
-                                               text: o[ os[i].rows[0] ],
-                                               row: ns[i].rows[0]
+                                       o[ os[ i ].rows[ 0 ] ] = {
+                                               text: o[ os[ i ].rows[ 0 ] ],
+                                               row: ns[ i ].rows[ 0 ]
                                        };
                                }
                        }
                }
 
                for ( i = 0; i < n.length - 1; i++ ) {
-                       if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-                                               n[ i + 1 ] == o[ n[i].row + 1 ] ) {
+                       if ( n[ i ].text != null && n[ i + 1 ].text == null && n[ i ].row + 1 < o.length && o[ n[ i ].row + 1 ].text == null &&
+                               n[ i + 1 ] == o[ n[ i ].row + 1 ] ) {
 
                                n[ i + 1 ] = {
                                        text: n[ i + 1 ],
-                                       row: n[i].row + 1
+                                       row: n[ i ].row + 1
                                };
-                               o[ n[i].row + 1 ] = {
-                                       text: o[ n[i].row + 1 ],
+                               o[ n[ i ].row + 1 ] = {
+                                       text: o[ n[ i ].row + 1 ],
                                        row: i + 1
                                };
                        }
                }
 
                for ( i = n.length - 1; i > 0; i-- ) {
-                       if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-                                               n[ i - 1 ] == o[ n[i].row - 1 ]) {
+                       if ( n[ i ].text != null && n[ i - 1 ].text == null && n[ i ].row > 0 && o[ n[ i ].row - 1 ].text == null &&
+                               n[ i - 1 ] == o[ n[ i ].row - 1 ] ) {
 
                                n[ i - 1 ] = {
                                        text: n[ i - 1 ],
-                                       row: n[i].row - 1
+                                       row: n[ i ].row - 1
                                };
-                               o[ n[i].row - 1 ] = {
-                                       text: o[ n[i].row - 1 ],
+                               o[ n[ i ].row - 1 ] = {
+                                       text: o[ n[ i ].row - 1 ],
                                        row: i - 1
                                };
                        }
@@ -2220,48 +2103,45 @@ QUnit.diff = (function() {
 
                var i, pre,
                        str = "",
-                       out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-                       oSpace = o.match(/\s+/g),
-                       nSpace = n.match(/\s+/g);
+                       out = diff( o === "" ? [] : o.split( /\s+/ ), n === "" ? [] : n.split( /\s+/ ) ),
+                       oSpace = o.match( /\s+/g ),
+                       nSpace = n.match( /\s+/g );
 
                if ( oSpace == null ) {
                        oSpace = [ " " ];
-               }
-               else {
+               } else {
                        oSpace.push( " " );
                }
 
                if ( nSpace == null ) {
                        nSpace = [ " " ];
-               }
-               else {
+               } else {
                        nSpace.push( " " );
                }
 
                if ( out.n.length === 0 ) {
                        for ( i = 0; i < out.o.length; i++ ) {
-                               str += "<del>" + out.o[i] + oSpace[i] + "</del>";
+                               str += "<del>" + out.o[ i ] + oSpace[ i ] + "</del>";
                        }
-               }
-               else {
-                       if ( out.n[0].text == null ) {
-                               for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-                                       str += "<del>" + out.o[n] + oSpace[n] + "</del>";
+               } else {
+                       if ( out.n[ 0 ].text == null ) {
+                               for ( n = 0; n < out.o.length && out.o[ n ].text == null; n++ ) {
+                                       str += "<del>" + out.o[ n ] + oSpace[ n ] + "</del>";
                                }
                        }
 
                        for ( i = 0; i < out.n.length; i++ ) {
-                               if (out.n[i].text == null) {
-                                       str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-                               }
-                               else {
+                               if ( out.n[ i ].text == null ) {
+                                       str += "<ins>" + out.n[ i ] + nSpace[ i ] + "</ins>";
+                               } else {
+
                                        // `pre` initialized at top of scope
                                        pre = "";
 
-                                       for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-                                               pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
+                                       for ( n = out.n[ i ].row + 1; n < out.o.length && out.o[ n ].text == null; n++ ) {
+                                               pre += "<del>" + out.o[ n ] + oSpace[ n ] + "</del>";
                                        }
-                                       str += " " + out.n[i].text + nSpace[i] + pre;
+                                       str += " " + out.n[ i ].text + nSpace[ i ] + pre;
                                }
                        }
                }
@@ -2269,20 +2149,671 @@ QUnit.diff = (function() {
                return str;
        };
 }());
+// jscs:enable
 
-// For browser, export only select globals
-if ( typeof window !== "undefined" ) {
-       extend( window, QUnit.constructor.prototype );
-       window.QUnit = QUnit;
+(function() {
+
+// Deprecated QUnit.init - Ref #530
+// Re-initialize the configuration options
+QUnit.init = function() {
+       var tests, banner, result, qunit,
+               config = QUnit.config;
+
+       config.stats = { all: 0, bad: 0 };
+       config.moduleStats = { all: 0, bad: 0 };
+       config.started = 0;
+       config.updateRate = 1000;
+       config.blocking = false;
+       config.autostart = true;
+       config.autorun = false;
+       config.filter = "";
+       config.queue = [];
+
+       // Return on non-browser environments
+       // This is necessary to not break on node tests
+       if ( typeof window === "undefined" ) {
+               return;
+       }
+
+       qunit = id( "qunit" );
+       if ( qunit ) {
+               qunit.innerHTML =
+                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
+                       "<h2 id='qunit-banner'></h2>" +
+                       "<div id='qunit-testrunner-toolbar'></div>" +
+                       "<h2 id='qunit-userAgent'></h2>" +
+                       "<ol id='qunit-tests'></ol>";
+       }
+
+       tests = id( "qunit-tests" );
+       banner = id( "qunit-banner" );
+       result = id( "qunit-testresult" );
+
+       if ( tests ) {
+               tests.innerHTML = "";
+       }
+
+       if ( banner ) {
+               banner.className = "";
+       }
+
+       if ( result ) {
+               result.parentNode.removeChild( result );
+       }
+
+       if ( tests ) {
+               result = document.createElement( "p" );
+               result.id = "qunit-testresult";
+               result.className = "result";
+               tests.parentNode.insertBefore( result, tests );
+               result.innerHTML = "Running...<br />&#160;";
+       }
+};
+
+// Don't load the HTML Reporter on non-Browser environments
+if ( typeof window === "undefined" ) {
+       return;
 }
 
-// For CommonJS environments, export everything
-if ( typeof module !== "undefined" && module.exports ) {
-       module.exports = QUnit;
+var config = QUnit.config,
+       hasOwn = Object.prototype.hasOwnProperty,
+       defined = {
+               document: window.document !== undefined,
+               sessionStorage: (function() {
+                       var x = "qunit-test-string";
+                       try {
+                               sessionStorage.setItem( x, x );
+                               sessionStorage.removeItem( x );
+                               return true;
+                       } catch ( e ) {
+                               return false;
+                       }
+               }())
+       },
+       modulesList = [];
+
+/**
+* Escape text for attribute or text content.
+*/
+function escapeText( s ) {
+       if ( !s ) {
+               return "";
+       }
+       s = s + "";
+
+       // Both single quotes and double quotes (for attributes)
+       return s.replace( /['"<>&]/g, function( s ) {
+               switch ( s ) {
+               case "'":
+                       return "&#039;";
+               case "\"":
+                       return "&quot;";
+               case "<":
+                       return "&lt;";
+               case ">":
+                       return "&gt;";
+               case "&":
+                       return "&amp;";
+               }
+       });
 }
 
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvent( elem, type, fn ) {
+       if ( elem.addEventListener ) {
 
-// Get a reference to the global object, like window in browsers
-}( (function() {
-       return this;
-})() ));
+               // Standards-based browsers
+               elem.addEventListener( type, fn, false );
+       } else if ( elem.attachEvent ) {
+
+               // support: IE <9
+               elem.attachEvent( "on" + type, fn );
+       }
+}
+
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+       var i = elems.length;
+       while ( i-- ) {
+               addEvent( elems[ i ], type, fn );
+       }
+}
+
+function hasClass( elem, name ) {
+       return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
+}
+
+function addClass( elem, name ) {
+       if ( !hasClass( elem, name ) ) {
+               elem.className += ( elem.className ? " " : "" ) + name;
+       }
+}
+
+function toggleClass( elem, name ) {
+       if ( hasClass( elem, name ) ) {
+               removeClass( elem, name );
+       } else {
+               addClass( elem, name );
+       }
+}
+
+function removeClass( elem, name ) {
+       var set = " " + elem.className + " ";
+
+       // Class name may appear multiple times
+       while ( set.indexOf( " " + name + " " ) >= 0 ) {
+               set = set.replace( " " + name + " ", " " );
+       }
+
+       // trim for prettiness
+       elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
+}
+
+function id( name ) {
+       return defined.document && document.getElementById && document.getElementById( name );
+}
+
+function getUrlConfigHtml() {
+       var i, j, val,
+               escaped, escapedTooltip,
+               selection = false,
+               len = config.urlConfig.length,
+               urlConfigHtml = "";
+
+       for ( i = 0; i < len; i++ ) {
+               val = config.urlConfig[ i ];
+               if ( typeof val === "string" ) {
+                       val = {
+                               id: val,
+                               label: val
+                       };
+               }
+
+               escaped = escapeText( val.id );
+               escapedTooltip = escapeText( val.tooltip );
+
+               config[ val.id ] = QUnit.urlParams[ val.id ];
+               if ( !val.value || typeof val.value === "string" ) {
+                       urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
+                               "' name='" + escaped + "' type='checkbox'" +
+                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
+                               ( config[ val.id ] ? " checked='checked'" : "" ) +
+                               " title='" + escapedTooltip + "' /><label for='qunit-urlconfig-" + escaped +
+                               "' title='" + escapedTooltip + "'>" + val.label + "</label>";
+               } else {
+                       urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
+                               "' title='" + escapedTooltip + "'>" + val.label +
+                               ": </label><select id='qunit-urlconfig-" + escaped +
+                               "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
+
+                       if ( QUnit.is( "array", val.value ) ) {
+                               for ( j = 0; j < val.value.length; j++ ) {
+                                       escaped = escapeText( val.value[ j ] );
+                                       urlConfigHtml += "<option value='" + escaped + "'" +
+                                               ( config[ val.id ] === val.value[ j ] ?
+                                                       ( selection = true ) && " selected='selected'" : "" ) +
+                                               ">" + escaped + "</option>";
+                               }
+                       } else {
+                               for ( j in val.value ) {
+                                       if ( hasOwn.call( val.value, j ) ) {
+                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
+                                                       ( config[ val.id ] === j ?
+                                                               ( selection = true ) && " selected='selected'" : "" ) +
+                                                       ">" + escapeText( val.value[ j ] ) + "</option>";
+                                       }
+                               }
+                       }
+                       if ( config[ val.id ] && !selection ) {
+                               escaped = escapeText( config[ val.id ] );
+                               urlConfigHtml += "<option value='" + escaped +
+                                       "' selected='selected' disabled='disabled'>" + escaped + "</option>";
+                       }
+                       urlConfigHtml += "</select>";
+               }
+       }
+
+       return urlConfigHtml;
+}
+
+// Handle "click" events on toolbar checkboxes and "change" for select menus.
+// Updates the URL with the new state of `config.urlConfig` values.
+function toolbarChanged() {
+       var updatedUrl, value,
+               field = this,
+               params = {};
+
+       // Detect if field is a select menu or a checkbox
+       if ( "selectedIndex" in field ) {
+               value = field.options[ field.selectedIndex ].value || undefined;
+       } else {
+               value = field.checked ? ( field.defaultValue || true ) : undefined;
+       }
+
+       params[ field.name ] = value;
+       updatedUrl = QUnit.url( params );
+
+       if ( "hidepassed" === field.name && "replaceState" in window.history ) {
+               config[ field.name ] = value || false;
+               if ( value ) {
+                       addClass( id( "qunit-tests" ), "hidepass" );
+               } else {
+                       removeClass( id( "qunit-tests" ), "hidepass" );
+               }
+
+               // It is not necessary to refresh the whole page
+               window.history.replaceState( null, "", updatedUrl );
+       } else {
+               window.location = updatedUrl;
+       }
+}
+
+function toolbarUrlConfigContainer() {
+       var urlConfigContainer = document.createElement( "span" );
+
+       urlConfigContainer.innerHTML = getUrlConfigHtml();
+
+       // For oldIE support:
+       // * Add handlers to the individual elements instead of the container
+       // * Use "click" instead of "change" for checkboxes
+       addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
+       addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+
+       return urlConfigContainer;
+}
+
+function toolbarModuleFilterHtml() {
+       var i,
+               moduleFilterHtml = "";
+
+       if ( !modulesList.length ) {
+               return false;
+       }
+
+       modulesList.sort(function( a, b ) {
+               return a.localeCompare( b );
+       });
+
+       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
+               "<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
+               ( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
+               ">< All Modules ></option>";
+
+       for ( i = 0; i < modulesList.length; i++ ) {
+               moduleFilterHtml += "<option value='" +
+                       escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
+                       ( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
+                       ">" + escapeText( modulesList[ i ] ) + "</option>";
+       }
+       moduleFilterHtml += "</select>";
+
+       return moduleFilterHtml;
+}
+
+function toolbarModuleFilter() {
+       var toolbar = id( "qunit-testrunner-toolbar" ),
+               moduleFilter = document.createElement( "span" ),
+               moduleFilterHtml = toolbarModuleFilterHtml();
+
+       if ( !moduleFilterHtml ) {
+               return false;
+       }
+
+       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+       moduleFilter.innerHTML = moduleFilterHtml;
+
+       addEvent( moduleFilter.lastChild, "change", function() {
+               var selectBox = moduleFilter.getElementsByTagName( "select" )[ 0 ],
+                       selection = decodeURIComponent( selectBox.options[ selectBox.selectedIndex ].value );
+
+               window.location = QUnit.url({
+                       module: ( selection === "" ) ? undefined : selection,
+
+                       // Remove any existing filters
+                       filter: undefined,
+                       testId: undefined
+               });
+       });
+
+       toolbar.appendChild( moduleFilter );
+}
+
+function appendToolbar() {
+       var toolbar = id( "qunit-testrunner-toolbar" );
+
+       if ( toolbar ) {
+               toolbar.appendChild( toolbarUrlConfigContainer() );
+       }
+}
+
+function appendBanner() {
+       var banner = id( "qunit-banner" );
+
+       if ( banner ) {
+               banner.className = "";
+               banner.innerHTML = "<a href='" +
+                       QUnit.url({ filter: undefined, module: undefined, testId: undefined }) +
+                       "'>" + banner.innerHTML + "</a> ";
+       }
+}
+
+function appendTestResults() {
+       var tests = id( "qunit-tests" ),
+               result = id( "qunit-testresult" );
+
+       if ( result ) {
+               result.parentNode.removeChild( result );
+       }
+
+       if ( tests ) {
+               tests.innerHTML = "";
+               result = document.createElement( "p" );
+               result.id = "qunit-testresult";
+               result.className = "result";
+               tests.parentNode.insertBefore( result, tests );
+               result.innerHTML = "Running...<br />&#160;";
+       }
+}
+
+function storeFixture() {
+       var fixture = id( "qunit-fixture" );
+       if ( fixture ) {
+               config.fixture = fixture.innerHTML;
+       }
+}
+
+function appendUserAgent() {
+       var userAgent = id( "qunit-userAgent" );
+       if ( userAgent ) {
+               userAgent.innerHTML = navigator.userAgent;
+       }
+}
+
+function appendTestsList( modules ) {
+       var i, l, x, z, test, moduleObj;
+
+       for ( i = 0, l = modules.length; i < l; i++ ) {
+               moduleObj = modules[ i ];
+
+               if ( moduleObj.name ) {
+                       modulesList.push( moduleObj.name );
+               }
+
+               for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
+                       test = moduleObj.tests[ x ];
+
+                       appendTest( test.name, test.testId, moduleObj.name );
+               }
+       }
+}
+
+function appendTest( name, testId, moduleName ) {
+       var title, rerunTrigger, testBlock, assertList,
+               tests = id( "qunit-tests" );
+
+       if ( !tests ) {
+               return;
+       }
+
+       title = document.createElement( "strong" );
+       title.innerHTML = getNameHtml( name, moduleName );
+
+       rerunTrigger = document.createElement( "a" );
+       rerunTrigger.innerHTML = "Rerun";
+       rerunTrigger.href = QUnit.url({ testId: testId });
+
+       testBlock = document.createElement( "li" );
+       testBlock.appendChild( title );
+       testBlock.appendChild( rerunTrigger );
+       testBlock.id = "qunit-test-output-" + testId;
+
+       assertList = document.createElement( "ol" );
+       assertList.className = "qunit-assert-list";
+
+       testBlock.appendChild( assertList );
+
+       tests.appendChild( testBlock );
+}
+
+// HTML Reporter initialization and load
+QUnit.begin(function( details ) {
+       var qunit = id( "qunit" );
+
+       // Fixture is the only one necessary to run without the #qunit element
+       storeFixture();
+
+       if ( !qunit ) {
+               return;
+       }
+
+       qunit.innerHTML =
+               "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
+               "<h2 id='qunit-banner'></h2>" +
+               "<div id='qunit-testrunner-toolbar'></div>" +
+               "<h2 id='qunit-userAgent'></h2>" +
+               "<ol id='qunit-tests'></ol>";
+
+       appendBanner();
+       appendTestResults();
+       appendUserAgent();
+       appendToolbar();
+       appendTestsList( details.modules );
+       toolbarModuleFilter();
+
+       if ( config.hidepassed ) {
+               addClass( qunit.lastChild, "hidepass" );
+       }
+});
+
+QUnit.done(function( details ) {
+       var i, key,
+               banner = id( "qunit-banner" ),
+               tests = id( "qunit-tests" ),
+               html = [
+                       "Tests completed in ",
+                       details.runtime,
+                       " milliseconds.<br />",
+                       "<span class='passed'>",
+                       details.passed,
+                       "</span> assertions of <span class='total'>",
+                       details.total,
+                       "</span> passed, <span class='failed'>",
+                       details.failed,
+                       "</span> failed."
+               ].join( "" );
+
+       if ( banner ) {
+               banner.className = details.failed ? "qunit-fail" : "qunit-pass";
+       }
+
+       if ( tests ) {
+               id( "qunit-testresult" ).innerHTML = html;
+       }
+
+       if ( config.altertitle && defined.document && document.title ) {
+
+               // show ✖ for good, ✔ for bad suite result in title
+               // use escape sequences in case file gets loaded with non-utf-8-charset
+               document.title = [
+                       ( details.failed ? "\u2716" : "\u2714" ),
+                       document.title.replace( /^[\u2714\u2716] /i, "" )
+               ].join( " " );
+       }
+
+       // clear own sessionStorage items if all tests passed
+       if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
+               for ( i = 0; i < sessionStorage.length; i++ ) {
+                       key = sessionStorage.key( i++ );
+                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
+                               sessionStorage.removeItem( key );
+                       }
+               }
+       }
+
+       // scroll back to top to show results
+       if ( config.scrolltop && window.scrollTo ) {
+               window.scrollTo( 0, 0 );
+       }
+});
+
+function getNameHtml( name, module ) {
+       var nameHtml = "";
+
+       if ( module ) {
+               nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
+       }
+
+       nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
+
+       return nameHtml;
+}
+
+QUnit.testStart(function( details ) {
+       var running, testBlock;
+
+       testBlock = id( "qunit-test-output-" + details.testId );
+       if ( testBlock ) {
+               testBlock.className = "running";
+       } else {
+
+               // Report later registered tests
+               appendTest( details.name, details.testId, details.module );
+       }
+
+       running = id( "qunit-testresult" );
+       if ( running ) {
+               running.innerHTML = "Running: <br />" + getNameHtml( details.name, details.module );
+       }
+
+});
+
+QUnit.log(function( details ) {
+       var assertList, assertLi,
+               message, expected, actual,
+               testItem = id( "qunit-test-output-" + details.testId );
+
+       if ( !testItem ) {
+               return;
+       }
+
+       message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
+       message = "<span class='test-message'>" + message + "</span>";
+       message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
+
+       // pushFailure doesn't provide details.expected
+       // when it calls, it's implicit to also not show expected and diff stuff
+       // Also, we need to check details.expected existence, as it can exist and be undefined
+       if ( !details.result && hasOwn.call( details, "expected" ) ) {
+               expected = escapeText( QUnit.dump.parse( details.expected ) );
+               actual = escapeText( QUnit.dump.parse( details.actual ) );
+               message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
+                       expected +
+                       "</pre></td></tr>";
+
+               if ( actual !== expected ) {
+                       message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
+                               actual + "</pre></td></tr>" +
+                               "<tr class='test-diff'><th>Diff: </th><td><pre>" +
+                               QUnit.diff( expected, actual ) + "</pre></td></tr>";
+               }
+
+               if ( details.source ) {
+                       message += "<tr class='test-source'><th>Source: </th><td><pre>" +
+                               escapeText( details.source ) + "</pre></td></tr>";
+               }
+
+               message += "</table>";
+
+       // this occours when pushFailure is set and we have an extracted stack trace
+       } else if ( !details.result && details.source ) {
+               message += "<table>" +
+                       "<tr class='test-source'><th>Source: </th><td><pre>" +
+                       escapeText( details.source ) + "</pre></td></tr>" +
+                       "</table>";
+       }
+
+       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+
+       assertLi = document.createElement( "li" );
+       assertLi.className = details.result ? "pass" : "fail";
+       assertLi.innerHTML = message;
+       assertList.appendChild( assertLi );
+});
+
+QUnit.testDone(function( details ) {
+       var testTitle, time, testItem, assertList,
+               good, bad, testCounts, skipped,
+               tests = id( "qunit-tests" );
+
+       if ( !tests ) {
+               return;
+       }
+
+       testItem = id( "qunit-test-output-" + details.testId );
+
+       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+
+       good = details.passed;
+       bad = details.failed;
+
+       // store result when possible
+       if ( config.reorder && defined.sessionStorage ) {
+               if ( bad ) {
+                       sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
+               } else {
+                       sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
+               }
+       }
+
+       if ( bad === 0 ) {
+               addClass( assertList, "qunit-collapsed" );
+       }
+
+       // testItem.firstChild is the test name
+       testTitle = testItem.firstChild;
+
+       testCounts = bad ?
+               "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
+               "";
+
+       testTitle.innerHTML += " <b class='counts'>(" + testCounts +
+               details.assertions.length + ")</b>";
+
+       if ( details.skipped ) {
+               addClass( testItem, "skipped" );
+               skipped = document.createElement( "em" );
+               skipped.className = "qunit-skipped-label";
+               skipped.innerHTML = "skipped";
+               testItem.insertBefore( skipped, testTitle );
+       } else {
+               addEvent( testTitle, "click", function() {
+                       toggleClass( assertList, "qunit-collapsed" );
+               });
+
+               testItem.className = bad ? "fail" : "pass";
+
+               time = document.createElement( "span" );
+               time.className = "runtime";
+               time.innerHTML = details.runtime + " ms";
+               testItem.insertBefore( time, assertList );
+       }
+});
+
+if ( !defined.document || document.readyState === "complete" ) {
+       config.pageLoaded = true;
+       config.autorun = true;
+}
+
+if ( defined.document ) {
+       addEvent( window, "load", QUnit.load );
+}
+
+})();
index 1b8c520..2fb7adf 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('af', {
@@ -26,6 +26,7 @@
         },
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -54,6 +55,7 @@
             y : '\'n jaar',
             yy : '%d jaar'
         },
+        ordinalParse: /\d{1,2}(ste|de)/,
         ordinal : function (number) {
             return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
         },
index 5b2095a..7add172 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('ar-ma', {
@@ -20,6 +20,7 @@
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
index f7867ea..ea7e2f6 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -43,6 +43,7 @@
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -79,7 +80,7 @@
             yy : '%d سنوات'
         },
         preparse: function (string) {
-            return string.replace(/[۰-۹]/g, function (match) {
+            return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                 return numberMap[match];
             }).replace(/،/g, ',');
         },
index 1791a6b..d645008 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -76,6 +76,7 @@
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
             yy : pluralize('y')
         },
         preparse: function (string) {
-            return string.replace(/[۰-۹]/g, function (match) {
+            return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                 return numberMap[match];
             }).replace(/،/g, ',');
         },
index e82f6e1..d4d1434 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var suffixes = {
@@ -44,6 +44,7 @@
         weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -83,6 +84,7 @@
                 return 'axşam';
             }
         },
+        ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
         ordinal : function (number) {
             if (number === 0) {  // special case for zero
                 return number + '-ıncı';
index fe3186a..68a6f37 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function plural(word, num) {
@@ -71,6 +71,7 @@
         weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY г.',
             LLL : 'D MMMM YYYY г., LT',
             }
         },
 
+        ordinalParse: /\d{1,2}-(і|ы|га)/,
         ordinal: function (number, period) {
             switch (period) {
             case 'M':
index 41b1e3a..540e17b 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('bg', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'D.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -59,6 +60,7 @@
             y : 'година',
             yy : '%d години'
         },
+        ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
         ordinal : function (number) {
             var lastDigit = number % 10,
                 last2Digits = number % 100;
index 7e8ccfd..e9549d9 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -44,6 +44,7 @@
         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',
index 0d44e47..cece8d1 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -44,6 +44,7 @@
         weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
         longDateFormat : {
             LT : 'A h:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY, LT',
index a4f1491..1f8dd61 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function relativeTimeWithMutation(number, withoutSuffix, key) {
@@ -67,6 +67,7 @@
         weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
         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',
@@ -95,6 +96,7 @@
             y : 'ur bloaz',
             yy : specialMutationForYears
         },
+        ordinalParse: /\d{1,2}(añ|vet)/,
         ordinal : function (number) {
             var output = (number === 1) ? 'añ' : 'vet';
             return number + output;
index b9a5851..c59f46b 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function translate(number, withoutSuffix, key) {
     }
 
     return moment.defineLocale('bs', {
-        months : 'januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar'.split('_'),
-        monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+        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('_'),
         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('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD. MM. YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY LT',
             y      : 'godinu',
             yy     : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index fd41ff5..4f0d3fe 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('ca', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
             y : 'un any',
             yy : '%d anys'
         },
-        ordinal : '%dº',
+        ordinalParse: /\d{1,2}(r|n|t|è|a)/,
+        ordinal : function (number, period) {
+            var output = (number === 1) ? 'r' :
+                (number === 2) ? 'n' :
+                (number === 3) ? 'r' :
+                (number === 4) ? 't' : 'è';
+            if (period === 'w' || period === 'W') {
+                output = 'a';
+            }
+            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.
index 87dec55..b61658d 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
@@ -87,7 +87,8 @@
         weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
         longDateFormat : {
             LT: 'H:mm',
-            L : 'DD. MM. YYYY',
+            LTS : 'LT:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY LT',
             LLLL : 'dddd D. MMMM YYYY LT'
             y : translate,
             yy : translate
         },
+        ordinalParse : /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 138b6c1..ea8e314 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('cv', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'вр_тн_ыт_юн_кç_эр_шм'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD-MM-YYYY',
             LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]',
             LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT',
@@ -50,6 +51,7 @@
             y : 'пĕр çул',
             yy : '%d çул'
         },
+        ordinalParse: /\d{1,2}-мĕш/,
         ordinal : '%d-мĕш',
         week : {
             dow : 1, // Monday is the first day of the week.
index 65fb356..72b2f91 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('cy', {
@@ -20,6 +20,7 @@
         // time formats are the same as en-gb
         longDateFormat: {
             LT: 'HH:mm',
+            LTS : 'LT:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
             LLL: 'D MMMM YYYY LT',
@@ -48,6 +49,7 @@
             y: 'blwyddyn',
             yy: '%d flynedd'
         },
+        ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
         // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
         ordinal: function (number) {
             var b = number,
index 5e9ef96..686ce00 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('da', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'et år',
             yy : '%d år'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index ff715f8..c982638 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
         weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
         longDateFormat : {
-            LT: 'HH:mm [Uhr]',
+            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'
         },
         calendar : {
-            sameDay: '[Heute um] LT',
+            sameDay: '[Heute um] LT [Uhr]',
             sameElse: 'L',
-            nextDay: '[Morgen um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gestern um] LT',
-            lastWeek: '[letzten] dddd [um] LT'
+            nextDay: '[Morgen um] LT [Uhr]',
+            nextWeek: 'dddd [um] LT [Uhr]',
+            lastDay: '[Gestern um] LT [Uhr]',
+            lastWeek: '[letzten] dddd [um] LT [Uhr]'
         },
         relativeTime : {
             future : 'in %s',
@@ -63,6 +64,7 @@
             y : processRelativeTime,
             yy : processRelativeTime
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 11ab9ac..f6d89a9 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
         weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
         longDateFormat : {
-            LT: 'HH:mm [Uhr]',
+            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'
         },
         calendar : {
-            sameDay: '[Heute um] LT',
+            sameDay: '[Heute um] LT [Uhr]',
             sameElse: 'L',
-            nextDay: '[Morgen um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gestern um] LT',
-            lastWeek: '[letzten] dddd [um] LT'
+            nextDay: '[Morgen um] LT [Uhr]',
+            nextWeek: 'dddd [um] LT [Uhr]',
+            lastDay: '[Gestern um] LT [Uhr]',
+            lastWeek: '[letzten] dddd [um] LT [Uhr]'
         },
         relativeTime : {
             future : 'in %s',
@@ -62,6 +63,7 @@
             y : processRelativeTime,
             yy : processRelativeTime
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index eb8eb1a..6dc769e 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('el', {
@@ -38,6 +38,7 @@
         meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
         longDateFormat : {
             LT : 'h:mm A',
+            LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -71,7 +72,7 @@
         relativeTime : {
             future : 'σε %s',
             past : '%s πριν',
-            s : 'δευτερόλεπτα',
+            s : 'λίγα Î´ÎµÏ\85Ï\84εÏ\81Ï\8cλεÏ\80Ï\84α',
             m : 'ένα λεπτό',
             mm : '%d λεπτά',
             h : 'μία ώρα',
@@ -83,9 +84,8 @@
             y : 'ένας χρόνος',
             yy : '%d χρόνια'
         },
-        ordinal : function (number) {
-            return number + 'η';
-        },
+        ordinalParse: /\d{1,2}η/,
+        ordinal: '%dη',
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 4  // The week that contains Jan 4st is the first week of the year.
index 75ad34a..a382b0a 100644 (file)
@@ -7,7 +7,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('en-au', {
@@ -18,6 +18,7 @@
         weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
         longDateFormat : {
             LT : 'h:mm A',
+            LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -46,6 +47,7 @@
             y : 'a year',
             yy : '%d years'
         },
+        ordinalParse: /\d{1,2}(st|nd|rd|th)/,
         ordinal : function (number) {
             var b = number % 10,
                 output = (~~(number % 100 / 10) === 1) ? 'th' :
index 077dc8b..2dec8a6 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('en-ca', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
         longDateFormat : {
             LT : 'h:mm A',
+            LTS : 'h:mm:ss A',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM, YYYY',
             LLL : 'D MMMM, YYYY LT',
@@ -47,6 +48,7 @@
             y : 'a year',
             yy : '%d years'
         },
+        ordinalParse: /\d{1,2}(st|nd|rd|th)/,
         ordinal : function (number) {
             var b = number % 10,
                 output = (~~(number % 100 / 10) === 1) ? 'th' :
index 4491d4a..4ea2b29 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('en-gb', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'a year',
             yy : '%d years'
         },
+        ordinalParse: /\d{1,2}(st|nd|rd|th)/,
         ordinal : function (number) {
             var b = number % 10,
                 output = (~~(number % 100 / 10) === 1) ? 'th' :
index 735ed8e..6a3d097 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('eo', {
@@ -21,6 +21,7 @@
         weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'YYYY-MM-DD',
             LL : 'D[-an de] MMMM, YYYY',
             LLL : 'D[-an de] MMMM, YYYY LT',
@@ -56,6 +57,7 @@
             y : 'jaro',
             yy : '%d jaroj'
         },
+        ordinalParse: /\d{1,2}a/,
         ordinal : '%da',
         week : {
             dow : 1, // Monday is the first day of the week.
index 04b83a8..b6e30b1 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
@@ -28,6 +28,7 @@
         weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
             LLL : 'D [de] MMMM [de] YYYY LT',
@@ -66,6 +67,7 @@
             y : 'un año',
             yy : '%d años'
         },
+        ordinalParse : /\d{1,2}º/,
         ordinal : '%dº',
         week : {
             dow : 1, // Monday is the first day of the week.
index 242ee16..7dbcee7 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
@@ -39,6 +39,7 @@
         weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),
         longDateFormat : {
             LT   : 'H:mm',
+            LTS : 'LT:ss',
             L    : 'DD.MM.YYYY',
             LL   : 'D. MMMM YYYY',
             LLL  : 'D. MMMM YYYY LT',
@@ -67,6 +68,7 @@
             y      : processRelativeTime,
             yy     : processRelativeTime
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 8fb89b4..c455c46 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('eu', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'YYYY-MM-DD',
             LL : 'YYYY[ko] MMMM[ren] D[a]',
             LLL : 'YYYY[ko] MMMM[ren] D[a] LT',
@@ -51,6 +52,7 @@
             y : 'urte bat',
             yy : '%d urte'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index b1151bd..ad2087a 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -43,6 +43,7 @@
         weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -88,6 +89,7 @@
                 return symbolMap[match];
             }).replace(/,/g, '،');
         },
+        ordinalParse: /\d{1,2}م/,
         ordinal : '%dم',
         week : {
             dow : 6, // Saturday is the first day of the week.
index 1fedcab..f884c3e 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
@@ -64,6 +64,7 @@
         weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
+            LTS : 'HH.mm.ss',
             L : 'DD.MM.YYYY',
             LL : 'Do MMMM[ta] YYYY',
             LLL : 'Do MMMM[ta] YYYY, [klo] LT',
@@ -96,6 +97,7 @@
             y : translate,
             yy : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index a27f9da..6b940e8 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('fo', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'eitt ár',
             yy : '%d ár'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index c0f1bdc..6cac1b8 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('fr-ca', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'un an',
             yy : '%d ans'
         },
+        ordinalParse: /\d{1,2}(er|)/,
         ordinal : function (number) {
             return number + (number === 1 ? 'er' : '');
         }
index f217ff1..4a7cbcc 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('fr', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'un an',
             yy : '%d ans'
         },
+        ordinalParse: /\d{1,2}(er|)/,
         ordinal : function (number) {
             return number + (number === 1 ? 'er' : '');
         },
index ac63862..5ff9e3f 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('gl', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -62,6 +63,7 @@
             y : 'un ano',
             yy : '%d anos'
         },
+        ordinalParse : /\d{1,2}º/,
         ordinal : '%dº',
         week : {
             dow : 1, // Monday is the first day of the week.
index 06f954f..9f9f470 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('he', {
@@ -21,6 +21,7 @@
         weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [ב]MMMM YYYY',
             LLL : 'D [ב]MMMM YYYY LT',
index 4e64560..73deba5 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -44,6 +44,7 @@
         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',
index 9e3f6fa..65264dc 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function translate(number, withoutSuffix, key) {
@@ -74,6 +74,7 @@
         weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD. MM. YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY LT',
             y      : 'godinu',
             yy     : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 73fdb83..7eccd1d 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
@@ -57,6 +57,7 @@
         weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'YYYY.MM.DD.',
             LL : 'YYYY. MMMM D.',
             LLL : 'YYYY. MMMM D., LT',
@@ -96,6 +97,7 @@
             y : translate,
             yy : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index affcd7e..053a845 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function monthsCaseReplace(m, format) {
@@ -44,6 +44,7 @@
         weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY թ.',
             LLL : 'D MMMM YYYY թ., LT',
@@ -89,6 +90,7 @@
             }
         },
 
+        ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
         ordinal: function (number, period) {
             switch (period) {
             case 'DDD':
index 143426a..36a841a 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('id', {
@@ -20,6 +20,7 @@
         weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
+            LTS : 'LT.ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY [pukul] LT',
index 479f82d..21888aa 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function plural(n) {
@@ -87,6 +87,7 @@
         weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY [kl.] LT',
             y : translate,
             yy : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 6695390..9d14714 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('it', {
@@ -20,6 +20,7 @@
         weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
             nextDay: '[Domani alle] LT',
             nextWeek: 'dddd [alle] LT',
             lastDay: '[Ieri alle] LT',
-            lastWeek: '[lo scorso] dddd [alle] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                    case 0:
+                        return '[la scorsa] dddd [alle] LT';
+                    default:
+                        return '[lo scorso] dddd [alle] LT';
+                }
+            },
             sameElse: 'L'
         },
         relativeTime : {
@@ -50,6 +58,7 @@
             y : 'un anno',
             yy : '%d anni'
         },
+        ordinalParse : /\d{1,2}º/,
         ordinal: '%dº',
         week : {
             dow : 1, // Monday is the first day of the week.
index f14fa4e..3f55bcf 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('ja', {
@@ -19,6 +19,7 @@
         weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
         longDateFormat : {
             LT : 'Ah時m分',
+            LTS : 'LTs秒',
             L : 'YYYY/MM/DD',
             LL : 'YYYY年M月D日',
             LLL : 'YYYY年M月D日LT',
index 73eb9c7..b56e18c 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function monthsCaseReplace(m, format) {
@@ -45,6 +45,7 @@
         weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
         longDateFormat : {
             LT : 'h:mm A',
+            LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -84,6 +85,7 @@
             y : 'წელი',
             yy : '%d წელი'
         },
+        ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
         ordinal : function (number) {
             if (number === 0) {
                 return number;
index 9ba4888..8d7b9b8 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('km', {
@@ -19,6 +19,7 @@
         weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         longDateFormat: {
             LT: 'HH:mm',
+            LTS : 'LT:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
             LLL: 'D MMMM YYYY LT',
index 57017f5..956345b 100644 (file)
@@ -11,7 +11,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('ko', {
@@ -22,6 +22,7 @@
         weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
         longDateFormat : {
             LT : 'A h시 m분',
+            LTS : 'A h시 m분 s초',
             L : 'YYYY.MM.DD',
             LL : 'YYYY년 MMMM D일',
             LLL : 'YYYY년 MMMM D일 LT',
@@ -54,6 +55,7 @@
             y : '일년',
             yy : '%d년'
         },
+        ordinalParse : /\d{1,2}일/,
         ordinal : '%d일',
         meridiemParse : /(오전|오후)/,
         isPM : function (token) {
index 14fab97..2e84dab 100644 (file)
@@ -12,7 +12,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
@@ -91,6 +91,7 @@
         weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
         longDateFormat: {
             LT: 'H:mm [Auer]',
+            LTS: 'H:mm:ss [Auer]',
             L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
             LLL: 'D. MMMM YYYY LT',
             y : processRelativeTime,
             yy : '%d Joer'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal: '%d.',
         week: {
             dow: 1, // Monday is the first day of the week.
index 013f8f1..2d87e04 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var units = {
@@ -75,6 +75,7 @@
         weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'YYYY-MM-DD',
             LL : 'YYYY [m.] MMMM D [d.]',
             LLL : 'YYYY [m.] MMMM D [d.], LT [val.]',
             y : translateSingular,
             yy : translate
         },
+        ordinalParse: /\d{1,2}-oji/,
         ordinal : function (number) {
             return number + '-oji';
         },
index 7e1892e..47a0708 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var units = {
@@ -40,6 +40,7 @@
         weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'YYYY. [gada] D. MMMM',
             LLL : 'YYYY. [gada] D. MMMM, LT',
@@ -68,6 +69,7 @@
             y : 'gadu',
             yy : relativeTimeWithPlural
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 94c7fc1..de36631 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('mk', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'D.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -59,6 +60,7 @@
             y : 'година',
             yy : '%d години'
         },
+        ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
         ordinal : function (number) {
             var lastDigit = number % 10,
                 last2Digits = number % 100;
index ea4d949..3850914 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('ml', {
@@ -19,6 +19,7 @@
         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',
index 141eaf8..45c200e 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -44,6 +44,7 @@
         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',
index 7efcbaa..09ec280 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('ms-my', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
+            LTS : 'LT.ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY [pukul] LT',
index 138d101..31f5c9e 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -42,6 +42,7 @@
         weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
         longDateFormat: {
             LT: 'HH:mm',
+            LTS: 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
             LLL: 'D MMMM YYYY LT',
index 533659d..4764b50 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('nb', {
@@ -20,6 +20,7 @@
         weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'H.mm',
+            LTS : 'LT.ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY [kl.] LT',
@@ -48,6 +49,7 @@
             y : 'ett år',
             yy : '%d år'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 51629eb..ceb2834 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var symbolMap = {
@@ -44,6 +44,7 @@
         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',
index 213beeb..9f4fdfe 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
@@ -28,6 +28,7 @@
         weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD-MM-YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -56,6 +57,7 @@
             y : 'één jaar',
             yy : '%d jaar'
         },
+        ordinalParse: /\d{1,2}(ste|de)/,
         ordinal : function (number) {
             return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
         },
index c5b6505..d7a8238 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('nn', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'eit år',
             yy : '%d år'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 63a62f1..418ca81 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
@@ -50,6 +50,7 @@
         weekdaysMin : 'N_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -89,6 +90,7 @@
             y : 'rok',
             yy : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 44eedaf..813c2de 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('pt-br', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
             LLL : 'D [de] MMMM [de] YYYY [às] LT',
@@ -51,6 +52,7 @@
             y : 'um ano',
             yy : '%d anos'
         },
+        ordinalParse: /\d{1,2}º/,
         ordinal : '%dº'
     });
 }));
index aced692..4afd564 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('pt', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
             LLL : 'D [de] MMMM [de] YYYY LT',
@@ -51,6 +52,7 @@
             y : 'um ano',
             yy : '%d anos'
         },
+        ordinalParse: /\d{1,2}º/,
         ordinal : '%dº',
         week : {
             dow : 1, // Monday is the first day of the week.
index dc34d3c..fcc7d07 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function relativeTimeWithPlural(number, withoutSuffix, key) {
@@ -36,6 +36,7 @@
         weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY H:mm',
index 2f15233..5adfa9a 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function plural(word, num) {
@@ -48,7 +48,7 @@
 
     function monthsShortCaseReplace(m, format) {
         var monthsShort = {
-            'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+            'nominative': 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
             'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
         },
 
@@ -65,7 +65,7 @@
             'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
         },
 
-        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
+        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/).test(format) ?
             'accusative' :
             'nominative';
 
@@ -81,6 +81,7 @@
         monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY г.',
             LLL : 'D MMMM YYYY г., LT',
             nextWeek: function () {
                 return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
             },
-            lastWeek: function () {
-                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';
+            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';
+                    }
+                } else {
+                    if (this.day() === 2) {
+                        return '[Во] dddd [в] LT';
+                    } else {
+                        return '[В] dddd [в] LT';
+                    }
                 }
             },
             sameElse: 'L'
             }
         },
 
+        ordinalParse: /\d{1,2}-(й|го|я)/,
         ordinal: function (number, period) {
             switch (period) {
             case 'M':
index 991afeb..f9d74c5 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
@@ -88,6 +88,7 @@
         weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
         longDateFormat : {
             LT: 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY LT',
             y : translate,
             yy : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 2bdbf1c..232695f 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function translate(number, withoutSuffix, key) {
@@ -80,6 +80,7 @@
         weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
+            LTS : 'LT:ss',
             L : 'DD. MM. YYYY',
             LL : 'D. MMMM YYYY',
             LLL : 'D. MMMM YYYY LT',
             y      : 'eno leto',
             yy     : translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 6ae4178..415495a 100644 (file)
@@ -10,7 +10,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('sq', {
@@ -24,6 +24,7 @@
         },
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -52,6 +53,7 @@
             y : 'një vit',
             yy : '%d vite'
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 7278de6..57619b6 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var translator = {
@@ -42,6 +42,7 @@
         weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
         longDateFormat: {
             LT: 'H:mm',
+            LTS : 'LT:ss',
             L: 'DD. MM. YYYY',
             LL: 'D. MMMM YYYY',
             LLL: 'D. MMMM YYYY LT',
@@ -96,6 +97,7 @@
             y      : 'годину',
             yy     : translator.translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index d008282..6f14284 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var translator = {
@@ -42,6 +42,7 @@
         weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
         longDateFormat: {
             LT: 'H:mm',
+            LTS : 'LT:ss',
             L: 'DD. MM. YYYY',
             LL: 'D. MMMM YYYY',
             LLL: 'D. MMMM YYYY LT',
@@ -96,6 +97,7 @@
             y      : 'godinu',
             yy     : translator.translate
         },
+        ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
         week : {
             dow : 1, // Monday is the first day of the week.
index 634b3cf..6e14958 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('sv', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -47,6 +48,7 @@
             y : 'ett år',
             yy : '%d år'
         },
+        ordinalParse: /\d{1,2}(e|a)/,
         ordinal : function (number) {
             var b = number % 10,
                 output = (~~(number % 100 / 10) === 1) ? 'e' :
index 53bab0d..d0356a3 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     /*var symbolMap = {
@@ -44,6 +44,7 @@
         weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY, LT',
@@ -82,6 +83,7 @@
                 return symbolMap[match];
             });
         },*/
+        ordinalParse: /\d{1,2}வது/,
         ordinal : function (number) {
             return number + 'வது';
         },
index fc99701..e3c5422 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('th', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
         longDateFormat : {
             LT : 'H นาฬิกา m นาที',
+            LTS : 'LT s วินาที',
             L : 'YYYY/MM/DD',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY เวลา LT',
index c15cc1f..40dbb07 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('tl-ph', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'MM/D/YYYY',
             LL : 'MMMM D, YYYY',
             LLL : 'MMMM D, YYYY LT',
@@ -47,6 +48,7 @@
             y : 'isang taon',
             yy : '%d taon'
         },
+        ordinalParse: /\d{1,2}/,
         ordinal : function (number) {
             return number;
         },
index 36e8fca..cd0a746 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     var suffixes = {
@@ -46,6 +46,7 @@
         weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
@@ -74,6 +75,7 @@
             y : 'bir yıl',
             yy : '%d yıl'
         },
+        ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
         ordinal : function (number) {
             if (number === 0) {  // special case for zero
                 return number + '\'ıncı';
index 3189772..34592b4 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('tzm-latn', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
index 0a7f3f1..9591521 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('tzm', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS: 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
index bc22fff..3dce4bc 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     function plural(word, num) {
@@ -79,6 +79,7 @@
         weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY р.',
             LLL : 'D MMMM YYYY р., LT',
             }
         },
 
+        ordinalParse: /\d{1,2}-(й|го)/,
         ordinal: function (number, period) {
             switch (period) {
             case 'M':
index 62fb89e..139e4de 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('uz', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY LT',
index 20e3ffe..15ec7dd 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('vi', {
@@ -19,6 +19,7 @@
         weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
+            LTS : 'LT:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM [năm] YYYY',
             LLL : 'D MMMM [năm] YYYY LT',
@@ -51,6 +52,7 @@
             y : 'một năm',
             yy : '%d năm'
         },
+        ordinalParse: /\d{1,2}/,
         ordinal : function (number) {
             return number;
         },
index aff26c5..b8a0bd2 100644 (file)
@@ -9,7 +9,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('zh-cn', {
@@ -20,6 +20,7 @@
         weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
         longDateFormat : {
             LT : 'Ah点mm',
+            LTS : 'Ah点m分s秒',
             L : 'YYYY-MM-DD',
             LL : 'YYYY年MMMD日',
             LLL : 'YYYY年MMMD日LT',
@@ -69,6 +70,7 @@
             },
             sameElse : 'LL'
         },
+        ordinalParse: /\d{1,2}(日|月|周)/,
         ordinal : function (number, period) {
             switch (period) {
             case 'd':
index 71f99a2..b3c4439 100644 (file)
@@ -8,7 +8,7 @@
     } else if (typeof exports === 'object') {
         module.exports = factory(require('../moment')); // Node
     } else {
-        factory(window.moment); // Browser global
+        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
     }
 }(function (moment) {
     return moment.defineLocale('zh-tw', {
@@ -19,6 +19,7 @@
         weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
         longDateFormat : {
             LT : 'Ah點mm',
+            LTS : 'Ah點m分s秒',
             L : 'YYYY年MMMD日',
             LL : 'YYYY年MMMD日',
             LLL : 'YYYY年MMMD日LT',
@@ -50,6 +51,7 @@
             lastWeek : '[上]ddddLT',
             sameElse : 'L'
         },
+        ordinalParse: /\d{1,2}(日|月|週)/,
         ordinal : function (number, period) {
             switch (period) {
             case 'd' :
index d100a9c..85e190d 100644 (file)
@@ -1,5 +1,5 @@
 //! moment.js
-//! version : 2.8.3
+//! version : 2.8.4
 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
 //! license : MIT
 //! momentjs.com
@@ -10,7 +10,7 @@
     ************************************/
 
     var moment,
-        VERSION = '2.8.3',
+        VERSION = '2.8.4',
         // the global-scope this is NOT the global object in Node.js
         globalScope = typeof global !== 'undefined' ? global : this,
         oldGlobalMoment,
@@ -33,7 +33,7 @@
         momentProperties = [],
 
         // check for nodeJS
-        hasModule = (typeof module !== 'undefined' && module.exports),
+        hasModule = (typeof module !== 'undefined' && module && module.exports),
 
         // ASP.NET json date format regex
         aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
@@ -44,8 +44,8 @@
         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|zz?|ZZ?|.)/g,
-        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
+        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
@@ -56,8 +56,8 @@
         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
-        parseTokenOrdinal = /\d{1,2}/,
 
         //strict parsing regexes
         parseTokenOneDigit = /\d/, // 0 - 9
             zz : function () {
                 return this.zoneName();
             },
+            x    : function () {
+                return this.valueOf();
+            },
             X    : function () {
                 return this.unix();
             },
             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] > 23 ? HOUR :
+                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 :
             if (m._strict) {
                 m._isValid = m._isValid &&
                     m._pf.charsLeftOver === 0 &&
-                    m._pf.unusedTokens.length === 0;
+                    m._pf.unusedTokens.length === 0 &&
+                    m._pf.bigHour === undefined;
             }
         }
         return m._isValid;
 
     // Return a moment from input, that is local/utc/zone equivalent to model.
     function makeAs(input, model) {
-        return model._isUTC ? moment(input).zone(model._offset || 0) :
-            moment(input).local();
+        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();
+        }
     }
 
     /************************************
                     this['_' + i] = 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('_'),
             return this._monthsShort[m.month()];
         },
 
-        monthsParse : function (monthName) {
+        monthsParse : function (monthName, format, strict) {
             var i, mom, regex;
 
             if (!this._monthsParse) {
                 this._monthsParse = [];
+                this._longMonthsParse = [];
+                this._shortMonthsParse = [];
             }
 
             for (i = 0; i < 12; i++) {
                 // make the regex if we don't have it already
-                if (!this._monthsParse[i]) {
-                    mom = moment.utc([2000, i]);
+                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 (this._monthsParse[i].test(monthName)) {
+                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;
                 }
             }
         },
 
         _longDateFormat : {
+            LTS : 'h:mm:ss A',
             LT : 'h:mm A',
             L : 'MM/DD/YYYY',
             LL : 'MMMM D, YYYY',
             lastWeek : '[Last] dddd [at] LT',
             sameElse : 'L'
         },
-        calendar : function (key, mom) {
+        calendar : function (key, mom, now) {
             var output = this._calendar[key];
-            return typeof output === 'function' ? output.apply(mom) : output;
+            return typeof output === 'function' ? output.apply(mom, [now]) : output;
         },
 
         _relativeTime : {
             return this._ordinal.replace('%d', number);
         },
         _ordinal : '%d',
+        _ordinalParse : /\d{1,2}/,
 
         preparse : function (string) {
             return string;
         case 'a':
         case 'A':
             return config._locale._meridiemParse;
+        case 'x':
+            return parseTokenOffsetMs;
         case 'X':
             return parseTokenTimestampMs;
         case 'Z':
         case 'E':
             return parseTokenOneOrTwoDigits;
         case 'Do':
-            return parseTokenOrdinal;
+            return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient;
         default :
             a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));
             return a;
             break;
         case 'MMM' : // fall through to MMMM
         case 'MMMM' :
-            a = config._locale.monthsParse(input);
+            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;
             break;
         case 'Do' :
             if (input != null) {
-                datePartArray[DATE] = toInt(parseInt(input, 10));
+                datePartArray[DATE] = toInt(parseInt(
+                            input.match(/\d{1,2}/)[0], 10));
             }
             break;
         // DAY OF YEAR
         case 'A' :
             config._isPm = config._locale.isPM(input);
             break;
-        // 24 HOUR
-        case 'H' : // fall through to hh
-        case 'HH' : // fall through to hh
+        // 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 '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);
             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 ? 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);
         }
+
+        if (config._nextDay) {
+            config._a[HOUR] = 24;
+        }
     }
 
     function dateFromObject(config) {
         config._a = [
             normalizedInput.year,
             normalizedInput.month,
-            normalizedInput.day,
+            normalizedInput.day || normalizedInput.date,
             normalizedInput.hour,
             normalizedInput.minute,
             normalizedInput.second,
             config._pf.unusedInput.push(string);
         }
 
+        // clear _12h flag if hour is <= 12
+        if (config._pf.bigHour === true && config._a[HOUR] <= 12) {
+            config._pf.bigHour = undefined;
+        }
         // handle am pm
         if (config._isPm && config._a[HOUR] < 12) {
             config._a[HOUR] += 12;
         if (config._isPm === false && config._a[HOUR] === 12) {
             config._a[HOUR] = 0;
         }
-
         dateFromConfig(config);
         checkOverflow(config);
     }
 
     function makeMoment(config) {
         var input = config._i,
-            format = config._f;
+            format = config._f,
+            res;
 
         config._locale = config._locale || moment.localeData(config._l);
 
             makeDateFromInput(config);
         }
 
-        return new Moment(config);
+        res = new Moment(config);
+        if (res._nextDay) {
+            // Adding is smart enough around DST
+            res.add(1, 'd');
+            res._nextDay = undefined;
+        }
+
+        return res;
     }
 
     moment = function (input, format, locale, strict) {
         'release. Please refer to ' +
         'https://github.com/moment/moment/issues/1407 for more info.',
         function (config) {
-            config._d = new Date(config._i);
+            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
         }
     );
 
         toISOString : function () {
             var m = moment(this).utc();
             if (0 < m.year() && m.year() <= 9999) {
-                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+                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]');
             }
                     diff < 1 ? 'sameDay' :
                     diff < 2 ? 'nextDay' :
                     diff < 7 ? 'nextWeek' : 'sameElse';
-            return this.format(this.localeData().calendar(format, this));
+            return this.format(this.localeData().calendar(format, this, moment(now)));
         },
 
         isLeapYear : function () {
 
         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');
         },
 
         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 {
-                return +this.clone().startOf(units) > +moment(input).startOf(units);
+                inputMs = moment.isMoment(input) ? +input : +moment(input);
+                return inputMs < +this.clone().startOf(units);
             }
         },
 
         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 {
-                return +this.clone().startOf(units) < +moment(input).startOf(units);
+                inputMs = moment.isMoment(input) ? +input : +moment(input);
+                return +this.clone().endOf(units) < inputMs;
             }
         },
 
         isSame: function (input, units) {
+            var inputMs;
             units = normalizeUnits(units || 'millisecond');
             if (units === 'millisecond') {
                 input = moment.isMoment(input) ? input : moment(input);
                 return +this === +input;
             } else {
-                return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
+                inputMs = +moment(input);
+                return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
             }
         },
 
         },
 
         lang : deprecate(
-            'moment().lang() is deprecated. Use moment().localeData() instead.',
+            '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();
                 return units === 'month' ? months : months / 12;
             } else {
                 // handle milliseconds separately because of floating point math errors (issue #1867)
-                days = this._days + yearsToDays(this._months / 12);
+                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;
 
     // 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' :
index b01e2cd..058a149 100644 (file)
@@ -9,16 +9,20 @@
                        "OsamaK",
                        "زكريا",
                        "مشعل الحربي",
-                       "ترجمان05"
+                       "ترجمان05",
+                       "Abanima"
                ]
        },
        "ooui-outline-control-move-down": "انقل العنصر للأسفل",
        "ooui-outline-control-move-up": "انقل العنصر للأعلى",
        "ooui-outline-control-remove": "أزل العنصر",
        "ooui-toolbar-more": "مزيد",
+       "ooui-toolgroup-expand": "مزيد",
+       "ooui-toolgroup-collapse": "أقل",
        "ooui-dialog-message-accept": "موافق",
        "ooui-dialog-message-reject": "ألغ",
        "ooui-dialog-process-error": "حدث خطأ",
        "ooui-dialog-process-dismiss": "أغلق",
-       "ooui-dialog-process-retry": "حاول مرة أخرى"
+       "ooui-dialog-process-retry": "حاول مرة أخرى",
+       "ooui-dialog-process-continue": "استمر"
 }
index c7afbfa..130bd8e 100644 (file)
@@ -8,6 +8,12 @@
        "ooui-outline-control-move-up": "Premjesti stavku gore",
        "ooui-outline-control-remove": "Ukloni stavku",
        "ooui-toolbar-more": "Više",
+       "ooui-toolgroup-expand": "Više",
+       "ooui-toolgroup-collapse": "Manje",
        "ooui-dialog-message-accept": "U redu",
-       "ooui-dialog-message-reject": "Otkaži"
+       "ooui-dialog-message-reject": "Otkaži",
+       "ooui-dialog-process-error": "Nešto je pošlo naopako",
+       "ooui-dialog-process-dismiss": "Odbaci",
+       "ooui-dialog-process-retry": "Pokušajte ponovo",
+       "ooui-dialog-process-continue": "Nastavi"
 }
index f1c6ea3..ce3afa4 100644 (file)
@@ -9,14 +9,20 @@
                        "SMP",
                        "Vriullop",
                        "Toniher",
-                       "Edustus"
+                       "Edustus",
+                       "Davidpar"
                ]
        },
-       "ooui-outline-control-move-down": "Baixa element",
-       "ooui-outline-control-move-up": "Puja element",
+       "ooui-outline-control-move-down": "Baixa l'element",
+       "ooui-outline-control-move-up": "Puja l'element",
+       "ooui-outline-control-remove": "Esborra l'ítem",
        "ooui-toolbar-more": "Més",
        "ooui-toolgroup-expand": "Més",
        "ooui-toolgroup-collapse": "Menys",
+       "ooui-dialog-message-accept": "D'acord",
+       "ooui-dialog-message-reject": "Cancel·la",
+       "ooui-dialog-process-error": "Alguna cosa no ha funcionat",
        "ooui-dialog-process-dismiss": "Descarta",
-       "ooui-dialog-process-retry": "Torneu-ho a provar"
+       "ooui-dialog-process-retry": "Torneu-ho a provar",
+       "ooui-dialog-process-continue": "Continua"
 }
index cddd46e..6fb7dba 100644 (file)
        "ooui-outline-control-move-up": "Μετακίνηση στοιχείου προς τα επάνω",
        "ooui-outline-control-remove": "Αφαίρεση στοιχείου",
        "ooui-toolbar-more": "Περισσότερα",
+       "ooui-toolgroup-expand": "Περισσότερα",
+       "ooui-toolgroup-collapse": "Λιγότερα",
        "ooui-dialog-message-accept": "ΟΚ",
        "ooui-dialog-message-reject": "Ακύρωση",
        "ooui-dialog-process-error": "Κάτι πήγε στραβά",
        "ooui-dialog-process-dismiss": "Απόρριψη",
-       "ooui-dialog-process-retry": "Δοκιμάστε ξανά"
+       "ooui-dialog-process-retry": "Δοκιμάστε ξανά",
+       "ooui-dialog-process-continue": "Συνέχεια"
 }
index eac992f..a4339f4 100644 (file)
@@ -3,16 +3,20 @@
                "authors": [
                        "Alison",
                        "Kscanne",
-                       "Toliño"
+                       "Toliño",
+                       "Elisardojm"
                ]
        },
        "ooui-outline-control-move-down": "Mover o elemento abaixo",
        "ooui-outline-control-move-up": "Mover o elemento arriba",
        "ooui-outline-control-remove": "Eliminar o elemento",
        "ooui-toolbar-more": "Máis",
+       "ooui-toolgroup-expand": "Máis",
+       "ooui-toolgroup-collapse": "Menos",
        "ooui-dialog-message-accept": "Aceptar",
        "ooui-dialog-message-reject": "Cancelar",
        "ooui-dialog-process-error": "Algo foi mal",
        "ooui-dialog-process-dismiss": "Agochar",
-       "ooui-dialog-process-retry": "Inténteo de novo"
+       "ooui-dialog-process-retry": "Inténteo de novo",
+       "ooui-dialog-process-continue": "Continuar"
 }
index 270bae4..119d1be 100644 (file)
@@ -20,5 +20,6 @@
        "ooui-dialog-message-reject": "Ofbriechen",
        "ooui-dialog-process-error": "Et ass eppes schif gaang",
        "ooui-dialog-process-dismiss": "Verwerfen",
-       "ooui-dialog-process-retry": "Nach eng Kéier probéieren"
+       "ooui-dialog-process-retry": "Nach eng Kéier probéieren",
+       "ooui-dialog-process-continue": "Virufueren"
 }
index 32fc9fe..9ff787a 100644 (file)
        "ooui-outline-control-move-down": "Pārvietot vienumu uz leju",
        "ooui-outline-control-move-up": "Pārvietot vienumu uz augšu",
        "ooui-toolbar-more": "Vairāk",
+       "ooui-toolgroup-expand": "Vairāk",
+       "ooui-toolgroup-collapse": "Mazāk",
        "ooui-dialog-message-accept": "Labi",
        "ooui-dialog-message-reject": "Atcelt",
-       "ooui-dialog-process-retry": "Mēģināt vēlreiz"
+       "ooui-dialog-process-error": "Kaut kas nogāja greizi",
+       "ooui-dialog-process-retry": "Mēģināt vēlreiz",
+       "ooui-dialog-process-continue": "Turpināt"
 }
index c5ecbac..9e77392 100644 (file)
@@ -6,7 +6,8 @@
                        "Jeblad",
                        "Laaknor",
                        "Njardarlogar",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Apple farmer"
                ]
        },
        "ooui-outline-control-move-down": "Flytt ned",
@@ -14,7 +15,7 @@
        "ooui-outline-control-remove": "Fjern element",
        "ooui-toolbar-more": "Mer",
        "ooui-toolgroup-expand": "Mer",
-       "ooui-toolgroup-collapse": "Mindre",
+       "ooui-toolgroup-collapse": "Færre",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Avbryt",
        "ooui-dialog-process-error": "Noe gikk galt",
index 26171f1..d3db318 100644 (file)
@@ -5,5 +5,15 @@
                ]
        },
        "ooui-outline-control-move-down": "Onderwarp ummeneer zetten",
-       "ooui-outline-control-move-up": "Onderwarp umhoge zetten"
+       "ooui-outline-control-move-up": "Onderwarp umhoge zetten",
+       "ooui-outline-control-remove": "Element vortdoon",
+       "ooui-toolbar-more": "Meer",
+       "ooui-toolgroup-expand": "Meer",
+       "ooui-toolgroup-collapse": "Minder",
+       "ooui-dialog-message-accept": "Okee",
+       "ooui-dialog-message-reject": "Aofbreken",
+       "ooui-dialog-process-error": "Der gung iets fout",
+       "ooui-dialog-process-dismiss": "Sluten",
+       "ooui-dialog-process-retry": "Opniej proberen",
+       "ooui-dialog-process-continue": "Deurgaon"
 }
index cd089af..f6f422a 100644 (file)
@@ -6,5 +6,14 @@
        },
        "ooui-outline-control-move-down": "Spuèste 'a vôsce sotte",
        "ooui-outline-control-move-up": "Spuèste 'a vôsce sus",
-       "ooui-toolbar-more": "De cchiù"
+       "ooui-outline-control-remove": "Live 'a vôsce",
+       "ooui-toolbar-more": "De cchiù",
+       "ooui-toolgroup-expand": "De cchiù",
+       "ooui-toolgroup-collapse": "De mene",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Annulle",
+       "ooui-dialog-process-error": "Quacche cose ha sciute stuèrte",
+       "ooui-dialog-process-dismiss": "Scitte",
+       "ooui-dialog-process-retry": "Pruève arrete",
+       "ooui-dialog-process-continue": "Condinue"
 }
index 5737548..a40728a 100644 (file)
        "ooui-outline-control-move-up": "Prestavi predmet višje",
        "ooui-outline-control-remove": "Odstrani vnos",
        "ooui-toolbar-more": "Več",
+       "ooui-toolgroup-expand": "Več",
+       "ooui-toolgroup-collapse": "Manj",
        "ooui-dialog-message-accept": "V redu",
        "ooui-dialog-message-reject": "Prekliči",
        "ooui-dialog-process-error": "Nekaj je šlo narobe",
        "ooui-dialog-process-dismiss": "Skrij",
-       "ooui-dialog-process-retry": "Poskusi znova"
+       "ooui-dialog-process-retry": "Poskusi znova",
+       "ooui-dialog-process-continue": "Nadaljuj"
 }
index 382317e..704a186 100644 (file)
@@ -8,9 +8,12 @@
        "ooui-outline-control-move-up": "Premesti stavku na gore",
        "ooui-outline-control-remove": "Ukloni stavku",
        "ooui-toolbar-more": "Više",
+       "ooui-toolgroup-expand": "Više",
+       "ooui-toolgroup-collapse": "Manje",
        "ooui-dialog-message-accept": "U redu",
        "ooui-dialog-message-reject": "Otkaži",
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
-       "ooui-dialog-process-retry": "Pokušaj ponovo"
+       "ooui-dialog-process-retry": "Pokušaj ponovo",
+       "ooui-dialog-process-continue": "Nastavi"
 }
index d6034f0..0197a4c 100644 (file)
                        "SteveR",
                        "Tel'et",
                        "Tifinaghes",
-                       "Ата"
+                       "Ата",
+                       "Piramidion"
                ]
        },
        "ooui-outline-control-move-down": "Перемістити елемент униз",
        "ooui-outline-control-move-up": "Перемістити елемент вгору",
        "ooui-outline-control-remove": "Видалити елемент",
        "ooui-toolbar-more": "Більше",
+       "ooui-toolgroup-expand": "Більше",
+       "ooui-toolgroup-collapse": "Менше",
        "ooui-dialog-message-accept": "Готово",
        "ooui-dialog-message-reject": "Скасувати",
        "ooui-dialog-process-error": "Щось пішло не так",
        "ooui-dialog-process-dismiss": "Приховати",
-       "ooui-dialog-process-retry": "Спробуйте ще раз"
+       "ooui-dialog-process-retry": "Спробуйте ще раз",
+       "ooui-dialog-process-continue": "Продовжити"
 }
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.css b/resources/lib/oojs-ui/oojs-ui-apex.css
deleted file mode 100644 (file)
index 8f048e4..0000000
+++ /dev/null
@@ -1,2229 +0,0 @@
-/*!
- * OOjs UI v0.4.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-12-06T00:33:19Z
- */
-.oo-ui-progressBarWidget-slide-frames from {
-       margin-left: -40%;
-}
-.oo-ui-progressBarWidget-slide-frames to {
-       margin-left: 100%;
-}
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-/* @noflip */
-.oo-ui-rtl {
-       direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-       direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       cursor: pointer;
-       display: inline-block;
-       vertical-align: middle;
-       font-family: inherit;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       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 {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-       display: inline-block;
-       position: relative;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       display: inline-block;
-       vertical-align: top;
-       text-align: center;
-}
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       color: #333333;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-right: -0.75em;
-       margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-left: 0;
-}
-.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 {
-       opacity: 0.8;
-       width: 1.9em;
-       height: 1.9em;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity 200ms);*/
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-       outline: none;
-}
-.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 {
-       opacity: 1;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #000000;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #333333;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       margin-left: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #087ecc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #76ab36;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #d45353;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       margin: 0.1em 0;
-       padding: 0.2em 0.8em;
-       border-radius: 0.3em;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: border-color 100ms ease-in-out;
-          -moz-transition: border-color 100ms ease-in-out;
-           -ms-transition: border-color 100ms ease-in-out;
-            -o-transition: border-color 100ms ease-in-out;
-               transition: border-color 100ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-       border-color: #aaaaaa;
-       outline: none;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       color: black;
-       border-color: #c9c9c9;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
-       border-color: #9dc2d4;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:    -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:     -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:      -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:         linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-       border-color: #adcb89;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:    -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:     -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:      -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:         linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-       color: #d45353;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       opacity: 0.5;
-       -webkit-transform: translate3d(0, 0, 0);
-       box-shadow: none;
-       color: #333333;
-       background: #eeeeee;
-       border-color: #cccccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
-       border-color: #cccccc;
-       box-shadow: none;
-}
-.oo-ui-clippableElement-clippable {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-draggableElement {
-       cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
-}
-.oo-ui-draggableElement-dragging {
-       cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
-       background: rgba(0, 0, 0, 0.2);
-       opacity: 0.4;
-}
-.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
-       display: inline-block;
-}
-.oo-ui-draggableGroupElement-placeholder {
-       position: absolute;
-       display: block;
-       background: rgba(0, 0, 0, 0.4);
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-       overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -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;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-       border-right: solid 1px #dddddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-       display: block;
-       margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-       content: " ";
-       display: table;
-}
-.oo-ui-fieldLayout:after {
-       clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       text-align: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-       float: right;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-       padding: 0.5em 0.75em;
-       line-height: 1.5em;
-}
-.oo-ui-fieldLayout:last-child {
-       margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       padding-top: 0.5em;
-       margin-right: 5%;
-       width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-       width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-fieldsetLayout {
-       position: relative;
-       margin: 0;
-       padding: 0;
-       border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       display: block;
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-       margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-       font-size: 1.5em;
-       margin-bottom: 0.5em;
-       padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-       padding-left: 1.75em;
-       line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       left: 0;
-       top: 0.25em;
-       width: 2em;
-       height: 2em;
-}
-.oo-ui-gridLayout {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout {
-       position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-       padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-       display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-       display: block;
-       position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-       z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-       /* @noflip */
-       margin-left: 1.25em;
-       font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-       display: inline-block;
-       vertical-align: middle;
-       margin: 0.3em;
-       border-radius: 0.25em;
-       border: solid 1px transparent;
-       -webkit-transition: border-color 300ms ease-in-out;
-          -moz-transition: border-color 300ms ease-in-out;
-           -ms-transition: border-color 300ms ease-in-out;
-            -o-transition: border-color 300ms ease-in-out;
-               transition: border-color 300ms ease-in-out;
-}
-.oo-ui-toolGroup-empty {
-       display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #000000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       display: inline-block;
-       position: relative;
-       vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-       display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       margin: -1px 0 -1px -1px;
-       border: solid 1px transparent;
-}
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-       border-top-left-radius: 0.25em;
-       border-bottom-left-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-       margin-right: -1px;
-       border-top-right-radius: 0.25em;
-       border-bottom-right-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       height: 1.5em;
-       padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 1.5em;
-       width: 1.5em;
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.2);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-left-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-       position: relative;
-       height: 2em;
-       min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-       display: block;
-       cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-       cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       display: none;
-       position: absolute;
-       z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-       display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-       left: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-       right: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       display: table-cell;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       text-align: right;
-       padding-right: 2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
-       padding-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-       min-width: 3.5em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 1em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-right: 2.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2em;
-       height: 2em;
-       opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-popupToolGroup-header {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 0.6em;
-       font-weight: bold;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-       border-bottom-left-radius: 0;
-       border-bottom-right-radius: 0;
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       top: 2em;
-       margin: 0 -1px;
-       border: solid 1px #cccccc;
-       background-color: white;
-       box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 2em;
-       width: 2em;
-       margin-right: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       line-height: 2em;
-       font-size: 0.8em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #888888;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em;
-}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       border: solid 1px transparent;
-       margin: -1px 0;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.1);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-top-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #dddddd;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-       display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-       min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.25);
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-       border-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-toolbar {
-       clear: both;
-}
-.oo-ui-toolbar-bar {
-       line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-       float: right;
-}
-.oo-ui-toolbar-tools {
-       display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-       -webkit-touch-callout: default;
-       -webkit-user-select: all;
-          -moz-user-select: all;
-           -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: solid 1px #cccccc;
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
-       background: none;
-}
-.oo-ui-toolbar-shadow {
-       background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-       bottom: -9px;
-       height: 9px;
-       opacity: 0.125;
-       -webkit-transition: opacity 500ms ease-in-out;
-          -moz-transition: opacity 500ms ease-in-out;
-           -ms-transition: opacity 500ms ease-in-out;
-            -o-transition: opacity 500ms ease-in-out;
-               transition: opacity 500ms ease-in-out;
-}
-.oo-ui-optionWidget {
-       position: relative;
-       display: block;
-       cursor: pointer;
-       padding: 0.25em 0.5em;
-       border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-       background-color: #e1f3ff;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-decoratedOptionWidget {
-       padding: 0.5em 2em 0.5em 3em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       top: 50%;
-       width: 2em;
-       height: 2em;
-       margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-       left: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       right: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-left: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-radioSelectWidget {
-       padding: 0.75em 0 0.5em 0;
-}
-.oo-ui-buttonOptionWidget {
-       display: inline-block;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       position: static;
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       height: 1.9em;
-       margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget {
-       cursor: default;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
-.oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
-       padding: 0 0.5em;
-}
-.oo-ui-labelWidget {
-       display: inline-block;
-       padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-bottom: -1px;
-       margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-       position: relative;
-       display: inline-block;
-       vertical-align: middle;
-       overflow: hidden;
-       cursor: pointer;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       -webkit-transform: translateZ(0px);
-          -moz-transform: translateZ(0px);
-           -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
-               transform: translateZ(0px);
-       height: 2em;
-       width: 4em;
-       border-radius: 1em;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border: solid 1px #cccccc;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       position: absolute;
-       display: block;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: none;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       opacity: 0.5;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.25em;
-       left: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-       margin-top: -1px;
-       border-radius: 1em;
-       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       border-radius: 1em;
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-transition: opacity 200ms ease-in-out;
-          -moz-transition: opacity 200ms ease-in-out;
-           -ms-transition: opacity 200ms ease-in-out;
-            -o-transition: opacity 200ms ease-in-out;
-               transition: opacity 200ms ease-in-out;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-       opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2.25em;
-       margin-left: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: block;
-       opacity: 0;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.25em;
-       margin-left: 0;
-}
-.oo-ui-progressBarWidget {
-       max-width: 50em;
-       border: solid 1px #a6cee1;
-       border-radius: 0.25em;
-       overflow: hidden;
-}
-.oo-ui-progressBarWidget-bar {
-       height: 1em;
-       border-right: solid 1px #a6cee1;
-       -webkit-transition: width 200ms, margin-left 200ms;
-          -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
-               transition: width 200ms, margin-left 200ms;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
-       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-       width: 40%;
-       margin-left: -10%;
-       border-left: solid 1px #a6cee1;
-}
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-       opacity: 0.6;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-popupWidget {
-       position: absolute;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-popupWidget-popup {
-       position: relative;
-       overflow: hidden;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-       display: none;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-       display: block;
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       float: left;
-       cursor: default;
-}
-.oo-ui-popupWidget-body {
-       clear: both;
-       overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-       border: solid 1px #cccccc;
-       border-radius: 0.25em;
-       background-color: #ffffff;
-       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       content: "";
-       position: absolute;
-       width: 0;
-       height: 0;
-       border-style: solid;
-       border-color: transparent;
-       border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-       bottom: -8px;
-       left: -7px;
-       border-bottom-color: #aaaaaa;
-       border-width: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -8px;
-       left: -6px;
-       border-bottom-color: #ffffff;
-       border-width: 6px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-       height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupWidget-body-padded {
-       padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-       position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-       position: absolute;
-       cursor: auto;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-       left: 1em;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-       left: 1.25em;
-}
-.oo-ui-textInputWidget {
-       position: relative;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       display: inline-block;
-       width: 100%;
-       resize: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       top: 0;
-       height: 100%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-       left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       padding: 0.5em;
-       font-size: 1em;
-       font-family: sans-serif;
-       background-color: #ffffff;
-       color: black;
-       border: solid 1px #cccccc;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border-radius: 0.25em;
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-          -moz-transition: border-color 200ms, box-shadow 200ms;
-           -ms-transition: border-color 200ms, box-shadow 200ms;
-            -o-transition: border-color 200ms, box-shadow 200ms;
-               transition: border-color 200ms, box-shadow 200ms;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-       outline: none;
-       border-color: #a7dcff;
-       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-       color: #777777;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
-       opacity: 0.8;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       width: 2em;
-       background-position: right center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.5em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 1.5em;
-       background-position: left center;
-}
-.oo-ui-menuSelectWidget {
-       position: absolute;
-       background: #ffffff;
-       margin-top: -1px;
-       border: solid 1px #cccccc;
-       border-radius: 0 0 0.25em 0.25em;
-       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuSelectWidget input {
-       position: absolute;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-       opacity: 0;
-}
-.oo-ui-menuOptionWidget {
-       position: relative;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuSectionOptionWidget {
-       cursor: default;
-       padding: 0.33em 0.75em;
-       color: #888888;
-}
-.oo-ui-dropdownWidget {
-       position: relative;
-       display: inline-block;
-       margin: 0.25em 0;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-dropdownWidget-handle {
-       width: 100%;
-       display: inline-block;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       -webkit-box-sizing: border-box;
-          -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 {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
-       z-index: 1;
-       width: 100%;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       cursor: default;
-}
-.oo-ui-dropdownWidget-handle {
-       height: 2.5em;
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-dropdownWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       line-height: 2.5em;
-       margin: 0 0.5em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2.5em;
-       height: 2.5em;
-       opacity: 0.8;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-       opacity: 0.2;
-}
-.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-right: 2em;
-}
-.oo-ui-outlineOptionWidget {
-       position: relative;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       font-size: 1.1em;
-       padding: 0.75em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-       padding-right: 1.5em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget-level-0 {
-       padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-       left: 1em;
-}
-.oo-ui-outlineOptionWidget-level-1 {
-       padding-left: 5em;
-}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
-       left: 2.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 {
-       padding-left: 6.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-       left: 4em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
-       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-placeholder {
-       font-style: italic;
-}
-.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: #777777;
-}
-.oo-ui-outlineControlsWidget {
-       height: 3em;
-       background-color: #ffffff;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       float: left;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       float: left;
-       background-position: right center;
-       background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       height: 2em;
-       margin: 0.5em;
-       padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       width: 1.5em;
-       height: 2em;
-       margin: 0.5em 0 0.5em 0.5em;
-       opacity: 0.2;
-}
-.oo-ui-outlineControlsWidget-items {
-       margin-left: 0;
-}
-.oo-ui-comboBoxWidget {
-       display: inline-block;
-       position: relative;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       width: 100%;
-       z-index: 1;
-}
-.oo-ui-comboBoxWidget-handle {
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-comboBoxWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       cursor: default;
-       opacity: 0.2;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       margin-top: -3px;
-}
-.oo-ui-searchWidget-query {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       width: 100%;
-}
-.oo-ui-searchWidget-results {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-       height: 4em;
-       padding: 0 1em;
-       box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-       top: 4em;
-       padding: 1em;
-       line-height: 0;
-}
-.oo-ui-window {
-       line-height: 1em;
-}
-.oo-ui-window-frame {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-}
-.oo-ui-window-content:focus {
-       outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-window-body {
-       margin: 0;
-       padding: 0;
-       background: none;
-}
-.oo-ui-window-overlay,
-.oo-ui-window-inner-overlay {
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-window,
-.oo-ui-window-isolated {
-       background-color: transparent;
-       background-image: none;
-       font-family: sans-serif;
-       font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       position: absolute;
-       left: 0;
-       right: 0;
-       overflow: hidden;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-       z-index: 1;
-       top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       z-index: 2;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       z-index: 1;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-inner-overlay {
-       z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-messageDialog-actions-horizontal {
-       display: table;
-       table-layout: fixed;
-       width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       display: table-cell;
-       width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-       display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       display: block;
-       overflow: hidden;
-       text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       position: relative;
-       text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-       position: relative;
-       top: auto;
-       bottom: auto;
-       display: inline;
-       white-space: nowrap;
-}
-.oo-ui-messageDialog-content .oo-ui-window-body {
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-       display: block;
-       text-align: center;
-       padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-       font-size: 1.5em;
-       line-height: 1em;
-       color: #000000;
-}
-.oo-ui-messageDialog-message {
-       font-size: 0.9em;
-       line-height: 1.25em;
-       color: #666666;
-}
-.oo-ui-messageDialog-message-verbose {
-       font-size: 1.1em;
-       line-height: 1.5em;
-       text-align: left;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       border-right: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-       border-right-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-       border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       height: 3.4em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       text-align: center;
-       line-height: 3.4em;
-       padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-       overflow: hidden;
-       text-overflow: ellipsis;
-       white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-       display: inline;
-       padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-       white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-       left: 0;
-}
-.oo-ui-processDialog-actions-primary {
-       right: 0;
-}
-.oo-ui-processDialog-errors {
-       display: none;
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-       z-index: 2;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-       height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-       top: 3.4em;
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-processDialog-navigation {
-       position: relative;
-       height: 3.4em;
-       padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-       padding: 0.75em 0;
-       height: 1.9em;
-       cursor: default;
-       text-align: center;
-}
-.oo-ui-processDialog-title {
-       font-weight: bold;
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       min-width: 1.9em;
-       min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em 0 0.75em 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       padding: 0 1em;
-       vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-       min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-       background-color: rgba(255, 255, 255, 0.9);
-       padding: 3em 3em 1.5em 3em;
-       text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-       margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-       font-size: 1.5em;
-       color: #000000;
-       margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-       text-align: left;
-       margin: 1em;
-       padding: 1em;
-       border: solid 1px #ff9e9e;
-       background-color: #fff7f7;
-       border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       position: fixed;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       width: auto;
-       height: auto;
-       top: 0;
-       right: 0;
-       bottom: 0;
-       left: 0;
-       padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       position: absolute;
-       right: 0;
-       left: 0;
-       margin: auto;
-       overflow: hidden;
-       max-width: 100%;
-       max-height: 100%;
-       visibility: visible;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       visibility: hidden;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-       width: 100%;
-       height: 100%;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       background-color: rgba(255, 255, 255, 0.5);
-       opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       top: 1em;
-       bottom: 1em;
-       background-color: #ffffff;
-       -webkit-transform: scale(0.5);
-          -moz-transform: scale(0.5);
-           -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
-               transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       -webkit-transform: scale(1);
-          -moz-transform: scale(1);
-           -ms-transform: scale(1);
-            -o-transform: scale(1);
-               transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-       border: solid 1px #cccccc;
-       border-radius: 0.5em;
-       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/apex/images/icons/add.png);
-}
-.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/apex/images/icons/advanced.png);
-}
-.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/apex/images/icons/alert.png);
-}
-.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.png);
-}
-.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/apex/images/icons/clear.png);
-}
-.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/apex/images/icons/close.png);
-}
-.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/apex/images/icons/code.png);
-}
-.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/apex/images/icons/collapse.png);
-}
-.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/apex/images/icons/comment.png);
-}
-.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/apex/images/icons/expand.png);
-}
-.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/apex/images/icons/help.png);
-}
-.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/apex/images/icons/info.png);
-}
-.oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/apex/images/icons/link.png);
-}
-.oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/apex/images/icons/menu.png);
-}
-.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.png);
-}
-.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/apex/images/icons/picture.png);
-}
-.oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.png);
-}
-.oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.png);
-}
-.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/apex/images/icons/remove.png);
-}
-.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/apex/images/icons/search.png);
-}
-.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/apex/images/icons/settings.png);
-}
-.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/apex/images/icons/tag.png);
-}
-.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.png);
-}
-.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/apex/images/icons/window.png);
-}
-.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/apex/images/indicators/alert.png);
-}
-.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.png);
-}
-.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.png);
-}
-.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.png);
-}
-.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.png);
-}
-.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/apex/images/indicators/required.png);
-}
-.oo-ui-texture-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-       background-image: /* @embed */ url(themes/apex/images/textures/transparency.png);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js
deleted file mode 100644 (file)
index f3f635d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*!
- * OOjs UI v0.4.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-12-06T00:33:09Z
- */
-/* Instantiation */
-
-OO.ui.theme = new OO.ui.Theme();
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.svg.css b/resources/lib/oojs-ui/oojs-ui-apex.svg.css
deleted file mode 100644 (file)
index ccbc0b3..0000000
+++ /dev/null
@@ -1,2229 +0,0 @@
-/*!
- * OOjs UI v0.4.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-12-06T00:33:19Z
- */
-.oo-ui-progressBarWidget-slide-frames from {
-       margin-left: -40%;
-}
-.oo-ui-progressBarWidget-slide-frames to {
-       margin-left: 100%;
-}
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-/* @noflip */
-.oo-ui-rtl {
-       direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-       direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       cursor: pointer;
-       display: inline-block;
-       vertical-align: middle;
-       font-family: inherit;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       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 {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-       display: inline-block;
-       position: relative;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       display: inline-block;
-       vertical-align: top;
-       text-align: center;
-}
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       color: #333333;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-right: -0.75em;
-       margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-left: 0;
-}
-.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 {
-       opacity: 0.8;
-       width: 1.9em;
-       height: 1.9em;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity 200ms);*/
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-       outline: none;
-}
-.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 {
-       opacity: 1;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #000000;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #333333;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       margin-left: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #087ecc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #76ab36;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #d45353;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       margin: 0.1em 0;
-       padding: 0.2em 0.8em;
-       border-radius: 0.3em;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: border-color 100ms ease-in-out;
-          -moz-transition: border-color 100ms ease-in-out;
-           -ms-transition: border-color 100ms ease-in-out;
-            -o-transition: border-color 100ms ease-in-out;
-               transition: border-color 100ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-       border-color: #aaaaaa;
-       outline: none;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       color: black;
-       border-color: #c9c9c9;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
-       border-color: #9dc2d4;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:    -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:     -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:      -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:         linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-       border-color: #adcb89;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:    -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:     -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:      -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:         linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-       color: #d45353;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       opacity: 0.5;
-       -webkit-transform: translate3d(0, 0, 0);
-       box-shadow: none;
-       color: #333333;
-       background: #eeeeee;
-       border-color: #cccccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
-       border-color: #cccccc;
-       box-shadow: none;
-}
-.oo-ui-clippableElement-clippable {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-draggableElement {
-       cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
-}
-.oo-ui-draggableElement-dragging {
-       cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
-       background: rgba(0, 0, 0, 0.2);
-       opacity: 0.4;
-}
-.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
-       display: inline-block;
-}
-.oo-ui-draggableGroupElement-placeholder {
-       position: absolute;
-       display: block;
-       background: rgba(0, 0, 0, 0.4);
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-       overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -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;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-       border-right: solid 1px #dddddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-       display: block;
-       margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-       content: " ";
-       display: table;
-}
-.oo-ui-fieldLayout:after {
-       clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       text-align: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-       float: right;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-       padding: 0.5em 0.75em;
-       line-height: 1.5em;
-}
-.oo-ui-fieldLayout:last-child {
-       margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       padding-top: 0.5em;
-       margin-right: 5%;
-       width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-       width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-fieldsetLayout {
-       position: relative;
-       margin: 0;
-       padding: 0;
-       border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       display: block;
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-       margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-       font-size: 1.5em;
-       margin-bottom: 0.5em;
-       padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-       padding-left: 1.75em;
-       line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       left: 0;
-       top: 0.25em;
-       width: 2em;
-       height: 2em;
-}
-.oo-ui-gridLayout {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout {
-       position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-       padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-       display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-       display: block;
-       position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-       z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-       /* @noflip */
-       margin-left: 1.25em;
-       font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-       display: inline-block;
-       vertical-align: middle;
-       margin: 0.3em;
-       border-radius: 0.25em;
-       border: solid 1px transparent;
-       -webkit-transition: border-color 300ms ease-in-out;
-          -moz-transition: border-color 300ms ease-in-out;
-           -ms-transition: border-color 300ms ease-in-out;
-            -o-transition: border-color 300ms ease-in-out;
-               transition: border-color 300ms ease-in-out;
-}
-.oo-ui-toolGroup-empty {
-       display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #000000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       display: inline-block;
-       position: relative;
-       vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-       display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       margin: -1px 0 -1px -1px;
-       border: solid 1px transparent;
-}
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-       border-top-left-radius: 0.25em;
-       border-bottom-left-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-       margin-right: -1px;
-       border-top-right-radius: 0.25em;
-       border-bottom-right-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       height: 1.5em;
-       padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 1.5em;
-       width: 1.5em;
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.2);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-left-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-       position: relative;
-       height: 2em;
-       min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-       display: block;
-       cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-       cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       display: none;
-       position: absolute;
-       z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-       display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-       left: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-       right: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       display: table-cell;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       text-align: right;
-       padding-right: 2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
-       padding-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-       min-width: 3.5em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 1em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-right: 2.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2em;
-       height: 2em;
-       opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-popupToolGroup-header {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 0.6em;
-       font-weight: bold;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-       border-bottom-left-radius: 0;
-       border-bottom-right-radius: 0;
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       top: 2em;
-       margin: 0 -1px;
-       border: solid 1px #cccccc;
-       background-color: white;
-       box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 2em;
-       width: 2em;
-       margin-right: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       line-height: 2em;
-       font-size: 0.8em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #888888;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em;
-}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       border: solid 1px transparent;
-       margin: -1px 0;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.1);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-top-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #dddddd;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-       display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-       min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.25);
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-       border-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-toolbar {
-       clear: both;
-}
-.oo-ui-toolbar-bar {
-       line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-       float: right;
-}
-.oo-ui-toolbar-tools {
-       display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-       -webkit-touch-callout: default;
-       -webkit-user-select: all;
-          -moz-user-select: all;
-           -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: solid 1px #cccccc;
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
-       background: none;
-}
-.oo-ui-toolbar-shadow {
-       background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-       bottom: -9px;
-       height: 9px;
-       opacity: 0.125;
-       -webkit-transition: opacity 500ms ease-in-out;
-          -moz-transition: opacity 500ms ease-in-out;
-           -ms-transition: opacity 500ms ease-in-out;
-            -o-transition: opacity 500ms ease-in-out;
-               transition: opacity 500ms ease-in-out;
-}
-.oo-ui-optionWidget {
-       position: relative;
-       display: block;
-       cursor: pointer;
-       padding: 0.25em 0.5em;
-       border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-       background-color: #e1f3ff;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-decoratedOptionWidget {
-       padding: 0.5em 2em 0.5em 3em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       top: 50%;
-       width: 2em;
-       height: 2em;
-       margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-       left: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       right: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-left: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-radioSelectWidget {
-       padding: 0.75em 0 0.5em 0;
-}
-.oo-ui-buttonOptionWidget {
-       display: inline-block;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       position: static;
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       height: 1.9em;
-       margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget {
-       cursor: default;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
-.oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
-       padding: 0 0.5em;
-}
-.oo-ui-labelWidget {
-       display: inline-block;
-       padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-bottom: -1px;
-       margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-       position: relative;
-       display: inline-block;
-       vertical-align: middle;
-       overflow: hidden;
-       cursor: pointer;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       -webkit-transform: translateZ(0px);
-          -moz-transform: translateZ(0px);
-           -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
-               transform: translateZ(0px);
-       height: 2em;
-       width: 4em;
-       border-radius: 1em;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border: solid 1px #cccccc;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       position: absolute;
-       display: block;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: none;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       opacity: 0.5;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.25em;
-       left: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-       margin-top: -1px;
-       border-radius: 1em;
-       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       border-radius: 1em;
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-transition: opacity 200ms ease-in-out;
-          -moz-transition: opacity 200ms ease-in-out;
-           -ms-transition: opacity 200ms ease-in-out;
-            -o-transition: opacity 200ms ease-in-out;
-               transition: opacity 200ms ease-in-out;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-       opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2.25em;
-       margin-left: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: block;
-       opacity: 0;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.25em;
-       margin-left: 0;
-}
-.oo-ui-progressBarWidget {
-       max-width: 50em;
-       border: solid 1px #a6cee1;
-       border-radius: 0.25em;
-       overflow: hidden;
-}
-.oo-ui-progressBarWidget-bar {
-       height: 1em;
-       border-right: solid 1px #a6cee1;
-       -webkit-transition: width 200ms, margin-left 200ms;
-          -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
-               transition: width 200ms, margin-left 200ms;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
-       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-       width: 40%;
-       margin-left: -10%;
-       border-left: solid 1px #a6cee1;
-}
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-       opacity: 0.6;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-popupWidget {
-       position: absolute;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-popupWidget-popup {
-       position: relative;
-       overflow: hidden;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-       display: none;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-       display: block;
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       float: left;
-       cursor: default;
-}
-.oo-ui-popupWidget-body {
-       clear: both;
-       overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-       border: solid 1px #cccccc;
-       border-radius: 0.25em;
-       background-color: #ffffff;
-       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       content: "";
-       position: absolute;
-       width: 0;
-       height: 0;
-       border-style: solid;
-       border-color: transparent;
-       border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-       bottom: -8px;
-       left: -7px;
-       border-bottom-color: #aaaaaa;
-       border-width: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -8px;
-       left: -6px;
-       border-bottom-color: #ffffff;
-       border-width: 6px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-       height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupWidget-body-padded {
-       padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-       position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-       position: absolute;
-       cursor: auto;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-       left: 1em;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-       left: 1.25em;
-}
-.oo-ui-textInputWidget {
-       position: relative;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       display: inline-block;
-       width: 100%;
-       resize: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       top: 0;
-       height: 100%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-       left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       padding: 0.5em;
-       font-size: 1em;
-       font-family: sans-serif;
-       background-color: #ffffff;
-       color: black;
-       border: solid 1px #cccccc;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border-radius: 0.25em;
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-          -moz-transition: border-color 200ms, box-shadow 200ms;
-           -ms-transition: border-color 200ms, box-shadow 200ms;
-            -o-transition: border-color 200ms, box-shadow 200ms;
-               transition: border-color 200ms, box-shadow 200ms;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-       outline: none;
-       border-color: #a7dcff;
-       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-       color: #777777;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
-       opacity: 0.8;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       width: 2em;
-       background-position: right center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.5em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 1.5em;
-       background-position: left center;
-}
-.oo-ui-menuSelectWidget {
-       position: absolute;
-       background: #ffffff;
-       margin-top: -1px;
-       border: solid 1px #cccccc;
-       border-radius: 0 0 0.25em 0.25em;
-       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuSelectWidget input {
-       position: absolute;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-       opacity: 0;
-}
-.oo-ui-menuOptionWidget {
-       position: relative;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuSectionOptionWidget {
-       cursor: default;
-       padding: 0.33em 0.75em;
-       color: #888888;
-}
-.oo-ui-dropdownWidget {
-       position: relative;
-       display: inline-block;
-       margin: 0.25em 0;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-dropdownWidget-handle {
-       width: 100%;
-       display: inline-block;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       -webkit-box-sizing: border-box;
-          -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 {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
-       z-index: 1;
-       width: 100%;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       cursor: default;
-}
-.oo-ui-dropdownWidget-handle {
-       height: 2.5em;
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-dropdownWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       line-height: 2.5em;
-       margin: 0 0.5em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2.5em;
-       height: 2.5em;
-       opacity: 0.8;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-       opacity: 0.2;
-}
-.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-right: 2em;
-}
-.oo-ui-outlineOptionWidget {
-       position: relative;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       font-size: 1.1em;
-       padding: 0.75em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-       padding-right: 1.5em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget-level-0 {
-       padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-       left: 1em;
-}
-.oo-ui-outlineOptionWidget-level-1 {
-       padding-left: 5em;
-}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
-       left: 2.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 {
-       padding-left: 6.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-       left: 4em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
-       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-placeholder {
-       font-style: italic;
-}
-.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: #777777;
-}
-.oo-ui-outlineControlsWidget {
-       height: 3em;
-       background-color: #ffffff;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       float: left;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       float: left;
-       background-position: right center;
-       background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       height: 2em;
-       margin: 0.5em;
-       padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       width: 1.5em;
-       height: 2em;
-       margin: 0.5em 0 0.5em 0.5em;
-       opacity: 0.2;
-}
-.oo-ui-outlineControlsWidget-items {
-       margin-left: 0;
-}
-.oo-ui-comboBoxWidget {
-       display: inline-block;
-       position: relative;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       width: 100%;
-       z-index: 1;
-}
-.oo-ui-comboBoxWidget-handle {
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-comboBoxWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       cursor: default;
-       opacity: 0.2;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       margin-top: -3px;
-}
-.oo-ui-searchWidget-query {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       width: 100%;
-}
-.oo-ui-searchWidget-results {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-       height: 4em;
-       padding: 0 1em;
-       box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-       top: 4em;
-       padding: 1em;
-       line-height: 0;
-}
-.oo-ui-window {
-       line-height: 1em;
-}
-.oo-ui-window-frame {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-}
-.oo-ui-window-content:focus {
-       outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-window-body {
-       margin: 0;
-       padding: 0;
-       background: none;
-}
-.oo-ui-window-overlay,
-.oo-ui-window-inner-overlay {
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-window,
-.oo-ui-window-isolated {
-       background-color: transparent;
-       background-image: none;
-       font-family: sans-serif;
-       font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       position: absolute;
-       left: 0;
-       right: 0;
-       overflow: hidden;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-       z-index: 1;
-       top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       z-index: 2;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       z-index: 1;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-inner-overlay {
-       z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-messageDialog-actions-horizontal {
-       display: table;
-       table-layout: fixed;
-       width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       display: table-cell;
-       width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-       display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       display: block;
-       overflow: hidden;
-       text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       position: relative;
-       text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-       position: relative;
-       top: auto;
-       bottom: auto;
-       display: inline;
-       white-space: nowrap;
-}
-.oo-ui-messageDialog-content .oo-ui-window-body {
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-       display: block;
-       text-align: center;
-       padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-       font-size: 1.5em;
-       line-height: 1em;
-       color: #000000;
-}
-.oo-ui-messageDialog-message {
-       font-size: 0.9em;
-       line-height: 1.25em;
-       color: #666666;
-}
-.oo-ui-messageDialog-message-verbose {
-       font-size: 1.1em;
-       line-height: 1.5em;
-       text-align: left;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       border-right: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-       border-right-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-       border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       height: 3.4em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       text-align: center;
-       line-height: 3.4em;
-       padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-       overflow: hidden;
-       text-overflow: ellipsis;
-       white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-       display: inline;
-       padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-       white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-       left: 0;
-}
-.oo-ui-processDialog-actions-primary {
-       right: 0;
-}
-.oo-ui-processDialog-errors {
-       display: none;
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-       z-index: 2;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-       height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-       top: 3.4em;
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-processDialog-navigation {
-       position: relative;
-       height: 3.4em;
-       padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-       padding: 0.75em 0;
-       height: 1.9em;
-       cursor: default;
-       text-align: center;
-}
-.oo-ui-processDialog-title {
-       font-weight: bold;
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       min-width: 1.9em;
-       min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em 0 0.75em 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       padding: 0 1em;
-       vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-       min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-       background-color: rgba(255, 255, 255, 0.9);
-       padding: 3em 3em 1.5em 3em;
-       text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-       margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-       font-size: 1.5em;
-       color: #000000;
-       margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-       text-align: left;
-       margin: 1em;
-       padding: 1em;
-       border: solid 1px #ff9e9e;
-       background-color: #fff7f7;
-       border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       position: fixed;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       width: auto;
-       height: auto;
-       top: 0;
-       right: 0;
-       bottom: 0;
-       left: 0;
-       padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       position: absolute;
-       right: 0;
-       left: 0;
-       margin: auto;
-       overflow: hidden;
-       max-width: 100%;
-       max-height: 100%;
-       visibility: visible;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       visibility: hidden;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-       width: 100%;
-       height: 100%;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       background-color: rgba(255, 255, 255, 0.5);
-       opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       top: 1em;
-       bottom: 1em;
-       background-color: #ffffff;
-       -webkit-transform: scale(0.5);
-          -moz-transform: scale(0.5);
-           -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
-               transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       -webkit-transform: scale(1);
-          -moz-transform: scale(1);
-           -ms-transform: scale(1);
-            -o-transform: scale(1);
-               transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-       border: solid 1px #cccccc;
-       border-radius: 0.5em;
-       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/apex/images/icons/add.svg);
-}
-.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/apex/images/icons/advanced.svg);
-}
-.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/apex/images/icons/alert.svg);
-}
-.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/apex/images/icons/clear.svg);
-}
-.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/apex/images/icons/close.svg);
-}
-.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/apex/images/icons/code.svg);
-}
-.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/apex/images/icons/collapse.svg);
-}
-.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/apex/images/icons/comment.svg);
-}
-.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/apex/images/icons/expand.svg);
-}
-.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/apex/images/icons/help.svg);
-}
-.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/apex/images/icons/info.svg);
-}
-.oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/apex/images/icons/link.svg);
-}
-.oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/apex/images/icons/menu.svg);
-}
-.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.svg);
-}
-.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/apex/images/icons/picture.svg);
-}
-.oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.svg);
-}
-.oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.svg);
-}
-.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/apex/images/icons/remove.svg);
-}
-.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/apex/images/icons/search.svg);
-}
-.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/apex/images/icons/settings.svg);
-}
-.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/apex/images/icons/tag.svg);
-}
-.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.svg);
-}
-.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/apex/images/icons/window.svg);
-}
-.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/apex/images/indicators/alert.svg);
-}
-.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.svg);
-}
-.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.svg);
-}
-.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.svg);
-}
-.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.svg);
-}
-.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/apex/images/indicators/required.svg);
-}
-.oo-ui-texture-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-       background-image: /* @embed */ url(themes/apex/images/textures/transparency.svg);
-}
index 6fed540..764f2eb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.4.0
+ * OOjs UI v0.6.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2014 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-06T00:33:19Z
+ * Date: 2015-01-16T00:05:16Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
@@ -66,7 +66,7 @@
        cursor: pointer;
        display: inline-block;
        vertical-align: middle;
-       font-family: inherit;
+       font: inherit;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
 }
 .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 {
-       width: 2.2em;
-       height: 2.2em;
+       width: 1.9em;
+       height: 1.9em;
 }
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #dddddd;
+       color: #ffffff;
+       background: #eeeeee;
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #444444;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
        color: #598ad1;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #777777;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #015ccc;
+       box-shadow: none;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #008c6d;
+       box-shadow: none;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #a7170f;
+       box-shadow: none;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
-       padding: 0.3em 1.2em;
-       border-radius: 0.3em;
+       padding: 0.2em 0.8em;
+       border-radius: 2px;
        -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
           -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
            -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
        outline: none;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 2.2em;
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.9em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-left: -0.5em;
        margin-right: 0.3em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       color: #dddddd;
-       background: #ffffff;
-       border: solid 1px #cdcdcd;
+       color: #ffffff;
+       background: #eeeeee;
+       border: #eeeeee;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
        color: #757575;
        background-color: #ffffff;
        border: solid 1px #cdcdcd;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
        border-color: #aaaaaa;
 }
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #d0d0d0;
        border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
+       color: #0274ff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #015ccc;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #015ccc;
+       border-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #015ccc;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #008c6d;
+       border-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #008c6d;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #a7170f;
+       border-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #a7170f;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #0274ff;
        border-color: #0274ff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
        border-bottom-color: #015ccc;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #015ccc;
+       border-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #015ccc;
+       border-color: #015ccc;
+       box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #00af89;
        border-color: #00af89;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
        border-bottom-color: #008c6d;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #008c6d;
+       border-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #008c6d;
+       border-color: #008c6d;
+       box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #d11d13;
        border-color: #d11d13;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
        border-bottom-color: #a7170f;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #a7170f;
+       border-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #a7170f;
+       border-color: #a7170f;
+       box-shadow: none;
 }
 .oo-ui-clippableElement-clippable {
        -webkit-box-sizing: border-box;
        display: block;
        background: rgba(0, 0, 0, 0.4);
 }
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+.oo-ui-lookupElement > .oo-ui-menuSelectWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        width: 100%;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
        bottom: 3em;
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        padding: 1.5em;
 }
 .oo-ui-bookletLayout-outlinePanel {
        border-right: solid 1px #dddddd;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
 .oo-ui-fieldLayout:after {
        clear: both;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        display: block;
        float: left;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        text-align: right;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+       display: table;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       display: inline-block;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       display: table-cell;
        vertical-align: middle;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        display: inline-block;
 }
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+.oo-ui-fieldLayout > .oo-ui-fieldLayout-help {
        float: right;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+.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.5em;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        padding-top: 0.5em;
        margin-right: 5%;
        width: 35%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        width: 60%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       padding: 0.75em 0.5em 0.5em 0.5em;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding: 0.5em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        padding: 0.5em 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        padding: 0.5em 0;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
 .oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
        color: #cccccc;
 }
+.oo-ui-actionFieldLayout-field {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-actionFieldLayout-input,
+.oo-ui-actionFieldLayout-button {
+       display: table-cell;
+       vertical-align: middle;
+}
+.oo-ui-actionFieldLayout-input {
+       padding-right: 1em;
+}
+.oo-ui-actionFieldLayout-button {
+       width: 1%;
+}
 .oo-ui-fieldsetLayout {
        position: relative;
        margin: 0;
        margin-top: 2em;
 }
 .oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-       font-size: 1.5em;
+       font-size: 1.1em;
        margin-bottom: 0.5em;
        padding: 0.25em 0;
+       font-weight: bold;
 }
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
        padding-left: 1.75em;
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
        left: 0;
        top: 0.25em;
-       width: 2em;
-       height: 2em;
+       width: 1.5em;
+       height: 1.5em;
 }
 .oo-ui-gridLayout {
        position: absolute;
 .oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #000000;
 }
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #888888;
 }
 .oo-ui-barToolGroup > .oo-ui-iconElement-icon,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        display: none;
 }
 .oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
        right: 0;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
+.oo-ui-popupToolGroup .oo-ui-tool-link {
+       display: table;
+       width: 100%;
        vertical-align: middle;
+       white-space: nowrap;
+       text-decoration: none;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
        display: table-cell;
+       vertical-align: middle;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        text-align: right;
-       padding-right: 2.5em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
        padding-left: 3em;
 }
 .oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        height: 2em;
        width: 2em;
-       margin-right: 0.25em;
+       min-width: 2em;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       padding-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        line-height: 2em;
        font-size: 0.8em;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
+       display: block;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       padding: 0 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
+       padding: 0 0.5em 0 0.25em;
 }
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
 }
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled,
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+       background-color: #d0d0d0;
+}
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #dddddd;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
 .oo-ui-listToolGroup .oo-ui-toolGroup-tools {
        padding: 0.25em 0 0.25em 0;
        border: 1px solid #aaaaaa;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
 }
 .oo-ui-menuToolGroup {
        border: solid 1px #cccccc;
        display: block;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
        margin-left: -1px;
        padding: 0.25em 0 0.25em 0;
        border: 1px solid #aaaaaa;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
 }
 .oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
        border-color: #aaaaaa;
 .oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
        border-color: #aaaaaa;
 }
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
+.oo-ui-menuToolGroup .oo-ui-tool {
+       padding: 0 0.75em 0 0.25em;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        background-image: none;
        background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #e1f3ff;
+       background-color: #eeeeee;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
        pointer-events: none;
 }
 .oo-ui-toolbar-bar {
-       border-bottom: solid 1px #cccccc;
+       border-bottom: solid 4px rgba(0, 0, 0, 0.15);
        background: #ffffff;
 }
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
        display: none;
 }
 .oo-ui-selectWidget {
-       border-radius: 0.3em;
+       border-radius: 2px;
 }
 .oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
        border-radius: 0;
        margin-left: -1px;
 }
 .oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
        margin-left: 0;
 }
 .oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
 }
 .oo-ui-optionWidget {
        position: relative;
 }
 .oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
 .oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #a7dcff;
+       background-color: #d0d0d0;
 }
 .oo-ui-optionWidget.oo-ui-widget-disabled {
        color: #cccccc;
 .oo-ui-buttonSelectWidget {
        display: inline-block;
        white-space: nowrap;
-       border-radius: 0.3em;
+       border-radius: 2px;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
        border-radius: 0;
        margin-left: -1px;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
        margin-left: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
 }
 .oo-ui-radioSelectWidget {
        padding: 0.75em 0 0.5em 0;
        vertical-align: middle;
 }
 .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 2.2em;
+       height: 1.9em;
 }
 .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       height: 2.2em;
+       height: 1.9em;
        margin-top: 0;
 }
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
        background-position: center center;
        background-repeat: no-repeat;
        line-height: 2.5em;
-       height: 2.2em;
-       width: 2.2em;
+       height: 1.9em;
+       width: 1.9em;
 }
 .oo-ui-iconWidget.oo-ui-widget-disabled {
        opacity: 0.2;
        background-position: center center;
        background-repeat: no-repeat;
        line-height: 2.5em;
-       height: 2.2em;
-       width: 2.2em;
+       height: 1.9em;
+       width: 1.9em;
 }
 .oo-ui-indicatorWidget.oo-ui-widget-disabled {
        opacity: 0.2;
 .oo-ui-buttonGroupWidget {
        display: inline-block;
        white-space: nowrap;
-       border-radius: 0.3em;
+       border-radius: 2px;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        border-radius: 0;
-       margin-bottom: -1px;
        margin-left: -1px;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
        margin-left: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
 }
 .oo-ui-toggleSwitchWidget {
        position: relative;
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 7px;
+       margin-top: 9px;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
        border-top: 0;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-       bottom: -8px;
-       left: -13px;
+       bottom: -10px;
+       left: -9px;
        border-bottom-color: #888888;
-       border-width: 13px;
+       border-width: 10px;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -8px;
-       left: -12px;
+       bottom: -10px;
+       left: -8px;
        border-bottom-color: #ffffff;
-       border-width: 12px;
+       border-width: 9px;
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
        -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
 .oo-ui-popupWidget-head .oo-ui-labelElement-label {
        margin: 0.75em 1em;
 }
-.oo-ui-popupWidget-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
 .oo-ui-popupWidget-body-padded {
        padding: 0 1em;
 }
 }
 .oo-ui-checkboxInputWidget {
        position: relative;
-       line-height: 1.6em;
+       line-height: 2em;
+       white-space: nowrap;
 }
 .oo-ui-checkboxInputWidget * {
+       font: inherit;
        vertical-align: middle;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] {
        opacity: 0;
-       width: 1.6em;
-       height: 1.6em;
+       margin: 0;
+       width: 2em;
+       height: 2em;
        max-width: none;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
        margin: 0 0.4em;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span::before {
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        content: "";
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
        position: absolute;
        left: 0;
-       border-radius: 0.3em;
-       width: 1.6em;
-       height: 1.6em;
-       background-color: #ffffff;
-       border: 1px solid grey;
-}
-.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span::before {
+       border-radius: 2px;
+       width: 2em;
+       height: 2em;
+       background-color: white;
+       border: 1px solid #777777;
        background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
-       background-size: 1.6em, 1.6em;
+       background-size: 2em, 2em;
        background-repeat: no-repeat;
-       background-position: center top;
+       background-position: center center;
+       background-origin: border-box;
+       background-size: 0 0;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span::before {
+       background-size: 100% 100%;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span::before {
+       background-color: #dddddd;
+       border-color: #dddddd;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span::before {
+       border-width: 2px;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus:hover + span::before,
+.oo-ui-checkboxInputWidget input[type="checkbox"]:hover + span::before {
+       border-bottom-width: 3px;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span::before {
+       cursor: default;
+       background-color: #eeeeee;
+       border-color: #eeeeee;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled:checked + span::before {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
+}
+.oo-ui-radioInputWidget {
+       position: relative;
+       line-height: 2em;
+       white-space: nowrap;
+}
+.oo-ui-radioInputWidget * {
+       font: inherit;
+       vertical-align: middle;
+}
+.oo-ui-radioInputWidget input[type="radio"] {
+       opacity: 0;
+       margin: 0;
+       width: 2em;
+       height: 2em;
+       max-width: none;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span::after,
-.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span::after {
+.oo-ui-radioInputWidget input[type="radio"] + span {
+       cursor: pointer;
+       margin: 0 0.4em;
+}
+.oo-ui-radioInputWidget input[type="radio"] + span::before {
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        content: "";
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
        position: absolute;
-       width: 1.6em;
-       height: 1.5em;
-       left: 1px;
-       border-bottom: solid 0.2em #d3d3d3;
+       left: 0;
+       border-radius: 100%;
+       width: 2em;
+       height: 2em;
+       background: white;
+       border: 1px solid #777777;
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-constructive.svg);
+       background-repeat: no-repeat;
+       background-position: center center;
+       background-origin: border-box;
+       background-size: 0 0;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span::before {
+.oo-ui-radioInputWidget input[type="radio"]:checked + span::before {
+       background-size: 100% 100%;
+}
+.oo-ui-radioInputWidget input[type="radio"]:active + span::before {
+       background-color: #dddddd;
+       border-color: #dddddd;
+}
+.oo-ui-radioInputWidget input[type="radio"]:focus + span::before {
+       border-width: 2px;
+}
+.oo-ui-radioInputWidget input[type="radio"]:focus:hover + span::before,
+.oo-ui-radioInputWidget input[type="radio"]:hover + span::before {
+       border-bottom-width: 3px;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled + span::before {
        cursor: default;
-       background-color: lightgrey;
+       background-color: #eeeeee;
+       border-color: #eeeeee;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled:checked + span::before {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-invert.svg);
 }
 .oo-ui-textInputWidget {
        position: relative;
+       vertical-align: middle;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 2.2em;
+       padding-right: 1.9em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 1.6em;
        color: #888888;
 }
 .oo-ui-dropdownWidget {
-       position: relative;
        display: inline-block;
+       position: relative;
        margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
+.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
           -moz-user-select: none;
            -ms-user-select: none;
                user-select: none;
+       font-size: 1.1em;
+       padding: 0.75em;
+}
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       opacity: 0.5;
+}
+.oo-ui-outlineOptionWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-outlineOptionWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-outlineOptionWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
+       background-color: #d0d0d0;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
+       font-weight: bold;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
+       font-style: italic;
+}
+.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: #777777;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+       background-color: #ffffff;
 }
 .oo-ui-outlineControlsWidget-items,
 .oo-ui-outlineControlsWidget-movers {
 .oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
        float: right;
 }
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em 0.5em 0.5em 0;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+       opacity: 0.2;
+}
 .oo-ui-comboBoxWidget {
        display: inline-block;
        position: relative;
        width: 100%;
        max-width: 50em;
 }
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       width: 100%;
+.oo-ui-comboBoxWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
+       width: 100%;
 }
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
        height: 2.35em;
 }
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
-       padding-right: 2.2em;
+       padding-right: 1.9em;
 }
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 2.2em;
+       width: 1.9em;
        background-position: center center;
        border: solid 1px #cccccc;
        border-left: none;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-searchWidget {
+       border: solid 1px #cccccc;
+}
 .oo-ui-searchWidget-query {
        position: absolute;
        top: 0;
        overflow-y: auto;
 }
 .oo-ui-searchWidget-query {
-       height: 2.4em;
-       top: 1px;
+       height: 4em;
+       padding: 0 1em;
+       border-bottom: solid 1px #cccccc;
 }
-.oo-ui-searchWidget-query .oo-ui-textInputWidget input {
-       border-width: 1px 0;
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
 }
 .oo-ui-searchWidget-results {
-       top: 2.2em;
-       bottom: 0.2em;
+       top: 4em;
+       padding: 1em;
        line-height: 0;
 }
 .oo-ui-window {
        z-index: 3;
 }
 .oo-ui-dialog-content > .oo-ui-window-body {
-       box-shadow: 0 0 1px 0 #aaaaaa;
+       outline: 1px solid #aaaaaa;
 }
 .oo-ui-messageDialog-actions-horizontal {
        display: table;
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
        background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
        background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
        font-weight: bold;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
 }
 .oo-ui-processDialog-content .oo-ui-window-body {
        top: 3.4em;
-       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
+       outline: 1px solid rgba(0, 0, 0, 0.2);
 }
 .oo-ui-processDialog-navigation {
        position: relative;
        /* Adjust for border so text aligns with title */
        margin: -1px;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
        background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
        font-weight: bold;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
 .oo-ui-image-invert.oo-ui-icon-link {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.png);
 }
+.oo-ui-icon-lock {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/lock.png);
+}
+.oo-ui-image-invert .oo-ui-icon-lock,
+.oo-ui-image-invert.oo-ui-icon-lock {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/lock-invert.png);
+}
 .oo-ui-icon-menu {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.png);
 }
 .oo-ui-image-invert.oo-ui-icon-previous {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.png);
 }
+.oo-ui-icon-circle {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle.png);
+}
+.oo-ui-image-constructive .oo-ui-icon-circle,
+.oo-ui-image-constructive.oo-ui-icon-circle {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-constructive.png);
+}
+.oo-ui-image-invert .oo-ui-icon-circle,
+.oo-ui-image-invert.oo-ui-icon-circle {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-invert.png);
+}
 .oo-ui-icon-redo {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.png);
 }
index 5bb3691..a0a5a32 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.4.0
+ * OOjs UI v0.6.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2014 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-06T00:33:09Z
+ * Date: 2015-01-16T00:05:04Z
  */
 /**
  * @class
@@ -33,7 +33,7 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        var variant,
                variants = {
                        invert: false,
-                       primary: false,
+                       progressive: false,
                        constructive: false,
                        destructive: false
                },
@@ -41,16 +41,10 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
                classes = OO.ui.MediaWikiTheme.super.prototype.getElementClasses.call( this, element );
 
        if ( element.supports( [ 'isFramed', 'isDisabled', 'hasFlag' ] ) ) {
-               if ( element.isFramed() && !element.isDisabled() ) {
-                       if (
-                               element.hasFlag( 'primary' ) ||
-                               element.hasFlag( 'constructive' ) ||
-                               element.hasFlag( 'destructive' )
-                       ) {
-                               variants.invert = true;
-                       }
+               if ( !element.isDisabled() && element.isFramed() && element.hasFlag( 'primary' ) ) {
+                       variants.invert = true;
                } else {
-                       variants.primary = element.hasFlag( 'primary' );
+                       variants.progressive = element.hasFlag( 'progressive' );
                        variants.constructive = element.hasFlag( 'constructive' );
                        variants.destructive = element.hasFlag( 'destructive' );
                }
index 2eb4746..474304b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.4.0
+ * OOjs UI v0.6.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2014 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-06T00:33:19Z
+ * Date: 2015-01-16T00:05:16Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
@@ -66,7 +66,7 @@
        cursor: pointer;
        display: inline-block;
        vertical-align: middle;
-       font-family: inherit;
+       font: inherit;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
 }
 .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 {
-       width: 2.2em;
-       height: 2.2em;
+       width: 1.9em;
+       height: 1.9em;
 }
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #dddddd;
+       color: #ffffff;
+       background: #eeeeee;
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #444444;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
        color: #598ad1;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #777777;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #015ccc;
+       box-shadow: none;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #008c6d;
+       box-shadow: none;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #a7170f;
+       box-shadow: none;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
-       padding: 0.3em 1.2em;
-       border-radius: 0.3em;
+       padding: 0.2em 0.8em;
+       border-radius: 2px;
        -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
           -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
            -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
        outline: none;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 2.2em;
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.9em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-left: -0.5em;
        margin-right: 0.3em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       color: #dddddd;
-       background: #ffffff;
-       border: solid 1px #cdcdcd;
+       color: #ffffff;
+       background: #eeeeee;
+       border: #eeeeee;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
        color: #757575;
        background-color: #ffffff;
        border: solid 1px #cdcdcd;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
        border-color: #aaaaaa;
 }
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #d0d0d0;
        border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
+       color: #0274ff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #015ccc;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #015ccc;
+       border-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #015ccc;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #008c6d;
+       border-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #008c6d;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #a7170f;
+       border-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #a7170f;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #0274ff;
        border-color: #0274ff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
        border-bottom-color: #015ccc;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #015ccc;
+       border-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #015ccc;
+       border-color: #015ccc;
+       box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #00af89;
        border-color: #00af89;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
        border-bottom-color: #008c6d;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #008c6d;
+       border-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #008c6d;
+       border-color: #008c6d;
+       box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #d11d13;
        border-color: #d11d13;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
        box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
        border-bottom-color: #a7170f;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #a7170f;
+       border-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #a7170f;
+       border-color: #a7170f;
+       box-shadow: none;
 }
 .oo-ui-clippableElement-clippable {
        -webkit-box-sizing: border-box;
        display: block;
        background: rgba(0, 0, 0, 0.4);
 }
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+.oo-ui-lookupElement > .oo-ui-menuSelectWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        width: 100%;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
        bottom: 3em;
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        padding: 1.5em;
 }
 .oo-ui-bookletLayout-outlinePanel {
        border-right: solid 1px #dddddd;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
 .oo-ui-fieldLayout:after {
        clear: both;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        display: block;
        float: left;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        text-align: right;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+       display: table;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       display: inline-block;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       display: table-cell;
        vertical-align: middle;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        display: inline-block;
 }
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+.oo-ui-fieldLayout > .oo-ui-fieldLayout-help {
        float: right;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+.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.5em;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        padding-top: 0.5em;
        margin-right: 5%;
        width: 35%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        width: 60%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-       padding: 0.75em 0.5em 0.5em 0.5em;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding: 0.5em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        padding: 0.5em 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
        padding: 0.5em 0;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
 .oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
        color: #cccccc;
 }
+.oo-ui-actionFieldLayout-field {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-actionFieldLayout-input,
+.oo-ui-actionFieldLayout-button {
+       display: table-cell;
+       vertical-align: middle;
+}
+.oo-ui-actionFieldLayout-input {
+       padding-right: 1em;
+}
+.oo-ui-actionFieldLayout-button {
+       width: 1%;
+}
 .oo-ui-fieldsetLayout {
        position: relative;
        margin: 0;
        margin-top: 2em;
 }
 .oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-       font-size: 1.5em;
+       font-size: 1.1em;
        margin-bottom: 0.5em;
        padding: 0.25em 0;
+       font-weight: bold;
 }
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
        padding-left: 1.75em;
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
        left: 0;
        top: 0.25em;
-       width: 2em;
-       height: 2em;
+       width: 1.5em;
+       height: 1.5em;
 }
 .oo-ui-gridLayout {
        position: absolute;
 .oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #000000;
 }
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #888888;
 }
 .oo-ui-barToolGroup > .oo-ui-iconElement-icon,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        display: none;
 }
 .oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
        right: 0;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
+.oo-ui-popupToolGroup .oo-ui-tool-link {
+       display: table;
+       width: 100%;
        vertical-align: middle;
+       white-space: nowrap;
+       text-decoration: none;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
        display: table-cell;
+       vertical-align: middle;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        text-align: right;
-       padding-right: 2.5em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
        padding-left: 3em;
 }
 .oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        height: 2em;
        width: 2em;
-       margin-right: 0.25em;
+       min-width: 2em;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       padding-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        line-height: 2em;
        font-size: 0.8em;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
+       display: block;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       padding: 0 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
+       padding: 0 0.5em 0 0.25em;
 }
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
 }
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled,
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+       background-color: #d0d0d0;
+}
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #dddddd;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
 .oo-ui-listToolGroup .oo-ui-toolGroup-tools {
        padding: 0.25em 0 0.25em 0;
        border: 1px solid #aaaaaa;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
 }
 .oo-ui-menuToolGroup {
        border: solid 1px #cccccc;
        display: block;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
        margin-left: -1px;
        padding: 0.25em 0 0.25em 0;
        border: 1px solid #aaaaaa;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
 }
 .oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
        border-color: #aaaaaa;
 .oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
        border-color: #aaaaaa;
 }
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
+.oo-ui-menuToolGroup .oo-ui-tool {
+       padding: 0 0.75em 0 0.25em;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        background-image: none;
        background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #e1f3ff;
+       background-color: #eeeeee;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
        pointer-events: none;
 }
 .oo-ui-toolbar-bar {
-       border-bottom: solid 1px #cccccc;
+       border-bottom: solid 4px rgba(0, 0, 0, 0.15);
        background: #ffffff;
 }
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
        display: none;
 }
 .oo-ui-selectWidget {
-       border-radius: 0.3em;
+       border-radius: 2px;
 }
 .oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
        border-radius: 0;
        margin-left: -1px;
 }
 .oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
        margin-left: 0;
 }
 .oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
 }
 .oo-ui-optionWidget {
        position: relative;
 }
 .oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
 .oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #a7dcff;
+       background-color: #d0d0d0;
 }
 .oo-ui-optionWidget.oo-ui-widget-disabled {
        color: #cccccc;
 .oo-ui-buttonSelectWidget {
        display: inline-block;
        white-space: nowrap;
-       border-radius: 0.3em;
+       border-radius: 2px;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
        border-radius: 0;
        margin-left: -1px;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
        margin-left: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
 }
 .oo-ui-radioSelectWidget {
        padding: 0.75em 0 0.5em 0;
        vertical-align: middle;
 }
 .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 2.2em;
+       height: 1.9em;
 }
 .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       height: 2.2em;
+       height: 1.9em;
        margin-top: 0;
 }
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
        background-position: center center;
        background-repeat: no-repeat;
        line-height: 2.5em;
-       height: 2.2em;
-       width: 2.2em;
+       height: 1.9em;
+       width: 1.9em;
 }
 .oo-ui-iconWidget.oo-ui-widget-disabled {
        opacity: 0.2;
        background-position: center center;
        background-repeat: no-repeat;
        line-height: 2.5em;
-       height: 2.2em;
-       width: 2.2em;
+       height: 1.9em;
+       width: 1.9em;
 }
 .oo-ui-indicatorWidget.oo-ui-widget-disabled {
        opacity: 0.2;
 .oo-ui-buttonGroupWidget {
        display: inline-block;
        white-space: nowrap;
-       border-radius: 0.3em;
+       border-radius: 2px;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        border-radius: 0;
-       margin-bottom: -1px;
        margin-left: -1px;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
        margin-left: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
 }
 .oo-ui-toggleSwitchWidget {
        position: relative;
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 7px;
+       margin-top: 9px;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
        border-top: 0;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-       bottom: -8px;
-       left: -13px;
+       bottom: -10px;
+       left: -9px;
        border-bottom-color: #888888;
-       border-width: 13px;
+       border-width: 10px;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -8px;
-       left: -12px;
+       bottom: -10px;
+       left: -8px;
        border-bottom-color: #ffffff;
-       border-width: 12px;
+       border-width: 9px;
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
        -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
 .oo-ui-popupWidget-head .oo-ui-labelElement-label {
        margin: 0.75em 1em;
 }
-.oo-ui-popupWidget-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
 .oo-ui-popupWidget-body-padded {
        padding: 0 1em;
 }
 }
 .oo-ui-checkboxInputWidget {
        position: relative;
-       line-height: 1.6em;
+       line-height: 2em;
+       white-space: nowrap;
 }
 .oo-ui-checkboxInputWidget * {
+       font: inherit;
        vertical-align: middle;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] {
        opacity: 0;
-       width: 1.6em;
-       height: 1.6em;
+       margin: 0;
+       width: 2em;
+       height: 2em;
        max-width: none;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
        margin: 0 0.4em;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span::before {
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        content: "";
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
        position: absolute;
        left: 0;
-       border-radius: 0.3em;
-       width: 1.6em;
-       height: 1.6em;
-       background-color: #ffffff;
-       border: 1px solid grey;
-}
-.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span::before {
+       border-radius: 2px;
+       width: 2em;
+       height: 2em;
+       background-color: white;
+       border: 1px solid #777777;
        background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
-       background-size: 1.6em, 1.6em;
+       background-size: 2em, 2em;
        background-repeat: no-repeat;
-       background-position: center top;
+       background-position: center center;
+       background-origin: border-box;
+       background-size: 0 0;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span::before {
+       background-size: 100% 100%;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span::after,
-.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span::after {
+.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span::before {
+       background-color: #dddddd;
+       border-color: #dddddd;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span::before {
+       border-width: 2px;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus:hover + span::before,
+.oo-ui-checkboxInputWidget input[type="checkbox"]:hover + span::before {
+       border-bottom-width: 3px;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span::before {
+       cursor: default;
+       background-color: #eeeeee;
+       border-color: #eeeeee;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled:checked + span::before {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
+}
+.oo-ui-radioInputWidget {
+       position: relative;
+       line-height: 2em;
+       white-space: nowrap;
+}
+.oo-ui-radioInputWidget * {
+       font: inherit;
+       vertical-align: middle;
+}
+.oo-ui-radioInputWidget input[type="radio"] {
+       opacity: 0;
+       margin: 0;
+       width: 2em;
+       height: 2em;
+       max-width: none;
+}
+.oo-ui-radioInputWidget input[type="radio"] + span {
+       cursor: pointer;
+       margin: 0 0.4em;
+}
+.oo-ui-radioInputWidget input[type="radio"] + span::before {
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        content: "";
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
        position: absolute;
-       width: 1.6em;
-       height: 1.5em;
-       left: 1px;
-       border-bottom: solid 0.2em #d3d3d3;
+       left: 0;
+       border-radius: 100%;
+       width: 2em;
+       height: 2em;
+       background: white;
+       border: 1px solid #777777;
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-constructive.svg);
+       background-repeat: no-repeat;
+       background-position: center center;
+       background-origin: border-box;
+       background-size: 0 0;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span::before {
+.oo-ui-radioInputWidget input[type="radio"]:checked + span::before {
+       background-size: 100% 100%;
+}
+.oo-ui-radioInputWidget input[type="radio"]:active + span::before {
+       background-color: #dddddd;
+       border-color: #dddddd;
+}
+.oo-ui-radioInputWidget input[type="radio"]:focus + span::before {
+       border-width: 2px;
+}
+.oo-ui-radioInputWidget input[type="radio"]:focus:hover + span::before,
+.oo-ui-radioInputWidget input[type="radio"]:hover + span::before {
+       border-bottom-width: 3px;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled + span::before {
        cursor: default;
-       background-color: lightgrey;
+       background-color: #eeeeee;
+       border-color: #eeeeee;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled:checked + span::before {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-invert.svg);
 }
 .oo-ui-textInputWidget {
        position: relative;
+       vertical-align: middle;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 2.2em;
+       padding-right: 1.9em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 1.6em;
        color: #888888;
 }
 .oo-ui-dropdownWidget {
-       position: relative;
        display: inline-block;
+       position: relative;
        margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
+.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
           -moz-user-select: none;
            -ms-user-select: none;
                user-select: none;
+       font-size: 1.1em;
+       padding: 0.75em;
+}
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       opacity: 0.5;
+}
+.oo-ui-outlineOptionWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-outlineOptionWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-outlineOptionWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
+       background-color: #d0d0d0;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
+       font-weight: bold;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
+       font-style: italic;
+}
+.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: #777777;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+       background-color: #ffffff;
 }
 .oo-ui-outlineControlsWidget-items,
 .oo-ui-outlineControlsWidget-movers {
 .oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
        float: right;
 }
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em 0.5em 0.5em 0;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+       opacity: 0.2;
+}
 .oo-ui-comboBoxWidget {
        display: inline-block;
        position: relative;
        width: 100%;
        max-width: 50em;
 }
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       width: 100%;
+.oo-ui-comboBoxWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
+       width: 100%;
 }
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
        height: 2.35em;
 }
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
-       padding-right: 2.2em;
+       padding-right: 1.9em;
 }
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 2.2em;
+       width: 1.9em;
        background-position: center center;
        border: solid 1px #cccccc;
        border-left: none;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-searchWidget {
+       border: solid 1px #cccccc;
+}
 .oo-ui-searchWidget-query {
        position: absolute;
        top: 0;
        overflow-y: auto;
 }
 .oo-ui-searchWidget-query {
-       height: 2.4em;
-       top: 1px;
+       height: 4em;
+       padding: 0 1em;
+       border-bottom: solid 1px #cccccc;
 }
-.oo-ui-searchWidget-query .oo-ui-textInputWidget input {
-       border-width: 1px 0;
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
 }
 .oo-ui-searchWidget-results {
-       top: 2.2em;
-       bottom: 0.2em;
+       top: 4em;
+       padding: 1em;
        line-height: 0;
 }
 .oo-ui-window {
        z-index: 3;
 }
 .oo-ui-dialog-content > .oo-ui-window-body {
-       box-shadow: 0 0 1px 0 #aaaaaa;
+       outline: 1px solid #aaaaaa;
 }
 .oo-ui-messageDialog-actions-horizontal {
        display: table;
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
        background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
        background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
        font-weight: bold;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
 }
 .oo-ui-processDialog-content .oo-ui-window-body {
        top: 3.4em;
-       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
+       outline: 1px solid rgba(0, 0, 0, 0.2);
 }
 .oo-ui-processDialog-navigation {
        position: relative;
        /* Adjust for border so text aligns with title */
        margin: -1px;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
        background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
        font-weight: bold;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
 .oo-ui-image-invert.oo-ui-icon-link {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.svg);
 }
+.oo-ui-icon-lock {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/lock.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-lock,
+.oo-ui-image-invert.oo-ui-icon-lock {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/lock-invert.svg);
+}
 .oo-ui-icon-menu {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.svg);
 }
 .oo-ui-image-invert.oo-ui-icon-previous {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.svg);
 }
+.oo-ui-icon-circle {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle.svg);
+}
+.oo-ui-image-constructive .oo-ui-icon-circle,
+.oo-ui-image-constructive.oo-ui-icon-circle {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-constructive.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-circle,
+.oo-ui-image-invert.oo-ui-icon-circle {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-invert.svg);
+}
 .oo-ui-icon-redo {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.svg);
 }
index dc92f1f..e0c98d0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.4.0
+ * OOjs UI v0.6.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2014 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-06T00:33:09Z
+ * Date: 2015-01-16T00:05:04Z
  */
 ( function ( OO ) {
 
@@ -171,7 +171,8 @@ OO.ui.contains = function ( containers, contained, matchContainers ) {
         * @return {string} Translated message with parameters substituted
         */
        OO.ui.msg = function ( key ) {
-               var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
+               var message = messages[key],
+                       params = Array.prototype.slice.call( arguments, 1 );
                if ( typeof message === 'string' ) {
                        // Perform $1 substitution
                        message = message.replace( /\$(\d+)/g, function ( unused, n ) {
@@ -721,6 +722,7 @@ OO.ui.ActionSet.prototype.organize = function () {
  * @param {Object} [config] Configuration options
  * @cfg {Function} [$] jQuery for the frame the widget is in
  * @cfg {string[]} [classes] CSS class names to add
+ * @cfg {string} [id] HTML id attribute
  * @cfg {string} [text] Text to insert
  * @cfg {jQuery} [$content] Content elements to append (after text)
  * @cfg {Mixed} [data] Element data
@@ -741,6 +743,9 @@ OO.ui.Element = function OoUiElement( config ) {
        if ( $.isArray( config.classes ) ) {
                this.$element.addClass( config.classes.join( ' ' ) );
        }
+       if ( config.id ) {
+               this.$element.attr( 'id', config.id );
+       }
        if ( config.text ) {
                this.$element.text( config.text );
        }
@@ -947,10 +952,10 @@ OO.ui.Element.static.getBorders = function ( el ) {
                right = parseFloat( style ? style.borderRightWidth : $el.css( 'borderRightWidth' ) ) || 0;
 
        return {
-               top: Math.round( top ),
-               left: Math.round( left ),
-               bottom: Math.round( bottom ),
-               right: Math.round( right )
+               top: top,
+               left: left,
+               bottom: bottom,
+               right: right
        };
 };
 
@@ -999,6 +1004,38 @@ OO.ui.Element.static.getDimensions = function ( el ) {
        }
 };
 
+/**
+ * Get scrollable object parent
+ *
+ * documentElement can't be used to get or set the scrollTop
+ * property on Blink. Changing and testing its value lets us
+ * use 'body' or 'documentElement' based on what is working.
+ *
+ * https://code.google.com/p/chromium/issues/detail?id=303131
+ *
+ * @static
+ * @param {HTMLElement} el Element to find scrollable parent for
+ * @return {HTMLElement} Scrollable parent
+ */
+OO.ui.Element.static.getRootScrollableElement = function ( el ) {
+       var scrollTop, body;
+
+       if ( OO.ui.scrollableElement === undefined ) {
+               body = el.ownerDocument.body;
+               scrollTop = body.scrollTop;
+               body.scrollTop = 1;
+
+               if ( body.scrollTop === 1 ) {
+                       body.scrollTop = scrollTop;
+                       OO.ui.scrollableElement = 'body';
+               } else {
+                       OO.ui.scrollableElement = 'documentElement';
+               }
+       }
+
+       return el.ownerDocument[ OO.ui.scrollableElement ];
+};
+
 /**
  * Get closest scrollable container.
  *
@@ -1020,7 +1057,7 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
        }
 
        while ( $parent.length ) {
-               if ( $parent[0] === el.ownerDocument.body ) {
+               if ( $parent[0] === this.getRootScrollableElement( el ) ) {
                        return $parent[0];
                }
                i = props.length;
@@ -1059,8 +1096,8 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
                $win = $( this.getWindow( el ) );
 
        // Compute the distances between the edges of el and the edges of the scroll viewport
-       if ( $sc.is( 'body' ) ) {
-               // If the scrollable container is the <body> this is easy
+       if ( $sc.is( 'html, body' ) ) {
+               // If the scrollable container is the root, this is easy
                rel = {
                        top: eld.rect.top,
                        bottom: $win.innerHeight() - eld.rect.bottom,
@@ -1195,6 +1232,8 @@ OO.ui.Element.prototype.isElementAttached = function () {
  * @return {HTMLDocument} Document object
  */
 OO.ui.Element.prototype.getElementDocument = function () {
+       // Don't use this.$.context because subclasses can rebind this.$
+       // Don't cache this in other ways either because subclasses could can change this.$element
        return OO.ui.Element.static.getDocument( this.$element );
 };
 
@@ -1432,8 +1471,8 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {string} [size] Symbolic name of dialog size, `small`, `medium`, `large` or `full`; omit to
- *   use #static-size
+ * @cfg {string} [size] Symbolic name of dialog size, `small`, `medium`, `large`, `larger` or
+ *  `full`; omit to use #static-size
  */
 OO.ui.Window = function OoUiWindow( config ) {
        // Configuration initialization
@@ -1693,7 +1732,7 @@ OO.ui.Window.prototype.getManager = function () {
 /**
  * Get the window size.
  *
- * @return {string} Symbolic size name, e.g. 'small', 'medium', 'large', 'full'
+ * @return {string} Symbolic size name, e.g. `small`, `medium`, `large`, `larger`, `full`
  */
 OO.ui.Window.prototype.getSize = function () {
        return this.size;
@@ -1730,18 +1769,23 @@ OO.ui.Window.prototype.withoutSizeTransitions = function ( callback ) {
 OO.ui.Window.prototype.getContentHeight = function () {
        var bodyHeight,
                win = this,
-               styleObj = this.$frame[0].style;
+               bodyStyleObj = this.$body[0].style,
+               frameStyleObj = this.$frame[0].style;
 
        // Temporarily resize the frame so getBodyHeight() can use scrollHeight measurements.
        // Disable transitions first, otherwise we'll get values from when the window was animating.
        this.withoutSizeTransitions( function () {
-               var oldHeight = styleObj.height;
-               styleObj.height = '1px';
+               var oldHeight = frameStyleObj.height,
+                       oldPosition = bodyStyleObj.position;
+               frameStyleObj.height = '1px';
+               // Force body to resize to new width
+               bodyStyleObj.position = 'relative';
                bodyHeight = win.getBodyHeight();
-               styleObj.height = oldHeight;
+               frameStyleObj.height = oldHeight;
+               bodyStyleObj.position = oldPosition;
        } );
 
-       return Math.round(
+       return (
                // Add buffer for border
                ( this.$frame.outerHeight() - this.$frame.innerHeight() ) +
                // Use combined heights of children
@@ -1897,7 +1941,7 @@ OO.ui.Window.prototype.setManager = function ( manager ) {
        } else {
                this.$content = this.$( '<div>' );
                this.$document = $( this.getElementDocument() );
-               this.$content.addClass( 'oo-ui-window-content' );
+               this.$content.addClass( 'oo-ui-window-content' ).attr( 'tabIndex', 0 );
                this.$frame.append( this.$content );
        }
        this.toggle( false );
@@ -2339,7 +2383,8 @@ OO.ui.Dialog.static.escapable = true;
 OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
        if ( e.which === OO.ui.Keys.ESCAPE ) {
                this.close();
-               return false;
+               e.preventDefault();
+               e.stopPropagation();
        }
 };
 
@@ -2645,6 +2690,9 @@ OO.ui.WindowManager.static.sizes = {
        large: {
                width: 700
        },
+       larger: {
+               width: 900
+       },
        full: {
                // These can be non-numeric because they are never used in calculations
                width: '100%',
@@ -2691,10 +2739,9 @@ OO.ui.WindowManager.prototype.afterWindowResize = function () {
  *
  * @param {jQuery.Event} e Mouse wheel event
  */
-OO.ui.WindowManager.prototype.onWindowMouseWheel = function ( e ) {
-       // Kill all events in the parent window if the child window is isolated,
-       // or if the event didn't come from the child window
-       return !( this.shouldIsolate() || !$.contains( this.getCurrentWindow().$frame[0], e.target ) );
+OO.ui.WindowManager.prototype.onWindowMouseWheel = function () {
+       // Kill all events in the parent window if the child window is isolated
+       return !this.shouldIsolate();
 };
 
 /**
@@ -2712,9 +2759,8 @@ OO.ui.WindowManager.prototype.onDocumentKeyDown = function ( e ) {
                case OO.ui.Keys.UP:
                case OO.ui.Keys.RIGHT:
                case OO.ui.Keys.DOWN:
-                       // Kill all events in the parent window if the child window is isolated,
-                       // or if the event didn't come from the child window
-                       return !( this.shouldIsolate() || !$.contains( this.getCurrentWindow().$frame[0], e.target ) );
+                       // Kill all events in the parent window if the child window is isolated
+                       return !this.shouldIsolate();
        }
 };
 
@@ -3053,7 +3099,7 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
  *
  * Windows will be closed before they are removed.
  *
- * @param {string} name Symbolic name of window to remove
+ * @param {string[]} names Symbolic names of windows to remove
  * @return {jQuery.Promise} Promise resolved when window is closed and removed
  * @throws {Error} If windows being removed are not being managed
  */
@@ -3144,6 +3190,10 @@ OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
                                // Start listening for top-level window dimension changes
                                'orientationchange resize': this.onWindowResizeHandler
                        } );
+                       // Disable window scrolling in isolated windows
+                       if ( !this.shouldIsolate() ) {
+                               $( this.getElementDocument().body ).css( 'overflow', 'hidden' );
+                       }
                        this.globalEvents = true;
                }
        } else if ( this.globalEvents ) {
@@ -3158,6 +3208,9 @@ OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
                        // Stop listening for top-level window dimension changes
                        'orientationchange resize': this.onWindowResizeHandler
                } );
+               if ( !this.shouldIsolate() ) {
+                       $( this.getElementDocument().body ).css( 'overflow', '' );
+               }
                this.globalEvents = false;
        }
 
@@ -3192,17 +3245,15 @@ OO.ui.WindowManager.prototype.toggleAriaIsolation = function ( isolate ) {
 
 /**
  * Destroy window manager.
- *
- * Windows will not be closed, only removed from the DOM.
  */
 OO.ui.WindowManager.prototype.destroy = function () {
        this.toggleGlobalEvents( false );
        this.toggleAriaIsolation( false );
+       this.clearWindows();
        this.$element.remove();
 };
 
 /**
- * @abstract
  * @class
  *
  * @constructor
@@ -3700,7 +3751,7 @@ OO.ui.ButtonElement.prototype.setButtonElement = function ( $button ) {
                this.$button
                        .removeClass( 'oo-ui-buttonElement-button' )
                        .removeAttr( 'role accesskey tabindex' )
-                       .off( this.onMouseDownHandler );
+                       .off( 'mousedown', this.onMouseDownHandler );
        }
 
        this.$button = $button
@@ -4715,7 +4766,7 @@ OO.ui.IndicatorElement.prototype.setIndicatorElement = function ( $indicator ) {
                .addClass( 'oo-ui-indicatorElement-indicator' )
                .toggleClass( 'oo-ui-indicator-' + this.indicator, !!this.indicator );
        if ( this.indicatorTitle !== null ) {
-               this.$indicatorTitle.attr( 'title', this.indicatorTitle );
+               this.$indicator.attr( 'title', this.indicatorTitle );
        }
 };
 
@@ -4923,6 +4974,332 @@ OO.ui.LabelElement.prototype.setLabelContent = function ( label ) {
        }
 };
 
+/**
+ * Mixin that adds a menu showing suggested values for a OO.ui.TextInputWidget.
+ *
+ * Subclasses that set the value of #lookupInput from #onLookupMenuItemChoose should
+ * be aware that this will cause new suggestions to be looked up for the new value. If this is
+ * not desired, disable lookups with #setLookupsDisabled, then set the value, then re-enable lookups.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$overlay] Overlay for dropdown; defaults to relative positioning
+ * @cfg {jQuery} [$container=this.$element] Element to render menu under
+ */
+OO.ui.LookupElement = function OoUiLookupElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$overlay = config.$overlay || this.$element;
+       this.lookupMenu = new OO.ui.TextInputMenuSelectWidget( this, {
+               $: OO.ui.Element.static.getJQuery( this.$overlay ),
+               $container: config.$container
+       } );
+       this.lookupCache = {};
+       this.lookupQuery = null;
+       this.lookupRequest = null;
+       this.lookupsDisabled = false;
+       this.lookupInputFocused = false;
+
+       // Events
+       this.$input.on( {
+               focus: this.onLookupInputFocus.bind( this ),
+               blur: this.onLookupInputBlur.bind( this ),
+               mousedown: this.onLookupInputMouseDown.bind( this )
+       } );
+       this.connect( this, { change: 'onLookupInputChange' } );
+       this.lookupMenu.connect( this, {
+               toggle: 'onLookupMenuToggle',
+               choose: 'onLookupMenuItemChoose'
+       } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-lookupElement' );
+       this.lookupMenu.$element.addClass( 'oo-ui-lookupElement-menu' );
+       this.$overlay.append( this.lookupMenu.$element );
+};
+
+/* Methods */
+
+/**
+ * Handle input focus event.
+ *
+ * @param {jQuery.Event} e Input focus event
+ */
+OO.ui.LookupElement.prototype.onLookupInputFocus = function () {
+       this.lookupInputFocused = true;
+       this.populateLookupMenu();
+};
+
+/**
+ * Handle input blur event.
+ *
+ * @param {jQuery.Event} e Input blur event
+ */
+OO.ui.LookupElement.prototype.onLookupInputBlur = function () {
+       this.closeLookupMenu();
+       this.lookupInputFocused = false;
+};
+
+/**
+ * Handle input mouse down event.
+ *
+ * @param {jQuery.Event} e Input mouse down event
+ */
+OO.ui.LookupElement.prototype.onLookupInputMouseDown = function () {
+       // Only open the menu if the input was already focused.
+       // This way we allow the user to open the menu again after closing it with Esc
+       // by clicking in the input. Opening (and populating) the menu when initially
+       // clicking into the input is handled by the focus handler.
+       if ( this.lookupInputFocused && !this.lookupMenu.isVisible() ) {
+               this.populateLookupMenu();
+       }
+};
+
+/**
+ * Handle input change event.
+ *
+ * @param {string} value New input value
+ */
+OO.ui.LookupElement.prototype.onLookupInputChange = function () {
+       if ( this.lookupInputFocused ) {
+               this.populateLookupMenu();
+       }
+};
+
+/**
+ * Handle the lookup menu being shown/hidden.
+ *
+ * @param {boolean} visible Whether the lookup menu is now visible.
+ */
+OO.ui.LookupElement.prototype.onLookupMenuToggle = function ( visible ) {
+       if ( !visible ) {
+               // When the menu is hidden, abort any active request and clear the menu.
+               // This has to be done here in addition to closeLookupMenu(), because
+               // MenuSelectWidget will close itself when the user presses Esc.
+               this.abortLookupRequest();
+               this.lookupMenu.clearItems();
+       }
+};
+
+/**
+ * Handle menu item 'choose' event, updating the text input value to the value of the clicked item.
+ *
+ * @param {OO.ui.MenuOptionWidget|null} item Selected item
+ */
+OO.ui.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {
+       if ( item ) {
+               this.setValue( item.getData() );
+       }
+};
+
+/**
+ * Get lookup menu.
+ *
+ * @return {OO.ui.TextInputMenuSelectWidget}
+ */
+OO.ui.LookupElement.prototype.getLookupMenu = function () {
+       return this.lookupMenu;
+};
+
+/**
+ * Disable or re-enable lookups.
+ *
+ * When lookups are disabled, calls to #populateLookupMenu will be ignored.
+ *
+ * @param {boolean} disabled Disable lookups
+ */
+OO.ui.LookupElement.prototype.setLookupsDisabled = function ( disabled ) {
+       this.lookupsDisabled = !!disabled;
+};
+
+/**
+ * Open the menu. If there are no entries in the menu, this does nothing.
+ *
+ * @chainable
+ */
+OO.ui.LookupElement.prototype.openLookupMenu = function () {
+       if ( !this.lookupMenu.isEmpty() ) {
+               this.lookupMenu.toggle( true );
+       }
+       return this;
+};
+
+/**
+ * Close the menu, empty it, and abort any pending request.
+ *
+ * @chainable
+ */
+OO.ui.LookupElement.prototype.closeLookupMenu = function () {
+       this.lookupMenu.toggle( false );
+       this.abortLookupRequest();
+       this.lookupMenu.clearItems();
+       return this;
+};
+
+/**
+ * Request menu items based on the input's current value, and when they arrive,
+ * populate the menu with these items and show the menu.
+ *
+ * If lookups have been disabled with #setLookupsDisabled, this function does nothing.
+ *
+ * @chainable
+ */
+OO.ui.LookupElement.prototype.populateLookupMenu = function () {
+       var widget = this,
+               value = this.getValue();
+
+       if ( this.lookupsDisabled ) {
+               return;
+       }
+
+       // If the input is empty, clear the menu
+       if ( value === '' ) {
+               this.closeLookupMenu();
+       // Skip population if there is already a request pending for the current value
+       } else if ( value !== this.lookupQuery ) {
+               this.getLookupMenuItems()
+                       .done( function ( items ) {
+                               widget.lookupMenu.clearItems();
+                               if ( items.length ) {
+                                       widget.lookupMenu
+                                               .addItems( items )
+                                               .toggle( true );
+                                       widget.initializeLookupMenuSelection();
+                               } else {
+                                       widget.lookupMenu.toggle( false );
+                               }
+                       } )
+                       .fail( function () {
+                               widget.lookupMenu.clearItems();
+                       } );
+       }
+
+       return this;
+};
+
+/**
+ * Select and highlight the first selectable item in the menu.
+ *
+ * @chainable
+ */
+OO.ui.LookupElement.prototype.initializeLookupMenuSelection = function () {
+       if ( !this.lookupMenu.getSelectedItem() ) {
+               this.lookupMenu.selectItem( this.lookupMenu.getFirstSelectableItem() );
+       }
+       this.lookupMenu.highlightItem( this.lookupMenu.getSelectedItem() );
+};
+
+/**
+ * Get lookup menu items for the current query.
+ *
+ * @return {jQuery.Promise} Promise object which will be passed menu items as the first argument of
+ *   the done event. If the request was aborted to make way for a subsequent request, this promise
+ *   will not be rejected: it will remain pending forever.
+ */
+OO.ui.LookupElement.prototype.getLookupMenuItems = function () {
+       var widget = this,
+               value = this.getValue(),
+               deferred = $.Deferred(),
+               ourRequest;
+
+       this.abortLookupRequest();
+       if ( Object.prototype.hasOwnProperty.call( this.lookupCache, value ) ) {
+               deferred.resolve( this.getLookupMenuOptionsFromData( this.lookupCache[value] ) );
+       } else {
+               this.pushPending();
+               this.lookupQuery = value;
+               ourRequest = this.lookupRequest = this.getLookupRequest();
+               ourRequest
+                       .always( function () {
+                               // We need to pop pending even if this is an old request, otherwise
+                               // the widget will remain pending forever.
+                               // TODO: this assumes that an aborted request will fail or succeed soon after
+                               // being aborted, or at least eventually. It would be nice if we could popPending()
+                               // at abort time, but only if we knew that we hadn't already called popPending()
+                               // for that request.
+                               widget.popPending();
+                       } )
+                       .done( function ( data ) {
+                               // If this is an old request (and aborting it somehow caused it to still succeed),
+                               // ignore its success completely
+                               if ( ourRequest === widget.lookupRequest ) {
+                                       widget.lookupQuery = null;
+                                       widget.lookupRequest = null;
+                                       widget.lookupCache[value] = widget.getLookupCacheDataFromResponse( data );
+                                       deferred.resolve( widget.getLookupMenuOptionsFromData( widget.lookupCache[value] ) );
+                               }
+                       } )
+                       .fail( function () {
+                               // If this is an old request (or a request failing because it's being aborted),
+                               // ignore its failure completely
+                               if ( ourRequest === widget.lookupRequest ) {
+                                       widget.lookupQuery = null;
+                                       widget.lookupRequest = null;
+                                       deferred.reject();
+                               }
+                       } );
+       }
+       return deferred.promise();
+};
+
+/**
+ * Abort the currently pending lookup request, if any.
+ */
+OO.ui.LookupElement.prototype.abortLookupRequest = function () {
+       var oldRequest = this.lookupRequest;
+       if ( oldRequest ) {
+               // First unset this.lookupRequest to the fail handler will notice
+               // that the request is no longer current
+               this.lookupRequest = null;
+               this.lookupQuery = null;
+               oldRequest.abort();
+       }
+};
+
+/**
+ * Get a new request object of the current lookup query value.
+ *
+ * @abstract
+ * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method
+ */
+OO.ui.LookupElement.prototype.getLookupRequest = function () {
+       // Stub, implemented in subclass
+       return null;
+};
+
+/**
+ * Pre-process data returned by the request from #getLookupRequest.
+ *
+ * The return value of this function will be cached, and any further queries for the given value
+ * will use the cache rather than doing API requests.
+ *
+ * @abstract
+ * @param {Mixed} data Response from server
+ * @return {Mixed} Cached result data
+ */
+OO.ui.LookupElement.prototype.getLookupCacheDataFromResponse = function () {
+       // Stub, implemented in subclass
+       return [];
+};
+
+/**
+ * Get a list of menu option widgets from the (possibly cached) data returned by
+ * #getLookupCacheDataFromResponse.
+ *
+ * @abstract
+ * @param {Mixed} data Cached result data, usually an array
+ * @return {OO.ui.MenuOptionWidget[]} Menu items
+ */
+OO.ui.LookupElement.prototype.getLookupMenuOptionsFromData = function () {
+       // Stub, implemented in subclass
+       return [];
+};
+
 /**
  * Element containing an OO.ui.PopupWidget object.
  *
@@ -4968,7 +5345,8 @@ OO.ui.PopupElement.prototype.getPopup = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {string|string[]} [flags] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ * @cfg {string|string[]} [flags] Flags describing importance and functionality, e.g. 'primary',
+ *   'safe', 'progressive', 'destructive' or 'constructive'
  * @cfg {jQuery} [$flagged] Flagged node, assigned to #$flagged, omit to use #$element
  */
 OO.ui.FlaggedElement = function OoUiFlaggedElement( config ) {
@@ -5292,9 +5670,9 @@ OO.ui.ClippableElement.prototype.toggleClipping = function ( clipping ) {
                this.clipping = clipping;
                if ( clipping ) {
                        this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
-                       // If the clippable container is the body, we have to listen to scroll events and check
+                       // If the clippable container is the root, we have to listen to scroll events and check
                        // jQuery.scrollTop on the window because of browser inconsistencies
-                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
+                       this.$clippableScroller = this.$clippableContainer.is( 'html, body' ) ?
                                this.$( OO.ui.Element.static.getWindow( this.$clippableContainer ) ) :
                                this.$clippableContainer;
                        this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
@@ -5386,17 +5764,23 @@ OO.ui.ClippableElement.prototype.clip = function () {
                return this;
        }
 
-       var buffer = 10,
+       var buffer = 7, // Chosen by fair dice roll
                cOffset = this.$clippable.offset(),
-               $container = this.$clippableContainer.is( 'body' ) ?
+               $container = this.$clippableContainer.is( 'html, body' ) ?
                        this.$clippableWindow : this.$clippableContainer,
                ccOffset = $container.offset() || { top: 0, left: 0 },
                ccHeight = $container.innerHeight() - buffer,
                ccWidth = $container.innerWidth() - buffer,
+               cHeight = this.$clippable.outerHeight() + buffer,
+               cWidth = this.$clippable.outerWidth() + buffer,
                scrollTop = this.$clippableScroller.scrollTop(),
                scrollLeft = this.$clippableScroller.scrollLeft(),
-               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
-               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
+               desiredWidth = cOffset.left < 0 ?
+                       cWidth + cOffset.left :
+                       ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
+               desiredHeight = cOffset.top < 0 ?
+                       cHeight + cOffset.top :
+                       ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
                naturalWidth = this.$clippable.prop( 'scrollWidth' ),
                naturalHeight = this.$clippable.prop( 'scrollHeight' ),
                clipWidth = desiredWidth < naturalWidth,
@@ -5453,7 +5837,6 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        this.toolbar = this.toolGroup.getToolbar();
        this.active = false;
        this.$title = this.$( '<span>' );
-       this.$titleText = this.$( '<span>' );
        this.$accel = this.$( '<span>' );
        this.$link = this.$( '<a>' );
        this.title = null;
@@ -5462,7 +5845,7 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        this.toolbar.connect( this, { updateState: 'onUpdateState' } );
 
        // Initialization
-       this.$titleText.addClass( 'oo-ui-tool-title-text' );
+       this.$title.addClass( 'oo-ui-tool-title' );
        this.$accel
                .addClass( 'oo-ui-tool-accel' )
                .prop( {
@@ -5471,12 +5854,9 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
                        dir: 'ltr',
                        lang: 'en'
                } );
-       this.$title
-               .addClass( 'oo-ui-tool-title' )
-               .append( this.$titleText, this.$accel );
        this.$link
                .addClass( 'oo-ui-tool-link' )
-               .append( this.$icon, this.$title )
+               .append( this.$icon, this.$title, this.$accel )
                .prop( 'tabIndex', 0 )
                .attr( 'role', 'button' );
        this.$element
@@ -5664,7 +6044,7 @@ OO.ui.Tool.prototype.updateTitle = function () {
                accel = this.toolbar.getToolAccelerator( this.constructor.static.name ),
                tooltipParts = [];
 
-       this.$titleText.text( this.title );
+       this.$title.text( this.title );
        this.$accel.text( accel );
 
        if ( titleTooltips && typeof this.title === 'string' && this.title.length ) {
@@ -5783,7 +6163,7 @@ OO.ui.Toolbar.prototype.onPointerDown = function ( e ) {
 
 /**
  * Sets up handles and preloads required information for the toolbar to work.
- * This must be called immediately after it is attached to a visible document.
+ * This must be called after it is attached to a visible document and before doing anything else.
  */
 OO.ui.Toolbar.prototype.initialize = function () {
        this.initialized = true;
@@ -6392,7 +6772,7 @@ OO.ui.MessageDialog.prototype.getBodyHeight = function () {
        $scrollable.height();
        $scrollable.contents().show();
 
-       bodyHeight = Math.round( this.text.$element.outerHeight( true ) );
+       bodyHeight = this.text.$element.outerHeight( true );
        $scrollable[0].style.overflow = oldOverflow;
 
        return bodyHeight;
@@ -7200,6 +7580,8 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  * @cfg {string} [help] Explanatory text shown as a '?' icon.
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
+       var hasInputWidget = fieldWidget instanceof OO.ui.InputWidget;
+
        // Configuration initialization
        config = $.extend( { align: 'left' }, config );
 
@@ -7214,6 +7596,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
 
        // Properties
        this.$field = this.$( '<div>' );
+       this.$body = this.$( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
        this.align = null;
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
@@ -7234,17 +7617,21 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        }
 
        // Events
-       if ( this.fieldWidget instanceof OO.ui.InputWidget ) {
+       if ( hasInputWidget ) {
                this.$label.on( 'click', this.onLabelClick.bind( this ) );
        }
        this.fieldWidget.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-fieldLayout' );
+       this.$element
+               .addClass( 'oo-ui-fieldLayout' )
+               .append( this.$help, this.$body );
+       this.$body.addClass( 'oo-ui-fieldLayout-body' );
        this.$field
                .addClass( 'oo-ui-fieldLayout-field' )
                .toggleClass( 'oo-ui-fieldLayout-disable', this.fieldWidget.isDisabled() )
                .append( this.fieldWidget.$element );
+
        this.setAlignment( config.align );
 };
 
@@ -7255,17 +7642,6 @@ OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabelElement );
 
 /* Methods */
 
-/**
- * @inheritdoc
- */
-OO.ui.FieldLayout.prototype.getTagName = function () {
-       if ( this.fieldWidget instanceof OO.ui.InputWidget ) {
-               return 'label';
-       } else {
-               return 'div';
-       }
-};
-
 /**
  * Handle field disable events.
  *
@@ -7309,9 +7685,9 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                }
                // Reorder elements
                if ( value === 'inline' ) {
-                       this.$element.append( this.$field, this.$label, this.$help );
+                       this.$body.append( this.$field, this.$label );
                } else {
-                       this.$element.append( this.$help, this.$label, this.$field );
+                       this.$body.append( this.$label, this.$field );
                }
                // Set classes. The following classes can be used here:
                // * oo-ui-fieldLayout-align-left
@@ -7328,6 +7704,51 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
        return this;
 };
 
+/**
+ * Layout made of a field, a button, and an optional label.
+ *
+ * @class
+ * @extends OO.ui.FieldLayout
+ *
+ * @constructor
+ * @param {OO.ui.Widget} fieldWidget Field widget
+ * @param {OO.ui.ButtonWidget} buttonWidget Button widget
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline'
+ * @cfg {string} [help] Explanatory text shown as a '?' icon.
+ */
+OO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWidget, config ) {
+       // Configuration initialization
+       config = $.extend( { align: 'left' }, config );
+
+       // Properties (must be set before parent constructor, which calls #getTagName)
+       this.fieldWidget = fieldWidget;
+       this.buttonWidget = buttonWidget;
+
+       // Parent constructor
+       OO.ui.ActionFieldLayout.super.call( this, fieldWidget, config );
+
+       // Mixin constructors
+       OO.ui.LabelElement.call( this, config );
+
+       // Properties
+       this.$button = this.$( '<div>' )
+               .addClass( 'oo-ui-actionFieldLayout-button' )
+               .append( this.buttonWidget.$element );
+
+       this.$input = this.$( '<div>' )
+               .addClass( 'oo-ui-actionFieldLayout-input' )
+               .append( this.fieldWidget.$element );
+
+       this.$field
+               .addClass( 'oo-ui-actionFieldLayout' )
+               .append( this.$input, this.$button );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
+
 /**
  * Layout made of a fieldset and optional legend.
  *
@@ -7547,15 +7968,15 @@ OO.ui.GridLayout.prototype.update = function () {
                        width = this.widths[x];
                        panel = this.panels[i];
                        dimensions = {
-                               width: Math.round( width * 100 ) + '%',
-                               height: Math.round( height * 100 ) + '%',
-                               top: Math.round( top * 100 ) + '%'
+                               width: ( width * 100 ) + '%',
+                               height: ( height * 100 ) + '%',
+                               top: ( top * 100 ) + '%'
                        };
                        // If RTL, reverse:
                        if ( OO.ui.Element.static.getDir( this.$.context ) === 'rtl' ) {
-                               dimensions.right = Math.round( left * 100 ) + '%';
+                               dimensions.right = ( left * 100 ) + '%';
                        } else {
-                               dimensions.left = Math.round( left * 100 ) + '%';
+                               dimensions.left = ( left * 100 ) + '%';
                        }
                        // HACK: Work around IE bug by setting visibility: hidden; if width or height is zero
                        if ( width === 0 || height === 0 ) {
@@ -8188,7 +8609,7 @@ OO.ui.ListToolGroup.prototype.populate = function () {
        // 'display' attribute and restores it, and the tool uses a <span> and can be hidden and re-shown.
        // Is this a jQuery bug? http://jsfiddle.net/gtj4hu3h/
        if ( this.getExpandCollapseTool().$element.css( 'display' ) === 'inline' ) {
-               this.getExpandCollapseTool().$element.css( 'display', 'inline-block' );
+               this.getExpandCollapseTool().$element.css( 'display', 'block' );
        }
 
        this.updateCollapsibleState();
@@ -8461,6 +8882,7 @@ OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
  *
  * @class
  * @abstract
+ * @deprecated Use LookupElement instead.
  *
  * @constructor
  * @param {OO.ui.TextInputWidget} input Input widget
@@ -9933,6 +10355,7 @@ OO.ui.ButtonInputWidget.prototype.onKeyPress = function ( e ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {boolean} [selected=false] Whether the checkbox is initially selected
  */
 OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
        // Parent constructor
@@ -9940,6 +10363,7 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
        // Initialization
        this.$element.addClass( 'oo-ui-checkboxInputWidget' );
+       this.setSelected( config.selected !== undefined ? config.selected : false );
 };
 
 /* Setup */
@@ -9959,39 +10383,41 @@ OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
 };
 
 /**
- * Get checked state of the checkbox
- *
- * @return {boolean} If the checkbox is checked
+ * @inheritdoc
  */
-OO.ui.CheckboxInputWidget.prototype.getValue = function () {
-       return this.value;
+OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
+       var widget = this;
+       if ( !this.isDisabled() ) {
+               // Allow the stack to clear so the value will be updated
+               setTimeout( function () {
+                       widget.setSelected( widget.$input.prop( 'checked' ) );
+               } );
+       }
 };
 
 /**
- * Set checked state of the checkbox
+ * Set selection state of this checkbox.
  *
- * @param {boolean} value New value
+ * @param {boolean} state Whether the checkbox is selected
+ * @chainable
  */
-OO.ui.CheckboxInputWidget.prototype.setValue = function ( value ) {
-       value = !!value;
-       if ( this.value !== value ) {
-               this.value = value;
-               this.$input.prop( 'checked', this.value );
-               this.emit( 'change', this.value );
+OO.ui.CheckboxInputWidget.prototype.setSelected = function ( state ) {
+       state = !!state;
+       if ( this.selected !== state ) {
+               this.selected = state;
+               this.$input.prop( 'checked', this.selected );
+               this.emit( 'change', this.selected );
        }
+       return this;
 };
 
 /**
- * @inheritdoc
+ * Check if this checkbox is selected.
+ *
+ * @return {boolean} Checkbox is selected
  */
-OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
-       var widget = this;
-       if ( !this.isDisabled() ) {
-               // Allow the stack to clear so the value will be updated
-               setTimeout( function () {
-                       widget.setValue( widget.$input.prop( 'checked' ) );
-               } );
-       }
+OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
+       return this.selected;
 };
 
 /**
@@ -10000,14 +10426,12 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  * Radio buttons only make sense as a set, and you probably want to use the OO.ui.RadioSelectWidget
  * class instead of using this class directly.
  *
- * This class doesn't make it possible to learn whether the radio button is selected ("pressed").
- *
  * @class
  * @extends OO.ui.InputWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @param {boolean} [config.selected=false] Whether the radio button is initially selected
+ * @cfg {boolean} [selected=false] Whether the radio button is initially selected
  */
 OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
        // Parent constructor
@@ -10075,6 +10499,8 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] HTML tag `type` attribute
  * @cfg {string} [placeholder] Placeholder text
+ * @cfg {boolean} [autofocus=false] Ask the browser to focus this widget, using the 'autofocus' HTML
+ *  attribute
  * @cfg {boolean} [readOnly=false] Prevent changes
  * @cfg {boolean} [multiline=false] Allow multiple lines of text
  * @cfg {boolean} [autosize=false] Automatically resize to fit content
@@ -10128,6 +10554,9 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
+       if ( config.autofocus ) {
+               this.$input.attr( 'autofocus', 'autofocus' );
+       }
        this.$element.attr( 'role', 'textbox' );
 };
 
@@ -11316,8 +11745,8 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        popupOffset = this.width * ( { left: 0, center: -0.5, right: -1 } )[this.align];
 
        // Figure out if this will cause the popup to go beyond the edge of the container
-       originOffset = Math.round( this.$element.offset().left );
-       containerLeft = Math.round( this.$container.offset().left );
+       originOffset = this.$element.offset().left;
+       containerLeft = this.$container.offset().left;
        containerWidth = this.$container.innerWidth();
        containerRight = containerLeft + containerWidth;
        popupLeft = popupOffset - this.containerPadding;
@@ -11391,7 +11820,7 @@ OO.ui.ProgressBarWidget = function OoUiProgressBarWidget( config ) {
 
        // Initialization
        this.setProgress( config.progress !== undefined ? config.progress : false );
-       this.$bar.addClass( 'oo-ui-progressBarWidget-bar');
+       this.$bar.addClass( 'oo-ui-progressBarWidget-bar' );
        this.$element
                .attr( {
                        role: 'progressbar',
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add.png b/resources/lib/oojs-ui/themes/apex/images/icons/add.png
deleted file mode 100644 (file)
index 730d102..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/add.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add.svg b/resources/lib/oojs-ui/themes/apex/images/icons/add.svg
deleted file mode 100644 (file)
index 29e5dba..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="add">
-        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png
deleted file mode 100644 (file)
index 514ff1d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg
deleted file mode 100644 (file)
index 201b4d7..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="settings">
-        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/alert.png b/resources/lib/oojs-ui/themes/apex/images/icons/alert.png
deleted file mode 100644 (file)
index e98a14a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/alert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/alert.svg
deleted file mode 100644 (file)
index f0c6522..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="alert">
-        <path id="point" d="M11 16h2v2h-2z"/>
-        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
-        <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png
deleted file mode 100644 (file)
index 88db108..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg
deleted file mode 100644 (file)
index 8a670ef..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="arched-arrow-ltr">
-        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png
deleted file mode 100644 (file)
index 0afcbfa..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg
deleted file mode 100644 (file)
index 01fc216..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="arched-arrow-rtl">
-        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/check.png b/resources/lib/oojs-ui/themes/apex/images/icons/check.png
deleted file mode 100644 (file)
index 9a2c9db..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/check.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/check.svg b/resources/lib/oojs-ui/themes/apex/images/icons/check.svg
deleted file mode 100644 (file)
index 8d4a1f8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.png b/resources/lib/oojs-ui/themes/apex/images/icons/clear.png
deleted file mode 100644 (file)
index 51a33ff..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/clear.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg
deleted file mode 100644 (file)
index 0dcde9d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="clear">
-        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/close.png b/resources/lib/oojs-ui/themes/apex/images/icons/close.png
deleted file mode 100644 (file)
index 4eedfbc..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/close.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/close.svg b/resources/lib/oojs-ui/themes/apex/images/icons/close.svg
deleted file mode 100644 (file)
index 1345e86..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="close">
-        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/code.png b/resources/lib/oojs-ui/themes/apex/images/icons/code.png
deleted file mode 100644 (file)
index ee58c9a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/code.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/code.svg b/resources/lib/oojs-ui/themes/apex/images/icons/code.svg
deleted file mode 100644 (file)
index 32f140d..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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">
-    <g id="code">
-        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1v-2.386c0-.514.024-.896.073-1.142.054-.252.139-.463.257-.633.204-.279.473-.475.808-.584.335-.115.872-.255 1.835-.255h1.027v1h-.752c-.457 0-.77.191-.936.408-.167.215-.312.445-.312 1.068v1.857c0 .729-.041 1.18-.244 1.493-.2.307-.562.529-1.09.667.535.155.9.385 1.096.688.199.303.238.757.238 1.484v1.862c0 .619.145.848.312 1.062.166.22.479.407.936.407l.752.004v1h-1.027c-.963 0-1.5-.133-1.835-.248-.335-.109-.604-.307-.808-.591-.118-.165-.203-.374-.257-.625-.049-.253-.073-.636-.073-1.149v-2.387c0-1 0-1-1-1h-1z"/>
-        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.png b/resources/lib/oojs-ui/themes/apex/images/icons/collapse.png
deleted file mode 100644 (file)
index 353ac79..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg b/resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg
deleted file mode 100644 (file)
index 55aa8f8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="collapse">
-        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/comment.png b/resources/lib/oojs-ui/themes/apex/images/icons/comment.png
deleted file mode 100644 (file)
index 265a3e4..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/comment.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/comment.svg b/resources/lib/oojs-ui/themes/apex/images/icons/comment.svg
deleted file mode 100644 (file)
index 0ae7e63..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="comment">
-        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/expand.png b/resources/lib/oojs-ui/themes/apex/images/icons/expand.png
deleted file mode 100644 (file)
index 9073d24..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/expand.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/expand.svg b/resources/lib/oojs-ui/themes/apex/images/icons/expand.svg
deleted file mode 100644 (file)
index 7666b41..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="expand">
-        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/help.png b/resources/lib/oojs-ui/themes/apex/images/icons/help.png
deleted file mode 100644 (file)
index b80df00..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/help.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/help.svg b/resources/lib/oojs-ui/themes/apex/images/icons/help.svg
deleted file mode 100644 (file)
index bb2545c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="help">
-        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
-        <g id="question-mark">
-            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
-            <path id="bottom" d="M11 16h2v2h-2z"/>
-        </g>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/info.png b/resources/lib/oojs-ui/themes/apex/images/icons/info.png
deleted file mode 100644 (file)
index eb0fb46..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/info.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/info.svg b/resources/lib/oojs-ui/themes/apex/images/icons/info.svg
deleted file mode 100644 (file)
index 9c0d1cb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="info">
-        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/link.png b/resources/lib/oojs-ui/themes/apex/images/icons/link.png
deleted file mode 100644 (file)
index 2a087a4..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/link.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/link.svg b/resources/lib/oojs-ui/themes/apex/images/icons/link.svg
deleted file mode 100644 (file)
index dbae341..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="link">
-        <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
-        <path id="center" d="M8 12c0 .535.42 1 .938 1h6.109c.518 0 .938-.465.938-1 0-.534-.42-1-.938-1h-6.109c-.518 0-.938.466-.938 1z"/>
-        <path id="left" d="M4.816 11.999c0-1.1.891-2.015 1.988-2.015l4.196.015c-.539-1.088-.964-1.999-1.998-1.999h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.459-.911 1.998-1.999l-4.195.015c-1.098 0-1.989-.917-1.989-2.017z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/menu.png b/resources/lib/oojs-ui/themes/apex/images/icons/menu.png
deleted file mode 100644 (file)
index 0a78119..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/menu.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/menu.svg b/resources/lib/oojs-ui/themes/apex/images/icons/menu.svg
deleted file mode 100644 (file)
index 50ac8a3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="menu">
-        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png
deleted file mode 100644 (file)
index fc4cd39..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg
deleted file mode 100644 (file)
index 51e6611..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="move-ltr">
-        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png
deleted file mode 100644 (file)
index dbce05e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg
deleted file mode 100644 (file)
index bcee09d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="move-rtl">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png b/resources/lib/oojs-ui/themes/apex/images/icons/picture.png
deleted file mode 100644 (file)
index 2043424..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg b/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg
deleted file mode 100644 (file)
index 7400bca..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="picture">
-        <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
-        <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.png b/resources/lib/oojs-ui/themes/apex/images/icons/remove.png
deleted file mode 100644 (file)
index 9dc34b8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg b/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg
deleted file mode 100644 (file)
index 6ad7917..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="remove">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.png b/resources/lib/oojs-ui/themes/apex/images/icons/search.png
deleted file mode 100644 (file)
index 39d3ab8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search.svg
deleted file mode 100644 (file)
index e4db4f0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="search">
-        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/settings.png b/resources/lib/oojs-ui/themes/apex/images/icons/settings.png
deleted file mode 100644 (file)
index dd2706b..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/settings.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/settings.svg b/resources/lib/oojs-ui/themes/apex/images/icons/settings.svg
deleted file mode 100644 (file)
index 9fa0a4b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="settings">
-        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/tag.png b/resources/lib/oojs-ui/themes/apex/images/icons/tag.png
deleted file mode 100644 (file)
index 8e100fc..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/tag.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/tag.svg b/resources/lib/oojs-ui/themes/apex/images/icons/tag.svg
deleted file mode 100644 (file)
index 534824c..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="tag">
-        <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/window.png b/resources/lib/oojs-ui/themes/apex/images/icons/window.png
deleted file mode 100644 (file)
index db726a1..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/window.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/window.svg b/resources/lib/oojs-ui/themes/apex/images/icons/window.svg
deleted file mode 100644 (file)
index cd3b76c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="window">
-        <path id="title" d="M7 10h10v1h-10z"/>
-        <path id="frame" d="M16 19h-8c-2.206 0-4-1.794-4-4v-6c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zm-8-12c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2v-6c0-1.103-.897-2-2-2h-8z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.png b/resources/lib/oojs-ui/themes/apex/images/indicators/alert.png
deleted file mode 100644 (file)
index 5bf0827..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg
deleted file mode 100644 (file)
index d9dc6a8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="alert">
-        <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png
deleted file mode 100644 (file)
index 6574725..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg
deleted file mode 100644 (file)
index bfa8ef0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="down">
-        <path id="arrow" d="M2 3l3.5 6 3.5-6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png
deleted file mode 100644 (file)
index 7c84397..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg
deleted file mode 100644 (file)
index aeca27a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="ltr">
-        <path id="arrow" d="M3 9v-7l6 3.5z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png
deleted file mode 100644 (file)
index 5bf9064..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg
deleted file mode 100644 (file)
index eba0099..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="rtl">
-        <path id="arrow" d="M3 5.5l6 3.5v-7z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png
deleted file mode 100644 (file)
index 1a05ade..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg
deleted file mode 100644 (file)
index 4b01bb0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="up">
-        <path id="arrow" d="M5.5 2l-3.5 6h7z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/required.png b/resources/lib/oojs-ui/themes/apex/images/indicators/required.png
deleted file mode 100644 (file)
index 45eb03b..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/required.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/required.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/required.svg
deleted file mode 100644 (file)
index 969fa2d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="required">
-        <path d="M5 1h2v10h-2zM9.83 2.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif b/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif
deleted file mode 100644 (file)
index 1194eed..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.png b/resources/lib/oojs-ui/themes/apex/images/textures/transparency.png
deleted file mode 100644 (file)
index 1843f27..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg b/resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg
deleted file mode 100644 (file)
index 63a0b57..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="16" viewBox="0, 0, 16, 16">
-       <g id="transparency">
-               <path d="M0,0 L8,0 L8,8 L0,8 z" fill="#CCCCCC"/>
-               <path d="M8,8 L16,8 L16,16 L8,16 z" fill="#CCCCCC"/>
-               <path d="M8,0 L16,0 L16,8 L8,8 z" fill="#FFFFFF"/>
-               <path d="M0,8 L8,8 L8,16 L0,16 z" fill="#FFFFFF"/>
-       </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 97e8d13..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png
new file mode 100644 (file)
index 0000000..e10c539
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.svg
new file mode 100644 (file)
index 0000000..88e014b
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00C697 }</style><circle cx="12" cy="12" r="6"></circle></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.png
new file mode 100644 (file)
index 0000000..82c327a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.svg
new file mode 100644 (file)
index 0000000..03c308d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="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><circle cx="12" cy="12" r="6"></circle></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.png
new file mode 100644 (file)
index 0000000..3bdc8e2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle.svg
new file mode 100644 (file)
index 0000000..a600581
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><circle cx="12" cy="12" r="6"></circle></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.png
new file mode 100644 (file)
index 0000000..d8d5eac
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-invert.svg
new file mode 100644 (file)
index 0000000..016c2ed
--- /dev/null
@@ -0,0 +1,6 @@
+<?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: #FFFFFF }</style>
+    <g id="lock">
+        <path d="M14 9.06c0-1.562-.656-2.342-2-2.342-1.344 0-1.992.775-2 2.33V10h4zm3-.036V10h2v10H7c-.46 0-1.168-.156-1.497-.485-.33-.327-.503-.727-.503-1.195V10h2v-.964c0-.914.19-1.75.574-2.517.383-.767.92-1.407 1.606-1.852C9.867 4.223 11.14 4 12 4c1.243 0 2.852.473 3.71 1.44.86.97 1.29 2.186 1.29 3.584z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.png
new file mode 100644 (file)
index 0000000..59787d2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock.svg
new file mode 100644 (file)
index 0000000..86fd1e3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="lock">
+        <path d="M14 9.06c0-1.562-.656-2.342-2-2.342-1.344 0-1.992.775-2 2.33V10h4zm3-.036V10h2v10H7c-.46 0-1.168-.156-1.497-.485-.33-.327-.503-.727-.503-1.195V10h2v-.964c0-.914.19-1.75.574-2.517.383-.767.92-1.407 1.606-1.852C9.867 4.223 11.14 4 12 4c1.243 0 2.852.473 3.71 1.44.86.97 1.29 2.186 1.29 3.584z"/>
+    </g>
+</svg>
index 226eb5c..55f3d1f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png differ
index 31a561a..6ee6803 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: #FFFFFF }</style>
-    <g id="ltr">
-        <path id="arrow" d="M12.008,3.034 L11.545,2.567 C11.095,2.121 10.359,2.122 9.908,2.567 L6.003,6.424 L2.087,2.559 C1.637,2.113 0.911,2.129 0.461,2.576 L-0.001,3.034 L6.003,9 L6.003,8.991 L6.003,9 L12.008,3.034"/>
+    <g id="down">
+        <path id="arrow" d="M11 4l-.463-.467c-.45-.446-1.186-.445-1.637 0l-2.897 2.89-2.915-2.898c-.45-.446-1.176-.43-1.626.017L1 4l5.003 5v-.01V9L11 4"/>
     </g>
 </svg>
index 9a418c9..db8c51d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png differ
index d64695f..0c0da8e 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">
-    <g id="ltr">
-        <path id="arrow" d="M12.008,3.034 L11.545,2.567 C11.095,2.121 10.359,2.122 9.908,2.567 L6.003,6.424 L2.087,2.559 C1.637,2.113 0.911,2.129 0.461,2.576 L-0.001,3.034 L6.003,9 L6.003,8.991 L6.003,9 L12.008,3.034"/>
+    <g id="down">
+        <path id="arrow" d="M11 4l-.463-.467c-.45-.446-1.186-.445-1.637 0l-2.897 2.89-2.915-2.898c-.45-.446-1.176-.43-1.626.017L1 4l5.003 5v-.01V9L11 4"/>
     </g>
 </svg>
index a348495..9edc9de 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png differ
index 5816c08..64203e1 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: #FFFFFF }</style>
     <g id="ltr">
-        <path id="arrow" d="M3.972,-0.005 L3.503,0.458 C3.058,0.908 3.058,1.644 3.503,2.095 L7.36,6 L3.495,9.915 C3.05,10.365 3.065,11.091 3.513,11.541 L3.972,12.004 L9.938,6 L9.929,6 L9.938,6 L3.972,-0.005"/>
+        <path id="arrow" d="M4 1l-.47.463c-.444.45-.444 1.186 0 1.637L6.423 6l-2.9 2.91c-.444.45-.43 1.177.02 1.627L4 11l5-5h-.01H9L4 1"/>
     </g>
 </svg>
index bfed7d2..19e9820 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png differ
index 7bccea1..0d11e3e 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">
     <g id="ltr">
-        <path id="arrow" d="M3.972,-0.005 L3.503,0.458 C3.058,0.908 3.058,1.644 3.503,2.095 L7.36,6 L3.495,9.915 C3.05,10.365 3.065,11.091 3.513,11.541 L3.972,12.004 L9.938,6 L9.929,6 L9.938,6 L3.972,-0.005"/>
+        <path id="arrow" d="M4 1l-.47.463c-.444.45-.444 1.186 0 1.637L6.423 6l-2.9 2.91c-.444.45-.43 1.177.02 1.627L4 11l5-5h-.01H9L4 1"/>
     </g>
 </svg>
index 5080ea5..ac769a3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png differ
index 01e40d7..3d36e4f 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: #FFFFFF }</style>
     <g id="rtl">
-        <path id="arrow" d="M7.979,12.004 L8.448,11.541 C8.893,11.091 8.893,10.355 8.448,9.904 L4.59,5.999 L8.455,2.084 C8.9,1.634 8.885,0.908 8.437,0.458 L7.979,-0.005 L2.013,5.999 L2.022,5.999 L2.013,5.999 L7.979,12.004"/>
+        <path id="arrow" d="M8 11l.47-.463c.444-.45.444-1.186 0-1.637L5.576 6l2.9-2.91c.444-.45.43-1.177-.02-1.627L8 1 3 6h.01H3l5 5"/>
     </g>
 </svg>
index 0639809..d912a1b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png differ
index 304c516..e4c04b8 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">
     <g id="rtl">
-        <path id="arrow" d="M7.979,12.004 L8.448,11.541 C8.893,11.091 8.893,10.355 8.448,9.904 L4.59,5.999 L8.455,2.084 C8.9,1.634 8.885,0.908 8.437,0.458 L7.979,-0.005 L2.013,5.999 L2.022,5.999 L2.013,5.999 L7.979,12.004"/>
+        <path id="arrow" d="M8 11l.47-.463c.444-.45.444-1.186 0-1.637L5.576 6l2.9-2.91c.444-.45.43-1.177-.02-1.627L8 1 3 6h.01H3l5 5"/>
     </g>
 </svg>
index 0474926..c8f4402 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png differ
index e880711..9bbde71 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: #FFFFFF }</style>
     <g id="up">
-        <path id="arrow" d="M-0.001,7.99 L0.462,8.459 C0.912,8.904 1.648,8.904 2.099,8.459 L6.004,4.601 L9.919,8.467 C10.369,8.912 11.095,8.897 11.545,8.449 L12.008,7.99 L6.004,2.024 L6.004,2.033 L6.004,2.024 L-0.001,7.99"/>
+        <path id="arrow" d="M1 8l.463.47c.45.444 1.186.444 1.637 0L6 5.567l2.91 2.91c.45.444 1.177.43 1.627-.02L11 8 6 2.99V3v-.01L1 8"/>
     </g>
 </svg>
index ac9f0b5..214b12e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png differ
index 4769526..ad41a87 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">
     <g id="up">
-        <path id="arrow" d="M-0.001,7.99 L0.462,8.459 C0.912,8.904 1.648,8.904 2.099,8.459 L6.004,4.601 L9.919,8.467 C10.369,8.912 11.095,8.897 11.545,8.449 L12.008,7.99 L6.004,2.024 L6.004,2.033 L6.004,2.024 L-0.001,7.99"/>
+        <path id="arrow" d="M1 8l.463.47c.45.444 1.186.444 1.637 0L6 5.567l2.91 2.91c.45.444 1.177.43 1.627-.02L11 8 6 2.99V3v-.01L1 8"/>
     </g>
 </svg>
index 58a99a5..2a37fa8 100644 (file)
@@ -6,7 +6,7 @@
 // * This installation of tipsy includes several local modifications to both Javascript and CSS.
 //   Please be careful when upgrading.
 
-(function($) {
+( function ( mw, $ ) {
 
     function maybeCall(thing, ctx) {
         return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
 
         if (!options.live) this.each(function() { get(this); });
 
-        if (options.trigger != 'manual') {
-            var binder   = options.live ? 'live' : 'bind',
-                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
+        if ( options.trigger != 'manual' ) {
+            var eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
                 eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
-            this[binder](eventIn, enter)[binder](eventOut, leave);
+            if ( options.live ) {
+                mw.track( 'mw.deprecate', 'tipsy-live' );
+                mw.log.warn( 'Use of the "live" option of jquery.tipsy is deprecated.' );
+                // XXX: The official status of 'context' is deprecated, and the official status of
+                // 'selector' is removed, so this really needs to go.
+                $( this.context )
+                    .on( eventIn, this.selector, enter )
+                    .on( eventOut, this.selector, leave );
+            } else {
+                this
+                    .on( eventIn, enter )
+                    .on( eventOut, leave );
+            }
         }
 
         return this;
         }
     };
 
-})(jQuery);
+}( mediaWiki, jQuery ) );
index 7b49cb2..867c25e 100644 (file)
@@ -8,7 +8,7 @@
 // Cached access key prefix for used browser
 var cachedAccessKeyPrefix,
 
-       // Wether to use 'test-' instead of correct prefix (used for testing)
+       // Whether to use 'test-' instead of correct prefix (used for testing)
        useTestPrefix = false,
 
        // tag names which can have a label tag
index f8641e1..629ce32 100644 (file)
@@ -80,7 +80,7 @@
                $.each( $steps, function ( i, step ) {
                        var $step = $( step );
                        if ( $step.is( selector ) ) {
-                               if ($previous) {
+                               if ( $previous ) {
                                        $previous.addClass( 'tail' );
                                }
                                $step.addClass( 'head' );
index 732cc6e..48341bc 100644 (file)
                        // Store the context for next time
                        $( this ).data( 'expandableField-context', context );
                } );
-               return returnValue !== undefined ? returnValue : $(this);
+               return returnValue !== undefined ? returnValue : $( this );
        };
 
 }( jQuery ) );
index de745c3..e601ddb 100644 (file)
@@ -2,7 +2,7 @@
  * @class jQuery.plugin.footHovzer
  */
 ( function ( $ ) {
-       var $hovzer, footHovzer, prevHeight, newHeight;
+       var $hovzer, footHovzer, $spacer;
 
        function getHovzer() {
                if ( $hovzer === undefined ) {
                        var $body;
 
                        $body = $( 'body' );
-                       if ( prevHeight === undefined ) {
-                               prevHeight = getHovzer().outerHeight( /* includeMargin = */ true );
-                               $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
-                       } else {
-                               newHeight = getHovzer().outerHeight( true );
-                               $body.css( 'paddingBottom', ( parseFloat( $body.css( 'paddingBottom' ) ) - prevHeight ) + newHeight );
 
-                               prevHeight = newHeight;
+                       if ( $spacer === undefined ) {
+                               $spacer = $( '<div>' ).attr( 'id', 'jquery-foot-hovzer-spacer' );
+                               $spacer.appendTo( $body );
                        }
+                       // Ensure CSS is applied by browser before using .outerHeight()
+                       setTimeout( function () {
+                               $spacer.css( 'height', getHovzer().outerHeight( /* includeMargin = */ true ) );
+                       }, 0 );
                }
        };
 
index 4ecfeb8..8fca056 100644 (file)
@@ -73,11 +73,11 @@ $.fn.hidpi = function () {
                                match;
                        if ( typeof srcset === 'string' && srcset !== '' ) {
                                match = $.matchSrcSet( devicePixelRatio, srcset );
-                               if (match !== null ) {
+                               if ( match !== null ) {
                                        $img.attr( 'src', match );
                                }
                        }
-               });
+               } );
        }
 
        return $target;
index c4e2520..f7c4217 100644 (file)
         * Enable collapsible-functionality on all elements in the collection.
         *
         * - Will prevent binding twice to the same element.
-        * - Initial state is expanded by default, this can be overriden by adding class
+        * - Initial state is expanded by default, this can be overridden by adding class
         *   "mw-collapsed" to the "mw-collapsible" element.
         * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
         * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
                                                                .prop( 'tabIndex', 0 );
                                                }
                                        } else {
-                                               // The toggle-link will be in one the the cells (td or th) of the first row
+                                               // The toggle-link will be in one of the cells (td or th) of the first row
                                                $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
                                                $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
 
index 8d38401..556bf8c 100644 (file)
@@ -17,8 +17,8 @@
 
        var util,
                hasOwn = Object.prototype.hasOwnProperty,
-               log = (window.console && window.console.log)
-                       ? function () { return window.console.log.apply(window.console, arguments); }
+               log = ( window.console && window.console.log )
+                       ? function () { return window.console.log.apply( window.console, arguments ); }
                        : function () {};
 
        // Simplified version of a few jQuery methods, except that they don't
@@ -91,7 +91,7 @@
                        // Restore warnings
                        mw.log.warn = warn;
                        warn = undefined;
-               });
+               } );
 
                QUnit.done( function () {
                        that.populateMissingTests();
                                        var elItem = document.createElement( 'li' );
                                        elItem.textContent = key;
                                        elList.appendChild( elItem );
-                               });
+                               } );
 
                                elFoot = document.createElement( 'p' );
                                elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
 
                                util.each( style, function ( key, value ) {
                                        elOutputWrapper.style[key] = value;
-                               });
+                               } );
                                return elOutputWrapper;
                        }
 
                        if ( toolbar ) {
                                toolbar.insertBefore( testResults, toolbar.firstChild );
                        }
-               });
+               } );
 
                return this;
        }
                        var ct = this;
                        util.each( ct.injectionTracker, function ( key ) {
                                ct.hasTest( key );
-                       });
+                       } );
                },
 
                /**
index 3369cde..f1b214e 100644 (file)
@@ -28,7 +28,7 @@
  * suggestions: Suggestions to display
  *             Type: Array of strings
  * maxRows: Maximum number of suggestions to display at one time
- *             Type: Number, Range: 1 - 100, Default: 7
+ *             Type: Number, Range: 1 - 100, Default: 10
  * delay: Number of ms to wait for the user to stop typing
  *             Type: Number, Range: 0 - 1200, Default: 120
  * cache: Whether to cache results from a fetch
@@ -125,6 +125,7 @@ $.suggestions = {
                                                context.data.$textbox,
                                                val,
                                                function ( suggestions ) {
+                                                       suggestions = suggestions.slice( 0, context.config.maxRows );
                                                        context.data.$textbox.suggestions( 'suggestions', suggestions );
                                                        if ( context.config.cache ) {
                                                                cache[ val ] = {
@@ -132,7 +133,8 @@ $.suggestions = {
                                                                        timestamp: +new Date()
                                                                };
                                                        }
-                                               }
+                                               },
+                                               context.config.maxRows
                                        );
                                }
                        }
@@ -474,8 +476,6 @@ $.suggestions = {
                                                }
                                        }
                                } else {
-                                       $.suggestions.highlight( context, selected, true );
-
                                        if ( typeof context.config.result.select === 'function' ) {
                                                // Allow the callback to decide whether to prevent default or not
                                                if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
@@ -515,7 +515,7 @@ $.fn.suggestions = function () {
                                        result: {},
                                        $region: $( this ),
                                        suggestions: [],
-                                       maxRows: 7,
+                                       maxRows: 10,
                                        delay: 120,
                                        cache: false,
                                        cacheMaxAge: 60000,
index 46cc8f2..ed37aa1 100644 (file)
@@ -10,8 +10,8 @@
         */
        $.fn.firstTabIndex = function () {
                var minTabIndex = null;
-               $(this).find( '[tabindex]' ).each( function () {
-                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
+               $( this ).find( '[tabindex]' ).each( function () {
+                       var tabIndex = parseInt( $( this ).prop( 'tabindex' ), 10 );
                        // In IE6/IE7 the above jQuery selector returns all elements,
                        // becuase it has a default value for tabIndex in IE6/IE7 of 0
                        // (rather than null/undefined). Therefore check "> 0" as well.
@@ -35,8 +35,8 @@
         */
        $.fn.lastTabIndex = function () {
                var maxTabIndex = null;
-               $(this).find( '[tabindex]' ).each( function () {
-                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
+               $( this ).find( '[tabindex]' ).each( function () {
+                       var tabIndex = parseInt( $( this ).prop( 'tabindex' ), 10 );
                        if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
                                // Initial value
                                if ( maxTabIndex === null ) {
index f3f2655..8e1c3f0 100644 (file)
@@ -15,7 +15,7 @@
  */
 /**
  *
- * @description Create a sortable table with multi-column sorting capabilitys
+ * @description Create a sortable table with multi-column sorting capabilities
  *
  * @example $( 'table' ).tablesorter();
  * @desc Create a simple tablesorter interface.
                // as each header can span over multiple columns (using colspan=N),
                // we have to bidirectionally map headers to their columns and columns to their headers
                $tableHeaders.each( function ( headerIndex ) {
-                       $cell = $(this);
+                       $cell = $( this );
                        columns = [];
 
                        for ( i = 0; i < this.colSpan; i++ ) {
                                headerIndex: headerIndex,
                                order: 0,
                                count: 0
-                       });
+                       } );
 
                        if ( $cell.hasClass( config.unsortableClass ) ) {
                                $cell.data( 'sortDisabled', true );
                                                buildCollationTable();
 
                                                // Legacy fix of .sortbottoms
-                                               // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+                                               // Wrap them inside a tfoot (because that's what they actually want to be)
                                                // and put the <tfoot> at the end of the <table>
                                                var $tfoot,
                                                        $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
                                                                                s = config.sortList[j];
                                                                                o = config.headerList[s[0]];
                                                                                if ( isValueInArray( s[0], newSortList ) ) {
-                                                                                       $(o).data( 'count', s[1] + 1 );
+                                                                                       $( o ).data( 'count', s[1] + 1 );
                                                                                        s[1] = $( o ).data( 'count' ) % 2;
                                                                                }
                                                                        }
index f88b836..01a25f3 100644 (file)
@@ -1,27 +1,23 @@
 /*!
- * Scripts for action=edit
+ * Scripts for action=edit at domready
  */
-( function ( mw, $ ) {
+jQuery( function ( $ ) {
+       var editBox, scrollTop, $editForm;
 
-       $( function () {
-               var editBox, scrollTop, $editForm;
+       // Make sure edit summary does not exceed byte limit
+       $( '#wpSummary' ).byteLimit( 255 );
 
-               // Make sure edit summary does not exceed byte limit
-               $( '#wpSummary' ).byteLimit( 255 );
-
-               // Restore the edit box scroll state following a preview operation,
-               // and set up a form submission handler to remember this state.
-               editBox = document.getElementById( 'wpTextbox1' );
-               scrollTop = document.getElementById( 'wpScrolltop' );
-               $editForm = $( '#editform' );
-               if ( $editForm.length && editBox && scrollTop ) {
-                       if ( scrollTop.value ) {
-                               editBox.scrollTop = scrollTop.value;
-                       }
-                       $editForm.submit( function () {
-                               scrollTop.value = editBox.scrollTop;
-                       } );
+       // Restore the edit box scroll state following a preview operation,
+       // and set up a form submission handler to remember this state.
+       editBox = document.getElementById( 'wpTextbox1' );
+       scrollTop = document.getElementById( 'wpScrolltop' );
+       $editForm = $( '#editform' );
+       if ( $editForm.length && editBox && scrollTop ) {
+               if ( scrollTop.value ) {
+                       editBox.scrollTop = scrollTop.value;
                }
-       } );
-
-}( mediaWiki, jQuery ) );
+               $editForm.submit( function () {
+                       scrollTop.value = editBox.scrollTop;
+               } );
+       }
+} );
index e4f4249..f6fab70 100644 (file)
@@ -61,8 +61,8 @@
                        action: 'parse',
                        uselang: mw.config.get( 'wgUserLanguage' ),
                        title: mw.config.get( 'wgPageName' ),
-                       text: $editform.find( '#wpTextbox1' ).val(),
-                       summary: $editform.find( '#wpSummary' ).val()
+                       text: $editform.find( '#wpTextbox1' ).textSelection( 'getContents' ),
+                       summary: $editform.find( '#wpSummary' ).textSelection( 'getContents' )
                };
 
                if ( isDiff ) {
                                        newList = [];
                                        $.each( response.parse.templates, function ( i, template ) {
                                                li = $( '<li>' )
-                                                       .append( $('<a>')
+                                                       .append( $( '<a>' )
                                                                .attr( {
                                                                        'href': mw.util.getUrl( template['*'] ),
                                                                        'class': ( template.exists !== undefined ? '' : 'new' )
index 9b8a0ce..29c533d 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var idleTimeout = 5000,
+               var idleTimeout = 4000,
                        api = new mw.Api(),
                        pending = null,
                        $form = $( '#editform' ),
index 52e0d4e..e66d8f6 100644 (file)
@@ -11,9 +11,6 @@
                fragment = null,
                shouldChangeFragment, index;
 
-       // Clear internal mw.config entries, so that no one tries to depend on them
-       mw.config.set( 'wgInternalRedirectTargetUrl', null );
-
        index = canonical.indexOf( '#' );
        if ( index !== -1 ) {
                fragment = canonical.slice( index );
index 3209c9b..a92f1c1 100644 (file)
@@ -47,7 +47,7 @@
        margin: 0;
        padding: 0;
        padding-right: 42px;
-       background: transparent url(images/nextredirect-rtl.png) bottom left no-repeat;
+       background: transparent url(images/nextredirect-rtl.png) bottom right no-repeat;
        /* @embed */
        background-image: -webkit-linear-gradient(transparent, transparent), url(images/nextredirect-rtl.svg);
        /* @embed */
@@ -57,7 +57,7 @@
 /* @noflip */
 .mw-content-rtl .redirectText li:first-child {
        padding-right: 47px;
-       background: transparent url(images/redirect-rtl.png) bottom left no-repeat;
+       background: transparent url(images/redirect-rtl.png) bottom right no-repeat;
        /* @embed */
        background-image: -webkit-linear-gradient(transparent, transparent), url(images/redirect-rtl.svg);
        /* @embed */
index dceae11..8b3a085 100644 (file)
@@ -86,7 +86,7 @@ $.extend( mw.language, {
         * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
         * If second or third parameter are not specified, masculine is used.
         *
-        * These details may be overriden per language.
+        * These details may be overridden per language.
         *
         * @param {string} gender 'male', 'female', or anything else for neutral.
         * @param {Array} forms List of gender forms
index 02bae5a..cf54cf9 100644 (file)
@@ -506,7 +506,7 @@ a.feedlink {
 table.wikitable {
        margin: 1em 0;
        background-color: #f9f9f9;
-       border: 1px #aaa solid;
+       border: 1px solid #aaa;
        border-collapse: collapse;
        color: black;
 }
@@ -515,7 +515,7 @@ table.wikitable > tr > th,
 table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
-       border: 1px #aaa solid;
+       border: 1px solid #aaa;
        padding: 0.2em;
 }
 
index a403996..dc21472 100644 (file)
@@ -60,7 +60,7 @@ mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
 // Run a function after the window onload event is fired
 mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
        if ( onloadFuncts ) {
-               onloadFuncts.push(hookFunct);
+               onloadFuncts.push( hookFunct );
        } else {
                // If func queue is gone the event has happened already,
                // run immediately instead of queueing.
@@ -197,7 +197,7 @@ win.importStylesheetURI = function ( url, media ) {
        if ( media ) {
                l.media = media;
        }
-       document.getElementsByTagName('head')[0].appendChild( l );
+       document.getElementsByTagName( 'head' )[0].appendChild( l );
        return l;
 };
 
index 1892967..3658ed8 100644 (file)
  * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
  * Also Dynamically resize images to justify them.
  */
-( function ( $ ) {
-       $( function () {
-               var isTouchScreen,
-                       gettingFocus,
-                       galleries = 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed';
+( function ( mw, $ ) {
+       // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
+       var isTouchScreen = !!( window.ontouchstart !== undefined || window.DocumentTouch !== undefined && document instanceof window.DocumentTouch ),
+               $galleries = $();
+
+       // Now on to justification.
+       function justify() {
+               var lastTop,
+                       $img,
+                       imgWidth,
+                       imgHeight,
+                       captionWidth,
+                       rows = [],
+                       $gallery = $( this );
+
+               $gallery.children( 'li' ).each( function () {
+                       // Math.floor to be paranoid if things are off by 0.00000000001
+                       var top = Math.floor( $( this ).position().top ),
+                               $this = $( this );
+
+                       if ( top !== lastTop ) {
+                               rows[rows.length] = [];
+                               lastTop = top;
+                       }
+
+                       $img = $this.find( 'div.thumb a.image img' );
+                       if ( $img.length && $img[0].height ) {
+                               imgHeight = $img[0].height;
+                               imgWidth = $img[0].width;
+                       } else {
+                               // If we don't have a real image, get the containing divs width/height.
+                               // Note that if we do have a real image, using this method will generally
+                               // give the same answer, but can be different in the case of a very
+                               // narrow image where extra padding is added.
+                               imgHeight = $this.children().children( 'div:first' ).height();
+                               imgWidth = $this.children().children( 'div:first' ).width();
+                       }
+
+                       // Hack to make an edge case work ok
+                       if ( imgHeight < 30 ) {
+                               // Don't try and resize this item.
+                               imgHeight = 0;
+                       }
+
+                       captionWidth = $this.children().children( 'div.gallerytextwrapper' ).width();
+                       rows[rows.length - 1][rows[rows.length - 1].length] = {
+                               $elm: $this,
+                               width: $this.outerWidth(),
+                               imgWidth: imgWidth,
+                               // XXX: can divide by 0 ever happen?
+                               aspect: imgWidth / imgHeight,
+                               captionWidth: captionWidth,
+                               height: imgHeight
+                       };
+
+                       // Save all boundaries so we can restore them on window resize
+                       $this.data( 'imgWidth', imgWidth );
+                       $this.data( 'imgHeight', imgHeight );
+                       $this.data( 'width', $this.outerWidth() );
+                       $this.data( 'captionWidth', captionWidth );
+               } );
+
+               ( function () {
+                       var maxWidth,
+                               combinedAspect,
+                               combinedPadding,
+                               curRow,
+                               curRowHeight,
+                               wantedWidth,
+                               preferredHeight,
+                               newWidth,
+                               padding,
+                               $outerDiv,
+                               $innerDiv,
+                               $imageDiv,
+                               $imageElm,
+                               imageElm,
+                               $caption,
+                               i,
+                               j,
+                               avgZoom,
+                               totalZoom = 0;
+
+                       for ( i = 0; i < rows.length; i++ ) {
+                               maxWidth = $gallery.width();
+                               combinedAspect = 0;
+                               combinedPadding = 0;
+                               curRow = rows[i];
+                               curRowHeight = 0;
+
+                               for ( j = 0; j < curRow.length; j++ ) {
+                                       if ( curRowHeight === 0 ) {
+                                               if ( isFinite( curRow[j].height ) ) {
+                                                       // Get the height of this row, by taking the first
+                                                       // non-out of bounds height
+                                                       curRowHeight = curRow[j].height;
+                                               }
+                                       }
 
-               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
-               isTouchScreen = !!( window.ontouchstart !== undefined || window.DocumentTouch !== undefined && document instanceof window.DocumentTouch );
+                                       if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
+                                               // One of the dimensions are 0. Probably should
+                                               // not try to resize.
+                                               combinedPadding += curRow[j].width;
+                                       } else {
+                                               combinedAspect += curRow[j].aspect;
+                                               combinedPadding += curRow[j].width - curRow[j].imgWidth;
+                                       }
+                               }
 
+                               // Add some padding for inter-element spacing.
+                               combinedPadding += 5 * curRow.length;
+                               wantedWidth = maxWidth - combinedPadding;
+                               preferredHeight = wantedWidth / combinedAspect;
+
+                               if ( preferredHeight > curRowHeight * 1.5 ) {
+                                       // Only expand at most 1.5 times current size
+                                       // As that's as high a resolution as we have.
+                                       // Also on the off chance there is a bug in this
+                                       // code, would prevent accidentally expanding to
+                                       // be 10 billion pixels wide.
+                                       if ( i === rows.length - 1 ) {
+                                               // If its the last row, and we can't fit it,
+                                               // don't make the entire row huge.
+                                               avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
+                                               if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
+                                                       preferredHeight = avgZoom;
+                                               } else {
+                                                       // Probably a single row gallery
+                                                       preferredHeight = curRowHeight;
+                                               }
+                                       } else {
+                                               preferredHeight = 1.5 * curRowHeight;
+                                       }
+                               }
+                               if ( !isFinite( preferredHeight ) ) {
+                                       // This *definitely* should not happen.
+                                       // Skip this row.
+                                       continue;
+                               }
+                               if ( preferredHeight < 5 ) {
+                                       // Well something clearly went wrong...
+                                       // Skip this row.
+                                       continue;
+                               }
+
+                               if ( preferredHeight / curRowHeight > 1 ) {
+                                       totalZoom += preferredHeight / curRowHeight;
+                               } else {
+                                       // If we shrink, still consider that a zoom of 1
+                                       totalZoom += 1;
+                               }
+
+                               for ( j = 0; j < curRow.length; j++ ) {
+                                       newWidth = preferredHeight * curRow[j].aspect;
+                                       padding = curRow[j].width - curRow[j].imgWidth;
+                                       $outerDiv = curRow[j].$elm;
+                                       $innerDiv = $outerDiv.children( 'div' ).first();
+                                       $imageDiv = $innerDiv.children( 'div.thumb' );
+                                       $imageElm = $imageDiv.find( 'img' ).first();
+                                       imageElm = $imageElm.length ? $imageElm[0] : null;
+                                       $caption = $outerDiv.find( 'div.gallerytextwrapper' );
+
+                                       // Since we are going to re-adjust the height, the vertical
+                                       // centering margins need to be reset.
+                                       $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
+
+                                       if ( newWidth < 60 || !isFinite( newWidth ) ) {
+                                               // Making something skinnier than this will mess up captions,
+                                               if ( newWidth < 1 || !isFinite( newWidth ) ) {
+                                                       $innerDiv.height( preferredHeight );
+                                                       // Don't even try and touch the image size if it could mean
+                                                       // making it disappear.
+                                                       continue;
+                                               }
+                                       } else {
+                                               $outerDiv.width( newWidth + padding );
+                                               $innerDiv.width( newWidth + padding );
+                                               $imageDiv.width( newWidth );
+                                               $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
+                                       }
+
+                                       if ( imageElm ) {
+                                               // We don't always have an img, e.g. in the case of an invalid file.
+                                               imageElm.width = newWidth;
+                                               imageElm.height = preferredHeight;
+                                       } else {
+                                               // Not a file box.
+                                               $imageDiv.height( preferredHeight );
+                                       }
+                               }
+                       }
+               }() );
+       }
+
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
                if ( isTouchScreen ) {
                        // Always show the caption for a touch screen.
-                       $( 'ul.mw-gallery-packed-hover' )
+                       $content.find( 'ul.mw-gallery-packed-hover' )
                                .addClass( 'mw-gallery-packed-overlay' )
                                .removeClass( 'mw-gallery-packed-hover' );
                } else {
                        // Note use of just "a", not a.image, since we want this to trigger if a link in
                        // the caption receives focus
-                       $( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
+                       $content.find( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
                                // Confusingly jQuery leaves e.type as focusout for delegated blur events
-                               gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
+                               var gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
                                $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
                        } );
                }
 
-               // Now on to justification.
-               // We may still get ragged edges if someone resizes their window. Could bind to
-               // that event, otoh do we really want to constantly be resizing galleries?
-               $( galleries ).each( function () {
-                       var lastTop,
-                               $img,
-                               imgWidth,
-                               imgHeight,
-                               rows = [],
-                               $gallery = $( this );
-
-                       $gallery.children( 'li' ).each( function () {
-                               // Math.floor to be paranoid if things are off by 0.00000000001
-                               var top = Math.floor( $( this ).position().top ),
-                                       $this = $( this );
-
-                               if ( top !== lastTop ) {
-                                       rows[rows.length] = [];
-                                       lastTop = top;
-                               }
+               $galleries = $content.find( 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed' );
+               // Call the justification asynchronous because live preview fires the hook with detached $content.
+               setTimeout( function () {
+                       $galleries.each( justify );
+               } );
+       } );
 
-                               $img = $this.find( 'div.thumb a.image img' );
-                               if ( $img.length && $img[0].height ) {
-                                       imgHeight = $img[0].height;
-                                       imgWidth = $img[0].width;
+       $( function () {
+               $( window ).resize( $.debounce( 300, true, function () {
+                       $galleries.children( 'li' ).each( function () {
+                               var imgWidth = $( this ).data( 'imgWidth' ),
+                                       imgHeight = $( this ).data( 'imgHeight' ),
+                                       width = $( this ).data( 'width' ),
+                                       captionWidth = $( this ).data( 'captionWidth' ),
+                                       $innerDiv = $( this ).children( 'div' ).first(),
+                                       $imageDiv = $innerDiv.children( 'div.thumb' ),
+                                       $imageElm, imageElm;
+
+                               // Restore original sizes so we can arrange the elements as on freshly loaded page
+                               $( this ).width( width );
+                               $innerDiv.width( width );
+                               $imageDiv.width( imgWidth );
+                               $( this ).find( 'div.gallerytextwrapper' ).width( captionWidth );
+
+                               $imageElm = $( this ).find( 'img' ).first();
+                               imageElm = $imageElm.length ? $imageElm[0] : null;
+                               if ( imageElm ) {
+                                       imageElm.width = imgWidth;
+                                       imageElm.height = imgHeight;
                                } else {
-                                       // If we don't have a real image, get the containing divs width/height.
-                                       // Note that if we do have a real image, using this method will generally
-                                       // give the same answer, but can be different in the case of a very
-                                       // narrow image where extra padding is added.
-                                       imgHeight = $this.children().children( 'div:first' ).height();
-                                       imgWidth = $this.children().children( 'div:first' ).width();
-                               }
-
-                               // Hack to make an edge case work ok
-                               if ( imgHeight < 30 ) {
-                                       // Don't try and resize this item.
-                                       imgHeight = 0;
+                                       $imageDiv.height( imgHeight );
                                }
-
-                               rows[rows.length - 1][rows[rows.length - 1].length] = {
-                                       $elm: $this,
-                                       width: $this.outerWidth(),
-                                       imgWidth: imgWidth,
-                                       // XXX: can divide by 0 ever happen?
-                                       aspect: imgWidth / imgHeight,
-                                       captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
-                                       height: imgHeight
-                               };
                        } );
-
-                       ( function () {
-                               var maxWidth,
-                                       combinedAspect,
-                                       combinedPadding,
-                                       curRow,
-                                       curRowHeight,
-                                       wantedWidth,
-                                       preferredHeight,
-                                       newWidth,
-                                       padding,
-                                       $outerDiv,
-                                       $innerDiv,
-                                       $imageDiv,
-                                       $imageElm,
-                                       imageElm,
-                                       $caption,
-                                       i,
-                                       j,
-                                       avgZoom,
-                                       totalZoom = 0;
-
-                               for ( i = 0; i < rows.length; i++ ) {
-                                       maxWidth = $gallery.width();
-                                       combinedAspect = 0;
-                                       combinedPadding = 0;
-                                       curRow = rows[i];
-                                       curRowHeight = 0;
-
-                                       for ( j = 0; j < curRow.length; j++ ) {
-                                               if ( curRowHeight === 0 ) {
-                                                       if ( isFinite( curRow[j].height ) ) {
-                                                               // Get the height of this row, by taking the first
-                                                               // non-out of bounds height
-                                                               curRowHeight = curRow[j].height;
-                                                       }
-                                               }
-
-                                               if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
-                                                       // One of the dimensions are 0. Probably should
-                                                       // not try to resize.
-                                                       combinedPadding += curRow[j].width;
-                                               } else {
-                                                       combinedAspect += curRow[j].aspect;
-                                                       combinedPadding += curRow[j].width - curRow[j].imgWidth;
-                                               }
-                                       }
-
-                                       // Add some padding for inter-element spacing.
-                                       combinedPadding += 5 * curRow.length;
-                                       wantedWidth = maxWidth - combinedPadding;
-                                       preferredHeight = wantedWidth / combinedAspect;
-
-                                       if ( preferredHeight > curRowHeight * 1.5 ) {
-                                               // Only expand at most 1.5 times current size
-                                               // As that's as high a resolution as we have.
-                                               // Also on the off chance there is a bug in this
-                                               // code, would prevent accidentally expanding to
-                                               // be 10 billion pixels wide.
-                                               if ( i === rows.length - 1 ) {
-                                                       // If its the last row, and we can't fit it,
-                                                       // don't make the entire row huge.
-                                                       avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
-                                                       if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
-                                                               preferredHeight = avgZoom;
-                                                       } else {
-                                                               // Probably a single row gallery
-                                                               preferredHeight = curRowHeight;
-                                                       }
-                                               } else {
-                                                       preferredHeight = 1.5 * curRowHeight;
-                                               }
-                                       }
-                                       if ( !isFinite( preferredHeight ) ) {
-                                               // This *definitely* should not happen.
-                                               // Skip this row.
-                                               continue;
-                                       }
-                                       if ( preferredHeight < 5 ) {
-                                               // Well something clearly went wrong...
-                                               // Skip this row.
-                                               continue;
-                                       }
-
-                                       if ( preferredHeight / curRowHeight > 1 ) {
-                                               totalZoom += preferredHeight / curRowHeight;
-                                       } else {
-                                               // If we shrink, still consider that a zoom of 1
-                                               totalZoom += 1;
-                                       }
-
-                                       for ( j = 0; j < curRow.length; j++ ) {
-                                               newWidth = preferredHeight * curRow[j].aspect;
-                                               padding = curRow[j].width - curRow[j].imgWidth;
-                                               $outerDiv = curRow[j].$elm;
-                                               $innerDiv = $outerDiv.children( 'div' ).first();
-                                               $imageDiv = $innerDiv.children( 'div.thumb' );
-                                               $imageElm = $imageDiv.find( 'img' ).first();
-                                               imageElm = $imageElm.length ? $imageElm[0] : null;
-                                               $caption = $outerDiv.find( 'div.gallerytextwrapper' );
-
-                                               // Since we are going to re-adjust the height, the vertical
-                                               // centering margins need to be reset.
-                                               $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
-
-                                               if ( newWidth < 60 || !isFinite( newWidth ) ) {
-                                                       // Making something skinnier than this will mess up captions,
-                                                       if ( newWidth < 1 || !isFinite( newWidth ) ) {
-                                                               $innerDiv.height( preferredHeight );
-                                                               // Don't even try and touch the image size if it could mean
-                                                               // making it disappear.
-                                                               continue;
-                                                       }
-                                               } else {
-                                                       $outerDiv.width( newWidth + padding );
-                                                       $innerDiv.width( newWidth + padding );
-                                                       $imageDiv.width( newWidth );
-                                                       $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
-                                               }
-
-                                               if ( imageElm ) {
-                                                       // We don't always have an img, e.g. in the case of an invalid file.
-                                                       imageElm.width = newWidth;
-                                                       imageElm.height = preferredHeight;
-                                               } else {
-                                                       // Not a file box.
-                                                       $imageDiv.height( preferredHeight );
-                                               }
-                                       }
-                               }
-                       }() );
-               } );
+               } ) );
+               $( window ).resize( $.debounce( 300, function () {
+                       $galleries.each( justify );
+               } ) );
        } );
-}( jQuery ) );
+}( mediaWiki, jQuery ) );
index a9a985e..5622b32 100644 (file)
@@ -2,7 +2,7 @@
  * JavaScript for Special:Import
  */
 ( function ( $ ) {
-       function updateImportSubprojectList() {
+       function updateImportSubprojectList( firstTime ) {
                var $projectField = $( '#mw-import-table-interwiki #interwiki' ),
                        $subprojectField = $projectField.parent().find( '#subproject' ),
                        $selected = $projectField.find( ':selected' ),
@@ -14,7 +14,7 @@
                                option = document.createElement( 'option' );
                                option.appendChild( document.createTextNode( el ) );
                                option.setAttribute( 'value', el );
-                               if ( oldValue === el ) {
+                               if ( oldValue === el && firstTime !== true ) {
                                        option.setAttribute( 'selected', 'selected' );
                                }
                                return option;
@@ -29,7 +29,7 @@
                var $projectField = $( '#mw-import-table-interwiki #interwiki' );
                if ( $projectField.length ) {
                        $projectField.change( updateImportSubprojectList );
-                       updateImportSubprojectList();
+                       updateImportSubprojectList( true );
                }
        } );
 }( jQuery ) );
index 3dd65fb..fb74e4e 100644 (file)
@@ -6,7 +6,7 @@
 
                // Create useskin dropdown menu and reload onchange to the selected skin
                // (only if a framework was found, not on error pages).
-               $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function () {
+               $( '#mw-javascripttest-summary' ).append( function () {
 
                        var $html = $( '<p><label for="useskin">'
                                        + mw.message( 'javascripttest-pagetext-skins' ).escaped()
@@ -25,7 +25,8 @@
                        // Bind onchange event handler and append to form
                        $html.append(
                                $( select ).change( function () {
-                                       location.href = QUnit.url( { useskin: $( this ).val() } );
+                                       var url = new mw.Uri();
+                                       location.href = url.extend( { useskin: $( this ).val() } );
                                } )
                        );
 
index c6ee1a7..f405c7a 100644 (file)
                                // URLs are less likely to have a useful extension, so don't include them in the
                                // extension check.
                                if (
+                                       mw.config.get( 'wgCheckFileExtensions' ) &&
                                        mw.config.get( 'wgStrictFileExtensions' ) &&
                                        mw.config.get( 'wgFileExtensions' ) &&
                                        $( this ).attr( 'id' ) !== 'wpUploadFileURL'
index 28b1446..30f000b 100644 (file)
@@ -1,5 +1,5 @@
 /* Styles for user login and signup forms */
-#mw-userlogin-help {
+.mw-form-related-link-container {
        text-align: center;
 }
 
index 247f814..f5289de 100644 (file)
@@ -20,7 +20,7 @@
                if ( !$submit.length ) {
                        return;
                }
-               tabIndex = $submit.prop( 'tabindex' ) - 1;
+               tabIndex = $submit.prop( 'tabIndex' ) - 1;
                $captchaStuff = $content.find( '.captcha' );
 
                if ( $captchaStuff.length ) {
index 64471b2..df3db57 100644 (file)
@@ -7,16 +7,3 @@
        margin: 0 auto;
        padding-top: 4em;
 }
-
-#mw-createaccount-cta,
-#mw-createaccount-another {
-       font-size: 0.9em;
-       font-weight: normal;
-       text-align: center;
-}
-
-#mw-createaccount-join {
-       margin-left: 0.75em;
-       width: auto;
-       display: inline-block;
-}
index f9944b4..70d54ce 100644 (file)
                // This causes further calls to addButton to go to insertion directly
                // instead of to the queue.
                // It is important that this is after the one and only loop through
-               // the the queue
+               // the queue
                isReady = true;
 
                // Apply to dynamically created textboxes as well as normal ones
index 6ba7bf7..f88f3ee 100644 (file)
@@ -17,6 +17,8 @@
 
 // Neutral button styling
 //
+// These are the main actions on the page/workflow. The page should have only one of progressive, constructive and desctructive buttons, the rest being quiet.
+//
 // Markup:
 // <div>
 //   <button class="mw-ui-button">.mw-ui-button</button>
 
        // Quiet buttons
        //
-       // Use quiet buttons when they are less important and alongside other constructive/progressive/destructive buttons.
-       // Use of quiet buttons is not recommended on mobile/tablet due to lack of hover state.
+       // Use quiet buttons when they are less important and alongside other constructive, progressive or destructive buttons. It should be used for an action that exits the user from the current view/workflow.
+       // Its use is  not recommended on mobile/tablet due to lack of hover state.
        //
        // Markup:
        // <div>
index ff454e1..4829f5f 100644 (file)
 @checkboxSize: 2em;
 
 // We use the not selector to cancel out styling on IE 8 and below
-.mw-ui-checkbox:not(#noop) {
+// We also disable this styling on javascript disabled devices. This fixes the issue with
+// Opera Mini where checking/unchecking doesn't apply styling but potentially leaves other
+// more capable browsers with unstyled checkboxes.
+.client-js .mw-ui-checkbox:not(#noop) {
        // Position relatively so we can make use of absolute pseudo elements
        position: relative;
-       line-height: @checkboxSize;
+       display: table;
 
        * {
                // reset font sizes (see bug 72727)
                height: @checkboxSize;
                // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
                max-width: none;
+               margin: 0;
                margin-right: 0.4em;
+               display: table-cell;
+
+               & + label {
+                       display: table-cell;
+               }
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
                & + label::before {
+                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
                        border-radius: @borderRadius;
                        width: @checkboxSize;
                        height: @checkboxSize;
+                       line-height: @checkboxSize;
                        background-color: #fff;
                        border: 1px solid @colorGray7;
-               }
-
-               // when the input is checked, style the label pseudo before element that followed as a checked checkbox
-               &:checked + label::before {
+                       // align the checkbox to middle of the text
+                       top: 50%;
+                       margin-top: -1em;
                        .background-image-svg('images/checked.svg', 'images/checked.png');
                        .background-size( @checkboxSize - 0.2em, @checkboxSize - 0.2em );
                        background-repeat: no-repeat;
                        background-position: center center;
                        background-origin: border-box;
+                       background-size: 0 0;
+               }
+
+               // when the input is checked, style the label pseudo before element that followed as a checked checkbox
+               &:checked + label::before {
+                       background-size: 100% 100%;
                }
 
                &:active + label::before {
index 40d1723..ad951b0 100644 (file)
@@ -36,8 +36,9 @@
        // Standalone icons
        //
        // Markup:
-       // <div class="mw-ui-icon mw-ui-icon-element mw-ui-icon-ok">OK</div>
-       // <div class="mw-ui-icon mw-ui-icon-element mw-ui-icon-ok mw-ui-button mw-ui-progressive">OK</div>
+       // <div class="mw-ui-icon mw-ui-icon-element mw-ui-icon-ok">OK</div><br/>
+       // <div class="mw-ui-icon mw-ui-icon-element mw-ui-icon-ok mw-ui-button mw-ui-progressive">OK</div><br/>
+       // <button class="mw-ui-icon mw-ui-icon-ok mw-ui-icon-element mw-ui-button mw-ui-quiet" title="">Close</button>
        //
        // Styleguide 6.1.1.
        &.mw-ui-icon-element {
@@ -49,7 +50,6 @@
                min-width: @width;
                max-width: @width;
                &:before {
-                       top: 0;
                        left: 0;
                        right: 0;
                        position: absolute;
index 992c55b..ec8ffe3 100644 (file)
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><circle fill="#fff" cx="12" cy="12" r="6"/></svg>\r
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><circle fill="#fff" cx="12" cy="12" r="6"/></svg>
index 425ec1b..1928699 100644 (file)
 
 @radioSize: 2em;
 
-// We use the not selector to cancel out styling on IE 8 and below
-.mw-ui-radio:not(#noop) {
+// We use the not selector to cancel out styling on IE 8 and below.
+// We also disable this styling on javascript disabled devices. This fixes the issue with
+// Opera Mini where checking/unchecking doesn't apply styling but potentially leaves other
+// more capable browsers with unstyled radio buttons.
+.client-js .mw-ui-radio:not(#noop) {
        // Position relatively so we can make use of absolute pseudo elements
        position: relative;
        line-height: @radioSize;
@@ -60,6 +63,7 @@
 
                // the pseudo before element of the label after the radio now looks like a radio
                & + label::before {
+                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
                        height: @radioSize;
                        background-color: #fff;
                        border: 1px solid @colorGray7;
-               }
-
-               // when the input is checked, style the label pseudo before element that followed as a checked radio
-               &:checked + label::before {
                        .background-image-svg('images/radio_checked.svg', 'images/radio_checked.png');
                        .background-size( @radioSize, @radioSize );
                        background-repeat: no-repeat;
                        background-position: center center;
                        background-origin: border-box;
+                       background-size: 0 0;
+               }
+
+               // when the input is checked, style the label pseudo before element that followed as a checked radio
+               &:checked + label::before {
+                       background-size: 100% 100%;
                }
 
                &:active + label::before {
index 7ced42f..eaf079f 100644 (file)
@@ -8,7 +8,7 @@
        /**
         * @class mw.Title
         *
-        * Parse titles into an object struture. Note that when using the constructor
+        * Parse titles into an object structure. Note that when using the constructor
         * directly, passing invalid titles will result in an exception. Use #newFromText to use the
         * logic directly and get null for invalid titles which is easier to work with.
         *
 
        rSplit = /^(.+?)_*:_*(.*)$/,
 
-       // See Title.php#getTitleInvalidRegex
+       // See MediaWikiTitleCodec.php#getTitleInvalidRegex
        rInvalid = new RegExp(
                '[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
                // URL percent encoding sequences interfere with the ability
 
                normalizeExtension = function ( extension ) {
                        // Remove only trailing space (that is removed by MW anyway)
-                       extension = extension.toLowerCase().replace(/\s*$/, '');
+                       extension = extension.toLowerCase().replace( /\s*$/, '' );
                        return extension;
                };
 
index d93e291..9e20264 100644 (file)
        padding: 0.5em 1em;
 }
 
-.mw-json td {
-       background-color: #eee;
-       font-style: italic;
-}
-
-.mw-json .value {
+.mw-json .value,
+.mw-json-single-value {
        background-color: #dcfae3;
        font-family: monospace, monospace;
        white-space: pre-wrap;
 }
 
+.mw-json-single-value {
+       background-color: #eee;
+}
+
+.mw-json-empty {
+       background-color: #fff;
+       font-style: italic;
+}
+
 .mw-json tr {
        margin-bottom: 0.5em;
+       background-color: #eee;
 }
 
 .mw-json th {
index 587f5b9..867134c 100644 (file)
                                fb = this;
 
                        // Get the values to submit.
-                       subject = this.subjectInput.value;
+                       subject = $.trim( this.subjectInput.value );
 
                        // We used to include "mw.html.escape( navigator.userAgent )" but there are legal issues
                        // with posting this without their explicit consent
-                       message = this.messageInput.value;
+                       message = $.trim( this.messageInput.value );
                        if ( message.indexOf( '~~~' ) === -1 ) {
                                message += ' ~~~~';
                        }
index c8f5506..c7858ab 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * Base library for MediaWiki.
  *
- * Exposed as globally as `mediaWiki` with `mw` as shortcut.
+ * Exposed globally as `mediaWiki` with `mw` as shortcut.
  *
  * @class mw
  * @alternateClassName mediaWiki
@@ -10,8 +10,6 @@
 ( function ( $ ) {
        'use strict';
 
-       /* Private Members */
-
        var mw,
                hasOwn = Object.prototype.hasOwnProperty,
                slice = Array.prototype.slice,
                trackQueue = [];
 
        /**
-        * Log a message to window.console, if possible. Useful to force logging of some
-        * errors that are otherwise hard to detect (I.e., this logs also in production mode).
-        * Gets console references in each invocation, so that delayed debugging tools work
-        * fine. No need for optimization here, which would only result in losing logs.
+        * Log a message to window.console, if possible.
+        *
+        * Useful to force logging of some  errors that are otherwise hard to detect (i.e., this logs
+        * also in production mode). Gets console references in each invocation instead of caching the
+        * reference, so that debugging tools loaded later are supported (e.g. Firebug Lite in IE).
         *
         * @private
         * @method log_
-        * @param {string} msg text for the log entry.
+        * @param {string} msg Text for the log entry.
         * @param {Error} [e]
         */
        function log( msg, e ) {
                var console = window.console;
                if ( console && console.log ) {
                        console.log( msg );
-                       // If we have an exception object, log it through .error() to trigger
-                       // proper stacktraces in browsers that support it. There are no (known)
-                       // browsers that don't support .error(), that do support .log() and
-                       // have useful exception handling through .log().
+                       // If we have an exception object, log it to the error channel to trigger a
+                       // proper stacktraces in browsers that support it. No fallback as we have no browsers
+                       // that don't support error(), but do support log().
                        if ( e && console.error ) {
                                console.error( String( e ), e );
                        }
                }
        }
 
-       /* Object constructors */
-
        /**
-        * Creates an object that can be read from or written to from prototype functions
-        * that allow both single and multiple variables at once.
+        * Create an object that can be read from or written to from methods that allow
+        * interaction both with single and multiple properties at once.
         *
         *     @example
         *
-        *     var addies, wanted, results;
+        *     var collection, query, results;
         *
         *     // Create your address book
-        *     addies = new mw.Map();
+        *     collection = new mw.Map();
         *
         *     // This data could be coming from an external source (eg. API/AJAX)
-        *     addies.set( {
-        *         'John Doe' : '10 Wall Street, New York, USA',
-        *         'Jane Jackson' : '21 Oxford St, London, UK',
-        *         'Dominique van Halen' : 'Kalverstraat 7, Amsterdam, NL'
+        *     collection.set( {
+        *         'John Doe': 'john@example.org',
+        *         'Jane Doe': 'jane@example.org',
+        *         'George van Halen': 'gvanhalen@example.org'
         *     } );
         *
-        *     wanted = ['Dominique van Halen', 'George Johnson', 'Jane Jackson'];
+        *     wanted = ['John Doe', 'Jane Doe', 'Daniel Jackson'];
         *
         *     // You can detect missing keys first
-        *     if ( !addies.exists( wanted ) ) {
-        *         // One or more are missing (in this case: "George Johnson")
+        *     if ( !collection.exists( wanted ) ) {
+        *         // One or more are missing (in this case: "Daniel Jackson")
         *         mw.log( 'One or more names were not found in your address book' );
         *     }
         *
-        *     // Or just let it give you what it can
-        *     results = addies.get( wanted, 'Middle of Nowhere, Alaska, US' );
-        *     mw.log( results['Jane Jackson'] ); // "21 Oxford St, London, UK"
-        *     mw.log( results['George Johnson'] ); // "Middle of Nowhere, Alaska, US"
+        *     // Or just let it give you what it can. Optionally fill in from a default.
+        *     results = collection.get( wanted, 'nobody@example.com' );
+        *     mw.log( results['Jane Doe'] ); // "jane@example.org"
+        *     mw.log( results['Daniel Jackson'] ); // "nobody@example.com"
         *
         * @class mw.Map
         *
         * @constructor
-        * @param {Object|boolean} [values] Value-bearing object to map, or boolean
-        *  true to map over the global object. Defaults to an empty object.
+        * @param {Object|boolean} [values] The value-baring object to be mapped. Defaults to an
+        *  empty object.
+        *  For backwards-compatibility with mw.config, this can also be `true` in which case values
+        *  are copied to the Window object as global variables (T72470). Values are copied in
+        *  one direction only. Changes to globals are not reflected in the map.
         */
        function Map( values ) {
-               this.values = values === true ? window : ( values || {} );
-               return this;
+               if ( values === true ) {
+                       this.values = {};
+
+                       // Override #set to also set the global variable
+                       this.set = function ( selection, value ) {
+                               var s;
+
+                               if ( $.isPlainObject( selection ) ) {
+                                       for ( s in selection ) {
+                                               setGlobalMapValue( this, s, selection[s] );
+                                       }
+                                       return true;
+                               }
+                               if ( typeof selection === 'string' && arguments.length ) {
+                                       setGlobalMapValue( this, selection, value );
+                                       return true;
+                               }
+                               return false;
+                       };
+
+                       return;
+               }
+
+               this.values = values || {};
+       }
+
+       /**
+        * Alias property to the global object.
+        *
+        * @private
+        * @static
+        * @param {mw.Map} map
+        * @param {string} key
+        * @param {Mixed} value
+        */
+       function setGlobalMapValue( map, key, value ) {
+               map.values[key] = value;
+               mw.log.deprecate(
+                       window,
+                       key,
+                       value,
+                       // Deprecation notice for mw.config globals (T58550, T72470)
+                       map === mw.config && 'Use mw.config instead.'
+               );
        }
 
        Map.prototype = {
                /**
-                * Get the value of one or multiple a keys.
+                * Get the value of one or more keys.
                 *
-                * If called with no arguments, all values will be returned.
+                * If called with no arguments, all values are returned.
                 *
-                * @param {string|Array} selection String key or array of keys to get values for.
-                * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
-                * @return mixed If selection was a string returns the value or null,
-                *  If selection was an array, returns an object of key/values (value is null if not found),
-                *  If selection was not passed or invalid, will return the 'values' object member (be careful as
-                *  objects are always passed by reference in JavaScript!).
-                * @return {string|Object|null} Values as a string or object, null if invalid/inexistant.
+                * @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,
+                *  If selection was an array, returns an object of key/values.
+                *  If no selection is passed, the 'values' container is returned. (Beware that,
+                *  as is the default in JavaScript, the object is returned by reference.)
                 */
                get: function ( selection, fallback ) {
                        var results, i;
                                return this.values;
                        }
 
-                       // invalid selection key
+                       // Invalid selection key
                        return null;
                },
 
                /**
-                * Sets one or multiple key/value pairs.
+                * Set one or more key/value pairs.
                 *
-                * @param {string|Object} selection String key to set value for, or object mapping keys to values.
+                * @param {string|Object} selection Key to set value for, or object mapping keys to values
                 * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
-                * @return {Boolean} This returns true on success, false on failure.
+                * @return {boolean} True on success, false on failure
                 */
                set: function ( selection, value ) {
                        var s;
                },
 
                /**
-                * Checks if one or multiple keys exist.
+                * Check if one or more keys exist.
                 *
-                * @param {Mixed} selection String key or array of keys to check
-                * @return {boolean} Existence of key(s)
+                * @param {Mixed} selection Key or array of keys to check
+                * @return {boolean} True if the key(s) exist
                 */
                exists: function ( selection ) {
                        var s;
         * @class mw.Message
         *
         * @constructor
-        * @param {mw.Map} map Message storage
+        * @param {mw.Map} map Message store
         * @param {string} key
         * @param {Array} [parameters]
         */
 
        Message.prototype = {
                /**
-                * Simple message parser, does $N replacement and nothing else.
+                * Get parsed contents of the message.
                 *
+                * The default parser does simple $N replacements and nothing else.
                 * This may be overridden to provide a more complex message parser.
-                *
-                * The primary override is in mediawiki.jqueryMsg.
+                * The primary override is in the mediawiki.jqueryMsg module.
                 *
                 * This function will not be called for nonexistent messages.
+                *
+                * @return {string} Parsed message
                 */
                parser: function () {
-                       var parameters = this.parameters;
-                       return this.map.get( this.key ).replace( /\$(\d+)/g, function ( str, match ) {
-                               var index = parseInt( match, 10 ) - 1;
-                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
-                       } );
+                       return mw.format.apply( null, [ this.map.get( this.key ) ].concat( this.parameters ) );
                },
 
                /**
-                * Appends (does not replace) parameters for replacement to the .parameters property.
+                * Add (does not replace) parameters for `N$` placeholder values.
                 *
                 * @param {Array} parameters
                 * @chainable
                },
 
                /**
-                * Converts message object to its string form based on the state of format.
+                * Convert message object to its string form based on current format.
                 *
-                * @return {string} Message as a string in the current form or `<key>` if key does not exist.
+                * @return {string} Message as a string in the current form, or `<key>` if key
+                *  does not exist.
                 */
                toString: function () {
                        var text;
                },
 
                /**
-                * Changes format to 'parse' and converts message to string
+                * Change format to 'parse' and convert message to string
                 *
                 * If jqueryMsg is loaded, this parses the message text from wikitext
                 * (where supported) to HTML
                },
 
                /**
-                * Changes format to 'plain' and converts message to string
+                * Change format to 'plain' and convert message to string
                 *
                 * This substitutes parameters, but otherwise does not change the
                 * message text.
                },
 
                /**
-                * Changes format to 'text' and converts message to string
+                * Change format to 'text' and convert message to string
                 *
                 * If jqueryMsg is loaded, {{-transformation is done where supported
                 * (such as {{plural:}}, {{gender:}}, {{int:}}).
                 *
-                * Otherwise, it is equivalent to plain.
+                * Otherwise, it is equivalent to plain
+                *
+                * @return {string} String form of text message
                 */
                text: function () {
                        this.format = 'text';
                },
 
                /**
-                * Changes the format to 'escaped' and converts message to string
+                * Change the format to 'escaped' and convert message to string
                 *
-                * This is equivalent to using the 'text' format (see text method), then
+                * This is equivalent to using the 'text' format (see #text), then
                 * HTML-escaping the output.
                 *
                 * @return {string} String form of html escaped message
                },
 
                /**
-                * Checks if message exists
+                * Check if a message exists
                 *
                 * @see mw.Map#exists
                 * @return {boolean}
         * @class mw
         */
        mw = {
-               /* Public Members */
 
                /**
                 * Get the current time, measured in milliseconds since January 1, 1970 (UTC).
                                function () { return +new Date(); };
                }() ),
 
+               /**
+                * Format a string. Replace $1, $2 ... $N with positional arguments.
+                *
+                * Used by Message#parser().
+                *
+                * @since 1.25
+                * @param {string} fmt Format string
+                * @param {Mixed...} parameters Values for $N replacements
+                * @return {string} Formatted string
+                */
+               format: function ( formatString ) {
+                       var parameters = slice.call( arguments, 1 );
+                       return formatString.replace( /\$(\d+)/g, function ( str, match ) {
+                               var index = parseInt( match, 10 ) - 1;
+                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                       } );
+               },
+
                /**
                 * Track an analytic event.
                 *
                },
 
                /**
-                * Register a handler for subset of analytic events, specified by topic
+                * Register a handler for subset of analytic events, specified by topic.
                 *
                 * Handlers will be called once for each tracked event, including any events that fired before the
                 * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
                 *
                 * @param {string} topic Handle events whose name starts with this string prefix
                 * @param {Function} callback Handler to call for each matching tracked event
+                * @param {string} callback.topic
+                * @param {Object} [callback.data]
                 */
                trackSubscribe: function ( topic, callback ) {
                        var seen = 0;
                        } );
                },
 
-               // Make the Map constructor publicly available.
+               // Expose Map constructor
                Map: Map,
 
-               // Make the Message constructor publicly available.
+               // Expose Message constructor
                Message: Message,
 
                /**
-                * Map of configuration values
+                * Map of configuration values.
                 *
                 * Check out [the complete list of configuration values](https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#mw.config)
                 * on mediawiki.org.
                 *
                 * @property {mw.Map} config
                 */
-               // Dummy placeholder. Re-assigned in ResourceLoaderStartupModule to an instance of `mw.Map`.
+               // Dummy placeholder later assigned in ResourceLoaderStartUpModule
                config: null,
 
                /**
                 * Empty object that plugins can be installed in.
+                *
                 * @property
                 */
                libs: {},
                legacy: {},
 
                /**
-                * Localization system
+                * Store for messages.
+                *
                 * @property {mw.Map}
                 */
                messages: new Map(),
 
                /**
-                * Templates associated with a module
+                * Store for templates associated with a module.
+                *
                 * @property {mw.Map}
                 */
                templates: new Map(),
 
-               /* Public Methods */
-
                /**
                 * Get a message object.
                 *
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+                * @param {Mixed...} parameters Values for $N replacements
                 * @return {mw.Message}
                 */
                message: function ( key ) {
-                       // Variadic arguments
                        var parameters = slice.call( arguments, 1 );
                        return new Message( mw.messages, key, parameters );
                },
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+                * @param {Mixed...} parameters Values for $N replacements
                 * @return {string}
                 */
                msg: function () {
                        /**
                         * Write a message the console's warning channel.
                         * Also logs a stacktrace for easier debugging.
-                        * Each action is silently ignored if the browser doesn't support it.
+                        * Actions not supported by the browser console are silently ignored.
                         *
                         * @param {string...} msg Messages to output to console
                         */
                         * @param {Object} obj Host object of deprecated property
                         * @param {string} key Name of property to create in `obj`
                         * @param {Mixed} val The value this property should return when accessed
-                        * @param {string} [msg] Optional text to include in the deprecation message.
+                        * @param {string} [msg] Optional text to include in the deprecation message
                         */
                        log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
                                obj[key] = val;
                        } : function ( obj, key, val, msg ) {
                                msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
+                               // Support: IE8
+                               // Can throw on Object.defineProperty.
                                try {
                                        Object.defineProperty( obj, key, {
                                                configurable: true,
                                                }
                                        } );
                                } catch ( err ) {
-                                       // IE8 can throw on Object.defineProperty
+                                       // Fallback to creating a copy of the value to the object.
                                        obj[key] = val;
                                }
                        };
                }() ),
 
                /**
-                * Client-side module loader which integrates with the MediaWiki ResourceLoader
+                * Client for ResourceLoader server end point.
+                *
+                * This client is in charge of maintaining the module registry and state
+                * machine, initiating network (batch) requests for loading modules, as
+                * well as dependency resolution and execution of source code.
+                *
+                * For more information, refer to
+                * <https://www.mediawiki.org/wiki/ResourceLoader/Features>
+                *
                 * @class mw.loader
                 * @singleton
                 */
                loader: ( function () {
 
-                       /* Private Members */
-
                        /**
-                        * Mapping of registered modules
-                        *
-                        * The jquery module is pre-registered, because it must have already
-                        * been provided for this object to have been built, and in debug mode
-                        * jquery would have been provided through a unique loader request,
-                        * making it impossible to hold back registration of jquery until after
-                        * mediawiki.
+                        * Mapping of registered modules.
                         *
-                        * For exact details on support for script, style and messages, look at
-                        * mw.loader.implement.
+                        * See #implement for exact details on support for script, style and messages.
                         *
                         * Format:
+                        *
                         *     {
                         *         'moduleName': {
-                        *             // At registry
-                        *             'version': ############## (unix timestamp),
+                        *             // From startup mdoule
+                        *             'version': ############## (unix timestamp)
                         *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
-                        *             'group': 'somegroup', (or) null,
-                        *             'source': 'local', 'someforeignwiki', (or) null
-                        *             'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing'
+                        *             'group': 'somegroup', (or) null
+                        *             'source': 'local', (or) 'anotherwiki'
                         *             'skip': 'return !!window.Example', (or) null
+                        *             'state': 'registered', 'loaded', 'loading', 'ready', 'error', or 'missing'
                         *
                         *             // Added during implementation
-                        *             'skipped': true,
-                        *             'script': ...,
-                        *             'style': ...,
-                        *             'messages': { 'key': 'value' },
+                        *             'skipped': true
+                        *             'script': ...
+                        *             'style': ...
+                        *             'messages': { 'key': 'value' }
                         *         }
                         *     }
                         *
                         * @private
                         */
                        var registry = {},
-                               //
                                // Mapping of sources, keyed by source-id, values are strings.
+                               //
                                // Format:
-                               //      {
-                               //              'sourceId': 'http://foo.bar/w/load.php'
-                               //      }
+                               //
+                               //     {
+                               //         'sourceId': 'http://example.org/w/load.php'
+                               //     }
                                //
                                sources = {},
+
                                // List of modules which will be loaded as when ready
                                batch = [],
+
                                // List of modules to be loaded
                                queue = [],
+
                                // List of callback functions waiting for modules to be ready to be called
                                jobs = [],
+
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null,
-                               // Buffer for addEmbeddedCSS.
+
+                               // Buffer for #addEmbeddedCSS
                                cssBuffer = '',
-                               // Callbacks for addEmbeddedCSS.
-                               cssCallbacks = $.Callbacks();
 
-                       /* Private methods */
+                               // Callbacks for #addEmbeddedCSS
+                               cssCallbacks = $.Callbacks();
 
                        function getMarker() {
-                               // Cached
                                if ( !$marker ) {
+                                       // Cache
                                        $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
                                        if ( !$marker.length ) {
                                                mw.log( 'No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically' );
                        }
 
                        /**
-                        * Create a new style tag and add it to the DOM.
+                        * Create a new style element and add it to the DOM.
                         *
                         * @private
                         * @param {string} text CSS text
-                        * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag should be
-                        *  inserted before. Otherwise it will be appended to `<head>`.
-                        * @return {HTMLElement} Reference to the created `<style>` element.
+                        * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag
+                        *  should be inserted before
+                        * @return {HTMLElement} Reference to the created style element
                         */
                        function newStyleTag( text, nextnode ) {
                                var s = document.createElement( 'style' );
-                               // Insert into document before setting cssText (bug 33305)
+                               // Support: IE
+                               // Must attach to document before setting cssText (bug 33305)
                                if ( nextnode ) {
-                                       // Must be inserted with native insertBefore, not $.fn.before.
-                                       // When using jQuery to insert it, like $nextnode.before( s ),
-                                       // then IE6 will throw "Access is denied" when trying to append
-                                       // to .cssText later. Some kind of weird security measure.
-                                       // http://stackoverflow.com/q/12586482/319266
-                                       // Works: jsfiddle.net/zJzMy/1
-                                       // Fails: jsfiddle.net/uJTQz
-                                       // Works again: http://jsfiddle.net/Azr4w/ (diff: the next 3 lines)
-                                       if ( nextnode.jquery ) {
-                                               nextnode = nextnode.get( 0 );
-                                       }
-                                       nextnode.parentNode.insertBefore( s, nextnode );
+                                       $( nextnode ).before( s );
                                } else {
                                        document.getElementsByTagName( 'head' )[0].appendChild( s );
                                }
                                if ( s.styleSheet ) {
-                                       // IE
+                                       // Support: IE6-10
+                                       // Old IE ignores appended text nodes, access stylesheet directly.
                                        s.styleSheet.cssText = text;
                                } else {
-                                       // Other browsers.
-                                       // (Safari sometimes borks on non-string values,
-                                       // play safe by casting to a string, just in case.)
-                                       s.appendChild( document.createTextNode( String( text ) ) );
+                                       // Standard behaviour
+                                       s.appendChild( document.createTextNode( text ) );
                                }
                                return s;
                        }
 
                        /**
-                        * Checks whether it is safe to add this css to a stylesheet.
+                        * Check whether given styles are safe to to a stylesheet.
                         *
                         * @private
                         * @param {string} cssText
                                // Yield once before inserting the <style> tag. There are likely
                                // more calls coming up which we can combine this way.
                                // Appending a stylesheet and waiting for the browser to repaint
-                               // is fairly expensive, this reduces it (bug 45810)
+                               // is fairly expensive, this reduces that (bug 45810)
                                if ( cssText ) {
                                        // Be careful not to extend the buffer with css that needs a new stylesheet
                                        if ( !cssBuffer || canExpandStylesheetWith( cssText ) ) {
                                                cssBuffer += '\n' + cssText;
                                                // TODO: Use requestAnimationFrame in the future which will
                                                // perform even better by not injecting styles while the browser
-                                               // is paiting.
+                                               // is painting.
                                                setTimeout( function () {
                                                        // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
                                                        // (below version 13) has the non-standard behaviour of passing a
                                } else if ( cssBuffer ) {
                                        cssText = cssBuffer;
                                        cssBuffer = '';
+
                                } else {
-                                       // This is a delayed call, but buffer is already cleared by
+                                       // This is a delayed call, but buffer was already cleared by
                                        // another delayed call.
                                        return;
                                }
                                if ( 'documentMode' in document && document.documentMode <= 9 ) {
 
                                        $style = getMarker().prev();
-                                       // Verify that the the element before Marker actually is a
+                                       // Verify that the element before the marker actually is a
                                        // <style> tag and one that came from ResourceLoader
                                        // (not some other style tag or even a `<meta>` or `<script>`).
                                        if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
                                                // There's already a dynamic <style> tag present and
                                                // canExpandStylesheetWith() gave a green light to append more to it.
                                                styleEl = $style.get( 0 );
+                                               // Support: IE6-10
                                                if ( styleEl.styleSheet ) {
                                                        try {
-                                                               styleEl.styleSheet.cssText += cssText; // IE
+                                                               styleEl.styleSheet.cssText += cssText;
                                                        } catch ( e ) {
                                                                log( 'Stylesheet error', e );
                                                        }
                                                } else {
-                                                       styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+                                                       styleEl.appendChild( document.createTextNode( cssText ) );
                                                }
                                                cssCallbacks.fire().empty();
                                                return;
                        }
 
                        /**
-                        * Convert UNIX timestamp to ISO8601 format
-                        * @param {number} timestamp UNIX timestamp
+                        * Zero-pad three numbers.
+                        *
                         * @private
+                        * @param {number} a
+                        * @param {number} b
+                        * @param {number} c
+                        * @return {string}
+                        */
+                       function pad( a, b, c ) {
+                               return [
+                                       a < 10 ? '0' + a : a,
+                                       b < 10 ? '0' + b : b,
+                                       c < 10 ? '0' + c : c
+                               ].join( '' );
+                       }
+
+                       /**
+                        * Convert UNIX timestamp to ISO8601 format.
+                        *
+                        * @private
+                        * @param {number} timestamp UNIX timestamp
                         */
                        function formatVersionNumber( timestamp ) {
                                var     d = new Date();
-                               function pad( a, b, c ) {
-                                       return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
-                               }
                                d.setTime( timestamp * 1000 );
                                return [
-                                       pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
-                                       pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
+                                       pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ),
+                                       'T',
+                                       pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ),
+                                       'Z'
                                ].join( '' );
                        }
 
                        /**
-                        * Resolves dependencies and detects circular references.
+                        * Resolve dependencies and detect circular references.
                         *
                         * @private
                         * @param {string} module Name of the top-level module whose dependencies shall be
-                        *   resolved and sorted.
+                        *  resolved and sorted.
                         * @param {Array} resolved Returns a topological sort of the given module and its
-                        *   dependencies, such that later modules depend on earlier modules. The array
-                        *   contains the module names. If the array contains already some module names,
-                        *   this function appends its result to the pre-existing array.
+                        *  dependencies, such that later modules depend on earlier modules. The array
+                        *  contains the module names. If the array contains already some module names,
+                        *  this function appends its result to the pre-existing array.
                         * @param {Object} [unresolved] Hash used to track the current dependency
-                        *   chain; used to report loops in the dependency graph.
+                        *  chain; used to report loops in the dependency graph.
                         * @throws {Error} If any unregistered module or a dependency loop is encountered
                         */
                        function sortDependencies( module, resolved, unresolved ) {
                                        }
                                }
                                if ( $.inArray( module, resolved ) !== -1 ) {
-                                       // Module already resolved; nothing to do.
+                                       // Module already resolved; nothing to do
                                        return;
                                }
-                               // unresolved is optional, supply it if not passed in
+                               // Create unresolved if not passed in
                                if ( !unresolved ) {
                                        unresolved = {};
                                }
                        }
 
                        /**
-                        * Gets a list of module names that a module depends on in their proper dependency
+                        * Get a list of module names that a module depends on in their proper dependency
                         * order.
                         *
                         * @private
                         * @param {string} module Module name or array of string module names
-                        * @return {Array} list of dependencies, including 'module'.
+                        * @return {Array} List of dependencies, including 'module'.
                         * @throws {Error} If circular reference is detected
                         */
                        function resolve( module ) {
                        }
 
                        /**
-                        * Narrows a list of module names down to those matching a specific
-                        * state (see comment on top of this scope for a list of valid states).
+                        * Narrow down a list of module names to those matching a specific
+                        * state (see #registry for a list of valid states).
+                        *
                         * One can also filter for 'unregistered', which will return the
                         * modules names that don't have a registry entry.
                         *
                         * @private
                         * @param {string|string[]} states Module states to filter by
-                        * @param {Array} [modules] List of module names to filter (optional, by default the entire
-                        * registry is used)
+                        * @param {Array} [modules] List of module names to filter (optional, by default the
+                        * entire registry is used)
                         * @return {Array} List of filtered module names
                         */
                        function filter( states, modules ) {
                        }
 
                        /**
-                        * A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs
-                        * and modules that depend upon this module. if the given module failed, propagate the 'error'
-                        * state up the dependency tree; otherwise, execute all jobs/modules that now have all their
-                        * dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
+                        * A module has entered state 'ready', 'error', or 'missing'. Automatically update
+                        * pending jobs and modules that depend upon this module. If the given module failed,
+                        * propagate the 'error' state up the dependency tree. Otherwise, go ahead an execute
+                        * all jobs/modules now having their dependencies satisfied.
+                        *
+                        * Jobs that depend on a failed module, will have their error callback ran (if any).
                         *
                         * @private
                         * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
                        function handlePending( module ) {
                                var j, job, hasErrors, m, stateChange;
 
-                               // Modules.
                                if ( $.inArray( registry[module].state, ['error', 'missing'] ) !== -1 ) {
                                        // If the current module failed, mark all dependent modules also as failed.
                                        // Iterate until steady-state to propagate the error state upwards in the
                                                stateChange = false;
                                                for ( m in registry ) {
                                                        if ( $.inArray( registry[m].state, ['error', 'missing'] ) === -1 ) {
-                                                               if ( filter( ['error', 'missing'], registry[m].dependencies ).length > 0 ) {
+                                                               if ( filter( ['error', 'missing'], registry[m].dependencies ).length ) {
                                                                        registry[m].state = 'error';
                                                                        stateChange = true;
                                                                }
                                 */
                                function addLink( media, url ) {
                                        var el = document.createElement( 'link' );
-                                       // For IE: Insert in document *before* setting href
+                                       // Support: IE
+                                       // Insert in document *before* setting href
                                        getMarker().before( el );
                                        el.rel = 'stylesheet';
                                        if ( media && media !== 'all' ) {
                                                        var check = checkCssHandles;
                                                        pending++;
                                                        return function () {
-                                                               if (check) {
+                                                               if ( check ) {
                                                                        pending--;
                                                                        check();
                                                                        check = undefined; // Revoke
                                        currReqBase
                                );
                                request = sortQuery( request );
-                               // Append &* to avoid triggering the IE6 extension check
+                               // Support: IE6
+                               // Append &* to satisfy load.php's WebRequest::checkUrlExtension test. This script
+                               // isn't actually used in IE6, but MediaWiki enforces it in general.
                                addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
                        }
 
                                 * the modules are registered.
                                 *
                                 * @param {string|Array} module Module name or array of arrays, each containing
-                                *   a list of arguments compatible with this method
+                                *  a list of arguments compatible with this method
                                 * @param {number} version Module version number as a timestamp (falls backs to 0)
                                 * @param {string|Array|Function} dependencies One string or array of strings of module
                                 *  names on which this module depends, or a function that returns that array.
                                 * @param {string} module Name of module
                                 * @param {Function|Array} script Function with module code or Array of URLs to
                                 *  be used as the src attribute of a new `<script>` tag.
-                                * @param {Object} style Should follow one of the following patterns:
+                                * @param {Object} [style] Should follow one of the following patterns:
                                 *
                                 *     { "css": [css, ..] }
                                 *     { "url": { <media>: [url, ..] } }
                                 * The reason css strings are not concatenated anymore is bug 31676. We now check
                                 * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
                                 *
-                                * @param {Object} msgs List of key/value pairs to be added to mw#messages.
+                                * @param {Object} [msgs] List of key/value pairs to be added to mw#messages.
                                 * @param {Object} [templates] List of key/value pairs to be added to mw#templates.
                                 */
                                implement: function ( module, script, style, msgs, templates ) {
                                        // Validate input
                                        if ( typeof module !== 'string' ) {
-                                               throw new Error( 'module must be a string, not a ' + typeof module );
+                                               throw new Error( 'module must be of type string, not ' + typeof module );
                                        }
                                        if ( !$.isFunction( script ) && !$.isArray( script ) ) {
-                                               throw new Error( 'script must be a function or an array, not a ' + typeof script );
+                                               throw new Error( 'script must be of type function or array, not ' + typeof script );
                                        }
-                                       if ( !$.isPlainObject( style ) ) {
-                                               throw new Error( 'style must be an object, not a ' + typeof style );
+                                       if ( style && !$.isPlainObject( style ) ) {
+                                               throw new Error( 'style must be of type object, not ' + typeof style );
                                        }
-                                       if ( !$.isPlainObject( msgs ) ) {
-                                               throw new Error( 'msgs must be an object, not a ' + typeof msgs );
+                                       if ( msgs && !$.isPlainObject( msgs ) ) {
+                                               throw new Error( 'msgs must be of type object, not a ' + typeof msgs );
                                        }
-                                       if ( templates !== undefined && !$.isPlainObject( templates ) ) {
-                                               throw new Error( 'templates must be an object, not a ' + typeof templates );
+                                       if ( templates && !$.isPlainObject( templates ) ) {
+                                               throw new Error( 'templates must be of type object, not a ' + typeof templates );
                                        }
                                        // Automatically register module
                                        if ( !hasOwn.call( registry, module ) ) {
                                        }
                                        // Attach components
                                        registry[module].script = script;
-                                       registry[module].style = style;
-                                       registry[module].messages = msgs;
+                                       registry[module].style = style || {};
+                                       registry[module].messages = msgs || {};
                                        // Templates are optional (for back-compat)
                                        registry[module].templates = templates || {};
                                        // The module may already have been marked as erroneous
                                        }
                                        // Allow calling with an external url or single dependency as a string
                                        if ( typeof modules === 'string' ) {
-                                               // Support adding arbitrary external scripts
                                                if ( /^(https?:)?\/\//.test( modules ) ) {
                                                        if ( async === undefined ) {
                                                                // Assume async for bug 34542
                                                                async = true;
                                                        }
                                                        if ( type === 'text/css' ) {
-                                                               // IE7-8 throws security warnings when inserting a <link> tag
-                                                               // with a protocol-relative URL set though attributes (instead of
-                                                               // properties) - when on HTTPS. See also bug 41331.
+                                                               // 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.
                                                                l = document.createElement( 'link' );
                                                                l.rel = 'stylesheet';
                                                                l.href = modules;
                                 * Get the state of a module.
                                 *
                                 * @param {string} module Name of module
-                                * @return {string|null} The state, or null if the module (or its version) is not
+                                * @return {string|null} The state, or null if the module (or its state) is not
                                 *  in the registry.
                                 */
                                getState: function ( module ) {
                                        },
 
                                        /**
-                                        * Get a string key on which to vary the module cache.
+                                        * Get a key on which to vary the module cache.
                                         * @return {string} String of concatenated vary conditions.
                                         */
                                        getVary: function () {
                                        },
 
                                        /**
-                                        * Get a string key for a specific module. The key format is '[name]@[version]'.
+                                        * Get a key for a specific module. The key format is '[name]@[version]'.
                                         *
                                         * @param {string} module Module name
                                         * @return {string|null} Module key or null if module does not exist
                                 *  - null or undefined: The short closing form is used, e.g. `<br/>`.
                                 *  - this.Raw: The value attribute is included without escaping.
                                 *  - this.Cdata: The value attribute is included, and an exception is
-                                *   thrown if it contains an illegal ETAGO delimiter.
-                                *   See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
+                                *    thrown if it contains an illegal ETAGO delimiter.
+                                *    See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
                                 * @return {string} HTML
                                 */
                                element: function ( name, attrs, contents ) {
index 1968aa9..132c334 100644 (file)
@@ -12,7 +12,7 @@
        /**
         * A Notification object for 1 message.
         *
-        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304).
+        * The underscore in the name is to avoid a bug <https://github.com/senchalabs/jsduck/issues/304>.
         * It is not part of the actual class name.
         *
         * @class mw.Notification_
index d372e8f..7b7ccf3 100644 (file)
                ];
                $( searchboxesSelectors.join( ', ' ) )
                        .suggestions( {
-                               fetch: function ( query, response ) {
+                               fetch: function ( query, response, maxRows ) {
                                        var node = this[0];
 
                                        api = api || new mw.Api();
                                                action: 'opensearch',
                                                search: query,
                                                namespace: 0,
+                                               limit: maxRows,
                                                suggest: ''
                                        } ).done( function ( data ) {
                                                response( data[ 1 ] );
index 79f43d1..61bbb0d 100644 (file)
@@ -63,7 +63,7 @@
                        var compiledTemplate,
                                compilerName = this.getCompilerName( templateName );
 
-                       if (!compiledTemplates[moduleName]) {
+                       if ( !compiledTemplates[moduleName] ) {
                                compiledTemplates[moduleName] = {};
                        }
 
index aed093c..3964f0b 100644 (file)
@@ -5,9 +5,8 @@
        var api, config;
 
        config = {
-               fetch: function ( userInput ) {
-                       var $textbox = this,
-                               node = this[0];
+               fetch: function ( userInput, response, maxRows ) {
+                       var node = this[0];
 
                        api = api || new mw.Api();
 
                                list: 'allusers',
                                // Prefix of list=allusers is case sensitive. Normalise first
                                // character to uppercase so that "fo" may yield "Foo".
-                               auprefix: userInput.charAt( 0 ).toUpperCase() + userInput.slice( 1 )
+                               auprefix: userInput.charAt( 0 ).toUpperCase() + userInput.slice( 1 ),
+                               aulimit: maxRows
                        } ).done( function ( data ) {
                                var users = $.map( data.query.allusers, function ( userObj ) {
                                        return userObj.name;
                                } );
-                               // Set the results as the autocomplete options
-                               $textbox.suggestions( 'suggestions', users );
+                               response( users );
                        } ) );
                },
                cancel: function () {
index cf56f29..0dde873 100644 (file)
                 * p-cactions (Content actions), p-personal (Personal tools),
                 * p-navigation (Navigation), p-tb (Toolbox)
                 *
-                * The first three paramters are required, the others are optional and
+                * The first three parameters are required, the others are optional and
                 * may be null. Though providing an id and tooltip is recommended.
                 *
                 * By default the new link will be added to the end of the list. To
index 6719bdd..cd5800c 100644 (file)
@@ -1,3 +1,3 @@
 /*
-!/common/
 !/.gitignore
+!/README
index 4145b35..7a980f7 100644 (file)
@@ -11,7 +11,10 @@ directory and make a symbolic link:
 
  mediawiki/skins$ ln -s ../../skins-trunk/FooBar
 
-Most skins are available through Git:
+The default skin Vector can be installed by cloning from Git:
+    git clone https://git.wikimedia.org/git/mediawiki/skins/Vector.git
+
+Other skins are also available:
     https://gerrit.wikimedia.org/r/#/admin/projects/?filter=mediawiki%252Fskins%252F
     https://git.wikimedia.org/project/mediawiki
 
diff --git a/tests/frontend/Gruntfile.js b/tests/frontend/Gruntfile.js
deleted file mode 100644 (file)
index c011a68..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*!
- * Grunt file
- */
-
-/*jshint node:true */
-module.exports = function ( grunt ) {
-       grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-       grunt.loadNpmTasks( 'grunt-contrib-watch' );
-       grunt.loadNpmTasks( 'grunt-banana-checker' );
-       grunt.loadNpmTasks( 'grunt-jscs' );
-       grunt.loadNpmTasks( 'grunt-jsonlint' );
-
-       grunt.file.setBase(  __dirname + '/../..' );
-
-       grunt.initConfig( {
-               pkg: grunt.file.readJSON( __dirname + '/package.json' ),
-               jshint: {
-                       options: {
-                               jshintrc: true
-                       },
-                       all: [
-                               '*.js',
-                               '{includes,languages,resources,skins,tests}/**/*.js'
-                       ]
-               },
-               jscs: {
-                       all: [
-                               '<%= jshint.all %>',
-                               // Auto-generated file with JSON (double quotes)
-                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js',
-                               // Skip functions are stored as script files but wrapped in a function when
-                               // executed. node-jscs trips on the would-be "Illegal return statement".
-                               '!resources/src/*-skip.js'
-
-                       // Exclude all files ignored by jshint
-                       ].concat( grunt.file.read( '.jshintignore' ).split( '\n' ).reduce( function ( patterns, pattern ) {
-                               // Filter out empty lines
-                               if ( pattern.length && pattern[0] !== '#' ) {
-                                       patterns.push( '!' + pattern );
-                               }
-                               return patterns;
-                       }, [] ) )
-               },
-               jsonlint: {
-                       all: [
-                               '.jscsrc',
-                               '{languages,maintenance,resources}/**/*.json',
-                               'tests/frontend/package.json'
-                       ]
-               },
-               banana: {
-                       core: 'languages/i18n/',
-                       api: 'includes/api/i18n/',
-                       installer: 'includes/installer/i18n/'
-               },
-               watch: {
-                       files: [
-                               '<%= jscs.all %>',
-                               '<%= jsonlint.all %>',
-                               '.jshintignore',
-                               '.jshintrc'
-                       ],
-                       tasks: 'test'
-               }
-       } );
-
-       grunt.registerTask( 'lint', ['jshint', 'jscs', 'jsonlint', 'banana'] );
-       grunt.registerTask( 'test', ['lint'] );
-       grunt.registerTask( 'default', ['test'] );
-};
diff --git a/tests/frontend/package.json b/tests/frontend/package.json
deleted file mode 100644 (file)
index 9b15379..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "mediawiki",
-  "version": "0.0.0",
-  "scripts": {
-    "test": "grunt test"
-  },
-  "devDependencies": {
-    "grunt": "0.4.2",
-    "grunt-contrib-jshint": "0.10.0",
-    "grunt-contrib-watch": "0.6.1",
-    "grunt-banana-checker": "0.2.0",
-    "grunt-jscs": "0.8.1",
-    "grunt-jsonlint": "1.0.4"
-  }
-}
index 529ab82..17769ad 100644 (file)
@@ -559,7 +559,7 @@ class ParserTest {
                        $parser->setTransparentTagHook( $tag, $callback );
                }
 
-               wfRunHooks( 'ParserTestParser', array( &$parser ) );
+               Hooks::run( 'ParserTestParser', array( &$parser ) );
 
                return $parser;
        }
@@ -901,7 +901,7 @@ class ParserTest {
                $this->savedGlobals = array();
 
                /** @since 1.20 */
-               wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
+               Hooks::run( 'ParserTestGlobals', array( &$settings ) );
 
                foreach ( $settings as $var => $val ) {
                        if ( array_key_exists( $var, $GLOBALS ) ) {
@@ -954,7 +954,7 @@ class ParserTest {
                // Allow extensions to add to the list of tables to duplicate;
                // may be necessary if they hook into page save or other code
                // which will require them while running tests.
-               wfRunHooks( 'ParserTestTables', array( &$tables ) );
+               Hooks::run( 'ParserTestTables', array( &$tables ) );
 
                return $tables;
        }
@@ -1493,8 +1493,10 @@ class ParserTest {
         * Insert a temporary test article
         * @param string $name The title, including any prefix
         * @param string $text The article text
-        * @param int $line The input line number, for reporting errors
-        * @param bool $ignoreDuplicate Whether to silently ignore duplicate pages
+        * @param int|string $line The input line number, for reporting errors
+        * @param bool|string $ignoreDuplicate Whether to silently ignore duplicate pages
+        * @throws Exception
+        * @throws MWException
         */
        public static function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) {
                global $wgCapitalLinks;
index 5f19e8b..7eb152a 100644 (file)
@@ -540,8 +540,6 @@ Italics and bold: 2-quote opening sequence: (2,2)
 
 !! test
 Italics and bold: 2-quote opening sequence: (2,3)
-!! options
-parsoid=wt2html
 !! wikitext
 ''foo'''
 !! html/*
@@ -549,16 +547,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 2-quote opening sequence: (2,3) w/ nowiki
-!! wikitext
-''foo'<nowiki/>''
-!! html
-<p><i>foo'</i>
-</p>
-!! end
-
 !! test
 Italics and bold: 2-quote opening sequence: (2,4)
 !! options
@@ -615,8 +603,6 @@ Italics and bold: 2-quote opening sequence: (2,5+3) w/ nowiki
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,2)
-!! options
-parsoid=wt2html
 !! wikitext
 '''foo''
 !! html/*
@@ -624,16 +610,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 3-quote opening sequence: (3,2) w/ nowiki
-!! wikitext
-'<nowiki/>''foo''
-!! html
-<p>'<i>foo</i>
-</p>
-!!end
-
 !! test
 Italics and bold: 3-quote opening sequence: (3,3)
 !! wikitext
@@ -645,8 +621,6 @@ Italics and bold: 3-quote opening sequence: (3,3)
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,4)
-!! options
-parsoid=wt2html
 !! wikitext
 '''foo''''
 !! html/*
@@ -654,16 +628,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 3-quote opening sequence: (3,4) w/ nowiki
-!! wikitext
-'''foo'<nowiki/>'''
-!! html
-<p><b>foo'</b>
-</p>
-!! end
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: 3-quote opening sequence: (3,5)
@@ -720,8 +684,6 @@ Italics and bold: 4-quote opening sequence: (4,2) w/ nowiki
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,3)
-!! options
-parsoid=wt2html
 !! wikitext
 ''''foo'''
 !! html/*
@@ -729,16 +691,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 4-quote opening sequence: (4,3) w/ nowiki
-!! wikitext
-'<nowiki/>'''foo'''
-!! html
-<p>'<b>foo</b>
-</p>
-!!end
-
 !! test
 Italics and bold: 4-quote opening sequence: (4,4)
 !! options
@@ -849,16 +801,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 5-quote opening sequence: (5,4+2) w/ nowiki
-!! wikitext
-'''''foo'<nowiki/>'''''
-!! html
-<p><i><b>foo'</b></i>
-</p>
-!! end
-
 !! test
 Italics and bold: 5-quote opening sequence: (5,5)
 !! wikitext
@@ -868,6 +810,15 @@ Italics and bold: 5-quote opening sequence: (5,5)
 </p>
 !!end
 
+!! test
+Italics and bold: 5-quote opening sequence: (5,6)
+!! wikitext
+'''''foo''''''
+!! html/*
+<p><i><b>foo'</b></i>
+</p>
+!! end
+
 ###
 ### multiple quote sequences in a line
 ###
@@ -1047,8 +998,6 @@ Italics and bold: other quote tests: (3,2,3+2+2,2)
 
 !! test
 Italics and bold: other quote tests: (3,2,3,3)
-!! options
-parsoid=wt2html
 !! wikitext
 '''this is about ''foo'''s family'''
 !! html/*
@@ -1057,17 +1006,6 @@ parsoid=wt2html
 !!end
 
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: other quote tests: (3,2,3,3) w/ nowiki
-!! wikitext
-'<nowiki/>''this is about ''foo'''s family'''
-!! html
-<p>'<i>this is about </i>foo<b>s family</b>
-</p>
-!!end
-
-
 !! test
 Italics and bold: other quote tests: (3,(2,2),3)
 !! wikitext
@@ -1082,9 +1020,11 @@ Italics and bold: other quote tests: (3,(2,2),3)
 Italicized possessive
 !! wikitext
 The ''[[Main Page]]'''s talk page.
-!! html
+!! html/php
 <p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
 </p>
+!! html/parsoid
+<p>The <i><a rel="mw:WikiLink"  href="Main_Page" title="Main Page">Main Page</a>'</i>s talk page.</p>
 !! end
 
 !! test
@@ -3966,6 +3906,76 @@ Definition Lists: Weird Ones: Test 1
 </ul>
 !! end
 
+!! test
+Definition Lists: colons occurring in tags
+!! wikitext
+;a:b
+;'''a:b'''
+;<i>a:b</i>
+;<span>a:b</span>
+;<div>a:b</div>
+;{{echo|a:b}}
+;{{echo|''a:b''}}
+!! html
+<dl><dt>a</dt>
+<dd>b</dd>
+<dt><b>a:b</b></dt>
+<dt><i>a:b</i></dt>
+<dt><span>a:b</span></dt>
+<dt><div>a:b</div></dt>
+<dt>a</dt>
+<dd>b</dd>
+<dt><i>a:b</i></dt></dl>
+
+!! end
+
+!! test
+Definition Lists: colons and tables 1
+!! wikitext
+:{|
+| x
+|}
+:{|
+| y
+|}
+!! html
+<dl><dd><table>
+<tr>
+<td> x
+</td></tr></table></dd></dl>
+<dl><dd><table>
+<tr>
+<td> y
+</td></tr></table></dd></dl>
+
+!! end
+
+# Parsoid's output (as documented below) differs from php's in this case.
+# This is probably a bug. If we fixup parsoid to match php's output, the
+# above test should pass and the below test case can be removed. It is
+# unclear which output is more desirable.
+
+!! test
+Definition Lists: colons and tables 2
+!! wikitext
+:{|
+| x
+|}
+:{|
+| y
+|}
+!! html/parsoid
+<dl><dd><table>
+<tr>
+<td> x
+</td></tr></table></dd>
+<dd><table>
+<tr>
+<td> y
+</td></tr></table></dd></dl>
+!! end
+
+
 ###
 ### External links
 ###
@@ -4171,6 +4181,13 @@ http://example.com!
 http://example.com?
 http://example.com)
 http://example.com/url_with_(brackets)
+(http://example.com/url_without_brackets)
+http://example.com/url_with_entity&nbsp;
+http://example.com/url_with_entity&#xA0;
+http://example.com/url_with_entity&#160;
+http://example.com/url_with_entity&lt;
+http://example.com/url_with_entity&#x3C;
+http://example.com/url_with_entity&#60;
 !! html
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>,
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>;
@@ -4181,6 +4198,13 @@ http://example.com/url_with_(brackets)
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>?
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
 <a rel="nofollow" class="external free" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
+(<a rel="nofollow" class="external free" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&lt;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
 </p>
 !! end
 
@@ -8910,6 +8934,19 @@ This is RFC 822 but thisRFC 822 is not RFC 822linked.
 </p>
 !! end
 
+!! test
+Magic links: RFC (w/ non-newline whitespace, bug 28950/29025)
+!! wikitext
+RFC &nbsp;&#160;&#0160;&#xA0;&#Xa0; 822
+RFC
+822
+!! html
+<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
+RFC
+822
+</p>
+!! end
+
 !! test
 Magic links: ISBN (bug 1937)
 !! wikitext
@@ -8928,6 +8965,23 @@ This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-
 </p>
 !! end
 
+!! test
+Magic links: ISBN (w/ non-newline whitespace, bug 28950/29025)
+!! wikitext
+ISBN &nbsp;&#160;&#0160;&#xA0;&#Xa0; 978&nbsp;0&#160;316&#0160;09811&#xA0;3
+ISBN
+9780316098113
+ISBN 978
+0316098113
+!! html
+<p><a href="/wiki/Special:BookSources/9780316098113" class="internal mw-magiclink-isbn">ISBN 978 0 316 09811 3</a>
+ISBN
+9780316098113
+ISBN 978
+0316098113
+</p>
+!! end
+
 !! test
 Magic links: PMID incorrectly converts space to underscore
 !! wikitext
@@ -8946,6 +9000,19 @@ This is PMID 1234 but thisPMID 1234 is not PMID 1234linked.
 </p>
 !! end
 
+!! test
+Magic links: PMID (w/ non-newline whitespace, bug 28950/29025)
+!! wikitext
+PMID &nbsp;&#160;&#0160;&#xA0;&#Xa0; 1234
+PMID
+1234
+!! html
+<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
+PMID
+1234
+</p>
+!! end
+
 ###
 ### Templates
 ####
@@ -11304,6 +11371,15 @@ thumbsize=220
 </figcaption></figure>
 !! end
 
+!! test
+Titles in unlinked images (T23454)
+!! wikitext
+[[File:Foobar.jpg|link=|stuff]]
+!! html/php
+<p><img alt="stuff" src="http://example.com/images/3/3a/Foobar.jpg" title="stuff" width="1941" height="220" />
+</p>
+!! end
+
 !! test
 Link with empty target
 !! wikitext
@@ -16474,8 +16550,8 @@ image4    |300px| centre
 Gallery (with options)
 !! wikitext
 <gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
+File:Nonexistent.jpg|caption
+File:Nonexistent.jpg
 image:foobar.jpg|some '''caption''' [[Main Page]]
 image:foobar.jpg
 image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
@@ -16484,14 +16560,14 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 <ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
        <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="height: 70px;">Nonexistant.jpg</div>
+                       <div class="thumb" style="height: 70px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
 <p>caption
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="height: 70px;">Nonexistant.jpg</div>
+                       <div class="thumb" style="height: 70px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -16580,25 +16656,25 @@ File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
 gallery (with showfilename option)
 !! wikitext
 <gallery showfilename>
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
+File:Nonexistent.jpg|caption
+File:Nonexistent.jpg
 image:foobar.jpg|some '''caption''' [[Main Page]]
 File:Foobar.jpg
 </gallery>
 !! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
+<p><a href="/wiki/File:Nonexistent.jpg" title="File:Nonexistent.jpg">Nonexistent.jpg</a><br />
 caption
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
+<p><a href="/wiki/File:Nonexistent.jpg" title="File:Nonexistent.jpg">Nonexistent.jpg</a><br />
 </p>
                        </div>
                </div></li>
@@ -16625,20 +16701,20 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 Gallery (with namespace-less filenames)
 !! wikitext
 <gallery>
-File:Nonexistant.jpg
-Nonexistant.jpg
+File:Nonexistent.jpg
+Nonexistent.jpg
 image:foobar.jpg
 foobar.jpg
 </gallery>
 !! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -18967,6 +19043,22 @@ __TOC__
 
 !! end
 
+!! test
+Bug 72884: bdi element in ToC
+!! wikitext
+__TOC__
+== <bdi>test</bdi> ==
+!! html
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#test"><span class="tocnumber">1</span> <span class="toctext"><bdi>test</bdi></span></a></li>
+</ul>
+</div>
+
+<h2><span class="mw-headline" id="test"><bdi>test</bdi></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: test">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! end
+
 !! article
 MediaWiki:Bug32057
 !! text
@@ -19981,17 +20073,15 @@ parsoid=html2wt
 !! test
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-parsoid=html2wt
+parsoid=html2wt,wt2wt
 !! wikitext
 = ='''bold'''<nowiki>foo=</nowiki> =
-!! html
-<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
+!! html/parsoid
+<h1>=<b>bold</b>foo=</h1>
 !!end
 
 !! test
 Headings: 4a. No escaping needed (testing just h1 and h2)
-!! options
-parsoid=html2wt
 !! wikitext
 = =foo =
 
@@ -20005,20 +20095,28 @@ parsoid=html2wt
 
 == foo= ==
 
-= ''=''foo= =
-
-= <nowiki>=</nowiki> =
-!! html
+= = =
+!! html/parsoid
 <h1>=foo</h1>
 <h1>foo=</h1>
 <h1> =foo= </h1>
 <h1>=foo= bar</h1>
 <h2>=foo</h2>
 <h2>foo=</h2>
-<h1><i>=</i>foo=</h1>
-<h1><span typeof="mw:Nowiki">=</span></h1>
+<h1>=</h1>
 !!end
 
+!! test
+Headings: 4a'. No escaping needed (Parsoid bug T84903)
+!! wikitext
+= ''=''foo= =
+!! html/php
+<h1><span class="mw-headline" id=".3Dfoo.3D"><i>=</i>foo=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =foo=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+
+!! html/parsoid
+<h1><i>=</i>foo=</h1>
+!! end
+
 !! test
 Headings: 4b. No escaping needed (inside p-tags)
 !! options
@@ -20265,33 +20363,36 @@ Lists: 5. No unnecessary escapes
 !! wikitext
 * bar <span><nowiki>[[foo]]</nowiki></span>
 
-*=bar <span><nowiki>[[foo]]</nowiki></span>
+* =bar <span><nowiki>[[foo]]</nowiki></span>
 
-*[[bar <span><nowiki>[[foo]]</nowiki></span>
+* [[bar <span><nowiki>[[foo]]</nowiki></span>
 
-*]]bar <span><nowiki>[[foo]]</nowiki></span>
+* ]]bar <span><nowiki>[[foo]]</nowiki></span>
 
-*=bar <span>foo]]</span>=
+* =bar <span>foo]]</span>=
 
 * <s></s>: a
+
+* ''* foo''
 !! html
 <ul><li> bar <span>[[foo]]</span></li></ul>
-<ul><li>=bar <span>[[foo]]</span></li></ul>
-<ul><li>[[bar <span>[[foo]]</span></li></ul>
-<ul><li>]]bar <span>[[foo]]</span></li></ul>
-<ul><li>=bar <span>foo]]</span>=</li></ul>
+<ul><li> =bar <span>[[foo]]</span></li></ul>
+<ul><li> [[bar <span>[[foo]]</span></li></ul>
+<ul><li> ]]bar <span>[[foo]]</span></li></ul>
+<ul><li> =bar <span>foo]]</span>=</li></ul>
 <ul><li> <s></s>: a</li></ul>
+<ul><li> <i>* foo</i></li></ul>
 
 !!end
 
 !! test
 Lists: 6. Escape bullets in SOL position
 !! options
-parsoid
+parsoid=html2wt
 !! wikitext
-<!--cmt--><nowiki>*foo</nowiki>
+<!--cmt--><nowiki>*</nowiki>foo
 !! html
-<p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
+<p><!--cmt-->*foo</p>
 !!end
 
 !! test
 </p>
 !!end
 
+!! test
+Lists: 8. Escape colons only if not present in tags
+!! options
+parsoid=html2wt
+!! wikitext
+; <nowiki>a:b</nowiki>''c:d''
+!! html
+<dl><dt>a:b<i>c:d</i></dt></dl>
+!! end
+
 #### --------------- HRs ---------------
 #### 1. Single line
 #### -----------------------------------
 
 !! test
 HRs: 1. Single line
-!! options
-parsoid
 !! wikitext
 ----<nowiki>----</nowiki>
 ----=foo=
 ----*foo
-!! html
-<hr><p><span typeof="mw:Nowiki">----</span></p>
-<hr><p>=foo=</p>
-<hr><p>*foo</p>
+!! html+tidy
+<hr />
+<p>----</p>
+<hr />
+<p>=foo=</p>
+<hr />
+<p>*foo</p>
 !! end
 
 #### --------------- Tables ---------------
@@ -20384,127 +20496,196 @@ Tables: 1d. No escaping needed
 Tables: 2a. Nested in td
 !! options
 parsoid=html2wt
+!! html/parsoid
+<table><tbody><tr>
+<td>foo|bar</td></tr>
+<tr><td>x<div>a|b</div></td>
+</tbody></table>
 !! wikitext
 {|
 |<nowiki>foo|bar</nowiki>
 |-
 |x<div><nowiki>a|b</nowiki></div>
 |}
-!! html
-<table><tbody><tr>
-<td>foo|bar</td></tr>
-<tr><td>x<div>a|b</div></td>
-</tbody></table>
+!! html/php+tidy
+<table>
+<tr>
+<td>foo|bar</td>
+</tr>
+<tr>
+<td>x
+<div>a|b</div>
+</td>
+</tr>
+</table>
 !! end
 
 !! test
 Tables: 2b. Nested in td
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<table><tbody><tr>
+<td>foo||bar</td>
+<td>a<i>b||c</i></td>
+<td>a<i><div>b||c</div></i></td>
+</tr></tbody></table>
 !! wikitext
 {|
 |<nowiki>foo||bar</nowiki>
-|''it''<nowiki>foo||bar</nowiki>
+|a''<nowiki>b||c</nowiki>''
+|a''<div><nowiki>b||c</nowiki></div>''
 |}
-!! html
-<table><tbody><tr>
-<td><span typeof="mw:Nowiki">foo||bar</span></td>
-<td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
+!! html/php
+<table>
+<tr>
+<td>foo||bar
+</td>
+<td>a<i>b||c</i>
+</td>
+<td>a<i><div>b||c</div></i>
+</td></tr></table>
+
 !! end
 
 !! test
 Tables: 2c. Nested in td -- no escaping needed
-!! options
-parsoid
 !! wikitext
 {|
+
 |foo!!bar
 |}
-!! html
-<table><tbody><tr><td>foo!!bar
-</td></tr></tbody></table>
+!! html/*
+<table>
+
+<tr>
+<td>foo!!bar
+</td></tr></table>
 
 !! end
 
 !! test
 Tables: 3a. Nested in th
-!! options
-parsoid
 !! wikitext
 {|
+
 !foo!bar
 |}
-!! html
-<table><tbody><tr><th>foo!bar
-</th></tr></tbody></table>
+!! html/*
+<table>
+
+<tr>
+<th>foo!bar
+</th></tr></table>
 
 !! end
 
 !! test
 Tables: 3b. Nested in th
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<table><tbody>
+<tr><th>foo!!bar</th>
+<th><i>foo|bar</i></th>
+<th><i>foo!!bar</i></th>
+<th><i><span>foo!!bar</span></i></th>
+</tr></tbody></table>
 !! wikitext
 {|
 !<nowiki>foo!!bar</nowiki>
+!''<nowiki>foo|bar</nowiki>''
+!''<nowiki>foo!!bar</nowiki>''
+!''<span><nowiki>foo!!bar</nowiki></span>''
 |}
-!! html
+!! html/php
 <table>
-<tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
-</tbody></table>
+<tr>
+<th>foo!!bar
+</th>
+<th><i>foo|bar</i>
+</th>
+<th><i>foo!!bar</i>
+</th>
+<th><i><span>foo!!bar</span></i>
+</th></tr></table>
+
 !! end
 
 !! test
-Tables: 3c. Nested in th -- no escaping needed
+Tables: 3c. Nested in th
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<table><tbody>
+<tr><th>foo||bar</th>
+<th><span typeof="mw:Nowiki">foo||bar</span></th>
+</tr></tbody></table>
 !! wikitext
 {|
 !<nowiki>foo||bar</nowiki>
+!<nowiki>foo||bar</nowiki>
 |}
-!! html
-<table><tbody><tr>
-<th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
+!! html/php
+<table>
+<tr>
+<th>foo||bar
+</th>
+<th>foo||bar
+</th></tr></table>
+
 !! end
 
 !! test
 Tables: 4a. Escape -
 !! options
-parsoid
+parsoid=html2wt
 !! wikitext
 {|
+
 !-bar
+
 |-
 |<nowiki>-bar</nowiki>
 |}
-!! html
-<table><tbody>
-<tr><th>-bar</th></tr>
+!! html/*
+<table>
+
+<tr>
+<th>-bar
+</th></tr>
 <tr>
-<td><span typeof="mw:Nowiki">-bar</span></td></tr></tbody></table>
+<td>-bar
+</td></tr></table>
+
 !! end
 
 !! test
 Tables: 4b. Escape +
 !! options
-parsoid
+parsoid=html2wt
 !! wikitext
 {|
+
 !+bar
+
 |-
 |<nowiki>+bar</nowiki>
 |}
-!! html
-<table><tbody>
-<tr><th>+bar</th></tr>
+!! html/*
+<table>
+
 <tr>
-<td><span typeof="mw:Nowiki">+bar</span></td></tr></tbody></table>
+<th>+bar
+</th></tr>
+<tr>
+<td>+bar
+</td></tr></table>
+
 !! end
 
 !! test
 Tables: 4c. No escaping needed
-!! options
-parsoid
 !! wikitext
 {|
 |foo-bar
@@ -20521,7 +20702,31 @@ bar|baz
 |x
 <div>a|b</div>
 |}
-!! html
+!! html/php
+<table>
+<tr>
+<td>foo-bar
+</td>
+<td>foo+bar
+</td></tr>
+<tr>
+<td><i>foo</i>-bar
+</td>
+<td><i>foo</i>+bar
+</td></tr>
+<tr>
+<td>foo
+<p>bar|baz
++bar
+-bar
+</p>
+</td></tr>
+<tr>
+<td>x
+<div>a|b</div>
+</td></tr></table>
+
+!! html/parsoid
 <table><tbody>
 <tr><td>foo-bar</td><td>foo+bar</td></tr>
 <tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
@@ -20536,15 +20741,23 @@ bar|baz
 
 !! test
 Tables: 4d. No escaping needed
-!! options
-parsoid
 !! wikitext
 {|
 |[[Foo]]-bar
 ||+1
 ||-2
 |}
-!! html
+!! html/php
+<table>
+<tr>
+<td><a href="/wiki/Foo" title="Foo">Foo</a>-bar
+</td>
+<td>+1
+</td>
+<td>-2
+</td></tr></table>
+
+!! html/parsoid
 <table>
 <tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
 <td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
@@ -20791,6 +21004,18 @@ Links 12. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 6
 ISBN 1234567890's
 !! end
 
+!! test
+Links 13: Protect link-like plain text. (Parsoid bug T78425)
+!! options
+parsoid=html2wt
+!! html/*
+<p>this is not a link: http://example.com
+</p>
+!! wikitext
+this is not a link: <nowiki>http://example.com</nowiki>
+!! end
+
+
 #### --------------- Quotes ---------------
 #### 1. Quotes inside <b> and <i>
 #### 2. Link fragments separated by <i> and <b> tags
@@ -20798,7 +21023,7 @@ ISBN 1234567890's
 #### 4. No escaping needed
 #### --------------------------------------
 !! test
-1. Quotes inside <b> and <i>
+1a. Quotes inside <b> and <i>
 !! options
 parsoid=html2wt,wt2wt
 !! wikitext
@@ -20811,14 +21036,16 @@ parsoid=html2wt,wt2wt
 '''<nowiki>'''foo'''</nowiki>'''
 '''foo'<nowiki/>''bar'<nowiki/>''baz'''
 '''foo'''<nowiki/>'s
-'<nowiki/>''foo''
+'''foo''
 ''foo''<nowiki/>'
+''foo'<nowiki/>''<nowiki/>'
 '<nowiki/>''foo''<nowiki/>'
-'<nowiki/>'''foo'''
+''''foo'''
 '''foo'''<nowiki/>'
 '<nowiki/>'''foo'''<nowiki/>'
 ''fools'<span> errand</span>''
 ''<span>fool</span>'s errand''
+a|!*#-:;+-~[]{}b'''x''
 !! html/*
 <p><i>'foo'</i>
 <i>''foo''</i>
@@ -20831,15 +21058,33 @@ parsoid=html2wt,wt2wt
 <b>foo</b>'s
 '<i>foo</i>
 <i>foo</i>'
+<i>foo'</i>'
 '<i>foo</i>'
 '<b>foo</b>
 <b>foo</b>'
 '<b>foo</b>'
 <i>fools'<span> errand</span></i>
 <i><span>fool</span>'s errand</i>
+a|!*#-:;+-~[]{}b'<i>x</i>
 </p>
 !! end
 
+!! test
+1b. Quotes inside <b> and <i> with other chars
+!! options
+parsoid=html2wt,wt2wt
+!! wikitext
+'''a'' foo ''[[bar]]''
+''a''' foo ''[[bar]]''
+''a''' foo '''{{echo|[[bar]]}}'''
+[[foo]] x'''[[bar]]''
+!! html
+'<i>a</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
+<i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
+<i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
+<a rel="mw:WikiLink" href="Foo" title="Foo">foo</a> x'<i><a href="Bar" rel="mw:WikiLink" title="Bar">bar</a></i>
+!! end
+
 !! test
 2. Link fragments separated by <i> and <b> tags
 !! wikitext
@@ -20871,9 +21116,11 @@ parsoid=html2wt,wt2wt
 !! wikitext
 '<span>''bar''</span>'
 '<span>'''bar'''</span>'
+'a:b'foo
 !! html
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
+'a:b'foo
 </p>
 !! end
 
@@ -22377,6 +22624,36 @@ parsoid=html2wt
 <p><i>A</i><b><i>B</i></b></p>
 !! end
 
+!! test
+5a. Merge adjacent quote nodes if they've been edited
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["p", "contents", "remove", ":contains('b')"]
+  ]
+}
+!! wikitext
+''a''b''c''
+!! wikitext/edited
+''ac''
+!! end
+
+!! test
+5b. Merge adjacent quote nodes if they've been edited
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["#x", "remove"]
+  ]
+}
+!! wikitext
+''a''<span id="x">b</span>''c''
+!! wikitext/edited
+''ac''
+!! end
+
 #------------------------------------
 # End of I/B quote minimization tests
 #------------------------------------
index 71e0f4b..df4690a 100644 (file)
@@ -38,7 +38,7 @@ class LessFileCompilationTest extends ResourceLoaderTestCase {
                        "$thisString must refer to a readable file"
                );
 
-               $rlContext = static::getResourceLoaderContext();
+               $rlContext = $this->getResourceLoaderContext();
 
                // Bleh
                $method = new ReflectionMethod( $this->module, 'getLessCompiler' );
index c3e2a30..3f4c6f9 100644 (file)
@@ -83,7 +83,7 @@ help:
        #                       You will need the Xdebug PHP extension for the later.
        #   [no]parser          Skip or only run Parser tests
        #
-       #   list-groups         List availabe Tests groups.
+       #   list-groups         List available Tests groups.
        #
        #  Options:
        #   CONFIG_FILE         Path to a PHPUnit configuration file (default: suite.xml)
index 2cd549e..7e07823 100644 (file)
@@ -198,7 +198,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        protected function setUp() {
-               wfProfileIn( __METHOD__ );
                parent::setUp();
                $this->called['setUp'] = true;
 
@@ -225,11 +224,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                DeferredUpdates::clearPendingUpdates();
 
-               wfProfileOut( __METHOD__ );
        }
 
        protected function tearDown() {
-               wfProfileIn( __METHOD__ );
 
                $this->called['tearDown'] = true;
                // Cleaning up temporary files
@@ -273,7 +270,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
 
                parent::tearDown();
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -634,7 +630,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( isset( $compatibility[$func] ) ) {
                        return call_user_func_array( array( $this, $compatibility[$func] ), $args );
                } else {
-                       throw new MWException( "Called non-existant $func method on "
+                       throw new MWException( "Called non-existent $func method on "
                                . get_class( $this ) );
                }
        }
index f5f302e..055beb0 100644 (file)
@@ -1,7 +1,12 @@
 <?php
 
 abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
-       protected static function getResourceLoaderContext( $lang = 'en' ) {
+       /**
+        * @param string $lang
+        * @param string $dir
+        * @return ResourceLoaderContext
+        */
+       protected function getResourceLoaderContext( $lang = 'en', $dir = 'ltr' ) {
                $resourceLoader = new ResourceLoader();
                $request = new FauxRequest( array(
                                'lang' => $lang,
@@ -10,7 +15,14 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                                'skin' => 'vector',
                                'target' => 'test',
                ) );
-               return new ResourceLoaderContext( $resourceLoader, $request );
+               $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
+                       ->setConstructorArgs( array( $resourceLoader, $request ) )
+                       ->setMethods( array( 'getDirection' ) )
+                       ->getMock();
+               $ctx->expects( $this->any() )->method( 'getDirection' )->will(
+                       $this->returnValue( $dir )
+               );
+               return $ctx;
        }
 
        protected function setUp() {
diff --git a/tests/phpunit/data/composer/composer.json b/tests/phpunit/data/composer/composer.json
new file mode 100644 (file)
index 0000000..bcd196f
--- /dev/null
@@ -0,0 +1,48 @@
+{
+       "name": "mediawiki/core",
+       "description": "Free software wiki application developed by the Wikimedia Foundation and others",
+       "keywords": ["mediawiki", "wiki"],
+       "homepage": "https://www.mediawiki.org/",
+       "authors": [
+               {
+                       "name": "MediaWiki Community",
+                       "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
+               }
+       ],
+       "license": "GPL-2.0",
+       "support": {
+               "issues": "https://bugzilla.wikimedia.org/",
+               "irc": "irc://irc.freenode.net/mediawiki",
+               "wiki": "https://www.mediawiki.org/"
+       },
+       "require": {
+               "leafo/lessphp": "0.5.0",
+               "php": ">=5.3.3",
+               "psr/log": "1.0.0",
+               "cssjanus/cssjanus": "1.1.1",
+               "cdb/cdb": "1.0.0"
+       },
+       "require-dev": {
+               "phpunit/phpunit": "*"
+       },
+       "suggest": {
+               "ext-fileinfo": "*",
+               "ext-mbstring": "*",
+               "ext-wikidiff2": "*",
+               "ext-apc": "*",
+               "monolog/monolog": "*"
+       },
+       "autoload": {
+               "psr-0": {
+                       "ComposerHookHandler": "includes/composer"
+               }
+       },
+       "scripts": {
+               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
+               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
+       },
+       "config": {
+               "prepend-autoloader": false,
+               "optimize-autoloader": true
+       }
+}
diff --git a/tests/phpunit/data/composer/composer.lock b/tests/phpunit/data/composer/composer.lock
new file mode 100644 (file)
index 0000000..cae6a47
--- /dev/null
@@ -0,0 +1,1195 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "a3bb80b0ac4c4a31e52574d48c032923",
+    "packages": [
+        {
+            "name": "composer/installers",
+            "version": "v1.0.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/installers.git",
+                "reference": "89d77bfbee79e16653f7162c86e602cc188471db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/installers/zipball/89d77bfbee79e16653f7162c86e602cc188471db",
+                "reference": "89d77bfbee79e16653f7162c86e602cc188471db",
+                "shasum": ""
+            },
+            "replace": {
+                "roundcube/plugin-installer": "*",
+                "shama/baton": "*"
+            },
+            "require-dev": {
+                "composer/composer": "1.0.*@dev",
+                "phpunit/phpunit": "4.1.*"
+            },
+            "type": "composer-installer",
+            "extra": {
+                "class": "Composer\\Installers\\Installer",
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Composer\\Installers\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kyle Robinson Young",
+                    "email": "kyle@dontkry.com",
+                    "homepage": "https://github.com/shama"
+                }
+            ],
+            "description": "A multi-framework Composer library installer",
+            "homepage": "http://composer.github.com/installers/",
+            "keywords": [
+                "Craft",
+                "Dolibarr",
+                "Hurad",
+                "MODX Evo",
+                "OXID",
+                "Thelia",
+                "WolfCMS",
+                "agl",
+                "annotatecms",
+                "bitrix",
+                "cakephp",
+                "chef",
+                "codeigniter",
+                "concrete5",
+                "croogo",
+                "dokuwiki",
+                "drupal",
+                "elgg",
+                "fuelphp",
+                "grav",
+                "installer",
+                "joomla",
+                "kohana",
+                "laravel",
+                "lithium",
+                "magento",
+                "mako",
+                "mediawiki",
+                "modulework",
+                "moodle",
+                "phpbb",
+                "piwik",
+                "ppi",
+                "puppet",
+                "roundcube",
+                "shopware",
+                "silverstripe",
+                "symfony",
+                "typo3",
+                "wordpress",
+                "zend",
+                "zikula"
+            ],
+            "time": "2014-11-29 01:29:17"
+        },
+        {
+            "name": "cssjanus/cssjanus",
+            "version": "v1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/cssjanus/php-cssjanus.git",
+                "reference": "62a9c32e6e140de09082b40a6e99d868ad14d4e0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/cssjanus/php-cssjanus/zipball/62a9c32e6e140de09082b40a6e99d868ad14d4e0",
+                "reference": "62a9c32e6e140de09082b40a6e99d868ad14d4e0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "jakub-onderka/php-parallel-lint": "0.8.*",
+                "phpunit/phpunit": "3.7.*",
+                "squizlabs/php_codesniffer": "1.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "description": "Convert CSS stylesheets between left-to-right and right-to-left.",
+            "time": "2014-11-14 20:00:50"
+        },
+        {
+            "name": "leafo/lessphp",
+            "version": "v0.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/leafo/lessphp.git",
+                "reference": "0f5a7f5545d2bcf4e9fad9a228c8ad89cc9aa283"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/leafo/lessphp/zipball/0f5a7f5545d2bcf4e9fad9a228c8ad89cc9aa283",
+                "reference": "0f5a7f5545d2bcf4e9fad9a228c8ad89cc9aa283",
+                "shasum": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "lessc.inc.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT",
+                "GPL-3.0"
+            ],
+            "authors": [
+                {
+                    "name": "Leaf Corcoran",
+                    "email": "leafot@gmail.com",
+                    "homepage": "http://leafo.net"
+                }
+            ],
+            "description": "lessphp is a compiler for LESS written in PHP.",
+            "homepage": "http://leafo.net/lessphp/",
+            "time": "2014-11-24 18:39:20"
+        },
+        {
+            "name": "mediawiki/translate",
+            "version": "2014.12",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wikimedia/mediawiki-extensions-Translate.git",
+                "reference": "2bc100763f3150380412faceea258c7378ce7ea0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wikimedia/mediawiki-extensions-Translate/zipball/2bc100763f3150380412faceea258c7378ce7ea0",
+                "reference": "2bc100763f3150380412faceea258c7378ce7ea0",
+                "shasum": ""
+            },
+            "require": {
+                "composer/installers": ">=1.0.1",
+                "mediawiki/universal-language-selector": "*",
+                "php": ">=5.3.0"
+            },
+            "suggest": {
+                "mediawiki/babel": "Users can easily indicate their language proficiency on their user page",
+                "mediawiki/translation-notifications": "Manage communication with translators",
+                "mustangostang/spyc": "More recent version of the bundled spyc library"
+            },
+            "type": "mediawiki-extension",
+            "autoload": {
+                "files": [
+                    "Translate.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "GPL-2.0+"
+            ],
+            "authors": [
+                {
+                    "name": "Niklas Laxström",
+                    "email": "niklas.laxstrom@gmail.com",
+                    "role": "Lead nitpicker"
+                },
+                {
+                    "name": "Siebrand Mazeland",
+                    "email": "s.mazeland@xs4all.nl",
+                    "role": "Developer"
+                }
+            ],
+            "description": "The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software",
+            "homepage": "https://www.mediawiki.org/wiki/Extension:Translate",
+            "keywords": [
+                "g11n",
+                "i18n",
+                "internationalization",
+                "l10n",
+                "localization",
+                "m17n",
+                "mediawiki",
+                "translatewiki.net",
+                "translation"
+            ],
+            "time": "2014-12-30 15:21:24"
+        },
+        {
+            "name": "mediawiki/universal-language-selector",
+            "version": "2014.12",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wikimedia/mediawiki-extensions-UniversalLanguageSelector.git",
+                "reference": "f730b0f47e2828001c1e03ec40d4681bfb0bff2d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wikimedia/mediawiki-extensions-UniversalLanguageSelector/zipball/f730b0f47e2828001c1e03ec40d4681bfb0bff2d",
+                "reference": "f730b0f47e2828001c1e03ec40d4681bfb0bff2d",
+                "shasum": ""
+            },
+            "require": {
+                "composer/installers": ">=1.0.1",
+                "php": ">=5.3.0"
+            },
+            "suggest": {
+                "mediawiki/cldr": "Language names in all languages"
+            },
+            "type": "mediawiki-extension",
+            "autoload": {
+                "files": [
+                    "UniversalLanguageSelector.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "GPL-2.0+",
+                "MIT"
+            ],
+            "description": "The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.",
+            "homepage": "https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector",
+            "keywords": [
+                "Input methods",
+                "Language selection",
+                "Web fonts",
+                "mediawiki"
+            ],
+            "time": "2014-12-30 15:21:25"
+        },
+        {
+            "name": "oojs/oojs-ui",
+            "version": "v0.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wikimedia/oojs-ui.git",
+                "reference": "50fa12637ad377f00bdbf1913406a3bfe9c1689e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wikimedia/oojs-ui/zipball/50fa12637ad377f00bdbf1913406a3bfe9c1689e",
+                "reference": "50fa12637ad377f00bdbf1913406a3bfe9c1689e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "php/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "homepage": "https://www.mediawiki.org/wiki/OOjs_UI",
+            "time": "2014-12-16 20:50:05"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Psr\\Log\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2012-12-21 11:40:51"
+        },
+        {
+            "name": "wikimedia/cdb",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wikimedia/cdb.git",
+                "reference": "3b7d5366c88eccf2517ebac57c59eb557c82f46c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wikimedia/cdb/zipball/3b7d5366c88eccf2517ebac57c59eb557c82f46c",
+                "reference": "3b7d5366c88eccf2517ebac57c59eb557c82f46c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "GPL-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Tim Starling",
+                    "email": "tstarling@wikimedia.org"
+                },
+                {
+                    "name": "Chad Horohoe",
+                    "email": "chad@wikimedia.org"
+                }
+            ],
+            "description": "Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.",
+            "homepage": "https://www.mediawiki.org/wiki/CDB",
+            "time": "2014-12-08 19:26:44"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119",
+                "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3,<8.0-DEV"
+            },
+            "require-dev": {
+                "athletic/athletic": "~0.1.8",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "2.0.*@ALPHA"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\Instantiator\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://github.com/doctrine/instantiator",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "time": "2014-10-13 12:58:55"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "2.0.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "ca158276c1200cc27f5409a5e338486bc0b4fc94"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca158276c1200cc27f5409a5e338486bc0b4fc94",
+                "reference": "ca158276c1200cc27f5409a5e338486bc0b4fc94",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-file-iterator": "~1.3",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-token-stream": "~1.3",
+                "sebastian/environment": "~1.0",
+                "sebastian/version": "~1.0"
+            },
+            "require-dev": {
+                "ext-xdebug": ">=2.1.4",
+                "phpunit/phpunit": "~4.1"
+            },
+            "suggest": {
+                "ext-dom": "*",
+                "ext-xdebug": ">=2.2.1",
+                "ext-xmlwriter": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "time": "2014-12-26 13:28:33"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "File/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "time": "2013-10-10 15:34:57"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+                "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "Text/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2014-01-30 17:20:04"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+                "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "time": "2013-08-02 07:42:54"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "f8d5d08c56de5cfd592b3340424a81733259a876"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876",
+                "reference": "f8d5d08c56de5cfd592b3340424a81733259a876",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ],
+            "time": "2014-08-31 06:12:13"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "4.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "6a5e49a86ce5e33b8d0657abe145057fc513543a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6a5e49a86ce5e33b8d0657abe145057fc513543a",
+                "reference": "6a5e49a86ce5e33b8d0657abe145057fc513543a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*",
+                "php": ">=5.3.3",
+                "phpunit/php-code-coverage": "~2.0",
+                "phpunit/php-file-iterator": "~1.3.2",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": "~1.0.2",
+                "phpunit/phpunit-mock-objects": "~2.3",
+                "sebastian/comparator": "~1.0",
+                "sebastian/diff": "~1.1",
+                "sebastian/environment": "~1.1",
+                "sebastian/exporter": "~1.0",
+                "sebastian/global-state": "~1.0",
+                "sebastian/version": "~1.0",
+                "symfony/yaml": "~2.0"
+            },
+            "suggest": {
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "time": "2014-12-28 07:57:05"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "2.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "c63d2367247365f688544f0d500af90a11a44c65"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65",
+                "reference": "c63d2367247365f688544f0d500af90a11a44c65",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "~1.0,>=1.0.1",
+                "php": ">=5.3.3",
+                "phpunit/php-text-template": "~1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.3"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "time": "2014-10-03 05:12:11"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "c484a80f97573ab934e37826dba0135a3301b26a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c484a80f97573ab934e37826dba0135a3301b26a",
+                "reference": "c484a80f97573ab934e37826dba0135a3301b26a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.1",
+                "sebastian/exporter": "~1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "http://www.github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "time": "2014-11-16 21:32:38"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "5843509fed39dee4b356a306401e9dd1a931fec7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7",
+                "reference": "5843509fed39dee4b356a306401e9dd1a931fec7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "http://www.github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff"
+            ],
+            "time": "2014-08-15 10:29:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7",
+                "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "time": "2014-10-25 08:00:45"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0",
+                "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "time": "2014-09-10 00:51:36"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2014-10-06 09:23:50"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b",
+                "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "time": "2014-12-15 14:25:24"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/Yaml",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Yaml.git",
+                "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/3346fc090a3eb6b53d408db2903b241af51dcb20",
+                "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Yaml\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "platform": {
+        "php": ">=5.3.3"
+    },
+    "platform-dev": []
+}
diff --git a/tests/phpunit/data/composer/new-composer.json b/tests/phpunit/data/composer/new-composer.json
new file mode 100644 (file)
index 0000000..0634c2d
--- /dev/null
@@ -0,0 +1,48 @@
+{
+       "name": "mediawiki/core",
+       "description": "Free software wiki application developed by the Wikimedia Foundation and others",
+       "keywords": ["mediawiki", "wiki"],
+       "homepage": "https://www.mediawiki.org/",
+       "authors": [
+               {
+                       "name": "MediaWiki Community",
+                       "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
+               }
+       ],
+       "license": "GPL-2.0",
+       "support": {
+               "issues": "https://bugzilla.wikimedia.org/",
+               "irc": "irc://irc.freenode.net/mediawiki",
+               "wiki": "https://www.mediawiki.org/"
+       },
+       "require": {
+               "leafo/lessphp": "0.5.0",
+               "php": ">=5.3.3",
+               "psr/log": "1.0.0",
+               "cssjanus/cssjanus": "1.1.1",
+               "wikimedia/cdb": "1.0.1"
+       },
+       "require-dev": {
+               "phpunit/phpunit": "*"
+       },
+       "suggest": {
+               "ext-fileinfo": "*",
+               "ext-mbstring": "*",
+               "ext-wikidiff2": "*",
+               "ext-apc": "*",
+               "monolog/monolog": "*"
+       },
+       "autoload": {
+               "psr-0": {
+                       "ComposerHookHandler": "includes/composer"
+               }
+       },
+       "scripts": {
+               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
+               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
+       },
+       "config": {
+               "prepend-autoloader": false,
+               "optimize-autoloader": true
+       }
+}
index e955a2b..8cf21bd 100644 (file)
@@ -1 +1,7 @@
-{\r    "head": "refs/heads/master",\r    "headSHA1": "0123456789abcdef0123456789abcdef01234567",\r    "headCommitDate": "1070884800",\r    "branch": "master",\r    "remoteURL": "https://gerrit.wikimedia.org/r/mediawiki/core"\r}\r
\ No newline at end of file
+{
+    "head": "refs/heads/master",
+    "headSHA1": "0123456789abcdef0123456789abcdef01234567",
+    "headCommitDate": "1070884800",
+    "branch": "master",
+    "remoteURL": "https://gerrit.wikimedia.org/r/mediawiki/core"
+}
index 6bd82fc..183e43d 100644 (file)
@@ -1,55 +1,55 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!DOCTYPE svg>\r
-<svg width="150" height="150" viewBox="-105 -105 210 210" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\r
-   <defs>\r
-      <clipPath id="ball">\r
-         <circle r="100" stroke-width="0"/>\r
-      </clipPath>\r
-      <radialGradient id="shadow1" cx=".4" cy=".3" r=".8">\r
-        <stop offset="0" stop-color="white" stop-opacity="1"/>\r
-        <stop offset=".4" stop-color="white" stop-opacity="1"/>\r
-        <stop offset=".8" stop-color="#EEEEEE" stop-opacity="1"/>\r
-      </radialGradient>\r
-      <radialGradient id="shadow2" cx=".5" cy=".5" r=".5">\r
-        <stop offset="0" stop-color="white" stop-opacity="0"/>\r
-        <stop offset=".8" stop-color="white" stop-opacity="0"/>\r
-        <stop offset=".99" stop-color="black" stop-opacity=".3"/>\r
-        <stop offset="1" stop-color="black" stop-opacity="1"/>\r
-      </radialGradient>\r
-      <g id="black_stuff" stroke-linejoin="round" clip-path="url(#ball)">\r
-         <g fill="black">\r
-            <path d="M 6,-32 Q 26,-28 46,-19 Q 57,-35 64,-47 Q 50,-68 37,-76 Q 17,-75 1,-68 Q 4,-51 6,-32"/>\r
-            <path d="M -26,-2 Q -45,-8 -62,-11 Q -74,5 -76,22 Q -69,40 -50,54 Q -32,47 -17,39 Q -23,15 -26,-2"/>\r
-            <path d="M -95,22 Q -102,12 -102,-8 V 80 H -85 Q -95,45 -95,22"/>\r
-            <path d="M 55,24 Q 41,41 24,52 Q 28,65 31,79 Q 55,78 68,67 Q 78,50 80,35 Q 65,28 55,24"/>\r
-            <path d="M 0,120 L -3,95 Q -25,93 -42,82 Q -50,84 -60,81"/>\r
-            <path d="M -90,-48 Q -80,-52 -68,-49 Q -52,-71 -35,-77 Q -35,-100 -40,-100 H -100"/>\r
-            <path d="M 100,-55 L 87,-37 Q 98,-10 97,5 L 100,6"/>\r
-         </g>\r
-         <g fill="none">\r
-            <path d="M 6,-32 Q -18,-12 -26,-2\r
-                     M 46,-19 Q 54,5 55,24\r
-                     M 64,-47 Q 77,-44 87,-37\r
-                     M 37,-76 Q 39,-90 36,-100\r
-                     M 1,-68 Q -13,-77 -35,-77\r
-                     M -62,-11 Q -67,-25 -68,-49\r
-                     M -76,22 Q -85,24 -95,22\r
-                     M -50,54 Q -49,70 -42,82\r
-                     M -17,39 Q 0,48 24,52\r
-                     M 31,79 Q 20,92 -3,95\r
-                     M 68,67 L 80,80\r
-                     M 80,35 Q 90,25 97,5\r
-            "/>\r
-         </g>\r
-      </g>\r
-   </defs>\r
-   <circle r="100" fill="white" stroke="none"/>\r
-   <circle r="100" fill="url(#shadow1)" stroke="none"/>\r
-   <g><animateTransform attributeName="transform" attributeType="XML" type="rotate" from="0" to="360" begin="0s" dur="3s" repeatCount="indefinite"/>\r
-      <use xlink:href="#black_stuff" stroke="#EEE" stroke-width="7"/>\r
-      <use xlink:href="#black_stuff" stroke="#DDD" stroke-width="4"/>\r
-      <use xlink:href="#black_stuff" stroke="#999" stroke-width="2"/>\r
-      <use xlink:href="#black_stuff" stroke="black" stroke-width="1"/>\r
-   </g>\r
-   <circle r="100" fill="url(#shadow2)" stroke="none"/>\r
-</svg>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg>
+<svg width="150" height="150" viewBox="-105 -105 210 210" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+   <defs>
+      <clipPath id="ball">
+         <circle r="100" stroke-width="0"/>
+      </clipPath>
+      <radialGradient id="shadow1" cx=".4" cy=".3" r=".8">
+        <stop offset="0" stop-color="white" stop-opacity="1"/>
+        <stop offset=".4" stop-color="white" stop-opacity="1"/>
+        <stop offset=".8" stop-color="#EEEEEE" stop-opacity="1"/>
+      </radialGradient>
+      <radialGradient id="shadow2" cx=".5" cy=".5" r=".5">
+        <stop offset="0" stop-color="white" stop-opacity="0"/>
+        <stop offset=".8" stop-color="white" stop-opacity="0"/>
+        <stop offset=".99" stop-color="black" stop-opacity=".3"/>
+        <stop offset="1" stop-color="black" stop-opacity="1"/>
+      </radialGradient>
+      <g id="black_stuff" stroke-linejoin="round" clip-path="url(#ball)">
+         <g fill="black">
+            <path d="M 6,-32 Q 26,-28 46,-19 Q 57,-35 64,-47 Q 50,-68 37,-76 Q 17,-75 1,-68 Q 4,-51 6,-32"/>
+            <path d="M -26,-2 Q -45,-8 -62,-11 Q -74,5 -76,22 Q -69,40 -50,54 Q -32,47 -17,39 Q -23,15 -26,-2"/>
+            <path d="M -95,22 Q -102,12 -102,-8 V 80 H -85 Q -95,45 -95,22"/>
+            <path d="M 55,24 Q 41,41 24,52 Q 28,65 31,79 Q 55,78 68,67 Q 78,50 80,35 Q 65,28 55,24"/>
+            <path d="M 0,120 L -3,95 Q -25,93 -42,82 Q -50,84 -60,81"/>
+            <path d="M -90,-48 Q -80,-52 -68,-49 Q -52,-71 -35,-77 Q -35,-100 -40,-100 H -100"/>
+            <path d="M 100,-55 L 87,-37 Q 98,-10 97,5 L 100,6"/>
+         </g>
+         <g fill="none">
+            <path d="M 6,-32 Q -18,-12 -26,-2
+                     M 46,-19 Q 54,5 55,24
+                     M 64,-47 Q 77,-44 87,-37
+                     M 37,-76 Q 39,-90 36,-100
+                     M 1,-68 Q -13,-77 -35,-77
+                     M -62,-11 Q -67,-25 -68,-49
+                     M -76,22 Q -85,24 -95,22
+                     M -50,54 Q -49,70 -42,82
+                     M -17,39 Q 0,48 24,52
+                     M 31,79 Q 20,92 -3,95
+                     M 68,67 L 80,80
+                     M 80,35 Q 90,25 97,5
+            "/>
+         </g>
+      </g>
+   </defs>
+   <circle r="100" fill="white" stroke="none"/>
+   <circle r="100" fill="url(#shadow1)" stroke="none"/>
+   <g><animateTransform attributeName="transform" attributeType="XML" type="rotate" from="0" to="360" begin="0s" dur="3s" repeatCount="indefinite"/>
+      <use xlink:href="#black_stuff" stroke="#EEE" stroke-width="7"/>
+      <use xlink:href="#black_stuff" stroke="#DDD" stroke-width="4"/>
+      <use xlink:href="#black_stuff" stroke="#999" stroke-width="2"/>
+      <use xlink:href="#black_stuff" stroke="black" stroke-width="1"/>
+   </g>
+   <circle r="100" fill="url(#shadow2)" stroke="none"/>
+</svg>
index 3956107..e48b735 100644 (file)
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 349.46883 405.12272">\r
- <title>Tux</title>\r
- <desc>For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg</desc>\r
- <radialGradient id="ag" gradientUnits="userSpaceOnUse" cy="-551.04" cx="274.822" gradientTransform="matrix(.5671 0 0 -.2835 81.263 201.645)" r="165.384">\r
-  <stop stop-opacity=".502" offset="0"/>\r
-  <stop stop-opacity="0" offset="1"/>\r
- </radialGradient>\r
- <path fill="url(#ag)" d="m330.892 357.885c0 25.898-41.989 46.893-93.785 46.893-51.795 0-93.784-20.994-93.784-46.893s41.989-46.893 93.784-46.893c51.795 0.001 93.785 20.995 93.785 46.893z"/>\r
- <radialGradient id="ak" gradientUnits="userSpaceOnUse" cy="-551.042" cx="268.794" gradientTransform="matrix(.5823 0 0 -.2835 -61.6052 201.14)" r="165.383">\r
-  <stop stop-opacity=".502" offset="0"/>\r
-  <stop stop-opacity="0" offset="1"/>\r
- </radialGradient>\r
- <path fill="url(#ak)" d="m191.223 357.381c0 25.897-43.117 46.892-96.306 46.892-53.188 0-96.305-20.994-96.305-46.892s43.117-46.893 96.305-46.893c53.188 0.001 96.306 20.995 96.306 46.893z"/>\r
- <g transform="translate(8.99996 9.00046)">\r
-  <path d="m292.327 256.606c-4.752 19.584-28.872 60.48-41.688 78.48-12.815 18.072-11.231 34.344-34.92 28.008-23.616-6.336-30.24-5.184-54.647-3.744-24.265 1.439-19.009-0.721-34.2 6.12-15.12 6.84-65.88-82.944-69.984-99.647-4.031-16.705-5.976-14.689 4.536-32.761 10.513-18.071 12.024-35.928 25.92-57.816 13.896-21.96 29.952-33.12 28.8-49.896-4.535-62.28-8.136-93.384 19.513-107.784 26.352-13.68 48.384-5.544 57.096-0.864 3.744 2.016 11.376 5.904 17.064 12.744 5.688 6.696 10.8 16.848 13.68 29.664 5.904 25.704-2.448 17.208 4.248 46.656 6.624 29.375 20.088 43.775 36.504 67.031 16.414 23.257 33.55 61.633 28.078 83.809z"/>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#666" d="m148.47 94.049c4.319-1.728 3.592-1.958 6.472-8.222 2.304-4.824 4.328-6.898 4.256-14.242 0-7.2-2.232-9.648-5.616-14.328-3.24-4.464-8.424-4.68-11.664-4.104-1.872 0.288-4.319 2.664-5.976 6.192-1.08 2.376-1.944 5.4-2.017 8.568-0.216 8.496 0.505 11.736 2.448 17.496 2.305 6.769 7.921 10.297 12.097 8.64z"/>\r
-   <path fill="#6d6d6d" d="m148.47 94.023c4.293-1.717 3.563-1.954 6.425-8.178 2.289-4.793 4.312-6.861 4.271-14.164 0.027-7.152-2.162-9.702-5.488-14.201-3.296-4.345-8.376-4.509-11.593-3.953-1.916 0.283-4.354 2.569-6.038 5.968-1.159 2.31-2.016 5.353-2.087 8.535-0.212 8.438 0.547 11.691 2.46 17.417 2.268 6.731 7.901 10.221 12.05 8.576z"/>\r
-   <path fill="#757575" d="m148.471 93.996c4.264-1.706 3.533-1.95 6.377-8.133 2.273-4.762 4.296-6.823 4.288-14.085 0.053-7.105-2.093-9.756-5.363-14.075-3.35-4.225-8.327-4.338-11.52-3.801-1.961 0.278-4.389 2.474-6.099 5.744-1.242 2.245-2.089 5.305-2.16 8.501-0.207 8.38 0.591 11.647 2.473 17.34 2.231 6.691 7.881 10.144 12.004 8.509z"/>\r
-   <path fill="#7c7c7c" d="m148.471 93.969c4.235-1.694 3.506-1.946 6.329-8.089 2.26-4.731 4.28-6.786 4.304-14.006 0.081-7.058-2.021-9.811-5.236-13.948-3.403-4.105-8.278-4.167-11.446-3.649-2.006 0.273-4.424 2.379-6.16 5.519-1.322 2.179-2.161 5.257-2.232 8.468-0.202 8.323 0.636 11.603 2.486 17.261 2.191 6.654 7.859 10.068 11.955 8.444z"/>\r
-   <path fill="#848484" d="m148.471 93.943c4.209-1.684 3.477-1.942 6.282-8.045 2.245-4.7 4.266-6.749 4.319-13.928 0.107-7.01-1.95-9.864-5.109-13.821-3.458-3.985-8.23-3.996-11.375-3.498-2.049 0.268-4.458 2.284-6.222 5.295-1.403 2.114-2.233 5.21-2.303 8.435-0.198 8.265 0.679 11.559 2.498 17.183 2.156 6.615 7.842 9.992 11.91 8.379z"/>\r
-   <path fill="#8c8c8c" d="m148.471 93.916c4.181-1.672 3.448-1.938 6.235-8 2.23-4.668 4.249-6.711 4.335-13.85 0.134-6.962-1.88-9.918-4.982-13.695-3.513-3.865-8.183-3.825-11.303-3.347-2.094 0.263-4.492 2.189-6.283 5.07-1.484 2.049-2.306 5.163-2.375 8.401-0.193 8.207 0.723 11.515 2.511 17.105 2.118 6.58 7.821 9.919 11.862 8.316z"/>\r
-   <path fill="#939393" d="m148.472 93.889c4.152-1.661 3.419-1.934 6.188-7.956 2.215-4.638 4.233-6.674 4.35-13.771 0.161-6.915-1.809-9.972-4.854-13.568-3.567-3.746-8.134-3.654-11.23-3.195-2.138 0.259-4.527 2.094-6.345 4.847-1.564 1.983-2.378 5.115-2.447 8.368-0.188 8.149 0.767 11.47 2.523 17.026 2.079 6.54 7.8 9.841 11.815 8.249z"/>\r
-   <path fill="#9b9b9b" d="m148.472 93.863c4.125-1.65 3.391-1.93 6.141-7.912 2.2-4.607 4.217-6.637 4.366-13.693 0.188-6.868-1.739-10.026-4.729-13.441-3.621-3.626-8.085-3.484-11.157-3.044-2.183 0.253-4.562 1.999-6.406 4.622-1.646 1.918-2.45 5.068-2.52 8.335-0.185 8.091 0.811 11.426 2.535 16.948 2.044 6.502 7.782 9.766 11.77 8.185z"/>\r
-   <path fill="#a3a3a3" d="m148.472 93.836c4.097-1.639 3.361-1.926 6.094-7.867 2.185-4.576 4.201-6.599 4.382-13.614 0.214-6.82-1.669-10.081-4.603-13.315-3.676-3.506-8.036-3.313-11.084-2.893-2.229 0.249-4.598 1.904-6.47 4.398-1.726 1.852-2.521 5.021-2.591 8.301-0.18 8.034 0.854 11.382 2.548 16.87 2.008 6.465 7.763 9.691 11.724 8.12z"/>\r
-   <path fill="#aaa" d="m148.472 93.809c4.069-1.628 3.334-1.922 6.047-7.823 2.17-4.544 4.185-6.562 4.396-13.536 0.242-6.772-1.597-10.134-4.475-13.188-3.73-3.387-7.989-3.142-11.013-2.741-2.271 0.243-4.632 1.809-6.53 4.173-1.808 1.787-2.594 4.974-2.662 8.268-0.176 7.976 0.897 11.337 2.56 16.792 1.97 6.427 7.743 9.615 11.677 8.055z"/>\r
-   <path fill="#b2b2b2" d="m148.473 93.782c4.041-1.617 3.304-1.918 5.999-7.778 2.154-4.514 4.169-6.524 4.412-13.458 0.269-6.725-1.526-10.188-4.349-13.062-3.784-3.267-7.939-2.971-10.939-2.589-2.316 0.238-4.666 1.714-6.592 3.949-1.888 1.721-2.667 4.926-2.734 8.234-0.171 7.918 0.941 11.293 2.572 16.713 1.933 6.391 7.723 9.541 11.631 7.991z"/>\r
-   <path fill="#bababa" d="m148.473 93.756c4.014-1.606 3.275-1.914 5.951-7.734 2.141-4.482 4.153-6.487 4.43-13.379 0.295-6.678-1.457-10.243-4.223-12.935-3.839-3.147-7.892-2.8-10.867-2.438-2.36 0.233-4.701 1.619-6.653 3.725-1.969 1.656-2.739 4.879-2.806 8.201-0.167 7.86 0.984 11.249 2.585 16.636 1.895 6.35 7.702 9.462 11.583 7.924z"/>\r
-   <path fill="#c1c1c1" d="m148.473 93.729c3.985-1.595 3.247-1.91 5.904-7.69 2.125-4.451 4.138-6.45 4.445-13.3 0.321-6.63-1.387-10.297-4.096-12.808-3.894-3.028-7.844-2.629-10.795-2.287-2.405 0.229-4.735 1.524-6.716 3.5-2.049 1.59-2.811 4.831-2.878 8.167-0.161 7.802 1.029 11.205 2.599 16.557 1.859 6.314 7.683 9.389 11.537 7.861z"/>\r
-   <path fill="#c9c9c9" d="m148.473 93.702c3.958-1.583 3.219-1.906 5.857-7.646 2.11-4.42 4.121-6.412 4.46-13.222 0.35-6.583-1.315-10.351-3.969-12.682-3.947-2.908-7.794-2.458-10.722-2.135-2.45 0.224-4.771 1.429-6.777 3.276-2.13 1.525-2.883 4.784-2.95 8.135-0.157 7.745 1.073 11.16 2.611 16.479 1.821 6.276 7.663 9.313 11.49 7.795z"/>\r
-   <path fill="#d1d1d1" d="m148.474 93.676c3.93-1.573 3.188-1.902 5.809-7.601 2.097-4.389 4.107-6.375 4.477-13.144 0.375-6.535-1.245-10.404-3.842-12.555-4.002-2.788-7.747-2.287-10.65-1.984-2.493 0.219-4.805 1.334-6.837 3.052-2.213 1.459-2.957 4.736-3.022 8.101-0.153 7.687 1.116 11.116 2.623 16.401 1.782 6.237 7.642 9.237 11.442 7.73z"/>\r
-   <path fill="#d8d8d8" d="m148.474 93.649c3.901-1.562 3.16-1.898 5.762-7.557 2.082-4.358 4.091-6.338 4.493-13.065 0.401-6.487-1.176-10.458-3.716-12.428-4.057-2.668-7.698-2.116-10.578-1.832-2.538 0.214-4.839 1.239-6.899 2.827-2.292 1.394-3.029 4.689-3.094 8.068-0.148 7.629 1.16 11.072 2.636 16.322 1.746 6.2 7.623 9.161 11.396 7.665z"/>\r
-   <path fill="#e0e0e0" d="m148.474 93.622c3.875-1.55 3.132-1.894 5.715-7.512 2.066-4.327 4.075-6.3 4.508-12.987 0.429-6.44-1.104-10.513-3.588-12.302-4.111-2.549-7.65-1.945-10.506-1.681-2.582 0.209-4.874 1.144-6.961 2.604-2.373 1.328-3.102 4.642-3.165 8.034-0.145 7.571 1.204 11.027 2.647 16.244 1.709 6.162 7.604 9.086 11.35 7.6z"/>\r
-   <path fill="#e8e8e8" d="m148.474 93.596c3.847-1.54 3.104-1.89 5.668-7.468 2.052-4.296 4.059-6.263 4.523-12.908 0.456-6.393-1.034-10.567-3.462-12.175-4.165-2.429-7.601-1.774-10.433-1.529-2.627 0.204-4.908 1.049-7.023 2.379-2.453 1.263-3.173 4.594-3.236 8.001-0.141 7.514 1.247 10.983 2.659 16.166 1.673 6.123 7.585 9.008 11.304 7.534z"/>\r
-   <path fill="#efefef" d="m148.475 93.569c3.817-1.528 3.073-1.886 5.62-7.424 2.036-4.265 4.043-6.226 4.539-12.83 0.482-6.345-0.964-10.621-3.336-12.048-4.219-2.31-7.552-1.604-10.359-1.378-2.672 0.199-4.943 0.954-7.084 2.155-2.535 1.197-3.246 4.546-3.311 7.967-0.135 7.456 1.292 10.939 2.673 16.087 1.636 6.087 7.565 8.935 11.258 7.471z"/>\r
-   <path fill="#f7f7f7" d="m148.475 93.542c3.791-1.517 3.046-1.882 5.572-7.379 2.022-4.234 4.027-6.188 4.556-12.751 0.51-6.297-0.894-10.675-3.208-11.921-4.274-2.19-7.505-1.433-10.289-1.227-2.715 0.194-4.978 0.859-7.146 1.93-2.614 1.132-3.317 4.5-3.381 7.935-0.131 7.398 1.335 10.895 2.686 16.009 1.597 6.047 7.544 8.858 11.21 7.404z"/>\r
-   <path fill="#fff" d="m148.475 93.516c3.763-1.506 3.017-1.878 5.525-7.335 2.007-4.203 4.012-6.151 4.571-12.673 0.536-6.25-0.823-10.729-3.082-11.795-4.328-2.07-7.456-1.262-10.216-1.075-2.76 0.189-5.012 0.764-7.207 1.706-2.696 1.066-3.39 4.452-3.453 7.901-0.126 7.34 1.379 10.85 2.698 15.931 1.561 6.01 7.525 8.782 11.164 7.34z"/>\r
-  </g>\r
-  <path d="m132.033 74.7465c2.16 0 4.896 1.44 6.191 3.384 1.368 1.944 2.376 4.68 2.376 7.776 0 4.608-0.504 9.72-3.239 11.304-0.864 0.504-2.736 0.936-3.816 0.936-2.448 0-2.664-1.584-4.968-3.96-0.792-0.864-3.168-5.04-3.168-8.496 0-2.16-0.504-5.256 1.368-7.992 1.296-2.016 2.952-2.952 5.256-2.952z"/>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m143.862 68.608c0.844-1.305 4.222-0.69 5.45 1.996 1.229 2.687 0.998 8.522 0.153 8.829-2.226 0.691-1.535-2.534-3.454-5.451-1.919-2.762-2.994-4.067-2.149-5.374z"/>\r
-   <path fill="#070707" d="m143.916 68.664c0.833-1.289 4.169-0.681 5.381 1.971 1.215 2.653 0.985 8.414 0.152 8.717-2.198 0.682-1.516-2.502-3.411-5.382-1.895-2.728-2.956-4.017-2.122-5.306z"/>\r
-   <path fill="#0f0f0f" d="m143.97 68.719c0.822-1.272 4.114-0.673 5.312 1.945 1.198 2.619 0.973 8.306 0.15 8.605-2.169 0.673-1.497-2.47-3.367-5.313-1.871-2.692-2.918-3.964-2.095-5.237z"/>\r
-   <path fill="#161616" d="m144.024 68.774c0.812-1.255 4.062-0.664 5.243 1.92 1.182 2.585 0.96 8.198 0.147 8.493-2.141 0.665-1.477-2.438-3.323-5.244-1.846-2.657-2.88-3.913-2.067-5.169z"/>\r
-   <path fill="#1e1e1e" d="m144.078 68.829c0.801-1.239 4.008-0.655 5.174 1.895 1.167 2.551 0.947 8.09 0.146 8.381-2.113 0.656-1.458-2.405-3.28-5.174-1.821-2.623-2.842-3.863-2.04-5.102z"/>\r
-   <path fill="#262626" d="m144.132 68.884c0.791-1.222 3.955-0.646 5.105 1.87 1.151 2.517 0.935 7.982 0.144 8.27-2.085 0.647-1.438-2.374-3.235-5.105-1.798-2.589-2.805-3.812-2.014-5.035z"/>\r
-   <path fill="#2d2d2d" d="m144.186 68.939c0.779-1.206 3.9-0.638 5.036 1.844 1.135 2.483 0.922 7.874 0.142 8.158-2.057 0.639-1.419-2.341-3.192-5.037-1.773-2.552-2.766-3.758-1.986-4.965z"/>\r
-   <path fill="#353535" d="m144.24 68.994c0.769-1.189 3.848-0.629 4.967 1.819 1.12 2.449 0.909 7.766 0.141 8.046-2.028 0.629-1.399-2.31-3.148-4.967-1.75-2.518-2.73-3.708-1.96-4.898z"/>\r
-   <path fill="#3d3d3d" d="m144.294 69.049c0.76-1.172 3.794-0.621 4.898 1.793 1.104 2.415 0.896 7.658 0.138 7.934-2 0.621-1.38-2.277-3.104-4.898-1.725-2.482-2.691-3.655-1.932-4.829z"/>\r
-   <path fill="#444" d="m144.348 69.104c0.748-1.156 3.74-0.612 4.829 1.768 1.088 2.38 0.884 7.55 0.136 7.822-1.973 0.612-1.36-2.245-3.062-4.829-1.699-2.448-2.651-3.604-1.903-4.761z"/>\r
-   <path fill="#4c4c4c" d="m144.402 69.16c0.737-1.14 3.687-0.603 4.76 1.743 1.073 2.347 0.871 7.442 0.134 7.71-1.943 0.604-1.341-2.213-3.017-4.76-1.676-2.414-2.614-3.554-1.877-4.693z"/>\r
-   <path fill="#545454" d="m144.456 69.215c0.727-1.123 3.634-0.595 4.691 1.717 1.057 2.313 0.857 7.334 0.132 7.598-1.916 0.595-1.321-2.181-2.973-4.691-1.652-2.378-2.577-3.501-1.85-4.624z"/>\r
-   <path fill="#5b5b5b" d="m144.51 69.27c0.717-1.106 3.58-0.585 4.622 1.692 1.041 2.278 0.847 7.226 0.131 7.486-1.888 0.586-1.303-2.149-2.93-4.622-1.628-2.343-2.539-3.45-1.823-4.556z"/>\r
-   <path fill="#636363" d="m144.564 69.325c0.705-1.09 3.526-0.577 4.553 1.667 1.026 2.245 0.833 7.118 0.128 7.375-1.858 0.577-1.282-2.117-2.885-4.553-1.604-2.309-2.501-3.399-1.796-4.489z"/>\r
-   <path fill="#6b6b6b" d="m144.618 69.38c0.694-1.073 3.473-0.568 4.483 1.642 1.011 2.21 0.82 7.01 0.127 7.263-1.831 0.568-1.264-2.084-2.842-4.484-1.578-2.274-2.462-3.347-1.768-4.421z"/>\r
-   <path fill="#727272" d="m144.672 69.435c0.685-1.057 3.42-0.56 4.414 1.617 0.995 2.176 0.81 6.902 0.125 7.15-1.803 0.56-1.243-2.053-2.798-4.415-1.554-2.238-2.425-3.295-1.741-4.352z"/>\r
-   <path fill="#7a7a7a" d="m144.726 69.49c0.673-1.041 3.365-0.551 4.345 1.591 0.979 2.143 0.796 6.794 0.123 7.039-1.775 0.551-1.224-2.021-2.754-4.346-1.53-2.203-2.387-3.244-1.714-4.284z"/>\r
-   <path fill="#828282" d="m144.78 69.545c0.662-1.023 3.313-0.542 4.276 1.566 0.964 2.108 0.782 6.686 0.121 6.926-1.746 0.542-1.204-1.988-2.711-4.276-1.505-2.167-2.348-3.192-1.686-4.216z"/>\r
-   <path fill="#898989" d="m144.834 69.6c0.652-1.007 3.259-0.533 4.207 1.541s0.771 6.578 0.119 6.815c-1.718 0.534-1.185-1.956-2.666-4.207-1.482-2.134-2.311-3.142-1.66-4.149z"/>\r
-   <path fill="#919191" d="m144.888 69.655c0.641-0.99 3.206-0.524 4.138 1.516 0.933 2.04 0.758 6.47 0.117 6.703-1.69 0.525-1.165-1.924-2.623-4.138-1.457-2.098-2.273-3.09-1.632-4.081z"/>\r
-   <path fill="#999" d="m144.942 69.71c0.63-0.974 3.152-0.516 4.069 1.49s0.744 6.362 0.114 6.591c-1.662 0.516-1.146-1.892-2.579-4.069-1.432-2.062-2.234-3.037-1.604-4.012z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#666" d="m193.11 94.985c10.8-1.152 14.616-5.328 16.56-12.6 1.729-6.48 1.801-13.68-3.023-22.104-4.536-8.063-7.128-9.36-13.681-9.864-10.079-0.864-14.832 6.192-17.063 11.232-2.376 5.472-1.872 4.68-1.729 11.592 0.145 7.272 4.245 9.299 6.766 13.835 2.519 4.465 10.946 7.982 12.17 7.909z"/>\r
-   <path fill="#6d6d6d" d="m193.115 94.944c10.759-1.131 14.618-5.354 16.515-12.569 1.701-6.525 1.785-13.686-3.002-21.912-4.434-7.797-7.038-9.081-13.512-9.581-10.049-0.861-14.941 5.873-17.181 10.874-2.304 5.28-1.878 4.718-1.726 11.539 0.16 7.268 4.268 9.223 6.784 13.76 2.521 4.475 10.898 7.962 12.122 7.889z"/>\r
-   <path fill="#757575" d="m193.12 94.902c10.718-1.11 14.62-5.379 16.469-12.538 1.676-6.57 1.771-13.692-2.979-21.721-4.331-7.53-6.947-8.801-13.344-9.297-10.018-0.858-15.05 5.553-17.298 10.516-2.229 5.087-1.885 4.757-1.722 11.487 0.176 7.264 4.289 9.146 6.803 13.686 2.52 4.485 10.848 7.942 12.071 7.867z"/>\r
-   <path fill="#7c7c7c" d="m193.126 94.861c10.675-1.09 14.621-5.405 16.423-12.507 1.648-6.616 1.756-13.698-2.958-21.529-4.229-7.263-6.856-8.522-13.176-9.014-9.985-0.854-15.158 5.234-17.414 10.158-2.156 4.895-1.891 4.795-1.719 11.434 0.193 7.26 4.31 9.07 6.822 13.611 2.52 4.495 10.798 7.922 12.022 7.847z"/>\r
-   <path fill="#848484" d="m193.131 94.82c10.635-1.069 14.623-5.431 16.377-12.476 1.622-6.661 1.741-13.704-2.936-21.337-4.126-6.996-6.767-8.242-13.008-8.73-9.955-0.852-15.267 4.915-17.53 9.8-2.084 4.703-1.896 4.833-1.716 11.38 0.209 7.256 4.332 8.995 6.841 13.537 2.52 4.505 10.748 7.902 11.972 7.826z"/>\r
-   <path fill="#8c8c8c" d="m193.136 94.778c10.593-1.048 14.625-5.457 16.331-12.445 1.596-6.706 1.726-13.709-2.913-21.145-4.025-6.729-6.678-7.963-12.841-8.447-9.924-0.848-15.375 4.595-17.647 9.441-2.01 4.51-1.903 4.872-1.712 11.328 0.225 7.251 4.354 8.918 6.858 13.462 2.521 4.517 10.7 7.883 11.924 7.806z"/>\r
-   <path fill="#939393" d="m193.141 94.737c10.552-1.027 14.627-5.482 16.286-12.414 1.568-6.751 1.711-13.715-2.893-20.954-3.922-6.462-6.586-7.683-12.672-8.163-9.892-0.845-15.483 4.276-17.764 9.083-1.938 4.318-1.909 4.91-1.709 11.275 0.24 7.247 4.375 8.842 6.878 13.387 2.521 4.528 10.651 7.863 11.874 7.786z"/>\r
-   <path fill="#9b9b9b" d="m193.146 94.695c10.51-1.007 14.63-5.508 16.241-12.382 1.542-6.796 1.694-13.721-2.87-20.762-3.82-6.195-6.496-7.404-12.504-7.879-9.861-0.842-15.592 3.956-17.882 8.725-1.863 4.126-1.915 4.949-1.706 11.223 0.258 7.243 4.397 8.766 6.897 13.313 2.521 4.535 10.601 7.841 11.824 7.762z"/>\r
-   <path fill="#a3a3a3" d="m193.151 94.654c10.469-0.986 14.632-5.534 16.196-12.351 1.515-6.842 1.68-13.727-2.85-20.57-3.717-5.928-6.405-7.125-12.335-7.596-9.83-0.839-15.7 3.637-17.998 8.367-1.791 3.933-1.922 4.987-1.703 11.169 0.273 7.239 4.419 8.689 6.916 13.238 2.521 4.547 10.551 7.822 11.774 7.743z"/>\r
-   <path fill="#aaa" d="m193.157 94.612c10.427-0.965 14.633-5.56 16.149-12.32 1.488-6.887 1.666-13.733-2.826-20.379-3.615-5.661-6.316-6.845-12.168-7.313-9.799-0.835-15.809 3.317-18.114 8.009-1.718 3.741-1.928 5.025-1.7 11.117 0.29 7.235 4.44 8.613 6.936 13.163 2.519 4.558 10.499 7.804 11.723 7.723z"/>\r
-   <path fill="#b2b2b2" d="m193.162 94.571c10.386-0.944 14.635-5.585 16.104-12.289 1.462-6.932 1.649-13.739-2.806-20.188-3.512-5.394-6.225-6.565-11.999-7.029-9.768-0.833-15.917 2.998-18.23 7.651-1.646 3.549-1.935 5.064-1.697 11.064 0.306 7.231 4.462 8.537 6.954 13.088 2.52 4.569 10.451 7.784 11.674 7.703z"/>\r
-   <path fill="#bababa" d="m193.167 94.529c10.345-0.923 14.638-5.611 16.059-12.258 1.436-6.977 1.636-13.744-2.782-19.995-3.41-5.127-6.135-6.286-11.832-6.746-9.736-0.829-16.025 2.679-18.347 7.293-1.572 3.356-1.941 5.103-1.694 11.011 0.322 7.227 4.484 8.461 6.973 13.014 2.519 4.579 10.4 7.764 11.623 7.681z"/>\r
-   <path fill="#c1c1c1" d="m193.172 94.488c10.304-0.903 14.64-5.637 16.014-12.227 1.409-7.022 1.62-13.75-2.762-19.804-3.308-4.86-6.044-6.006-11.662-6.462-9.705-0.826-16.135 2.359-18.466 6.935-1.498 3.164-1.945 5.141-1.689 10.958 0.338 7.223 4.506 8.385 6.991 12.939 2.519 4.59 10.351 7.744 11.574 7.661z"/>\r
-   <path fill="#c9c9c9" d="m193.177 94.447c10.262-0.882 14.641-5.663 15.967-12.196 1.383-7.068 1.605-13.756-2.738-19.612-3.206-4.593-5.954-5.727-11.496-6.179-9.673-0.823-16.242 2.04-18.581 6.577-1.425 2.972-1.952 5.179-1.687 10.906 0.354 7.219 4.526 8.308 7.01 12.865 2.52 4.598 10.302 7.723 11.525 7.639z"/>\r
-   <path fill="#d1d1d1" d="m193.182 94.405c10.221-0.861 14.643-5.688 15.922-12.165 1.355-7.113 1.591-13.762-2.717-19.42-3.104-4.326-5.864-5.448-11.327-5.895-9.644-0.82-16.352 1.721-18.698 6.219-1.353 2.779-1.959 5.217-1.684 10.853 0.369 7.214 4.549 8.232 7.028 12.79 2.521 4.609 10.254 7.703 11.476 7.618z"/>\r
-   <path fill="#d8d8d8" d="m193.187 94.364c10.179-0.841 14.645-5.714 15.876-12.133 1.33-7.158 1.576-13.768-2.694-19.229-3.001-4.059-5.773-5.168-11.16-5.612-9.61-0.817-16.459 1.401-18.813 5.861-1.279 2.586-1.965 5.256-1.682 10.8 0.387 7.21 4.571 8.156 7.049 12.715 2.519 4.619 10.202 7.684 11.424 7.598z"/>\r
-   <path fill="#e0e0e0" d="m193.193 94.322c10.137-0.82 14.646-5.74 15.83-12.103 1.303-7.203 1.561-13.773-2.673-19.037-2.898-3.792-5.684-4.889-10.991-5.328-9.58-0.813-16.568 1.082-18.931 5.502-1.206 2.395-1.972 5.294-1.679 10.747 0.403 7.207 4.592 8.08 7.067 12.641 2.521 4.631 10.154 7.666 11.377 7.578z"/>\r
-   <path fill="#e8e8e8" d="m193.198 94.281c10.096-0.799 14.648-5.766 15.785-12.071 1.275-7.249 1.545-13.779-2.651-18.845-2.796-3.525-5.593-4.609-10.823-5.044-9.549-0.81-16.677 0.762-19.048 5.145-1.133 2.202-1.978 5.333-1.675 10.694 0.419 7.202 4.614 8.003 7.086 12.566 2.52 4.638 10.103 7.643 11.326 7.555z"/>\r
-   <path fill="#efefef" d="m193.203 94.239c10.055-0.778 14.65-5.792 15.739-12.04 1.25-7.293 1.531-13.785-2.629-18.653-2.694-3.258-5.502-4.33-10.655-4.761-9.517-0.807-16.785 0.443-19.165 4.786-1.059 2.01-1.983 5.372-1.671 10.642 0.435 7.198 4.636 7.928 7.104 12.492 2.52 4.649 10.055 7.624 11.277 7.534z"/>\r
-   <path fill="#f7f7f7" d="m193.208 94.198c10.014-0.757 14.652-5.817 15.694-12.009 1.223-7.339 1.516-13.792-2.607-18.462-2.592-2.991-5.413-4.05-10.486-4.478-9.487-0.804-16.895 0.124-19.282 4.428-0.986 1.817-1.989 5.41-1.668 10.589 0.451 7.194 4.657 7.851 7.123 12.417 2.519 4.661 10.004 7.605 11.226 7.515z"/>\r
-   <path fill="#fff" d="m193.213 94.156c9.973-0.737 14.654-5.843 15.648-11.978 1.197-7.384 1.501-13.797-2.585-18.27-2.489-2.724-5.322-3.771-10.319-4.194-9.455-0.801-17.002-0.196-19.397 4.07-0.913 1.625-1.996 5.448-1.665 10.536 0.467 7.19 4.679 7.775 7.142 12.342 2.519 4.671 9.954 7.586 11.176 7.494z"/>\r
-  </g>\r
-  <path d="m179.841 74.4585c5.4 0 8.568 4.824 9.648 11.016 0.432 2.808-0.216 6.048-1.944 8.28-1.944 2.592-5.4 4.176-8.208 4.176-2.664 0-5.688 0.432-7.271-1.728-1.584-2.232-1.944-7.2-1.944-10.728 0-3.96 1.152-6.768 3.168-9 1.511-1.657 4.247-2.016 6.551-2.016z"/>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m192.591 66.68c0.98-0.653 2.612 0 4.489 2.122 2.039 2.285 2.938 4.08 0.489 5.385-1.877 0.98-2.448-1.958-3.59-3.182-1.795-1.959-3.346-3.02-1.388-4.325z"/>\r
-   <path fill="#070707" d="m192.631 66.738c0.96-0.649 2.573 0 4.423 2.09 2.009 2.251 2.864 4.02 0.481 5.305-1.837 0.977-2.403-1.929-3.525-3.135-1.768-1.925-3.296-2.965-1.379-4.26z"/>\r
-   <path fill="#0f0f0f" d="m192.671 66.797c0.939-0.645 2.534 0 4.356 2.059 1.978 2.217 2.792 3.958 0.474 5.225-1.798 0.974-2.357-1.9-3.46-3.087-1.742-1.895-3.247-2.913-1.37-4.197z"/>\r
-   <path fill="#161616" d="m192.711 66.855c0.919-0.641 2.495 0 4.289 2.027 1.948 2.184 2.721 3.898 0.467 5.146-1.759 0.971-2.313-1.871-3.396-3.041-1.715-1.861-3.197-2.858-1.36-4.132z"/>\r
-   <path fill="#1e1e1e" d="m192.751 66.914c0.899-0.637 2.457 0 4.223 1.996 1.918 2.149 2.647 3.838 0.46 5.065-1.72 0.968-2.269-1.842-3.331-2.993-1.689-1.83-3.148-2.805-1.352-4.068z"/>\r
-   <path fill="#262626" d="m192.791 66.973c0.878-0.633 2.418 0 4.155 1.964 1.888 2.116 2.576 3.777 0.453 4.986-1.68 0.965-2.224-1.813-3.267-2.946-1.661-1.798-3.097-2.752-1.341-4.004z"/>\r
-   <path fill="#2d2d2d" d="m192.831 67.031c0.858-0.629 2.379 0 4.089 1.933 1.857 2.082 2.503 3.717 0.445 4.906-1.641 0.961-2.178-1.784-3.201-2.898-1.636-1.767-3.048-2.7-1.333-3.941z"/>\r
-   <path fill="#353535" d="m192.87 67.09c0.838-0.625 2.341 0 4.023 1.902 1.827 2.047 2.431 3.656 0.438 4.826-1.601 0.958-2.133-1.755-3.137-2.852-1.608-1.735-2.998-2.646-1.324-3.876z"/>\r
-   <path fill="#3d3d3d" d="m192.91 67.148c0.818-0.621 2.302 0 3.956 1.87 1.797 2.014 2.359 3.596 0.431 4.746-1.562 0.956-2.088-1.726-3.071-2.804-1.583-1.702-2.95-2.592-1.316-3.812z"/>\r
-   <path fill="#444" d="m192.95 67.207c0.798-0.617 2.263 0 3.889 1.839 1.768 1.98 2.287 3.535 0.425 4.666-1.523 0.952-2.043-1.697-3.008-2.757-1.556-1.671-2.899-2.539-1.306-3.748z"/>\r
-   <path fill="#4c4c4c" d="m192.99 67.266c0.777-0.614 2.224 0 3.823 1.807 1.735 1.946 2.214 3.474 0.416 4.586-1.483 0.949-1.998-1.667-2.942-2.709-1.529-1.639-2.85-2.486-1.297-3.684z"/>\r
-   <path fill="#545454" d="m193.03 67.325c0.757-0.61 2.185 0 3.756 1.775 1.706 1.912 2.143 3.414 0.409 4.506-1.444 0.946-1.953-1.639-2.878-2.663-1.502-1.606-2.799-2.431-1.287-3.618z"/>\r
-   <path fill="#5b5b5b" d="m193.07 67.383c0.736-0.605 2.146 0 3.688 1.744 1.677 1.878 2.07 3.353 0.402 4.426-1.405 0.943-1.908-1.609-2.813-2.615-1.475-1.575-2.749-2.378-1.277-3.555z"/>\r
-   <path fill="#636363" d="m193.11 67.442c0.716-0.602 2.106 0 3.622 1.712 1.646 1.844 1.998 3.293 0.395 4.347-1.364 0.94-1.862-1.581-2.748-2.568-1.449-1.543-2.701-2.326-1.269-3.491z"/>\r
-   <path fill="#6b6b6b" d="m193.15 67.5c0.696-0.598 2.069 0 3.556 1.681 1.615 1.811 1.925 3.232 0.387 4.267-1.325 0.937-1.818-1.552-2.683-2.521-1.423-1.511-2.651-2.272-1.26-3.427z"/>\r
-   <path fill="#727272" d="m193.19 67.559c0.675-0.594 2.03 0 3.489 1.649 1.585 1.777 1.853 3.172 0.38 4.187-1.287 0.935-1.774-1.522-2.619-2.473-1.396-1.48-2.601-2.219-1.25-3.363z"/>\r
-   <path fill="#7a7a7a" d="m193.23 67.618c0.654-0.59 1.991 0 3.422 1.618 1.555 1.743 1.781 3.111 0.373 4.107-1.247 0.931-1.729-1.494-2.554-2.426-1.369-1.448-2.551-2.166-1.241-3.299z"/>\r
-   <path fill="#828282" d="m193.269 67.677c0.635-0.586 1.953 0 3.355 1.586 1.525 1.708 1.709 3.05 0.366 4.026-1.208 0.928-1.684-1.464-2.489-2.378-1.342-1.416-2.501-2.112-1.232-3.234z"/>\r
-   <path fill="#898989" d="m193.309 67.735c0.614-0.582 1.914 0 3.29 1.555 1.493 1.675 1.636 2.99 0.357 3.947-1.169 0.925-1.639-1.435-2.424-2.332-1.316-1.384-2.452-2.058-1.223-3.17z"/>\r
-   <path fill="#919191" d="m193.349 67.794c0.595-0.578 1.875 0 3.223 1.523 1.464 1.641 1.564 2.93 0.351 3.867-1.129 0.922-1.594-1.406-2.359-2.284-1.29-1.352-2.403-2.005-1.215-3.106z"/>\r
-   <path fill="#999" d="m193.389 67.853c0.573-0.574 1.836 0 3.155 1.492 1.435 1.607 1.492 2.869 0.345 3.787-1.091 0.919-1.55-1.377-2.295-2.237-1.263-1.32-2.353-1.953-1.205-3.042z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m165.498 69.906c1.693-0.654 3.012-0.69 5.63 1.036 3.166 2.088 1.705 5.245-0.779 4.601-2.146-0.556-2.417-0.681-4.391-1.086-3.101-0.648-3.641-3.322-0.46-4.551z"/>\r
-   <path fill="#050505" d="m165.564 70.033c1.658-0.629 2.973-0.656 5.555 1.026 3.066 2.009 1.654 5.012-0.805 4.38-2.131-0.547-2.345-0.656-4.284-1.052-3.055-0.634-3.587-3.173-0.466-4.354z"/>\r
-   <path fill="#0a0a0a" d="m165.63 70.16c1.623-0.604 2.935-0.622 5.481 1.015 2.965 1.93 1.602 4.779-0.83 4.159-2.119-0.539-2.274-0.63-4.179-1.018-3.009-0.618-3.533-3.022-0.472-4.156z"/>\r
-   <path fill="#0f0f0f" d="m165.696 70.287c1.587-0.579 2.895-0.587 5.406 1.005 2.864 1.851 1.551 4.546-0.855 3.938-2.105-0.53-2.203-0.605-4.073-0.983-2.963-0.604-3.48-2.873-0.478-3.96z"/>\r
-   <path fill="#141414" d="m165.761 70.413c1.553-0.553 2.856-0.553 5.331 0.995 2.766 1.772 1.5 4.313-0.88 3.717-2.092-0.521-2.131-0.58-3.967-0.949-2.916-0.588-3.425-2.723-0.484-3.763z"/>\r
-   <path fill="#191919" d="m165.827 70.54c1.519-0.528 2.818-0.519 5.258 0.984 2.664 1.693 1.448 4.079-0.905 3.497-2.079-0.513-2.06-0.554-3.861-0.915-2.873-0.573-3.373-2.573-0.492-3.566z"/>\r
-   <path fill="#1e1e1e" d="m165.893 70.667c1.482-0.503 2.778-0.484 5.183 0.974 2.564 1.614 1.397 3.846-0.93 3.276-2.067-0.504-1.989-0.529-3.756-0.88-2.826-0.559-3.319-2.425-0.497-3.37z"/>\r
-   <path fill="#232323" d="m165.959 70.793c1.447-0.478 2.74-0.45 5.108 0.964 2.464 1.535 1.345 3.613-0.955 3.055-2.053-0.496-1.917-0.503-3.651-0.846-2.779-0.543-3.264-2.274-0.502-3.173z"/>\r
-   <path fill="#282828" d="m166.025 70.92c1.412-0.453 2.701-0.416 5.034 0.954 2.362 1.456 1.293 3.38-0.981 2.834-2.04-0.487-1.845-0.478-3.545-0.812-2.733-0.528-3.21-2.125-0.508-2.976z"/>\r
-   <path fill="#2d2d2d" d="m166.09 71.047c1.378-0.428 2.663-0.382 4.96 0.943 2.264 1.377 1.242 3.146-1.006 2.613-2.026-0.478-1.773-0.453-3.438-0.777-2.688-0.513-3.158-1.974-0.516-2.779z"/>\r
-   <path fill="#333" d="m166.156 71.173c1.343-0.402 2.624-0.347 4.885 0.933 2.163 1.298 1.191 2.914-1.029 2.392-2.015-0.47-1.703-0.428-3.334-0.743-2.642-0.498-3.104-1.824-0.522-2.582z"/>\r
-   <path fill="#383838" d="m166.222 71.3c1.307-0.377 2.585-0.313 4.81 0.922 2.063 1.219 1.14 2.681-1.055 2.171-2.001-0.461-1.631-0.402-3.229-0.708-2.594-0.483-3.048-1.674-0.526-2.385z"/>\r
-   <path fill="#3d3d3d" d="m166.288 71.427c1.272-0.352 2.546-0.279 4.736 0.913 1.962 1.14 1.088 2.447-1.081 1.95-1.988-0.452-1.56-0.377-3.122-0.674-2.55-0.469-2.995-1.526-0.533-2.189z"/>\r
-   <path fill="#424242" d="m166.354 71.554c1.236-0.327 2.507-0.245 4.661 0.902 1.861 1.061 1.037 2.214-1.106 1.729-1.974-0.444-1.488-0.352-3.016-0.64-2.504-0.453-2.942-1.375-0.539-1.991z"/>\r
-   <path fill="#474747" d="m166.419 71.68c1.203-0.302 2.469-0.21 4.587 0.892 1.762 0.982 0.986 1.98-1.13 1.508-1.962-0.435-1.417-0.326-2.911-0.606-2.458-0.437-2.888-1.224-0.546-1.794z"/>\r
-   <path fill="#4c4c4c" d="m166.485 71.807c1.167-0.276 2.429-0.176 4.513 0.882 1.66 0.903 0.935 1.748-1.156 1.288-1.948-0.426-1.345-0.301-2.805-0.572-2.412-0.423-2.834-1.076-0.552-1.598z"/>\r
-   <path fill="#515151" d="m166.551 71.934c1.133-0.251 2.391-0.142 4.438 0.871 1.56 0.824 0.883 1.515-1.181 1.067-1.936-0.417-1.274-0.275-2.699-0.537-2.366-0.408-2.781-0.926-0.558-1.401z"/>\r
-   <path fill="#565656" d="m166.617 72.061c1.097-0.227 2.351-0.108 4.363 0.861 1.46 0.745 0.831 1.281-1.206 0.846-1.922-0.409-1.202-0.25-2.594-0.503-2.319-0.393-2.726-0.777-0.563-1.204z"/>\r
-   <path fill="#5b5b5b" d="m166.683 72.187c1.062-0.201 2.312-0.073 4.289 0.851 1.358 0.666 0.778 1.048-1.231 0.625-1.91-0.4-1.131-0.225-2.489-0.469-2.274-0.377-2.672-0.626-0.569-1.007z"/>\r
-   <path fill="#606060" d="m166.748 72.314c1.027-0.176 2.274-0.04 4.215 0.84 1.26 0.587 0.729 0.815-1.256 0.404-1.896-0.392-1.06-0.2-2.383-0.435-2.228-0.361-2.619-0.475-0.576-0.809z"/>\r
-   <path fill="#666" d="m166.814 72.44c0.992-0.151 2.234-0.005 4.14 0.83 1.159 0.508 0.677 0.582-1.281 0.183-1.883-0.383-0.987-0.174-2.276-0.4-2.183-0.346-2.566-0.325-0.583-0.613z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#666" d="m159.99 128.249c-9.36 0.36-24.192-25.848-24.552-14.976-0.288 9.216 0.216 9.072 0.216 18 0 5.976-2.736 6.408-8.64 15.408-3.024 4.752-5.4 9.864-7.272 15.048-1.152 3.096-2.232 6.336-3.096 9.504-0.36 1.584-1.008 3.24-1.368 4.824-2.952 10.872-13.464 24.264-15.912 35.136-2.448 10.8-5.328 17.712-4.968 32.185 0.36 14.472 0.504 10.295 4.896 13.896 4.32 3.601 8.784 6.983 15.624 13.032 7.2 6.264 22.177 17.208 24.192 20.592 2.16 3.456 2.088 11.232 0.792 13.752-1.296 2.448-12.6 3.816-12.528 3.816-0.071 0 9.864 13.68 11.809 15.623 1.872 1.873 9.936 10.873 42.768 4.752 18.504-3.455 32.832-13.823 43.2-23.832 13.392-13.031 6.624-16.775 8.352-23.327 2.521-9.433 10.729-12.96 12.601-23.616 0.216-1.512 0.72-2.664 2.088-4.896 2.088-3.168 1.584-9.432 1.584-15.191 0-14.977-1.729-30.24-5.185-41.472-3.168-10.512-8.208-17.856-12.527-27.36-8.641-18.936-8.208-27.432-15.912-39.528-8.784-13.968-4.464-23.256-16.128-22.68-14.546 0.79-26.282 20.734-40.034 21.31z"/>\r
-   <path fill="#6d6d6d" d="m159.973 129.334c-9.281 0.353-23.746-25.511-24.242-15.179-0.316 8.755 0.1 8.678 0.03 17.247-0.15 5.87-2.953 6.637-8.727 15.481-3.013 4.763-5.273 9.812-6.993 14.877-0.968 3.253-1.56 6.422-2.43 9.526-0.415 1.642-1.497 3.187-2.185 5.042-3.254 10.78-13.545 24.182-15.961 34.877-2.466 10.81-5.37 17.694-4.961 32.141 0.366 14 0.395 10.177 4.773 13.816 4.283 3.616 8.839 7.069 15.662 13.103 7.183 6.248 22.237 17.216 24.243 20.588 2.149 3.444 2.131 11.317 0.844 13.823-1.284 2.439-12.579 3.875-12.508 3.875-0.071 0 9.815 13.566 11.757 15.508 1.87 1.87 9.902 10.809 42.678 4.704 18.524-3.455 33.124-13.753 43.078-23.856 12.789-12.762 6.107-16.773 7.826-23.291 2.513-9.416 11.277-12.961 13.143-23.602 0.216-1.508 0.754-2.654 2.113-4.876 2.096-3.202 1.561-9.447 1.582-15.185 0.067-15.027-1.705-30.234-5.159-41.434-3.171-10.483-8.204-17.817-12.515-27.305-8.624-18.906-8.221-27.415-15.933-39.474-8.586-13.613-4.601-22.583-16.011-21.99-14.374 0.826-26.375 21.016-40.104 21.584z"/>\r
-   <path fill="#757575" d="m159.955 130.419c-9.201 0.346-23.299-25.175-23.931-15.383-0.344 8.295-0.017 8.284-0.156 16.494-0.301 5.764-3.17 6.867-8.812 15.555-3.002 4.774-5.148 9.76-6.714 14.706-0.784 3.41-0.889 6.508-1.764 9.548-0.471 1.699-1.986 3.133-3.003 5.259-3.554 10.688-13.624 24.1-16.009 34.619-2.483 10.82-5.411 17.678-4.954 32.097 0.373 13.528 0.285 10.058 4.651 13.739 4.244 3.632 8.893 7.154 15.699 13.171 7.167 6.233 22.299 17.224 24.294 20.585 2.142 3.432 2.175 11.404 0.896 13.896-1.271 2.428-12.558 3.932-12.486 3.932-0.071 0 9.768 13.453 11.705 15.392 1.867 1.867 9.867 10.744 42.588 4.655 18.545-3.453 33.415-13.682 42.956-23.879 12.187-12.492 5.591-16.771 7.3-23.258 2.507-9.398 11.826-12.959 13.687-23.586 0.215-1.5 0.788-2.643 2.138-4.854 2.104-3.235 1.538-9.462 1.58-15.178 0.133-15.076-1.681-30.228-5.135-41.394-3.173-10.455-8.199-17.779-12.501-27.25-8.609-18.877-8.234-27.399-15.952-39.42-8.389-13.258-4.739-21.911-15.895-21.301-14.21 0.859-26.474 21.295-40.182 21.855z"/>\r
-   <path fill="#7c7c7c" d="m159.938 131.504c-9.122 0.338-22.854-24.838-23.622-15.586-0.37 7.833-0.131 7.89-0.341 15.741-0.452 5.657-3.388 7.096-8.899 15.628-2.99 4.785-5.021 9.708-6.433 14.535-0.602 3.566-0.218 6.594-1.099 9.57-0.526 1.756-2.475 3.08-3.82 5.477-3.854 10.596-13.703 24.016-16.057 34.361-2.501 10.829-5.453 17.66-4.948 32.052 0.38 13.059 0.177 9.939 4.529 13.66 4.208 3.648 8.948 7.239 15.739 13.242 7.149 6.217 22.358 17.232 24.345 20.581 2.13 3.42 2.216 11.489 0.946 13.968-1.259 2.417-12.538 3.99-12.466 3.99-0.072 0 9.718 13.34 11.653 15.275 1.865 1.864 9.833 10.681 42.498 4.607 18.565-3.453 33.706-13.609 42.834-23.902 11.583-12.223 5.074-16.771 6.774-23.223 2.499-9.382 12.375-12.959 14.229-23.57 0.215-1.496 0.821-2.633 2.162-4.834 2.111-3.271 1.516-9.478 1.578-15.173 0.199-15.125-1.657-30.221-5.109-41.354-3.177-10.427-8.196-17.741-12.488-27.195-8.594-18.848-8.247-27.383-15.972-39.366-8.192-12.903-4.877-21.239-15.779-20.612-14.041 0.894-26.569 21.576-40.254 22.128z"/>\r
-   <path fill="#848484" d="m159.921 132.589c-9.043 0.331-22.406-24.502-23.312-15.79-0.398 7.373-0.247 7.496-0.527 14.988-0.602 5.551-3.604 7.326-8.984 15.702-2.98 4.796-4.896 9.656-6.154 14.364-0.417 3.723 0.455 6.679-0.432 9.592-0.582 1.813-2.964 3.026-4.639 5.694-4.153 10.504-13.782 23.936-16.104 34.104-2.519 10.838-5.495 17.643-4.941 32.008 0.387 12.586 0.067 9.819 4.407 13.582 4.171 3.664 9.002 7.324 15.777 13.311 7.132 6.201 22.419 17.24 24.396 20.576 2.12 3.41 2.259 11.578 0.998 14.041-1.247 2.408-12.517 4.049-12.446 4.049-0.07 0 9.67 13.227 11.604 15.16 1.861 1.861 9.798 10.615 42.409 4.558 18.584-3.45 33.996-13.538 42.711-23.926 10.979-11.952 4.557-16.769 6.248-23.187 2.491-9.367 12.924-12.959 14.771-23.557 0.215-1.49 0.856-2.622 2.188-4.813 2.118-3.305 1.491-9.494 1.575-15.166 0.267-15.174-1.635-30.215-5.086-41.314-3.179-10.399-8.19-17.703-12.473-27.141-8.579-18.818-8.262-27.366-15.994-39.312-7.993-12.547-5.013-20.565-15.661-19.922-13.876 0.927-26.669 21.855-40.331 22.399z"/>\r
-   <path fill="#8c8c8c" d="m159.903 133.674c-8.963 0.323-21.961-24.165-23.001-15.994-0.426 6.912-0.363 7.102-0.713 14.236-0.753 5.445-3.821 7.554-9.071 15.775-2.969 4.807-4.768 9.604-5.875 14.192-0.232 3.881 1.128 6.766 0.234 9.615-0.638 1.87-3.452 2.972-5.455 5.911-4.455 10.413-13.862 23.853-16.153 33.845-2.537 10.849-5.537 17.625-4.935 31.963 0.393 12.115-0.042 9.701 4.285 13.505 4.133 3.68 9.057 7.409 15.814 13.38 7.116 6.188 22.48 17.248 24.447 20.574 2.109 3.398 2.301 11.662 1.049 14.113-1.235 2.396-12.496 4.104-12.425 4.104-0.071 0 9.622 13.114 11.552 15.045 1.86 1.858 9.763 10.552 42.319 4.509 18.604-3.449 34.288-13.467 42.589-23.949 10.377-11.682 4.04-16.766 5.721-23.15 2.486-9.35 13.474-12.959 15.316-23.542 0.214-1.483 0.89-2.611 2.213-4.793 2.126-3.339 1.468-9.507 1.573-15.158 0.333-15.224-1.611-30.208-5.062-41.276-3.181-10.37-8.186-17.664-12.459-27.085-8.563-18.789-8.275-27.35-16.014-39.258-7.796-12.192-5.151-19.893-15.545-19.233-13.707 0.961-26.763 22.134-40.404 22.671z"/>\r
-   <path fill="#939393" d="m159.886 134.759c-8.885 0.316-21.516-23.829-22.691-16.197-0.454 6.451-0.479 6.708-0.899 13.482-0.903 5.339-4.038 7.784-9.157 15.849-2.957 4.818-4.642 9.552-5.595 14.021-0.05 4.037 1.799 6.852 0.9 9.637-0.693 1.928-3.941 2.919-6.273 6.129-4.756 10.32-13.941 23.77-16.201 33.587-2.555 10.858-5.579 17.608-4.928 31.92 0.399 11.644-0.151 9.581 4.162 13.424 4.096 3.697 9.111 7.494 15.854 13.451 7.099 6.17 22.541 17.256 24.498 20.569 2.1 3.387 2.344 11.75 1.101 14.186-1.223 2.387-12.476 4.163-12.404 4.163-0.071 0 9.573 13.001 11.5 14.929 1.857 1.856 9.729 10.488 42.229 4.461 18.625-3.449 34.579-13.396 42.467-23.973 9.774-11.412 3.523-16.764 5.195-23.115 2.479-9.334 14.022-12.959 15.858-23.527 0.214-1.479 0.924-2.601 2.238-4.772 2.134-3.373 1.445-9.522 1.571-15.151 0.399-15.273-1.587-30.201-5.036-41.237-3.185-10.342-8.184-17.625-12.446-27.03-8.548-18.76-8.288-27.333-16.034-39.204-7.598-11.837-5.289-19.221-15.428-18.544-13.543 0.994-26.863 22.413-40.481 22.942z"/>\r
-   <path fill="#9b9b9b" d="m159.868 135.844c-8.805 0.308-21.068-23.492-22.381-16.401-0.481 5.991-0.594 6.314-1.085 12.73-1.053 5.232-4.253 8.013-9.243 15.922-2.946 4.829-4.515 9.5-5.314 13.85 0.133 4.194 2.471 6.937 1.565 9.658-0.749 1.986-4.43 2.866-7.091 6.347-5.056 10.229-14.021 23.689-16.249 33.329-2.572 10.868-5.621 17.591-4.921 31.876 0.405 11.172-0.261 9.463 4.04 13.346 4.058 3.713 9.166 7.58 15.892 13.521 7.082 6.155 22.601 17.265 24.548 20.567 2.092 3.373 2.388 11.834 1.152 14.256-1.21 2.377-12.454 4.222-12.383 4.222-0.071 0 9.523 12.888 11.45 14.813 1.854 1.854 9.692 10.424 42.138 4.412 18.645-3.447 34.871-13.324 42.345-23.996 9.171-11.143 3.007-16.762 4.669-23.08 2.472-9.317 14.572-12.959 16.401-23.514 0.214-1.473 0.958-2.588 2.265-4.75 2.142-3.408 1.421-9.539 1.568-15.145 0.466-15.324-1.564-30.196-5.012-41.198-3.187-10.313-8.179-17.587-12.433-26.976-8.533-18.73-8.301-27.316-16.054-39.149-7.401-11.482-5.426-18.548-15.313-17.855-13.373 1.029-26.958 22.694-40.554 23.215z"/>\r
-   <path fill="#a3a3a3" d="m159.851 136.929c-8.727 0.301-20.622-23.156-22.071-16.604-0.509 5.529-0.71 5.919-1.271 11.976-1.203 5.126-4.47 8.243-9.328 15.996-2.936 4.84-4.39 9.448-5.036 13.679 0.316 4.351 3.143 7.023 2.231 9.68-0.804 2.043-4.919 2.812-7.908 6.563-5.356 10.137-14.101 23.607-16.298 33.072-2.589 10.877-5.661 17.574-4.913 31.832 0.412 10.699-0.37 9.342 3.918 13.268 4.021 3.729 9.221 7.664 15.93 13.59 7.064 6.139 22.661 17.271 24.599 20.563 2.081 3.363 2.43 11.922 1.204 14.33-1.198 2.365-12.434 4.278-12.363 4.278-0.07 0 9.477 12.774 11.399 14.697 1.851 1.851 9.659 10.36 42.048 4.364 18.666-3.447 35.162-13.254 42.223-24.021 8.568-10.873 2.49-16.761 4.144-23.045 2.464-9.301 15.121-12.958 16.943-23.498 0.215-1.467 0.992-2.579 2.29-4.729 2.148-3.441 1.398-9.553 1.566-15.139 0.532-15.373-1.541-30.189-4.987-41.158-3.188-10.285-8.174-17.549-12.419-26.921-8.518-18.701-8.313-27.3-16.073-39.096-7.204-11.126-5.564-17.875-15.196-17.165-13.21 1.064-27.058 22.975-40.632 23.488z"/>\r
-   <path fill="#aaa" d="m159.834 138.014c-8.646 0.293-20.176-22.819-21.761-16.808-0.536 5.069-0.826 5.526-1.457 11.224-1.354 5.02-4.687 8.472-9.416 16.069-2.924 4.851-4.262 9.396-4.756 13.508 0.501 4.507 3.814 7.109 2.897 9.702-0.858 2.1-5.406 2.759-8.725 6.782-5.657 10.045-14.181 23.524-16.347 32.812-2.606 10.888-5.703 17.557-4.906 31.787 0.418 10.229-0.479 9.225 3.795 13.189 3.984 3.745 9.275 7.749 15.968 13.66 7.048 6.124 22.723 17.279 24.651 20.559 2.07 3.352 2.472 12.008 1.255 14.402-1.186 2.355-12.414 4.337-12.343 4.337-0.071 0 9.428 12.66 11.348 14.581 1.85 1.848 9.624 10.297 41.958 4.314 18.687-3.444 35.453-13.18 42.102-24.043 7.965-10.602 1.973-16.758 3.616-23.01 2.457-9.283 15.67-12.957 17.487-23.482 0.214-1.461 1.026-2.568 2.315-4.709 2.155-3.477 1.375-9.568 1.563-15.131 0.6-15.424-1.518-30.184-4.963-41.119-3.192-10.257-8.17-17.511-12.405-26.866-8.502-18.672-8.328-27.284-16.095-39.042-7.005-10.771-5.701-17.203-15.078-16.476-13.04 1.098-27.152 23.255-40.703 23.76z"/>\r
-   <path fill="#b2b2b2" d="m159.816 139.099c-8.567 0.286-19.729-22.483-21.45-17.012-0.563 4.608-0.942 5.132-1.643 10.471-1.506 4.914-4.904 8.701-9.502 16.143-2.913 4.862-4.137 9.344-4.477 13.336 0.685 4.665 4.486 7.195 3.564 9.725-0.915 2.157-5.897 2.705-9.543 6.999-5.958 9.953-14.262 23.443-16.396 32.554-2.624 10.898-5.745 17.54-4.9 31.744 0.426 9.757-0.588 9.105 3.674 13.111 3.945 3.761 9.33 7.834 16.006 13.729 7.032 6.109 22.783 17.288 24.702 20.557 2.06 3.338 2.515 12.094 1.306 14.473-1.173 2.346-12.392 4.395-12.321 4.395-0.07 0 9.379 12.549 11.296 14.465 1.847 1.848 9.591 10.234 41.868 4.268 18.706-3.444 35.745-13.11 41.979-24.066 7.361-10.332 1.456-16.757 3.091-22.974 2.45-9.269 16.219-12.958 18.03-23.47 0.213-1.455 1.06-2.557 2.34-4.688 2.164-3.509 1.352-9.583 1.562-15.124 0.665-15.473-1.494-30.177-4.938-41.08-3.195-10.228-8.166-17.472-12.393-26.811-8.486-18.642-8.341-27.267-16.114-38.987-6.809-10.416-5.838-16.531-14.962-15.787-12.873 1.129-27.25 23.531-40.779 24.029z"/>\r
-   <path fill="#bababa" d="m159.799 140.184c-8.487 0.279-19.282-22.146-21.141-17.215-0.591 4.147-1.057 4.737-1.828 9.717-1.656 4.808-5.121 8.931-9.588 16.217-2.902 4.873-4.01 9.292-4.197 13.165 0.868 4.822 5.158 7.281 4.23 9.747-0.971 2.215-6.385 2.651-10.361 7.216-6.258 9.861-14.339 23.36-16.442 32.297-2.643 10.906-5.787 17.521-4.894 31.699 0.432 9.285-0.697 8.986 3.552 13.032 3.908 3.776 9.384 7.919 16.043 13.799 7.016 6.093 22.845 17.296 24.753 20.552 2.051 3.328 2.559 12.18 1.358 14.547-1.161 2.334-12.372 4.451-12.301 4.451-0.071 0 9.33 12.436 11.245 14.35 1.844 1.844 9.555 10.17 41.777 4.219 18.727-3.443 36.036-13.039 41.857-24.09 6.759-10.063 0.939-16.756 2.565-22.939 2.442-9.25 16.768-12.957 18.572-23.453 0.213-1.451 1.095-2.547 2.365-4.668 2.171-3.543 1.329-9.599 1.56-15.117 0.732-15.522-1.471-30.172-4.913-41.042-3.197-10.2-8.161-17.433-12.379-26.756-8.471-18.612-8.354-27.25-16.135-38.933-6.609-10.061-5.976-15.858-14.845-15.098-12.706 1.165-27.347 23.813-40.853 24.303z"/>\r
-   <path fill="#c1c1c1" d="m159.781 141.269c-8.408 0.271-18.837-21.81-20.83-17.419-0.619 3.687-1.173 4.344-2.014 8.965-1.808 4.701-5.338 9.16-9.674 16.29-2.892 4.884-3.885 9.24-3.918 12.994 1.052 4.978 5.829 7.367 4.896 9.769-1.026 2.272-6.874 2.598-11.178 7.434-6.56 9.769-14.419 23.277-16.491 32.039-2.66 10.916-5.829 17.504-4.887 31.656 0.438 8.813-0.807 8.867 3.43 12.953 3.87 3.793 9.438 8.004 16.082 13.868 6.997 6.077 22.904 17.304 24.803 20.55 2.041 3.314 2.601 12.266 1.409 14.617-1.149 2.324-12.351 4.51-12.28 4.51-0.07 0 9.282 12.321 11.194 14.233 1.841 1.842 9.521 10.106 41.688 4.17 18.746-3.44 36.326-12.967 41.734-24.112 6.156-9.793 0.423-16.754 2.038-22.904 2.438-9.235 17.318-12.957 19.117-23.438 0.212-1.444 1.128-2.536 2.39-4.647 2.18-3.578 1.306-9.613 1.558-15.11 0.799-15.571-1.447-30.165-4.889-41.002-3.2-10.172-8.156-17.395-12.364-26.701-8.456-18.583-8.367-27.234-16.155-38.88-6.413-9.705-6.114-15.185-14.729-14.408-12.541 1.197-27.445 24.091-40.93 24.573z"/>\r
-   <path fill="#c9c9c9" d="m159.764 142.354c-8.329 0.264-18.392-21.473-20.521-17.622-0.646 3.225-1.289 3.949-2.2 8.211-1.957 4.596-5.555 9.39-9.761 16.364-2.879 4.895-3.757 9.188-3.638 12.823 1.235 5.135 6.502 7.453 5.562 9.791-1.081 2.329-7.362 2.544-11.995 7.651-6.859 9.677-14.499 23.195-16.54 31.78-2.677 10.927-5.87 17.488-4.879 31.611 0.444 8.344-0.916 8.748 3.307 12.875 3.834 3.81 9.492 8.09 16.121 13.939 6.98 6.061 22.965 17.311 24.854 20.545 2.031 3.303 2.643 12.352 1.461 14.69-1.137 2.313-12.33 4.567-12.26 4.567-0.07 0 9.233 12.209 11.143 14.117 1.839 1.84 9.486 10.043 41.599 4.122 18.767-3.44 36.618-12.896 41.612-24.137 5.554-9.522-0.094-16.751 1.513-22.868 2.43-9.219 17.866-12.957 19.659-23.424 0.213-1.439 1.162-2.525 2.415-4.627 2.188-3.612 1.282-9.629 1.556-15.104 0.865-15.621-1.424-30.158-4.864-40.962-3.202-10.144-8.153-17.357-12.351-26.646-8.441-18.554-8.381-27.218-16.176-38.826-6.216-9.35-6.251-14.513-14.612-13.719-12.374 1.235-27.543 24.375-41.005 24.849z"/>\r
-   <path fill="#d1d1d1" d="m159.747 143.439c-8.25 0.256-17.944-21.137-20.21-17.826-0.675 2.765-1.406 3.555-2.386 7.459-2.108 4.489-5.772 9.619-9.847 16.437-2.869 4.906-3.631 9.136-3.358 12.652 1.419 5.292 7.174 7.538 6.228 9.812-1.137 2.387-7.852 2.491-12.813 7.869-7.161 9.586-14.579 23.114-16.588 31.522-2.695 10.938-5.912 17.471-4.873 31.568 0.451 7.871-1.025 8.629 3.185 12.797 3.796 3.824 9.547 8.174 16.158 14.008 6.964 6.047 23.026 17.32 24.905 20.541 2.021 3.292 2.686 12.439 1.513 14.764-1.125 2.303-12.31 4.625-12.239 4.625-0.07 0 9.186 12.094 11.092 14.002 1.836 1.836 9.45 9.978 41.509 4.072 18.786-3.439 36.909-12.824 41.49-24.16 4.948-9.252-0.611-16.748 0.985-22.832 2.423-9.203 18.415-12.957 20.203-23.41 0.212-1.434 1.196-2.514 2.44-4.605 2.193-3.646 1.259-9.645 1.553-15.098 0.932-15.67-1.4-30.151-4.84-40.922-3.205-10.115-8.148-17.319-12.336-26.592-8.427-18.524-8.396-27.201-16.197-38.771-6.017-8.995-6.388-13.84-14.495-13.03-12.207 1.266-27.64 24.652-41.079 25.118z"/>\r
-   <path fill="#d8d8d8" d="m159.729 144.524c-8.17 0.249-17.498-20.8-19.9-18.03-0.702 2.304-1.521 3.162-2.571 6.706-2.259 4.383-5.988 9.848-9.933 16.511-2.858 4.917-3.504 9.084-3.079 12.48 1.604 5.449 7.846 7.625 6.895 9.835-1.193 2.444-8.342 2.438-13.631 8.087-7.461 9.493-14.658 23.031-16.637 31.262-2.712 10.947-5.953 17.455-4.865 31.524 0.458 7.399-1.135 8.511 3.063 12.718 3.758 3.842 9.601 8.26 16.196 14.078 6.946 6.031 23.087 17.328 24.956 20.538 2.011 3.28 2.729 12.524 1.563 14.835-1.112 2.293-12.289 4.684-12.218 4.684-0.071 0 9.136 11.981 11.04 13.886 1.834 1.834 9.417 9.913 41.419 4.024 18.807-3.438 37.2-12.752 41.368-24.184 4.346-8.982-1.128-16.747 0.46-22.798 2.416-9.187 18.964-12.956 20.746-23.394 0.211-1.429 1.229-2.504 2.465-4.586 2.202-3.681 1.236-9.658 1.551-15.091 0.998-15.72-1.377-30.146-4.814-40.884-3.208-10.086-8.145-17.28-12.323-26.536-8.411-18.495-8.408-27.185-16.217-38.717-5.82-8.64-6.526-13.168-14.38-12.341-12.04 1.303-27.736 24.934-41.154 25.393z"/>\r
-   <path fill="#e0e0e0" d="m159.712 145.609c-8.091 0.241-17.052-20.464-19.59-18.233-0.729 1.843-1.637 2.767-2.757 5.953-2.409 4.276-6.206 10.077-10.02 16.584-2.847 4.928-3.378 9.032-2.8 12.309 1.787 5.606 8.519 7.711 7.561 9.857-1.248 2.502-8.829 2.384-14.448 8.304-7.761 9.402-14.738 22.95-16.684 31.006-2.731 10.955-5.996 17.436-4.859 31.48 0.464 6.928-1.244 8.389 2.939 12.639 3.722 3.857 9.656 8.344 16.234 14.148 6.932 6.014 23.148 17.336 25.008 20.533 2 3.268 2.771 12.611 1.615 14.907-1.1 2.282-12.268 4.741-12.198 4.741-0.069 0 9.089 11.867 10.989 13.77 1.831 1.831 9.382 9.85 41.329 3.977 18.827-3.438 37.492-12.683 41.246-24.207 3.743-8.715-1.646-16.746-0.066-22.762 2.409-9.171 19.514-12.957 21.289-23.381 0.211-1.422 1.265-2.494 2.49-4.564 2.21-3.715 1.213-9.674 1.549-15.084 1.065-15.77-1.354-30.139-4.791-40.844-3.21-10.058-8.14-17.241-12.309-26.481-8.396-18.466-8.421-27.168-16.237-38.664-5.622-8.284-6.663-12.495-14.262-11.651-11.872 1.335-27.833 25.212-41.228 25.663z"/>\r
-   <path fill="#e8e8e8" d="m159.694 146.694c-8.012 0.234-16.605-20.127-19.279-18.437-0.757 1.383-1.753 2.373-2.943 5.2-2.56 4.171-6.423 10.307-10.105 16.658-2.835 4.939-3.251 8.979-2.52 12.138 1.97 5.763 9.189 7.796 8.226 9.879-1.303 2.559-9.318 2.33-15.265 8.521-8.063 9.31-14.818 22.867-16.733 30.748-2.748 10.967-6.037 17.419-4.853 31.436 0.472 6.457-1.353 8.271 2.818 12.562 3.685 3.873 9.711 8.429 16.273 14.218 6.913 6 23.207 17.344 25.058 20.529 1.991 3.257 2.814 12.697 1.666 14.98-1.087 2.271-12.247 4.799-12.177 4.799-0.07 0 9.04 11.755 10.938 13.654 1.829 1.828 9.349 9.785 41.239 3.926 18.847-3.435 37.783-12.609 41.124-24.229 3.14-8.444-2.161-16.743-0.592-22.728 2.401-9.152 20.062-12.955 21.831-23.364 0.211-1.417 1.298-2.483 2.516-4.544 2.217-3.748 1.19-9.689 1.547-15.076 1.132-15.82-1.331-30.133-4.766-40.806-3.213-10.03-8.136-17.203-12.296-26.427-8.38-18.436-8.435-27.151-16.257-38.609-5.425-7.929-6.802-11.822-14.146-10.962-11.706 1.368-27.931 25.491-41.304 25.934z"/>\r
-   <path fill="#efefef" d="m159.677 147.779c-7.934 0.226-16.16-19.791-18.97-18.64-0.785 0.921-1.869 1.979-3.13 4.447-2.71 4.064-6.639 10.536-10.19 16.731-2.824 4.95-3.125 8.928-2.24 11.967 2.152 5.919 9.86 7.882 8.892 9.901-1.358 2.616-9.808 2.277-16.083 8.739-8.363 9.218-14.896 22.784-16.781 30.489-2.766 10.977-6.079 17.402-4.846 31.393 0.478 5.984-1.462 8.152 2.696 12.482 3.646 3.889 9.765 8.514 16.311 14.287 6.896 5.983 23.269 17.352 25.109 20.526 1.98 3.245 2.855 12.782 1.718 15.052-1.076 2.262-12.227 4.857-12.156 4.857-0.07 0 8.991 11.641 10.887 13.537 1.826 1.826 9.313 9.723 41.148 3.879 18.868-3.434 38.074-12.538 41.002-24.254 2.537-8.174-2.678-16.741-1.119-22.69 2.396-9.138 20.612-12.957 22.375-23.351 0.212-1.412 1.332-2.473 2.541-4.523 2.226-3.783 1.166-9.704 1.545-15.07 1.197-15.869-1.307-30.125-4.741-40.766-3.215-10.002-8.131-17.165-12.282-26.372-8.365-18.407-8.447-27.135-16.277-38.555-5.228-7.574-6.938-11.15-14.029-10.272-11.541 1.402-28.029 25.771-41.38 26.206z"/>\r
-   <path fill="#f7f7f7" d="m159.66 148.864c-7.854 0.219-15.714-19.454-18.66-18.844-0.812 0.461-1.983 1.585-3.314 3.694-2.86 3.958-6.856 10.766-10.278 16.805-2.813 4.961-2.998 8.876-1.96 11.796 2.337 6.076 10.533 7.968 9.558 9.923-1.415 2.673-10.296 2.223-16.899 8.956-8.664 9.126-14.978 22.702-16.83 30.23-2.783 10.986-6.121 17.386-4.839 31.349 0.484 5.515-1.571 8.033 2.573 12.403 3.609 3.906 9.82 8.6 16.35 14.357 6.88 5.969 23.329 17.36 25.16 20.523 1.971 3.232 2.898 12.869 1.77 15.124-1.063 2.252-12.206 4.915-12.136 4.915-0.07 0 8.942 11.527 10.835 13.422 1.824 1.822 9.279 9.658 41.059 3.83 18.889-3.434 38.366-12.467 40.881-24.278 1.934-7.903-3.195-16.739-1.646-22.655 2.388-9.121 21.161-12.955 22.918-23.336 0.211-1.404 1.366-2.461 2.566-4.502 2.232-3.816 1.143-9.719 1.542-15.063 1.265-15.92-1.283-30.12-4.717-40.727-3.219-9.974-8.128-17.127-12.269-26.317-8.349-18.378-8.461-27.119-16.298-38.501-5.029-7.219-7.075-10.478-13.912-9.584-11.373 1.438-28.126 26.053-41.454 26.48z"/>\r
-   <path fill="#fff" d="m159.642 149.949c-7.774 0.211-15.268-19.118-18.35-19.048-0.84 0-2.1 1.191-3.501 2.941-3.011 3.852-7.072 10.995-10.363 16.878-2.803 4.972-2.872 8.824-1.682 11.625 2.521 6.233 11.205 8.054 10.225 9.945-1.471 2.731-10.785 2.17-17.719 9.174-8.964 9.034-15.056 22.621-16.877 29.973-2.801 10.995-6.163 17.368-4.832 31.304 0.49 5.043-1.681 7.914 2.451 12.325 3.571 3.923 9.874 8.685 16.387 14.427 6.863 5.953 23.391 17.368 25.211 20.521 1.962 3.221 2.942 12.954 1.821 15.196-1.051 2.24-12.185 4.972-12.115 4.972-0.069 0 8.895 11.416 10.784 13.307 1.821 1.82 9.244 9.595 40.97 3.781 18.907-3.431 38.656-12.396 40.758-24.302 1.331-7.633-3.712-16.736-2.171-22.619 2.381-9.104 21.71-12.956 23.461-23.321 0.21-1.399 1.399-2.45 2.591-4.481 2.24-3.852 1.12-9.734 1.54-15.057 1.331-15.968-1.26-30.113-4.692-40.688-3.221-9.945-8.123-17.088-12.255-26.262-8.334-18.348-8.474-27.102-16.318-38.447-4.832-6.863-7.213-9.805-13.796-8.894-11.205 1.469-28.222 26.33-41.528 26.75z"/>\r
-  </g>\r
-  <path fill="#995900" d="m152.553 88.8575c5.256-0.648 12.456 0.648 15.769 3.096 3.096 2.304 5.256 3.528 8.063 4.464 9.433 3.096 21.816 4.536 21.24 13.032-0.648 10.151-3.6 14.688-12.024 17.351-6.768 2.088-18.863 13.824-28.224 13.824-4.176 0-10.008 0.216-13.392-1.008-3.24-1.152-7.776-6.624-13.104-11.016-5.328-4.32-10.296-8.928-10.439-14.976-0.217-6.407 3.96-8.496 9.863-13.607 3.097-2.736 8.712-7.272 12.601-9.288 3.599-1.799 5.903-1.439 9.647-1.872z"/>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#9e5f00" d="m165.068 78.951c5.225-0.644 12.384 0.645 15.677 3.079 3.078 2.29 5.227 3.51 8.018 4.438 9.375 3.078 21.729 4.529 21.159 12.973-0.641 10.09-3.669 14.581-12.041 17.223-6.723 2.073-18.768 13.589-28.07 13.64-4.21 0.032-9.926 0.234-13.287-0.977-3.215-1.142-7.737-6.608-13.031-10.969-5.291-4.292-10.26-8.774-10.317-14.765-0.153-6.252 3.912-8.411 9.773-13.488 3.071-2.71 8.594-7.303 12.463-9.333 3.563-1.803 5.933-1.392 9.656-1.821z"/>\r
-   <path fill="#a36400" d="m165.177 79.044c5.195-0.641 12.313 0.64 15.587 3.06 3.06 2.278 5.194 3.494 7.971 4.413 9.317 3.06 21.641 4.522 21.078 12.914-0.634 10.027-3.737 14.474-12.058 17.094-6.678 2.057-18.673 13.352-27.919 13.454-4.241 0.064-9.842 0.252-13.18-0.945-3.19-1.133-7.7-6.592-12.96-10.921-5.254-4.264-10.222-8.622-10.192-14.555-0.093-6.099 3.863-8.329 9.681-13.369 3.048-2.685 8.478-7.335 12.328-9.379 3.526-1.804 5.963-1.338 9.664-1.766z"/>\r
-   <path fill="#a86a00" d="m165.287 79.138c5.165-0.637 12.241 0.637 15.496 3.043 3.042 2.264 5.165 3.476 7.924 4.387 9.26 3.042 21.556 4.515 20.998 12.854-0.627 9.968-3.805 14.368-12.074 16.967-6.633 2.042-18.576 13.117-27.766 13.27-4.276 0.096-9.759 0.27-13.075-0.914-3.165-1.123-7.661-6.577-12.887-10.874-5.217-4.236-10.187-8.468-10.069-14.345-0.03-5.943 3.815-8.244 9.589-13.249 3.023-2.66 8.36-7.366 12.191-9.424 3.49-1.808 5.993-1.291 9.673-1.715z"/>\r
-   <path fill="#ad7000" d="m165.396 79.23c5.135-0.633 12.17 0.633 15.404 3.025 3.025 2.251 5.137 3.46 7.88 4.361 9.201 3.025 21.467 4.508 20.917 12.796-0.62 9.905-3.874 14.26-12.093 16.837-6.586 2.027-18.479 12.882-27.611 13.086-4.311 0.127-9.677 0.287-12.971-0.883-3.14-1.113-7.622-6.561-12.814-10.826-5.18-4.208-10.148-8.315-9.945-14.135 0.031-5.789 3.768-8.16 9.497-13.129 2.999-2.635 8.244-7.398 12.055-9.47 3.454-1.808 6.023-1.24 9.681-1.662z"/>\r
-   <path fill="#b27600" d="m165.506 79.325c5.105-0.63 12.099 0.629 15.314 3.007 3.007 2.237 5.104 3.442 7.832 4.335 9.145 3.007 21.38 4.501 20.837 12.737-0.614 9.844-3.943 14.154-12.109 16.709-6.541 2.011-18.385 12.645-27.46 12.9-4.342 0.16-9.592 0.306-12.862-0.851-3.115-1.103-7.584-6.545-12.743-10.779-5.144-4.18-10.112-8.162-9.821-13.924 0.092-5.634 3.718-8.076 9.405-13.009 2.975-2.609 8.126-7.429 11.919-9.514 3.416-1.812 6.052-1.192 9.688-1.611z"/>\r
-   <path fill="#b77b00" d="m165.615 79.417c5.075-0.626 12.026 0.626 15.224 2.989 2.989 2.225 5.075 3.425 7.786 4.31 9.087 2.989 21.292 4.494 20.756 12.678-0.606 9.781-4.012 14.046-12.126 16.581-6.496 1.997-18.289 12.41-27.307 12.716-4.376 0.191-9.51 0.323-12.758-0.82-3.09-1.094-7.546-6.53-12.671-10.732-5.106-4.152-10.074-8.008-9.697-13.713 0.155-5.479 3.67-7.992 9.313-12.889 2.951-2.585 8.011-7.461 11.783-9.56 3.38-1.814 6.083-1.143 9.697-1.56z"/>\r
-   <path fill="#bc8100" d="m165.725 79.511c5.044-0.622 11.954 0.622 15.133 2.972 2.971 2.211 5.045 3.408 7.739 4.284 9.029 2.971 21.205 4.487 20.675 12.619-0.6 9.719-4.079 13.939-12.143 16.451-6.45 1.982-18.192 12.175-27.153 12.532-4.41 0.223-9.428 0.341-12.653-0.789-3.065-1.084-7.507-6.514-12.598-10.684-5.069-4.124-10.038-7.855-9.574-13.504 0.217-5.324 3.622-7.908 9.222-12.77 2.926-2.559 7.894-7.492 11.646-9.605 3.344-1.816 6.113-1.092 9.706-1.506z"/>\r
-   <path fill="#c18700" d="m165.834 79.604c5.015-0.618 11.883 0.619 15.043 2.954 2.953 2.198 5.015 3.391 7.693 4.259 8.972 2.953 21.118 4.48 20.594 12.559-0.593 9.66-4.147 13.833-12.159 16.324-6.405 1.967-18.098 11.94-27.002 12.347-4.441 0.255-9.343 0.359-12.546-0.757-3.04-1.074-7.469-6.498-12.526-10.637-5.032-4.096-10-7.701-9.45-13.293 0.278-5.169 3.574-7.823 9.13-12.649 2.903-2.534 7.776-7.524 11.511-9.651 3.306-1.821 6.141-1.044 9.712-1.456z"/>\r
-   <path fill="#c68d00" d="m165.944 79.697c4.984-0.615 11.811 0.614 14.952 2.936 2.935 2.184 4.983 3.374 7.646 4.233 8.915 2.935 21.031 4.473 20.515 12.5-0.586 9.597-4.218 13.726-12.177 16.195-6.36 1.951-18.002 11.703-26.849 12.162-4.476 0.287-9.261 0.377-12.441-0.726-3.015-1.064-7.431-6.482-12.453-10.589-4.995-4.068-9.965-7.549-9.326-13.083 0.34-5.015 3.524-7.741 9.038-12.531 2.878-2.508 7.658-7.555 11.374-9.696 3.269-1.82 6.171-0.992 9.721-1.401z"/>\r
-   <path fill="#cc9200" d="m166.054 79.791c4.952-0.61 11.738 0.611 14.86 2.918 2.918 2.172 4.954 3.357 7.601 4.207 8.857 2.918 20.942 4.466 20.432 12.442-0.578 9.536-4.285 13.62-12.192 16.066-6.314 1.936-17.906 11.468-26.696 11.978-4.509 0.319-9.178 0.394-12.335-0.696-2.989-1.054-7.393-6.466-12.382-10.541-4.959-4.04-9.928-7.395-9.202-12.873 0.401-4.859 3.477-7.655 8.945-12.411 2.854-2.482 7.542-7.586 11.239-9.741 3.233-1.824 6.201-0.943 9.73-1.349z"/>\r
-   <path fill="#d19800" d="m166.163 79.883c4.923-0.606 11.668 0.608 14.771 2.901 2.9 2.158 4.924 3.339 7.554 4.181 8.801 2.9 20.855 4.459 20.352 12.383-0.571 9.474-4.353 13.512-12.21 15.938-6.269 1.921-17.81 11.233-26.543 11.793-4.542 0.351-9.094 0.413-12.229-0.664-2.965-1.044-7.354-6.45-12.311-10.494-4.921-4.012-9.89-7.241-9.079-12.662 0.465-4.705 3.431-7.571 8.855-12.29 2.83-2.458 7.425-7.618 11.102-9.787 3.197-1.827 6.231-0.893 9.738-1.299z"/>\r
-   <path fill="#d69e00" d="m166.273 79.978c4.893-0.603 11.596 0.603 14.679 2.882 2.883 2.145 4.895 3.323 7.507 4.156 8.744 2.882 20.77 4.452 20.272 12.324-0.565 9.412-4.422 13.406-12.228 15.81-6.224 1.905-17.714 10.996-26.39 11.608-4.576 0.383-9.012 0.431-12.124-0.633-2.94-1.034-7.316-6.434-12.237-10.446-4.884-3.984-9.854-7.089-8.955-12.452 0.525-4.551 3.382-7.489 8.764-12.171 2.805-2.432 7.307-7.649 10.965-9.832 3.16-1.829 6.261-0.845 9.747-1.246z"/>\r
-   <path fill="#dba300" d="m166.382 80.07c4.863-0.599 11.525 0.6 14.59 2.865 2.864 2.131 4.862 3.305 7.461 4.13 8.686 2.864 20.682 4.445 20.19 12.264-0.559 9.352-4.491 13.299-12.244 15.681-6.179 1.89-17.619 10.761-26.237 11.423-4.608 0.415-8.929 0.449-12.018-0.601-2.915-1.024-7.277-6.418-12.166-10.399-4.847-3.956-9.815-6.935-8.831-12.241 0.587-4.396 3.333-7.404 8.671-12.051 2.782-2.407 7.191-7.681 10.83-9.878 3.123-1.829 6.29-0.793 9.754-1.193z"/>\r
-   <path fill="#e0a900" d="m166.492 80.164c4.832-0.595 11.453 0.596 14.498 2.847 2.847 2.118 4.833 3.289 7.414 4.104 8.629 2.846 20.595 4.438 20.111 12.205-0.553 9.29-4.56 13.193-12.262 15.553-6.134 1.875-17.522 10.526-26.085 11.239-4.642 0.447-8.845 0.467-11.912-0.57-2.89-1.015-7.238-6.402-12.093-10.351-4.81-3.928-9.78-6.782-8.708-12.032 0.649-4.241 3.285-7.32 8.58-11.932 2.757-2.381 7.073-7.712 10.693-9.923 3.088-1.831 6.321-0.743 9.764-1.14z"/>\r
-   <path fill="#e5af00" d="m166.601 80.257c4.803-0.592 11.382 0.592 14.407 2.829 2.829 2.105 4.804 3.271 7.368 4.079 8.571 2.828 20.507 4.431 20.029 12.146-0.544 9.228-4.627 13.085-12.277 15.423-6.089 1.861-17.427 10.29-25.932 11.055-4.676 0.478-8.763 0.484-11.807-0.539-2.865-1.005-7.2-6.387-12.021-10.304-4.772-3.9-9.742-6.629-8.583-11.821 0.711-4.085 3.236-7.236 8.487-11.812 2.732-2.357 6.957-7.744 10.557-9.968 3.052-1.834 6.351-0.694 9.772-1.088z"/>\r
-   <path fill="#eab500" d="m166.711 80.351c4.772-0.588 11.31 0.589 14.317 2.811 2.811 2.092 4.771 3.254 7.321 4.054 8.514 2.81 20.42 4.424 19.948 12.087-0.538 9.165-4.695 12.979-12.294 15.295-6.044 1.845-17.332 10.054-25.779 10.869-4.708 0.511-8.68 0.503-11.7-0.507-2.84-0.995-7.163-6.371-11.949-10.257-4.736-3.872-9.706-6.475-8.46-11.61 0.773-3.931 3.188-7.152 8.396-11.692 2.709-2.331 6.839-7.775 10.421-10.013 3.013-1.839 6.38-0.645 9.779-1.037z"/>\r
-   <path fill="#efba00" d="m166.82 80.443c4.742-0.584 11.238 0.585 14.226 2.794 2.794 2.078 4.743 3.237 7.276 4.027 8.456 2.793 20.332 4.417 19.868 12.029-0.531 9.104-4.766 12.872-12.313 15.167-5.997 1.83-17.234 9.819-25.626 10.685-4.742 0.542-8.596 0.52-11.595-0.476-2.815-0.985-7.124-6.355-11.877-10.209-4.699-3.844-9.668-6.322-8.336-11.4 0.835-3.778 3.14-7.068 8.304-11.573 2.686-2.306 6.724-7.807 10.285-10.059 2.978-1.84 6.411-0.595 9.788-0.985z"/>\r
-   <path fill="#f4c000" d="m166.93 80.537c4.711-0.58 11.166 0.582 14.135 2.776 2.775 2.066 4.713 3.22 7.229 4.002 8.399 2.775 20.246 4.41 19.787 11.969-0.522 9.043-4.832 12.765-12.328 15.039-5.952 1.815-17.139 9.584-25.473 10.501-4.776 0.574-8.513 0.538-11.49-0.445-2.79-0.976-7.085-6.34-11.804-10.162-4.662-3.816-9.632-6.168-8.213-11.189 0.896-3.623 3.092-6.984 8.213-11.454 2.66-2.281 6.604-7.838 10.147-10.104 2.942-1.844 6.441-0.547 9.797-0.933z"/>\r
-   <path fill="#f9c600" d="m167.039 80.63c4.683-0.577 11.095 0.577 14.045 2.758 2.758 2.052 4.683 3.203 7.184 3.976 8.341 2.757 20.157 4.403 19.706 11.91-0.518 8.981-4.901 12.659-12.346 14.911-5.906 1.799-17.044 9.347-25.32 10.315-4.809 0.606-8.431 0.556-11.384-0.413-2.765-0.966-7.048-6.324-11.732-10.114-4.625-3.788-9.594-6.016-8.088-10.98 0.958-3.467 3.043-6.9 8.12-11.333 2.637-2.256 6.488-7.87 10.013-10.15 2.902-1.844 6.468-0.495 9.802-0.88z"/>\r
-  </g>\r
-  <path fill="#fc0" d="m154.744 90.7245c4.65-0.573 11.022 0.574 13.954 2.74 2.739 2.039 4.651 3.186 7.136 3.951 8.284 2.739 20.071 4.396 19.626 11.851-0.51 8.919-4.97 12.551-12.362 14.781-5.861 1.784-16.947 9.112-25.168 10.131-4.842 0.638-8.347 0.574-11.277-0.382-2.74-0.956-7.01-6.308-11.66-10.067-4.588-3.76-9.559-5.862-7.965-10.769 1.02-3.313 2.995-6.816 8.028-11.213 2.612-2.23 6.371-7.901 9.876-10.195 2.867-1.847 6.499-0.447 9.812-0.828z"/>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m167.982 83.609c1.008 2.088 3.6 2.376 5.328 3.312 1.655 0.936 2.592 1.152 3.239 0.792 1.44-0.792 0.36-3.384-1.079-4.32-1.368-0.935-8.064-1.151-7.488 0.216z"/>\r
-   <path fill="#f9c600" d="m168.125 83.631c0.982 2.035 3.508 2.316 5.193 3.229 1.614 0.912 2.526 1.123 3.158 0.771 1.402-0.771 0.35-3.298-1.054-4.21-1.332-0.913-7.859-1.123-7.297 0.21z"/>\r
-   <path fill="#f4c000" d="m168.267 83.653c0.957 1.982 3.418 2.255 5.058 3.144 1.572 0.889 2.461 1.094 3.076 0.752 1.367-0.752 0.342-3.213-1.025-4.101-1.299-0.889-7.656-1.094-7.109 0.205z"/>\r
-   <path fill="#efba00" d="m168.409 83.674c0.932 1.929 3.327 2.195 4.924 3.06 1.53 0.865 2.395 1.064 2.993 0.732 1.331-0.732 0.333-3.127-0.998-3.992-1.264-0.864-7.451-1.064-6.919 0.2z"/>\r
-   <path fill="#eab500" d="m168.552 83.696c0.905 1.876 3.234 2.135 4.787 2.977 1.488 0.841 2.329 1.035 2.912 0.711 1.294-0.711 0.323-3.041-0.971-3.882-1.228-0.841-7.246-1.036-6.728 0.194z"/>\r
-   <path fill="#e5af00" d="m168.694 83.718c0.881 1.823 3.144 2.075 4.653 2.892 1.446 0.818 2.264 1.006 2.83 0.692 1.257-0.692 0.313-2.956-0.943-3.773-1.195-0.818-7.043-1.007-6.54 0.189z"/>\r
-   <path fill="#e0a900" d="m168.837 83.739c0.855 1.771 3.053 2.015 4.519 2.809 1.403 0.793 2.198 0.977 2.747 0.671 1.221-0.671 0.306-2.87-0.916-3.664-1.161-0.793-6.839-0.976-6.35 0.184z"/>\r
-   <path fill="#dba300" d="m168.979 83.761c0.829 1.718 2.962 1.955 4.383 2.725 1.363 0.77 2.132 0.948 2.666 0.651 1.184-0.651 0.296-2.784-0.889-3.554-1.125-0.77-6.634-0.948-6.16 0.178z"/>\r
-   <path fill="#d69e00" d="m169.121 83.782c0.804 1.665 2.871 1.895 4.249 2.641 1.32 0.747 2.066 0.918 2.583 0.631 1.148-0.631 0.287-2.698-0.861-3.444-1.091-0.746-6.43-0.919-5.971 0.172z"/>\r
-   <path fill="#d19800" d="m169.264 83.804c0.777 1.612 2.778 1.834 4.112 2.557 1.279 0.723 2.001 0.889 2.501 0.611 1.112-0.611 0.278-2.612-0.834-3.335-1.055-0.722-6.224-0.889-5.779 0.167z"/>\r
-   <path fill="#cc9200" d="m169.406 83.826c0.753 1.559 2.688 1.774 3.979 2.473 1.236 0.699 1.936 0.86 2.42 0.591 1.074-0.591 0.269-2.527-0.808-3.226-1.021-0.699-6.021-0.86-5.591 0.162z"/>\r
-   <path fill="#c68c00" d="m169.549 83.847c0.728 1.506 2.597 1.714 3.844 2.389 1.194 0.675 1.869 0.831 2.337 0.571 1.039-0.571 0.26-2.441-0.779-3.116-0.988-0.675-5.818-0.831-5.402 0.156z"/>\r
-   <path fill="#c18700" d="m169.691 83.869c0.702 1.453 2.506 1.654 3.709 2.305 1.152 0.652 1.803 0.802 2.254 0.551 1.002-0.551 0.251-2.355-0.751-3.006-0.953-0.652-5.613-0.802-5.212 0.15z"/>\r
-   <path fill="#bc8100" d="m169.833 83.89c0.677 1.4 2.415 1.594 3.574 2.221 1.111 0.628 1.738 0.772 2.173 0.531 0.965-0.531 0.241-2.27-0.725-2.897-0.917-0.627-5.408-0.772-5.022 0.145z"/>\r
-   <path fill="#b77b00" d="m169.976 83.912c0.65 1.347 2.322 1.533 3.438 2.137 1.069 0.604 1.673 0.743 2.091 0.511 0.93-0.511 0.233-2.184-0.696-2.788-0.884-0.603-5.205-0.743-4.833 0.14z"/>\r
-   <path fill="#b27500" d="m170.118 83.934c0.626 1.294 2.232 1.473 3.304 2.053 1.027 0.581 1.606 0.714 2.009 0.491 0.893-0.491 0.224-2.098-0.669-2.678-0.85-0.58-5.001-0.715-4.644 0.134z"/>\r
-   <path fill="#ad7000" d="m170.261 83.955c0.6 1.242 2.14 1.413 3.168 1.97 0.984 0.557 1.541 0.685 1.927 0.47 0.855-0.47 0.214-2.012-0.644-2.569-0.812-0.555-4.794-0.684-4.451 0.129z"/>\r
-   <path fill="#a86a00" d="m170.403 83.977c0.574 1.189 2.05 1.353 3.034 1.886 0.942 0.533 1.475 0.656 1.844 0.45 0.82-0.45 0.205-1.926-0.615-2.459-0.779-0.533-4.591-0.656-4.263 0.123z"/>\r
-   <path fill="#a36400" d="m170.545 83.998c0.55 1.136 1.959 1.292 2.899 1.802 0.901 0.509 1.41 0.626 1.762 0.43 0.783-0.43 0.197-1.841-0.587-2.35-0.745-0.508-4.387-0.626-4.074 0.118z"/>\r
-   <path fill="#9e5e00" d="m170.688 84.02c0.522 1.083 1.867 1.232 2.764 1.718 0.859 0.486 1.343 0.597 1.68 0.41 0.746-0.41 0.188-1.755-0.561-2.241-0.709-0.484-4.182-0.597-3.883 0.113z"/>\r
-   <path fill="#995900" d="m170.83 84.042c0.498 1.03 1.776 1.172 2.629 1.634 0.817 0.462 1.278 0.568 1.599 0.39 0.71-0.39 0.178-1.669-0.533-2.131-0.676-0.461-3.979-0.568-3.695 0.107z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m152.875 86.29c-0.325 0.813 1.952 2.359 3.091 1.301 1.222-1.057 2.686-2.033 3.175-2.359 2.195-1.465 1.383-2.522-2.278-1.871-3.663 0.651-3.663 2.115-3.988 2.929z"/>\r
-   <path fill="#f9c600" d="m152.934 86.279c-0.318 0.794 1.906 2.304 3.019 1.271 1.193-1.033 2.623-1.986 3.102-2.305 2.145-1.431 1.351-2.463-2.226-1.828-3.578 0.637-3.578 2.067-3.895 2.862z"/>\r
-   <path fill="#f4c000" d="m152.993 86.269c-0.31 0.775 1.861 2.25 2.948 1.241 1.164-1.008 2.56-1.939 3.026-2.25 2.095-1.397 1.319-2.405-2.173-1.784-3.491 0.62-3.491 2.017-3.801 2.793z"/>\r
-   <path fill="#efba00" d="m153.051 86.258c-0.302 0.757 1.817 2.195 2.878 1.211 1.136-0.984 2.497-1.892 2.952-2.195 2.044-1.363 1.287-2.347-2.118-1.741-3.409 0.606-3.409 1.968-3.712 2.725z"/>\r
-   <path fill="#eab500" d="m153.11 86.248c-0.295 0.738 1.771 2.141 2.805 1.181 1.108-0.959 2.437-1.845 2.88-2.141 1.993-1.329 1.255-2.289-2.066-1.698-3.324 0.591-3.324 1.92-3.619 2.658z"/>\r
-   <path fill="#e5af00" d="m153.169 86.238c-0.287 0.719 1.727 2.086 2.733 1.151 1.08-0.935 2.374-1.798 2.807-2.086 1.942-1.296 1.224-2.23-2.015-1.655s-3.238 1.87-3.525 2.59z"/>\r
-   <path fill="#e0a900" d="m153.228 86.228c-0.28 0.7 1.681 2.032 2.661 1.121 1.052-0.91 2.312-1.751 2.732-2.031 1.893-1.262 1.191-2.172-1.961-1.611-3.152 0.559-3.152 1.82-3.432 2.521z"/>\r
-   <path fill="#dba300" d="m153.286 86.217c-0.271 0.681 1.636 1.977 2.591 1.09 1.023-0.886 2.25-1.704 2.659-1.977 1.84-1.228 1.159-2.114-1.909-1.568-3.068 0.547-3.068 1.773-3.341 2.455z"/>\r
-   <path fill="#d69e00" d="m153.345 86.207c-0.265 0.662 1.591 1.922 2.519 1.061 0.995-0.862 2.188-1.657 2.586-1.922 1.789-1.194 1.127-2.055-1.855-1.525-2.985 0.53-2.985 1.723-3.25 2.386z"/>\r
-   <path fill="#d19800" d="m153.404 86.197c-0.257 0.643 1.546 1.868 2.447 1.03 0.967-0.837 2.126-1.61 2.512-1.868 1.739-1.16 1.095-1.997-1.803-1.481-2.899 0.516-2.899 1.674-3.156 2.319z"/>\r
-   <path fill="#cc9200" d="m153.463 86.187c-0.25 0.625 1.5 1.813 2.375 1 0.939-0.813 2.064-1.563 2.439-1.813 1.688-1.126 1.063-1.938-1.75-1.438-2.814 0.5-2.814 1.625-3.064 2.251z"/>\r
-   <path fill="#c68c00" d="m153.521 86.176c-0.242 0.605 1.456 1.758 2.304 0.97 0.911-0.788 2.002-1.516 2.366-1.758 1.637-1.092 1.031-1.88-1.698-1.395-2.729 0.486-2.729 1.576-2.972 2.183z"/>\r
-   <path fill="#c18700" d="m153.58 86.166c-0.233 0.587 1.41 1.704 2.233 0.939 0.882-0.763 1.938-1.469 2.292-1.704 1.586-1.058 0.999-1.822-1.646-1.352-2.644 0.472-2.644 1.529-2.879 2.117z"/>\r
-   <path fill="#bc8100" d="m153.639 86.156c-0.228 0.568 1.364 1.649 2.16 0.91 0.854-0.739 1.878-1.422 2.219-1.649 1.536-1.024 0.967-1.764-1.593-1.308s-2.559 1.477-2.786 2.047z"/>\r
-   <path fill="#b77b00" d="m153.698 86.146c-0.22 0.549 1.32 1.594 2.089 0.879 0.825-0.715 1.815-1.375 2.146-1.595 1.484-0.99 0.935-1.705-1.54-1.265s-2.475 1.43-2.695 1.981z"/>\r
-   <path fill="#b27500" d="m153.756 86.135c-0.211 0.53 1.275 1.54 2.019 0.85 0.797-0.69 1.753-1.328 2.072-1.54 1.434-0.957 0.902-1.646-1.487-1.221s-2.391 1.38-2.604 1.911z"/>\r
-   <path fill="#ad7000" d="m153.815 86.125c-0.204 0.512 1.229 1.486 1.946 0.82 0.769-0.666 1.69-1.281 1.997-1.486 1.385-0.922 0.871-1.588-1.434-1.178s-2.304 1.331-2.509 1.844z"/>\r
-   <path fill="#a86a00" d="m153.874 86.114c-0.196 0.493 1.185 1.431 1.875 0.79 0.74-0.642 1.628-1.234 1.924-1.431 1.332-0.889 0.84-1.53-1.381-1.135s-2.221 1.283-2.418 1.776z"/>\r
-   <path fill="#a36400" d="m153.933 86.104c-0.189 0.474 1.139 1.376 1.803 0.759 0.712-0.617 1.566-1.187 1.851-1.376 1.281-0.855 0.808-1.472-1.329-1.092-2.135 0.38-2.135 1.234-2.325 1.709z"/>\r
-   <path fill="#9e5e00" d="m153.991 86.094c-0.181 0.455 1.095 1.322 1.732 0.729 0.684-0.592 1.504-1.14 1.776-1.321 1.231-0.821 0.775-1.414-1.274-1.048-2.051 0.364-2.051 1.184-2.234 1.64z"/>\r
-   <path fill="#995900" d="m154.05 86.083c-0.174 0.436 1.05 1.267 1.66 0.699 0.656-0.568 1.442-1.093 1.704-1.267 1.181-0.787 0.743-1.355-1.223-1.005s-1.966 1.136-2.141 1.573z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m156.951 107.887c-0.229 2.858 6.343-4.286 6.743-4.915 0.856-1.543 3.715-5.886 4.172-7.715 0.857-3.2 2.401-5.543 1.429-8.915-0.343-1.086-2.742-1.372-3.829-0.687-3.086 1.829-2.629 4.058-2.972 6.115-1.143 5.831-5.143 11.717-5.543 16.117z"/>\r
-   <path fill="#ffcc02" d="m157.22 107.441c-0.22 2.787 6.178-4.188 6.566-4.802 0.833-1.506 3.614-5.745 4.056-7.529 0.831-3.122 2.333-5.408 1.382-8.695-0.337-1.058-2.678-1.333-3.735-0.663-3.006 1.788-2.557 3.96-2.889 5.967-1.105 5.685-4.997 11.431-5.38 15.722z"/>\r
-   <path fill="#ffcc05" d="m157.488 106.995c-0.209 2.715 6.014-4.091 6.392-4.69 0.811-1.469 3.513-5.603 3.941-7.342 0.804-3.043 2.264-5.273 1.331-8.474-0.329-1.031-2.61-1.295-3.64-0.64-2.927 1.747-2.486 3.863-2.806 5.818-1.068 5.541-4.851 11.146-5.218 15.328z"/>\r
-   <path fill="#ffcc07" d="m157.757 106.548c-0.198 2.645 5.85-3.993 6.217-4.577 0.785-1.431 3.409-5.461 3.824-7.156 0.779-2.964 2.196-5.138 1.282-8.253-0.322-1.003-2.543-1.257-3.545-0.618-2.847 1.706-2.414 3.766-2.722 5.67-1.031 5.398-4.706 10.862-5.056 14.934z"/>\r
-   <path fill="#ffcd0a" d="m158.026 106.102c-0.189 2.573 5.684-3.896 6.04-4.465 0.762-1.394 3.309-5.32 3.709-6.969 0.753-2.886 2.129-5.004 1.233-8.033-0.315-0.976-2.478-1.219-3.45-0.595-2.768 1.665-2.343 3.668-2.64 5.522-0.993 5.254-4.558 10.577-4.892 14.54z"/>\r
-   <path fill="#ffcd0c" d="m158.294 105.655c-0.179 2.503 5.52-3.798 5.865-4.351 0.738-1.357 3.207-5.179 3.594-6.783 0.727-2.807 2.061-4.869 1.185-7.813-0.309-0.948-2.411-1.18-3.356-0.572-2.687 1.623-2.271 3.571-2.556 5.374-0.958 5.11-4.414 10.291-4.732 14.145z"/>\r
-   <path fill="#ffcd0f" d="m158.563 105.209c-0.169 2.431 5.354-3.701 5.688-4.239 0.715-1.319 3.106-5.037 3.479-6.596 0.7-2.728 1.992-4.734 1.135-7.592-0.301-0.92-2.344-1.142-3.261-0.549-2.608 1.583-2.199 3.474-2.473 5.226-0.919 4.965-4.267 10.005-4.568 13.75z"/>\r
-   <path fill="#ffcd11" d="m158.831 104.762c-0.159 2.361 5.19-3.602 5.515-4.126 0.69-1.282 3.004-4.896 3.361-6.409 0.674-2.649 1.924-4.599 1.087-7.372-0.295-0.893-2.277-1.104-3.167-0.526-2.527 1.541-2.128 3.376-2.389 5.077-0.883 4.822-4.122 9.721-4.407 13.356z"/>\r
-   <path fill="#ffce14" d="m159.1 104.316c-0.149 2.289 5.024-3.505 5.338-4.014 0.667-1.244 2.901-4.754 3.247-6.223 0.646-2.571 1.854-4.464 1.037-7.151-0.287-0.865-2.211-1.065-3.072-0.504-2.448 1.5-2.056 3.279-2.306 4.929-0.845 4.679-3.976 9.437-4.244 12.963z"/>\r
-   <path fill="#ffce16" d="m159.369 103.869c-0.139 2.219 4.86-3.407 5.162-3.9 0.643-1.208 2.801-4.613 3.131-6.037 0.622-2.492 1.787-4.329 0.988-6.93-0.28-0.838-2.146-1.027-2.978-0.481-2.368 1.459-1.983 3.182-2.223 4.781-0.807 4.533-3.829 9.151-4.08 12.567z"/>\r
-   <path fill="#ffce19" d="m159.637 103.423c-0.13 2.147 4.695-3.31 4.986-3.788 0.62-1.17 2.699-4.471 3.016-5.85 0.596-2.414 1.719-4.195 0.939-6.71-0.273-0.81-2.079-0.989-2.883-0.458-2.289 1.418-1.913 3.084-2.139 4.632-0.77 4.391-3.684 8.866-3.919 12.174z"/>\r
-   <path fill="#ffce1c" d="m159.906 102.977c-0.119 2.076 4.531-3.213 4.811-3.676 0.597-1.133 2.599-4.33 2.899-5.664 0.57-2.335 1.651-4.06 0.891-6.49-0.267-0.782-2.012-0.95-2.787-0.435-2.21 1.377-1.842 2.987-2.057 4.484-0.734 4.247-3.539 8.582-3.757 11.781z"/>\r
-   <path fill="#ffcf1e" d="m160.174 102.53c-0.108 2.005 4.366-3.115 4.637-3.563 0.571-1.096 2.496-4.189 2.784-5.478 0.543-2.256 1.581-3.925 0.841-6.269-0.26-0.754-1.945-0.912-2.693-0.412-2.129 1.336-1.77 2.889-1.973 4.336-0.697 4.103-3.394 8.297-3.596 11.386z"/>\r
-   <path fill="#ffcf21" d="m160.443 102.084c-0.099 1.934 4.201-3.018 4.46-3.45 0.548-1.059 2.394-4.047 2.668-5.291 0.517-2.178 1.514-3.79 0.793-6.049-0.253-0.727-1.879-0.874-2.599-0.39-2.051 1.295-1.698 2.792-1.891 4.188-0.658 3.959-3.246 8.012-3.431 10.992z"/>\r
-   <path fill="#ffcf23" d="m160.712 101.637c-0.089 1.863 4.036-2.919 4.283-3.337 0.526-1.021 2.294-3.905 2.553-5.104 0.491-2.099 1.447-3.655 0.744-5.828-0.246-0.699-1.813-0.835-2.505-0.367-1.969 1.253-1.625 2.694-1.805 4.04-0.623 3.814-3.101 7.726-3.27 10.596z"/>\r
-   <path fill="#ffcf26" d="m160.98 101.191c-0.079 1.792 3.872-2.822 4.107-3.225 0.502-0.984 2.192-3.764 2.438-4.918 0.464-2.02 1.378-3.52 0.694-5.607-0.238-0.672-1.746-0.797-2.41-0.344-1.89 1.212-1.555 2.597-1.723 3.891-0.583 3.671-2.953 7.442-3.106 10.203z"/>\r
-   <path fill="#ffd028" d="m161.249 100.744c-0.068 1.721 3.707-2.724 3.933-3.112 0.478-0.947 2.091-3.623 2.321-4.731 0.439-1.942 1.311-3.386 0.646-5.387-0.232-0.645-1.68-0.758-2.316-0.321-1.81 1.171-1.481 2.5-1.639 3.743-0.548 3.527-2.809 7.156-2.945 9.808z"/>\r
-   <path fill="#ffd02b" d="m161.517 100.298c-0.06 1.65 3.543-2.627 3.757-2.999 0.454-0.91 1.989-3.481 2.206-4.545 0.413-1.863 1.242-3.25 0.597-5.167-0.225-0.617-1.613-0.72-2.221-0.298-1.73 1.13-1.411 2.402-1.557 3.595-0.509 3.383-2.662 6.871-2.782 9.414z"/>\r
-   <path fill="#ffd02d" d="m161.786 99.852c-0.049 1.579 3.377-2.529 3.581-2.887 0.431-0.872 1.887-3.34 2.091-4.359 0.387-1.784 1.173-3.116 0.547-4.946-0.217-0.589-1.546-0.682-2.126-0.275-1.649 1.089-1.339 2.305-1.472 3.446-0.474 3.24-2.518 6.587-2.621 9.021z"/>\r
-   <path fill="#ffd030" d="m162.055 99.405c-0.039 1.508 3.212-2.432 3.404-2.773 0.407-0.835 1.786-3.199 1.976-4.172 0.359-1.706 1.104-2.981 0.499-4.726-0.211-0.562-1.481-0.644-2.032-0.253-1.571 1.048-1.268 2.208-1.389 3.298-0.436 3.096-2.372 6.302-2.458 8.626z"/>\r
-   <path fill="#ffd133" d="m162.323 98.958c-0.029 1.437 3.048-2.334 3.23-2.661 0.383-0.798 1.684-3.057 1.858-3.986 0.334-1.627 1.037-2.846 0.45-4.505-0.204-0.534-1.414-0.605-1.938-0.23-1.49 1.007-1.195 2.11-1.306 3.15-0.397 2.953-2.224 6.018-2.294 8.232z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m179.646 95.994c-3.168 3.456-5.4 6.767-7.2 9-1.872 2.304-6.48 5.04-4.176 7.704 1.943 2.376 9.936-1.944 16.128-6.552 6.12-4.608 15.696-8.711 11.016-13.967-2.448-2.664-8.208-2.088-10.439-0.648-1.729 1.078-2.737 1.655-5.329 4.463z"/>\r
-   <path fill="#ffcc02" d="m179.782 96.147c-3.118 3.378-5.313 6.628-7.086 8.809-1.841 2.249-6.375 4.945-4.13 7.534 1.893 2.31 9.724-1.943 15.795-6.469 6.001-4.525 15.38-8.574 10.82-13.682-2.387-2.588-8.022-1.998-10.209-0.584-1.692 1.062-2.665 1.67-5.19 4.392z"/>\r
-   <path fill="#ffcc05" d="m179.919 96.3c-3.068 3.3-5.227 6.488-6.973 8.619-1.81 2.193-6.271 4.85-4.085 7.364 1.843 2.243 9.513-1.943 15.463-6.386 5.882-4.442 15.064-8.437 10.623-13.396-2.323-2.513-7.835-1.907-9.978-0.52-1.655 1.044-2.593 1.684-5.05 4.319z"/>\r
-   <path fill="#ffcc07" d="m180.055 96.454c-3.02 3.222-5.14 6.347-6.859 8.428-1.78 2.138-6.166 4.754-4.04 7.194 1.793 2.177 9.302-1.942 15.131-6.303 5.762-4.359 14.748-8.299 10.427-13.11-2.261-2.437-7.648-1.817-9.747-0.456-1.619 1.025-2.522 1.698-4.912 4.247z"/>\r
-   <path fill="#ffcd0a" d="m180.191 96.607c-2.97 3.143-5.052 6.207-6.745 8.237-1.749 2.082-6.063 4.659-3.994 7.023 1.743 2.111 9.09-1.941 14.798-6.219 5.644-4.276 14.433-8.162 10.231-12.824-2.199-2.361-7.463-1.727-9.518-0.392-1.581 1.008-2.45 1.713-4.772 4.175z"/>\r
-   <path fill="#ffcd0c" d="m180.327 96.761c-2.92 3.065-4.965 6.066-6.631 8.047-1.718 2.027-5.957 4.564-3.949 6.853 1.693 2.044 8.878-1.94 14.466-6.136 5.524-4.194 14.116-8.024 10.034-12.538-2.137-2.286-7.275-1.636-9.285-0.328-1.546 0.988-2.38 1.726-4.635 4.102z"/>\r
-   <path fill="#ffcd0f" d="m180.464 96.914c-2.871 2.987-4.879 5.926-6.518 7.857-1.688 1.971-5.854 4.468-3.903 6.683 1.643 1.978 8.666-1.94 14.133-6.053 5.404-4.111 13.801-7.887 9.839-12.251-2.075-2.21-7.091-1.546-9.056-0.264-1.509 0.969-2.308 1.738-4.495 4.028z"/>\r
-   <path fill="#ffcd11" d="m180.6 97.067c-2.821 2.909-4.792 5.786-6.404 7.667-1.657 1.916-5.748 4.373-3.858 6.512 1.593 1.912 8.455-1.938 13.802-5.969 5.284-4.028 13.484-7.75 9.641-11.966-2.012-2.134-6.902-1.456-8.823-0.199-1.474 0.951-2.238 1.752-4.358 3.955z"/>\r
-   <path fill="#ffce14" d="m180.736 97.221c-2.771 2.83-4.705 5.645-6.29 7.476-1.626 1.86-5.644 4.278-3.813 6.342 1.542 1.845 8.244-1.938 13.47-5.886 5.166-3.945 13.169-7.612 9.444-11.68-1.949-2.059-6.716-1.365-8.592-0.135-1.437 0.933-2.166 1.766-4.219 3.883z"/>\r
-   <path fill="#ffce16" d="m180.872 97.375c-2.722 2.752-4.617 5.504-6.176 7.286-1.595 1.805-5.539 4.182-3.767 6.172 1.49 1.779 8.031-1.937 13.136-5.803 5.046-3.862 12.853-7.475 9.249-11.394-1.889-1.983-6.53-1.274-8.362-0.071-1.4 0.914-2.095 1.779-4.08 3.81z"/>\r
-   <path fill="#ffce19" d="m181.009 97.528c-2.673 2.674-4.53 5.364-6.063 7.095-1.564 1.749-5.435 4.087-3.722 6.001 1.44 1.713 7.82-1.936 12.804-5.719 4.927-3.78 12.537-7.338 9.052-11.108-1.825-1.907-6.343-1.185-8.13-0.007-1.364 0.896-2.024 1.793-3.941 3.738z"/>\r
-   <path fill="#ffce1c" d="m181.145 97.682c-2.623 2.595-4.444 5.225-5.949 6.904-1.534 1.693-5.33 3.992-3.676 5.831 1.39 1.646 7.608-1.935 12.471-5.636 4.808-3.697 12.221-7.2 8.856-10.822-1.764-1.832-6.157-1.094-7.9 0.057-1.327 0.878-1.952 1.807-3.802 3.666z"/>\r
-   <path fill="#ffcf1e" d="m181.281 97.835c-2.573 2.517-4.357 5.084-5.835 6.714-1.503 1.638-5.226 3.896-3.631 5.661 1.34 1.58 7.396-1.935 12.139-5.553 4.689-3.614 11.905-7.063 8.659-10.536-1.701-1.756-5.97-1.004-7.668 0.121-1.291 0.86-1.881 1.821-3.664 3.593z"/>\r
-   <path fill="#ffcf21" d="m181.417 97.988c-2.522 2.439-4.27 4.944-5.721 6.524-1.472 1.582-5.121 3.801-3.586 5.491 1.29 1.513 7.186-1.934 11.807-5.47 4.569-3.531 11.589-6.926 8.463-10.25-1.639-1.68-5.783-0.914-7.438 0.186-1.254 0.84-1.809 1.834-3.525 3.519z"/>\r
-   <path fill="#ffcf23" d="m181.554 98.142c-2.476 2.361-4.185 4.803-5.608 6.333-1.441 1.527-5.017 3.706-3.54 5.32 1.24 1.447 6.974-1.933 11.474-5.386 4.45-3.448 11.273-6.788 8.268-9.964-1.577-1.605-5.599-0.823-7.207 0.25-1.22 0.822-1.74 1.848-3.387 3.447z"/>\r
-   <path fill="#ffcf26" d="m181.69 98.295c-2.425 2.283-4.098 4.663-5.494 6.143-1.411 1.471-4.912 3.61-3.495 5.15 1.19 1.381 6.763-1.932 11.142-5.303 4.331-3.366 10.957-6.65 8.07-9.679-1.514-1.529-5.411-0.732-6.976 0.313-1.182 0.805-1.667 1.863-3.247 3.376z"/>\r
-   <path fill="#ffd028" d="m181.826 98.449c-2.375 2.204-4.009 4.522-5.38 5.952-1.38 1.416-4.808 3.515-3.449 4.98 1.14 1.314 6.551-1.932 10.81-5.22 4.211-3.283 10.641-6.513 7.874-9.393-1.452-1.454-5.226-0.642-6.745 0.378-1.147 0.786-1.597 1.876-3.11 3.303z"/>\r
-   <path fill="#ffd02b" d="m181.962 98.602c-2.324 2.127-3.922 4.382-5.266 5.762-1.349 1.36-4.703 3.42-3.404 4.809 1.089 1.248 6.34-1.93 10.478-5.136 4.092-3.2 10.325-6.376 7.677-9.106-1.389-1.378-5.038-0.552-6.513 0.441-1.111 0.768-1.526 1.89-2.972 3.23z"/>\r
-   <path fill="#ffd02d" d="m182.099 98.756c-2.276 2.048-3.836 4.241-5.153 5.571-1.318 1.305-4.599 3.324-3.359 4.639 1.039 1.182 6.128-1.93 10.146-5.053 3.973-3.117 10.009-6.238 7.48-8.82-1.328-1.303-4.852-0.462-6.282 0.506-1.074 0.748-1.454 1.903-2.832 3.157z"/>\r
-   <path fill="#ffd030" d="m182.235 98.909c-2.228 1.97-3.749 4.101-5.039 5.381-1.288 1.249-4.494 3.229-3.313 4.469 0.988 1.115 5.916-1.929 9.813-4.97 3.853-3.034 9.693-6.101 7.285-8.535-1.267-1.227-4.666-0.371-6.052 0.57-1.038 0.731-1.384 1.918-2.694 3.085z"/>\r
-   <path fill="#ffd133" d="m182.371 99.063c-2.177 1.892-3.662 3.96-4.925 5.19-1.257 1.193-4.39 3.133-3.268 4.298 0.938 1.049 5.704-1.928 9.479-4.886 3.734-2.952 9.377-5.963 7.088-8.249-1.203-1.151-4.479-0.281-5.821 0.634-0.999 0.713-1.31 1.931-2.553 3.013z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fff" d="m186.414 168.569c0.864-2.808 28.872-9.432 33.48-7.272 4.536 2.16 26.279 33.768 22.392 35.496-3.888 1.657-12.24-10.512-24.408-16.128s-32.328-9.216-31.464-12.096z"/>\r
-   <path fill="#f9f9f9" d="m187.239 168.626c0.848-2.761 28.145-9.076 32.69-6.997 4.476 2.079 25.768 32.897 21.943 34.591-3.824 1.625-11.965-10.346-23.94-15.874-11.976-5.527-31.541-8.89-30.693-11.72z"/>\r
-   <path fill="#f4f4f4" d="m188.063 168.683c0.832-2.714 27.418-8.72 31.899-6.722 4.417 1.998 25.259 32.026 21.497 33.685-3.76 1.595-11.689-10.18-23.474-15.619-11.782-5.438-30.754-8.565-29.922-11.344z"/>\r
-   <path fill="#efefef" d="m188.888 168.74c0.814-2.668 26.69-8.364 31.109-6.447 4.357 1.917 24.746 31.155 21.049 32.779-3.695 1.563-11.416-10.014-23.007-15.364-11.59-5.349-29.967-8.239-29.151-10.968z"/>\r
-   <path fill="#eaeaea" d="m189.712 168.797c0.801-2.621 25.964-8.009 30.32-6.173 4.299 1.837 24.235 30.285 20.603 31.874-3.633 1.532-11.142-9.847-22.54-15.109-11.4-5.261-29.182-7.914-28.383-10.592z"/>\r
-   <path fill="#e5e5e5" d="m190.537 168.853c0.783-2.573 25.236-7.652 29.53-5.897 4.239 1.756 23.723 29.414 20.155 30.968-3.569 1.501-10.867-9.681-22.074-14.854-11.206-5.172-28.395-7.589-27.611-10.217z"/>\r
-   <path fill="#e0e0e0" d="m191.361 168.91c0.768-2.527 24.51-7.296 28.74-5.622 4.18 1.675 23.212 28.543 19.708 30.063-3.505 1.469-10.593-9.516-21.607-14.6-11.014-5.083-27.608-7.263-26.841-9.841z"/>\r
-   <path fill="#dbdbdb" d="m192.186 168.967c0.751-2.48 23.781-6.941 27.95-5.347 4.119 1.593 22.7 27.671 19.26 29.157-3.441 1.438-10.318-9.349-21.141-14.345-10.821-4.994-26.821-6.938-26.069-9.465z"/>\r
-   <path fill="#d6d6d6" d="m193.01 169.024c0.735-2.433 23.057-6.585 27.16-5.073 4.062 1.513 22.19 26.801 18.813 28.252-3.377 1.407-10.043-9.183-20.673-14.09-10.629-4.906-26.035-6.612-25.3-9.089z"/>\r
-   <path fill="#d1d1d1" d="m193.835 169.081c0.72-2.387 22.328-6.229 26.37-4.798 4.001 1.432 21.678 25.93 18.365 27.346-3.313 1.376-9.768-9.017-20.206-13.835-10.437-4.817-25.248-6.287-24.529-8.713z"/>\r
-   <path fill="#ccc" d="m194.659 169.137c0.703-2.339 21.603-5.873 25.58-4.521 3.942 1.351 21.167 25.059 17.918 26.44-3.249 1.345-9.493-8.851-19.739-13.58-10.245-4.729-24.462-5.963-23.759-8.339z"/>\r
-   <path fill="#c6c6c6" d="m195.484 169.194c0.687-2.292 20.874-5.517 24.79-4.247 3.882 1.27 20.655 24.188 17.47 25.535-3.185 1.314-9.219-8.685-19.271-13.326-10.054-4.639-23.676-5.636-22.989-7.962z"/>\r
-   <path fill="#c1c1c1" d="m196.308 169.251c0.671-2.246 20.147-5.161 24-3.973 3.822 1.19 20.145 23.318 17.022 24.63-3.121 1.283-8.943-8.519-18.805-13.071-9.859-4.551-22.888-5.311-22.217-7.586z"/>\r
-   <path fill="#bcbcbc" d="m197.133 169.308c0.654-2.199 19.421-4.805 23.21-3.698 3.764 1.109 19.634 22.447 16.575 23.724-3.057 1.252-8.669-8.353-18.338-12.816-9.668-4.462-22.102-4.985-21.447-7.21z"/>\r
-   <path fill="#b7b7b7" d="m197.957 169.365c0.64-2.152 18.693-4.45 22.42-3.423 3.705 1.027 19.122 21.575 16.129 22.818-2.993 1.221-8.395-8.186-17.872-12.561-9.476-4.373-21.315-4.66-20.677-6.834z"/>\r
-   <path fill="#b2b2b2" d="m198.782 169.421c0.622-2.105 17.966-4.093 21.63-3.147 3.646 0.946 18.61 20.704 15.681 21.912-2.93 1.19-8.12-8.02-17.404-12.306-9.284-4.284-20.53-4.335-19.907-6.459z"/>\r
-   <path fill="#adadad" d="m199.606 169.478c0.606-2.058 17.239-3.737 20.84-2.873 3.586 0.866 18.099 19.834 15.234 21.008-2.866 1.158-7.847-7.855-16.938-12.052-9.091-4.196-19.742-4.009-19.136-6.083z"/>\r
-   <path fill="#a8a8a8" d="m200.431 169.535c0.59-2.011 16.512-3.382 20.05-2.598 3.525 0.785 17.588 18.963 14.786 20.102-2.803 1.127-7.571-7.688-16.472-11.797-8.898-4.107-18.955-3.684-18.364-5.707z"/>\r
-   <path fill="#a3a3a3" d="m201.255 169.592c0.574-1.965 15.785-3.026 19.261-2.323 3.467 0.704 17.076 18.092 14.339 19.196-2.738 1.096-7.296-7.522-16.004-11.542-8.707-4.018-18.17-3.358-17.596-5.331z"/>\r
-   <path fill="#9e9e9e" d="m202.08 169.649c0.559-1.918 15.059-2.67 18.47-2.048 3.407 0.623 16.565 17.221 13.892 18.29-2.674 1.065-7.022-7.356-15.537-11.287-8.515-3.929-17.383-3.033-16.825-4.955z"/>\r
-   <path fill="#999" d="m202.904 169.705c0.542-1.871 14.331-2.314 17.68-1.773 3.349 0.542 16.055 16.35 13.444 17.385-2.61 1.034-6.747-7.19-15.07-11.032-8.322-3.841-16.596-2.708-16.054-4.58z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fff" d="m151.134 211.625c2.881 0.144 0.145 16.271 0.145 32.903s2.231 22.464 0.144 24.552-5.688-5.399-5.688-22.031c-0.001-16.632 2.519-35.568 5.399-35.424z"/>\r
-   <path fill="#f9f9f9" d="m151.105 212.016c2.783 0.162 0.109 16.052 0.097 32.419-0.012 16.366 2.188 22.208 0.164 24.237-2.02 2.029-5.561-5.383-5.546-21.752 0.012-16.367 2.502-35.065 5.285-34.904z"/>\r
-   <path fill="#f4f4f4" d="m151.075 212.407c2.687 0.18 0.076 15.832 0.051 31.934-0.023 16.102 2.143 21.951 0.185 23.924-1.953 1.968-5.435-5.367-5.405-21.473 0.024-16.103 2.484-34.564 5.169-34.385z"/>\r
-   <path fill="#efefef" d="m151.046 212.797c2.588 0.197 0.041 15.613 0.004 31.449-0.036 15.836 2.098 21.694 0.204 23.609-1.886 1.907-5.308-5.352-5.263-21.195 0.037-15.835 2.467-34.058 5.055-33.863z"/>\r
-   <path fill="#eaeaea" d="m151.017 213.189c2.49 0.214 0.007 15.392-0.043 30.962-0.05 15.571 2.052 21.439 0.224 23.297-1.818 1.848-5.181-5.334-5.122-20.916 0.049-15.571 2.45-33.557 4.941-33.343z"/>\r
-   <path fill="#e5e5e5" d="m150.987 213.581c2.394 0.23-0.027 15.17-0.089 30.477s2.007 21.182 0.244 22.982c-1.751 1.787-5.055-5.32-4.98-20.638 0.061-15.305 2.431-33.053 4.825-32.821z"/>\r
-   <path fill="#e0e0e0" d="m150.958 213.971c2.297 0.248-0.062 14.951-0.136 29.99-0.074 15.041 1.962 20.927 0.264 22.668-1.683 1.728-4.928-5.301-4.839-20.356 0.074-15.04 2.414-32.551 4.711-32.302z"/>\r
-   <path fill="#dbdbdb" d="m150.928 214.362c2.199 0.266-0.096 14.73-0.182 29.506-0.087 14.775 1.915 20.67 0.282 22.354-1.615 1.667-4.8-5.286-4.696-20.078 0.087-14.776 2.397-32.048 4.596-31.782z"/>\r
-   <path fill="#d6d6d6" d="m150.899 214.752c2.102 0.283-0.13 14.511-0.229 29.021-0.099 14.511 1.87 20.413 0.303 22.04-1.549 1.607-4.674-5.27-4.556-19.799 0.1-14.51 2.38-31.545 4.482-31.262z"/>\r
-   <path fill="#d1d1d1" d="m150.87 215.144c2.005 0.301-0.165 14.29-0.274 28.535-0.112 14.245 1.824 20.155 0.321 21.725-1.479 1.548-4.547-5.252-4.413-19.519 0.11-14.245 2.361-31.043 4.366-30.741z"/>\r
-   <path fill="#ccc" d="m150.84 215.536c1.908 0.317-0.197 14.069-0.32 28.049-0.124 13.979 1.779 19.899 0.342 21.412-1.413 1.486-4.42-5.238-4.272-19.242 0.122-13.979 2.343-30.54 4.25-30.219z"/>\r
-   <path fill="#c6c6c6" d="m150.811 215.926c1.811 0.334-0.233 13.85-0.368 27.564-0.136 13.713 1.735 19.643 0.362 21.096-1.346 1.428-4.293-5.219-4.131-18.961 0.136-13.712 2.327-30.035 4.137-29.699z"/>\r
-   <path fill="#c1c1c1" d="m150.781 216.317c1.714 0.354-0.267 13.629-0.414 27.078s1.69 19.387 0.382 20.783c-1.277 1.367-4.166-5.203-3.989-18.682 0.148-13.449 2.308-29.533 4.021-29.179z"/>\r
-   <path fill="#bcbcbc" d="m150.752 216.708c1.616 0.371-0.301 13.41-0.461 26.594-0.161 13.184 1.646 19.13 0.402 20.469-1.211 1.307-4.04-5.188-3.847-18.402 0.16-13.185 2.29-29.033 3.906-28.661z"/>\r
-   <path fill="#b7b7b7" d="m150.723 217.099c1.519 0.387-0.336 13.188-0.509 26.106-0.173 12.92 1.601 18.875 0.423 20.156-1.144 1.246-3.913-5.171-3.706-18.123 0.172-12.919 2.273-28.529 3.792-28.139z"/>\r
-   <path fill="#b2b2b2" d="m150.693 217.491c1.422 0.404-0.37 12.969-0.554 25.621-0.186 12.653 1.555 18.617 0.441 19.842-1.076 1.187-3.786-5.156-3.563-17.846 0.184-12.652 2.255-28.024 3.676-27.617z"/>\r
-   <path fill="#adadad" d="m150.664 217.881c1.325 0.422-0.404 12.748-0.601 25.136-0.198 12.388 1.51 18.36 0.462 19.528-1.008 1.125-3.66-5.139-3.423-17.566 0.197-12.389 2.238-27.521 3.562-27.098z"/>\r
-   <path fill="#a8a8a8" d="m150.634 218.272c1.229 0.439-0.438 12.527-0.646 24.65-0.21 12.123 1.464 18.104 0.48 19.213-0.939 1.066-3.531-5.121-3.279-17.285 0.208-12.123 2.219-27.019 3.445-26.578z"/>\r
-   <path fill="#a3a3a3" d="m150.605 218.663c1.13 0.457-0.474 12.309-0.694 24.166-0.222 11.857 1.419 17.848 0.501 18.899-0.873 1.006-3.405-5.106-3.139-17.009 0.222-11.855 2.202-26.515 3.332-26.056z"/>\r
-   <path fill="#9e9e9e" d="m150.576 219.054c1.033 0.474-0.507 12.088-0.741 23.68-0.234 11.593 1.374 17.591 0.521 18.585-0.806 0.946-3.279-5.089-2.997-16.729 0.233-11.591 2.184-26.011 3.217-25.536z"/>\r
-   <path fill="#999" d="m150.546 219.444c0.937 0.492-0.541 11.868-0.787 23.195-0.246 11.326 1.329 17.335 0.541 18.271-0.737 0.885-3.151-5.074-2.855-16.449 0.245-11.328 2.166-25.509 3.101-25.017z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fff" d="m157.434 167.161c1.735 0.192 12.437-2.218 12.822-1.254 0.386 0.772-6.651 2.893-8.966 5.303-0.771 0.771-2.796 2.603-4.049 2.41-0.964-0.096-1.543-2.121-2.989-3.664-3.471-3.47-5.688-3.181-5.013-4.531 0.579-1.06 5.207 1.446 8.195 1.736z"/>\r
-   <path fill="#fbfbfb" d="m157.479 167.201c1.7 0.188 12.176-2.171 12.554-1.227 0.377 0.755-6.512 2.832-8.778 5.191-0.755 0.755-2.736 2.549-3.964 2.36-0.942-0.094-1.51-2.077-2.926-3.587-3.398-3.397-5.568-3.115-4.907-4.436 0.565-1.038 5.096 1.415 8.021 1.699z"/>\r
-   <path fill="#f8f8f8" d="m157.525 167.241c1.663 0.184 11.914-2.124 12.283-1.201 0.369 0.739-6.372 2.771-8.589 5.08-0.738 0.739-2.679 2.494-3.879 2.309-0.924-0.092-1.479-2.032-2.863-3.51-3.325-3.324-5.449-3.048-4.803-4.341 0.555-1.015 4.988 1.385 7.851 1.663z"/>\r
-   <path fill="#f5f5f5" d="m157.57 167.281c1.626 0.18 11.652-2.078 12.014-1.175 0.361 0.723-6.231 2.711-8.4 4.969-0.723 0.722-2.619 2.439-3.793 2.258-0.903-0.09-1.446-1.987-2.802-3.433-3.252-3.251-5.329-2.981-4.695-4.245 0.54-0.993 4.876 1.354 7.676 1.626z"/>\r
-   <path fill="#f2f2f2" d="m157.615 167.321c1.59 0.176 11.391-2.031 11.745-1.148 0.352 0.706-6.093 2.649-8.212 4.856-0.707 0.707-2.562 2.385-3.709 2.208-0.883-0.088-1.413-1.943-2.738-3.356-3.179-3.178-5.209-2.914-4.591-4.15 0.529-0.971 4.768 1.324 7.505 1.59z"/>\r
-   <path fill="#efefef" d="m157.66 167.361c1.554 0.172 11.13-1.985 11.475-1.122 0.346 0.69-5.952 2.589-8.022 4.745-0.69 0.69-2.503 2.33-3.624 2.157-0.863-0.086-1.381-1.898-2.675-3.279-3.106-3.105-5.09-2.847-4.486-4.055 0.517-0.948 4.658 1.294 7.332 1.554z"/>\r
-   <path fill="#ebebeb" d="m157.705 167.401c1.518 0.168 10.868-1.938 11.206-1.096 0.336 0.674-5.813 2.528-7.835 4.634-0.674 0.674-2.444 2.275-3.539 2.106-0.842-0.084-1.348-1.853-2.612-3.202-3.032-3.032-4.97-2.78-4.38-3.959 0.505-0.926 4.549 1.263 7.16 1.517z"/>\r
-   <path fill="#e8e8e8" d="m157.751 167.441c1.48 0.164 10.606-1.892 10.936-1.069 0.329 0.657-5.673 2.467-7.646 4.522-0.658 0.657-2.385 2.22-3.453 2.055-0.822-0.082-1.315-1.809-2.549-3.124-2.96-2.96-4.851-2.714-4.275-3.865 0.491-0.904 4.438 1.233 6.987 1.481z"/>\r
-   <path fill="#e5e5e5" d="m157.796 167.481c1.444 0.16 10.346-1.845 10.666-1.043 0.32 0.641-5.532 2.406-7.458 4.41-0.641 0.642-2.325 2.166-3.367 2.005-0.803-0.08-1.284-1.764-2.486-3.047-2.887-2.887-4.732-2.647-4.17-3.769 0.48-0.882 4.329 1.202 6.815 1.444z"/>\r
-   <path fill="#e2e2e2" d="m157.841 167.521c1.407 0.156 10.083-1.799 10.397-1.017 0.312 0.625-5.394 2.346-7.271 4.299-0.625 0.625-2.267 2.111-3.282 1.954-0.782-0.078-1.251-1.719-2.423-2.97-2.814-2.814-4.612-2.58-4.065-3.674 0.469-0.859 4.221 1.172 6.644 1.408z"/>\r
-   <path fill="#dfdfdf" d="m157.886 167.56c1.37 0.152 9.821-1.751 10.127-0.99 0.304 0.609-5.254 2.285-7.081 4.188-0.609 0.609-2.208 2.056-3.198 1.903-0.761-0.076-1.218-1.675-2.36-2.893-2.741-2.741-4.492-2.513-3.959-3.579 0.456-0.837 4.111 1.142 6.471 1.371z"/>\r
-   <path fill="#dbdbdb" d="m157.931 167.6c1.335 0.148 9.561-1.704 9.857-0.963 0.296 0.592-5.114 2.223-6.893 4.076-0.593 0.593-2.149 2.001-3.113 1.853-0.741-0.074-1.186-1.631-2.297-2.817-2.668-2.667-4.373-2.446-3.854-3.483 0.445-0.815 4.003 1.111 6.3 1.334z"/>\r
-   <path fill="#d8d8d8" d="m157.977 167.64c1.298 0.144 9.299-1.658 9.587-0.937 0.288 0.576-4.974 2.163-6.704 3.964-0.576 0.577-2.091 1.947-3.027 1.803-0.721-0.072-1.153-1.586-2.234-2.74-2.596-2.594-4.253-2.379-3.748-3.388 0.431-0.792 3.891 1.081 6.126 1.298z"/>\r
-   <path fill="#d5d5d5" d="m158.022 167.68c1.261 0.14 9.037-1.611 9.317-0.911 0.28 0.56-4.834 2.102-6.516 3.853-0.56 0.561-2.032 1.892-2.942 1.752-0.7-0.07-1.12-1.541-2.172-2.663-2.521-2.521-4.133-2.312-3.643-3.292 0.421-0.77 3.784 1.05 5.956 1.261z"/>\r
-   <path fill="#d2d2d2" d="m158.067 167.72c1.225 0.136 8.775-1.564 9.049-0.884 0.271 0.543-4.695 2.041-6.327 3.741-0.545 0.544-1.974 1.837-2.857 1.701-0.682-0.068-1.09-1.497-2.109-2.585-2.449-2.449-4.014-2.246-3.538-3.198 0.407-0.748 3.673 1.02 5.782 1.225z"/>\r
-   <path fill="#cfcfcf" d="m158.112 167.76c1.188 0.132 8.515-1.518 8.779-0.858 0.264 0.527-4.555 1.98-6.139 3.63-0.527 0.528-1.915 1.782-2.772 1.65-0.66-0.066-1.057-1.452-2.046-2.508-2.376-2.376-3.895-2.179-3.433-3.103 0.397-0.725 3.565 0.99 5.611 1.189z"/>\r
-   <path fill="#ccc" d="m158.157 167.8c1.152 0.128 8.253-1.472 8.51-0.832 0.255 0.511-4.415 1.92-5.95 3.518-0.512 0.512-1.855 1.728-2.688 1.6-0.64-0.064-1.023-1.407-1.983-2.431-2.303-2.303-3.773-2.112-3.326-3.007 0.383-0.703 3.454 0.959 5.437 1.152z"/>\r
-   <path fill="#c8c8c8" d="m158.203 167.84c1.115 0.124 7.991-1.425 8.239-0.805 0.248 0.494-4.274 1.858-5.761 3.406-0.496 0.496-1.798 1.673-2.603 1.549-0.62-0.063-0.992-1.363-1.921-2.354-2.229-2.229-3.655-2.045-3.221-2.912 0.372-0.681 3.346 0.929 5.267 1.116z"/>\r
-   <path fill="#c5c5c5" d="m158.248 167.88c1.079 0.12 7.73-1.379 7.97-0.779 0.239 0.478-4.135 1.798-5.572 3.295-0.479 0.479-1.739 1.618-2.518 1.498-0.6-0.06-0.959-1.318-1.857-2.277-2.157-2.157-3.535-1.978-3.116-2.816 0.359-0.659 3.235 0.898 5.093 1.079z"/>\r
-   <path fill="#c2c2c2" d="m158.293 167.92c1.042 0.116 7.469-1.332 7.701-0.753 0.231 0.462-3.995 1.737-5.385 3.184-0.463 0.463-1.68 1.563-2.432 1.447-0.579-0.058-0.927-1.273-1.796-2.2-2.084-2.084-3.415-1.911-3.01-2.721 0.348-0.636 3.127 0.868 4.922 1.043z"/>\r
-   <path fill="#bfbfbf" d="m158.338 167.959c1.007 0.112 7.207-1.285 7.432-0.726 0.223 0.446-3.855 1.676-5.196 3.072-0.447 0.447-1.621 1.509-2.347 1.397-0.56-0.056-0.895-1.229-1.732-2.123-2.011-2.011-3.296-1.844-2.905-2.626 0.334-0.614 3.016 0.838 4.748 1.006z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m194.253 11.922c-1.222 2.631-3.812 23.214-0.248 20.892 3.594-2.341 13.57-5.312 19.886-7.013 7.003-1.886-17.188-19.463-19.638-13.879z"/>\r
-   <path fill="#060606" d="m194.485 12.307c-1.21 2.594-3.704 22.255-0.234 20.007 3.491-2.262 13.077-5.1 19.039-6.782 6.59-1.905-16.436-18.609-18.805-13.225z"/>\r
-   <path fill="#0c0c0c" d="m194.717 12.691c-1.198 2.557-3.595 21.296-0.221 19.124 3.391-2.184 12.586-4.888 18.194-6.551 6.177-1.924-15.684-17.757-17.973-12.573z"/>\r
-   <path fill="#131313" d="m194.949 13.076c-1.187 2.52-3.487 20.337-0.207 18.239 3.288-2.105 12.093-4.676 17.348-6.321 5.763-1.941-14.933-16.903-17.141-11.918z"/>\r
-   <path fill="#191919" d="m195.181 13.46c-1.177 2.483-3.379 19.378-0.193 17.355 3.187-2.027 11.6-4.464 16.502-6.09 5.349-1.959-14.182-16.05-16.309-11.265z"/>\r
-   <path fill="#1f1f1f" d="m195.413 13.845c-1.164 2.446-3.27 18.419-0.18 16.471 3.086-1.949 11.107-4.252 15.657-5.859 4.935-1.978-13.43-15.198-15.477-10.612z"/>\r
-   <path fill="#262626" d="m195.645 14.229c-1.153 2.409-3.162 17.46-0.166 15.586 2.983-1.87 10.616-4.04 14.811-5.628 4.521-1.995-12.679-14.344-14.645-9.958z"/>\r
-   <path fill="#2c2c2c" d="m195.878 14.614c-1.142 2.372-3.055 16.501-0.152 14.702 2.882-1.792 10.123-3.828 13.965-5.398 4.107-2.013-11.929-13.49-13.813-9.304z"/>\r
-   <path fill="#333" d="m196.11 14.999c-1.131 2.335-2.946 15.542-0.14 13.817 2.78-1.713 9.631-3.616 13.119-5.167 3.695-2.031-11.175-12.637-12.979-8.65z"/>\r
-   <path fill="#393939" d="m196.342 15.383c-1.118 2.299-2.838 14.583-0.126 12.934 2.68-1.636 9.139-3.404 12.274-4.937 3.28-2.049-10.425-11.784-12.148-7.997z"/>\r
-   <path fill="#3f3f3f" d="m196.574 15.768c-1.108 2.261-2.729 13.624-0.112 12.049 2.577-1.557 8.646-3.192 11.429-4.706 2.865-2.068-9.675-10.931-11.317-7.343z"/>\r
-   <path fill="#464646" d="m196.806 16.152c-1.097 2.225-2.622 12.665-0.1 11.165 2.477-1.479 8.154-2.98 10.583-4.475 2.453-2.086-8.922-10.078-10.483-6.69z"/>\r
-   <path fill="#4c4c4c" d="m197.038 16.537c-1.085 2.188-2.513 11.706-0.085 10.28 2.374-1.4 7.661-2.768 9.737-4.244 2.039-2.104-8.171-9.225-9.652-6.036z"/>\r
-   <path fill="#525252" d="m197.27 16.921c-1.073 2.151-2.405 10.747-0.071 9.396 2.272-1.322 7.168-2.556 8.891-4.013 1.625-2.122-7.42-8.371-8.82-5.383z"/>\r
-   <path fill="#595959" d="m197.502 17.306c-1.062 2.113-2.297 9.788-0.058 8.512 2.172-1.244 6.677-2.344 8.046-3.783 1.211-2.14-6.669-7.518-7.988-4.729z"/>\r
-   <path fill="#5f5f5f" d="m197.734 17.69c-1.05 2.077-2.188 8.829-0.044 7.627 2.069-1.165 6.184-2.132 7.2-3.552 0.797-2.157-5.917-6.664-7.156-4.075z"/>\r
-   <path fill="#666" d="m197.966 18.075c-1.038 2.04-2.079 7.87-0.029 6.743 1.968-1.087 5.69-1.92 6.354-3.321 0.382-2.176-5.167-5.812-6.325-3.422z"/>\r
-   <path fill="#6c6c6c" d="m198.198 18.459c-1.027 2.003-1.972 6.911-0.017 5.859 1.866-1.008 5.198-1.708 5.509-3.09-0.03-2.194-4.415-4.959-5.492-2.769z"/>\r
-   <path fill="#727272" d="m198.43 18.844c-1.017 1.966-1.863 5.952-0.003 4.975 1.765-0.93 4.706-1.496 4.662-2.86-0.443-2.212-3.662-4.106-4.659-2.115z"/>\r
-   <path fill="#797979" d="m198.662 19.228c-1.004 1.929-1.755 4.993 0.011 4.09 1.663-0.852 4.215-1.284 3.817-2.629-0.858-2.23-2.912-3.251-3.828-1.461z"/>\r
-   <path fill="#7f7f7f" d="m198.894 19.612c-0.993 1.892-1.647 4.034 0.023 3.206 1.563-0.773 3.723-1.072 2.973-2.398-1.272-2.248-2.161-2.399-2.996-0.808z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m143.502 46.386c-0.72 2.16 8.712 5.112 10.801 6.984 2.808 2.52 3.023 7.488 6.336 5.472 2.159-1.296 0.504-4.176-3.456-8.568-5.833-6.481-13.033-5.689-13.681-3.888z"/>\r
-   <path fill="#050505" d="m143.991 46.582c-0.716 2.073 8.275 4.9 10.336 6.741 2.745 2.457 2.961 7.249 6.146 5.313 2.094-1.254 0.449-4.072-3.343-8.28-5.574-6.203-12.491-5.505-13.139-3.774z"/>\r
-   <path fill="#0a0a0a" d="m144.479 46.779c-0.71 1.987 7.839 4.688 9.873 6.498 2.682 2.394 2.897 7.009 5.956 5.154 2.028-1.212 0.395-3.968-3.228-7.993-5.319-5.926-11.953-5.321-12.601-3.659z"/>\r
-   <path fill="#0f0f0f" d="m144.967 46.976c-0.704 1.9 7.403 4.476 9.41 6.254 2.62 2.33 2.835 6.77 5.766 4.995 1.964-1.171 0.342-3.864-3.112-7.706-5.064-5.647-11.415-5.137-12.064-3.543z"/>\r
-   <path fill="#141414" d="m145.456 47.172c-0.701 1.813 6.966 4.263 8.946 6.011 2.557 2.266 2.772 6.53 5.575 4.835 1.897-1.129 0.287-3.76-2.998-7.418-4.807-5.369-10.874-4.952-11.523-3.428z"/>\r
-   <path fill="#191919" d="m145.944 47.369c-0.696 1.726 6.53 4.051 8.483 5.768 2.493 2.203 2.71 6.291 5.385 4.676 1.833-1.087 0.231-3.656-2.884-7.13-4.551-5.093-10.335-4.769-10.984-3.314z"/>\r
-   <path fill="#1e1e1e" d="m146.433 47.565c-0.692 1.64 6.093 3.839 8.019 5.525 2.431 2.14 2.647 6.052 5.194 4.517 1.768-1.046 0.179-3.552-2.77-6.843-4.293-4.814-9.794-4.585-10.443-3.199z"/>\r
-   <path fill="#232323" d="m146.921 47.762c-0.686 1.553 5.657 3.627 7.558 5.282 2.367 2.076 2.583 5.813 5.003 4.357 1.702-1.003 0.124-3.448-2.654-6.555-4.04-4.537-9.257-4.401-9.907-3.084z"/>\r
-   <path fill="#282828" d="m147.409 47.959c-0.681 1.466 5.221 3.415 7.094 5.039 2.305 2.013 2.521 5.573 4.813 4.198 1.637-0.962 0.07-3.344-2.54-6.268-3.782-4.26-8.717-4.218-9.367-2.969z"/>\r
-   <path fill="#2d2d2d" d="m147.898 48.156c-0.677 1.379 4.784 3.203 6.63 4.795 2.242 1.949 2.457 5.333 4.622 4.039 1.572-0.92 0.016-3.24-2.425-5.98-3.526-3.983-8.177-4.034-8.827-2.854z"/>\r
-   <path fill="#333" d="m148.386 48.353c-0.673 1.292 4.348 2.99 6.167 4.552 2.179 1.886 2.394 5.095 4.432 3.88 1.506-0.878-0.038-3.136-2.312-5.693-3.268-3.705-7.636-3.85-8.287-2.739z"/>\r
-   <path fill="#383838" d="m148.875 48.549c-0.668 1.206 3.911 2.778 5.703 4.309 2.116 1.823 2.331 4.855 4.242 3.721 1.439-0.836-0.093-3.032-2.197-5.405-3.013-3.428-7.098-3.667-7.748-2.625z"/>\r
-   <path fill="#3d3d3d" d="m149.363 48.746c-0.662 1.119 3.475 2.566 5.24 4.065 2.053 1.759 2.268 4.616 4.052 3.562 1.375-0.795-0.147-2.928-2.082-5.118-2.757-3.15-6.559-3.483-7.21-2.509z"/>\r
-   <path fill="#424242" d="m149.851 48.942c-0.657 1.032 3.039 2.354 4.776 3.823 1.99 1.696 2.205 4.376 3.861 3.402 1.31-0.753-0.201-2.824-1.967-4.831-2.5-2.871-6.018-3.298-6.67-2.394z"/>\r
-   <path fill="#474747" d="m150.34 49.139c-0.652 0.946 2.603 2.142 4.313 3.58 1.927 1.632 2.143 4.137 3.671 3.243 1.244-0.712-0.256-2.72-1.853-4.543-2.245-2.595-5.48-3.115-6.131-2.28z"/>\r
-   <path fill="#4c4c4c" d="m150.828 49.336c-0.647 0.859 2.166 1.93 3.851 3.336 1.863 1.569 2.079 3.898 3.48 3.084 1.179-0.67-0.31-2.616-1.739-4.255-1.988-2.317-4.94-2.932-5.592-2.165z"/>\r
-   <path fill="#515151" d="m151.317 49.533c-0.645 0.772 1.729 1.718 3.386 3.093 1.802 1.505 2.018 3.658 3.29 2.925 1.114-0.628-0.364-2.512-1.624-3.968-1.732-2.04-4.4-2.748-5.052-2.05z"/>\r
-   <path fill="#565656" d="m151.805 49.729c-0.639 0.685 1.293 1.505 2.923 2.85 1.738 1.442 1.954 3.419 3.1 2.766 1.048-0.586-0.418-2.408-1.509-3.681-1.476-1.762-3.862-2.563-4.514-1.935z"/>\r
-   <path fill="#5b5b5b" d="m152.293 49.926c-0.633 0.598 0.857 1.293 2.46 2.606 1.677 1.379 1.892 3.18 2.91 2.606 0.983-0.544-0.473-2.304-1.395-3.393-1.22-1.483-3.322-2.379-3.975-1.819z"/>\r
-   <path fill="#606060" d="m152.782 50.123c-0.629 0.512 0.42 1.081 1.996 2.363 1.613 1.315 1.828 2.94 2.719 2.447 0.918-0.502-0.525-2.2-1.28-3.105-0.963-1.207-2.782-2.196-3.435-1.705z"/>\r
-   <path fill="#666" d="m153.27 50.319c-0.624 0.425-0.017 0.869 1.533 2.12 1.55 1.252 1.765 2.701 2.528 2.288 0.853-0.461-0.581-2.096-1.166-2.818-0.706-0.929-2.242-2.012-2.895-1.59z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m193.47 45.594c-0.072 1.08 2.951 1.728 4.896 2.448 1.944 0.648 5.76 3.24 7.56 5.256 1.801 1.944 5.688 7.704 6.553 6.192 0.863-1.368-2.017-5.328-2.809-6.984s-3.239-5.256-7.128-6.48c-3.384-1.008-9-1.297-9.072-0.432z"/>\r
-   <path fill="#060606" d="m193.779 45.67c-0.071 1.05 2.869 1.685 4.758 2.387 1.891 0.633 5.598 3.161 7.345 5.122 1.747 1.893 5.535 7.493 6.376 6.027 0.84-1.328-1.936-5.173-2.738-6.795-0.8-1.622-3.175-5.09-6.952-6.301-3.282-0.995-8.718-1.28-8.789-0.44z"/>\r
-   <path fill="#0c0c0c" d="m194.088 45.747c-0.07 1.021 2.785 1.641 4.62 2.327 1.836 0.618 5.436 3.081 7.131 4.988 1.692 1.842 5.382 7.282 6.198 5.862 0.814-1.288-1.855-5.019-2.67-6.607-0.808-1.587-3.11-4.925-6.776-6.122-3.178-0.983-8.433-1.264-8.503-0.448z"/>\r
-   <path fill="#131313" d="m194.397 45.824c-0.071 0.991 2.702 1.598 4.481 2.267 1.782 0.603 5.272 3.001 6.916 4.854 1.64 1.791 5.229 7.071 6.022 5.697 0.788-1.248-1.776-4.865-2.603-6.418-0.815-1.554-3.044-4.759-6.599-5.942-3.073-0.973-8.148-1.251-8.217-0.458z"/>\r
-   <path fill="#191919" d="m194.706 45.9c-0.069 0.961 2.618 1.555 4.345 2.206 1.728 0.588 5.109 2.922 6.7 4.721 1.586 1.74 5.075 6.86 5.846 5.531 0.764-1.207-1.696-4.711-2.532-6.23-0.824-1.519-2.979-4.593-6.424-5.763-2.972-0.959-7.866-1.234-7.935-0.465z"/>\r
-   <path fill="#1f1f1f" d="m195.015 45.977c-0.07 0.931 2.534 1.511 4.207 2.146 1.672 0.573 4.945 2.843 6.485 4.586 1.531 1.689 4.921 6.649 5.668 5.367 0.738-1.167-1.616-4.557-2.464-6.042-0.832-1.485-2.914-4.428-6.247-5.583-2.868-0.948-7.581-1.219-7.649-0.474z"/>\r
-   <path fill="#262626" d="m195.324 46.054c-0.069 0.901 2.451 1.468 4.069 2.085 1.618 0.557 4.784 2.763 6.271 4.453 1.479 1.638 4.769 6.438 5.491 5.201 0.714-1.127-1.536-4.402-2.396-5.854-0.839-1.451-2.848-4.263-6.07-5.404-2.765-0.934-7.298-1.202-7.365-0.481z"/>\r
-   <path fill="#2c2c2c" d="m195.632 46.13c-0.067 0.872 2.369 1.424 3.933 2.025 1.563 0.542 4.621 2.684 6.056 4.318 1.424 1.587 4.615 6.228 5.315 5.036 0.688-1.086-1.456-4.248-2.326-5.665-0.848-1.416-2.783-4.097-5.896-5.224-2.662-0.923-7.015-1.187-7.082-0.49z"/>\r
-   <path fill="#333" d="m195.941 46.207c-0.068 0.842 2.285 1.381 3.794 1.964 1.51 0.527 4.458 2.605 5.842 4.185 1.37 1.536 4.461 6.016 5.138 4.871 0.662-1.046-1.377-4.093-2.258-5.476-0.855-1.382-2.718-3.932-5.718-5.045-2.56-0.911-6.732-1.172-6.798-0.499z"/>\r
-   <path fill="#393939" d="m196.25 46.284c-0.066 0.813 2.202 1.338 3.656 1.904 1.456 0.512 4.296 2.525 5.627 4.051 1.317 1.485 4.308 5.805 4.961 4.706 0.638-1.006-1.296-3.939-2.188-5.288-0.863-1.348-2.652-3.766-5.542-4.866-2.457-0.899-6.449-1.157-6.514-0.507z"/>\r
-   <path fill="#3f3f3f" d="m196.559 46.36c-0.067 0.783 2.118 1.295 3.518 1.844 1.402 0.497 4.133 2.446 5.412 3.917 1.263 1.434 4.155 5.594 4.785 4.541 0.612-0.966-1.217-3.785-2.12-5.1-0.872-1.313-2.587-3.6-5.366-4.687-2.353-0.886-6.165-1.141-6.229-0.515z"/>\r
-   <path fill="#464646" d="m196.868 46.437c-0.065 0.753 2.035 1.251 3.38 1.783 1.349 0.482 3.972 2.367 5.197 3.783 1.21 1.383 4.002 5.383 4.608 4.375 0.588-0.926-1.137-3.63-2.052-4.911-0.879-1.279-2.521-3.435-5.189-4.507-2.25-0.874-5.881-1.125-5.944-0.523z"/>\r
-   <path fill="#4c4c4c" d="m197.177 46.514c-0.066 0.723 1.95 1.208 3.241 1.723 1.293 0.467 3.809 2.287 4.983 3.649 1.155 1.332 3.848 5.172 4.431 4.21 0.563-0.885-1.057-3.476-1.982-4.723-0.888-1.245-2.456-3.269-5.014-4.328-2.146-0.862-5.597-1.109-5.659-0.531z"/>\r
-   <path fill="#525252" d="m197.486 46.591c-0.066 0.693 1.868 1.164 3.104 1.662 1.239 0.452 3.646 2.208 4.769 3.515 1.102 1.281 3.695 4.961 4.254 4.045 0.537-0.845-0.976-3.321-1.913-4.534-0.896-1.21-2.391-3.103-4.838-4.148-2.044-0.851-5.315-1.095-5.376-0.54z"/>\r
-   <path fill="#595959" d="m197.795 46.667c-0.064 0.664 1.784 1.121 2.968 1.602 1.184 0.437 3.481 2.128 4.552 3.381 1.049 1.23 3.542 4.75 4.078 3.88 0.512-0.805-0.897-3.167-1.846-4.346-0.902-1.176-2.325-2.938-4.66-3.969-1.942-0.838-5.031-1.078-5.092-0.548z"/>\r
-   <path fill="#5f5f5f" d="m198.104 46.744c-0.065 0.634 1.701 1.078 2.829 1.541 1.13 0.421 3.318 2.049 4.338 3.248 0.994 1.179 3.388 4.539 3.899 3.715 0.487-0.765-0.815-3.013-1.775-4.157-0.911-1.142-2.261-2.772-4.485-3.79-1.837-0.826-4.746-1.064-4.806-0.557z"/>\r
-   <path fill="#666" d="m198.413 46.821c-0.063 0.604 1.617 1.034 2.691 1.481 1.076 0.406 3.157 1.969 4.123 3.113 0.94 1.128 3.234 4.328 3.724 3.55 0.462-0.725-0.737-2.858-1.707-3.969-0.919-1.108-2.195-2.606-4.309-3.61-1.734-0.814-4.463-1.049-4.522-0.565z"/>\r
-   <path fill="#6c6c6c" d="m198.721 46.897c-0.063 0.574 1.534 0.991 2.554 1.42 1.021 0.391 2.994 1.89 3.908 2.979 0.887 1.077 3.082 4.117 3.548 3.384 0.436-0.685-0.657-2.704-1.64-3.78-0.927-1.074-2.13-2.44-4.132-3.431-1.631-0.8-4.179-1.031-4.238-0.572z"/>\r
-   <path fill="#727272" d="m199.03 46.974c-0.063 0.544 1.451 0.948 2.416 1.36 0.967 0.376 2.831 1.811 3.694 2.846 0.833 1.026 2.928 3.906 3.369 3.219 0.411-0.644-0.576-2.549-1.569-3.592-0.936-1.04-2.064-2.275-3.956-3.251-1.528-0.79-3.896-1.017-3.954-0.582z"/>\r
-   <path fill="#797979" d="m199.339 47.051c-0.062 0.515 1.368 0.904 2.278 1.299 0.913 0.361 2.669 1.731 3.479 2.712 0.779 0.975 2.774 3.695 3.193 3.054 0.386-0.604-0.497-2.396-1.501-3.403-0.942-1.005-1.999-2.11-3.78-3.072-1.424-0.778-3.612-1.002-3.669-0.59z"/>\r
-   <path fill="#7f7f7f" d="m199.648 47.127c-0.063 0.485 1.284 0.861 2.14 1.239 0.859 0.346 2.506 1.652 3.265 2.578 0.726 0.924 2.621 3.484 3.017 2.889 0.361-0.564-0.417-2.241-1.432-3.215-0.951-0.971-1.935-1.944-3.604-2.893-1.323-0.765-3.33-0.986-3.386-0.598z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#995900" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.017 11.592-31.104 19.152-13.968 9.576-18.792 13.824-23.328 18.359-7.056 7.057-13.752 9.432-24.48 9.432s-15.552-2.231-18.863-5.184c-3.313-2.88-6.984-10.225-6.624-21.168 0.288-10.872 3.744-20.809 5.399-37.729 0.721-7.271 0.648-16.271 0.648-24.264 0-10.08 0.144-18.648 2.304-19.943 3.889-2.448 4.752-2.592 9.36-2.592 4.607 0 6.696 0.287 8.208 1.799 1.439 1.44 0.864 4.752 0.359 9.433-0.432 4.681 1.801 6.192 4.032 8.136 2.232 1.872 4.248 4.248 11.305 4.824 7.056 0.504 9.647-0.648 12.96-2.736 3.312-2.088 7.991-5.832 9.72-7.992 1.656-2.088 5.76-9.287 6.552-9.287 0.719 0 5.472-1.656 8.136 2.232z"/>\r
-   <path fill="#9e5e00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.12 11.556-31.26 19.008-13.885 9.371-18.903 13.54-23.521 17.902-6.912 6.74-13.414 9.084-23.915 9.019-10.411-0.047-15.116-2.181-18.414-5.118-3.297-2.867-6.931-9.966-6.613-20.578 0.205-10.851 3.701-20.683 5.256-37.279 0.666-7.379 0.407-16.303 0.335-24.375-0.076-10.068-0.072-18.627 2.084-19.922 3.889-2.444 4.752-2.592 9.36-2.592 4.607 0 6.7 0.291 8.208 1.799 1.491 1.492 0.767 4.887 0.205 9.408-0.63 4.658 1.458 6.486 3.795 8.607 2.34 2.059 4.489 4.471 11.534 5.021 7.232 0.482 10.015-0.832 13.362-3.106 3.303-2.207 7.773-5.903 9.513-8.168 1.641-2.132 5.727-9.386 6.519-9.386 0.719 0 5.472-1.656 8.136 2.232z"/>\r
-   <path fill="#a36400" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.226 11.52-31.414 18.863-13.803 9.166-19.016 13.256-23.717 17.447-6.768 6.422-13.075 8.733-23.35 8.604-10.094-0.094-14.682-2.131-17.964-5.055-3.283-2.852-6.876-9.705-6.603-19.987 0.122-10.828 3.657-20.556 5.112-36.828 0.612-7.487 0.165-16.336 0.021-24.487-0.15-10.058-0.287-18.605 1.865-19.9 3.889-2.44 4.752-2.592 9.36-2.592 4.607 0 6.703 0.295 8.208 1.799 1.541 1.541 0.67 5.02 0.051 9.383-0.828 4.637 1.116 6.781 3.556 9.078 2.448 2.248 4.731 4.695 11.766 5.221 7.409 0.461 10.383-1.016 13.767-3.477 3.29-2.326 7.552-5.977 9.302-8.346 1.627-2.175 5.695-9.482 6.487-9.482 0.72-0.001 5.473-1.657 8.137 2.231z"/>\r
-   <path fill="#a86a00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.329 11.484-31.568 18.72-13.721 8.961-19.127 12.972-23.911 16.989-6.624 6.105-12.737 8.384-22.785 8.189-9.777-0.141-14.245-2.08-17.514-4.99-3.27-2.836-6.822-9.445-6.591-19.396 0.038-10.807 3.613-20.43 4.968-36.378 0.558-7.597-0.076-16.368-0.292-24.599-0.228-10.047-0.504-18.584 1.645-19.879 3.889-2.438 4.752-2.592 9.36-2.592 4.607 0 6.707 0.299 8.208 1.799 1.591 1.593 0.573 5.152-0.104 9.357-1.025 4.615 0.774 7.077 3.319 9.551 2.556 2.434 4.972 4.918 11.995 5.418 7.585 0.439 10.75-1.199 14.17-3.849 3.279-2.444 7.333-6.048 9.093-8.521 1.613-2.219 5.663-9.58 6.455-9.58 0.719 0.001 5.472-1.655 8.136 2.233z"/>\r
-   <path fill="#ad7000" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.434 11.447-31.724 18.576-13.637 8.756-19.238 12.687-24.106 16.531-6.479 5.789-12.397 8.035-22.219 7.776-9.461-0.188-13.809-2.03-17.063-4.925-3.254-2.823-6.769-9.188-6.581-18.807-0.043-10.785 3.571-20.305 4.824-35.928 0.504-7.705-0.316-16.402-0.604-24.711-0.303-10.037-0.72-18.563 1.425-19.857 3.889-2.434 4.752-2.592 9.36-2.592 4.607 0 6.711 0.303 8.208 1.799 1.642 1.643 0.475 5.285-0.259 9.332-1.225 4.594 0.432 7.373 3.082 10.022 2.664 2.621 5.212 5.142 12.225 5.616 7.762 0.418 11.117-1.383 14.573-4.219 3.269-2.563 7.113-6.121 8.885-8.698 1.598-2.261 5.63-9.677 6.422-9.677 0.719 0.002 5.472-1.654 8.136 2.234z"/>\r
-   <path fill="#b27500" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.538 11.412-31.879 18.432-13.554 8.551-19.35 12.402-24.3 16.074-6.336 5.473-12.06 7.686-21.654 7.361-9.144-0.233-13.374-1.979-16.613-4.859-3.24-2.809-6.714-8.928-6.57-18.216-0.126-10.765 3.528-20.179 4.68-35.478 0.45-7.813-0.558-16.435-0.918-24.822-0.378-10.026-0.936-18.541 1.206-19.836 3.889-2.43 4.752-2.592 9.36-2.592 4.607 0 6.714 0.305 8.208 1.799 1.691 1.693 0.378 5.418-0.414 9.307-1.422 4.572 0.09 7.668 2.844 10.494 2.772 2.808 5.454 5.363 12.456 5.814 7.938 0.396 11.484-1.566 14.977-4.591 3.258-2.682 6.894-6.192 8.676-8.874 1.584-2.304 5.598-9.773 6.39-9.773 0.718 0 5.471-1.656 8.135 2.232z"/>\r
-   <path fill="#b77b00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.643 11.376-32.033 18.288-13.472 8.345-19.461 12.118-24.494 15.616-6.192 5.156-11.723 7.338-21.089 6.949-8.827-0.281-12.938-1.93-16.164-4.795-3.226-2.795-6.66-8.67-6.56-17.627-0.209-10.742 3.485-20.052 4.536-35.027 0.396-7.92-0.799-16.467-1.23-24.934-0.454-10.015-1.152-18.52 0.985-19.814 3.889-2.426 4.752-2.592 9.36-2.592 4.607 0 6.718 0.31 8.208 1.799 1.743 1.744 0.281 5.553-0.569 9.281-1.62 4.551-0.252 7.963 2.607 10.967 2.88 2.994 5.694 5.586 12.686 6.012 8.115 0.373 11.852-1.75 15.379-4.961 3.248-2.801 6.676-6.264 8.469-9.051 1.568-2.348 5.564-9.871 6.356-9.871 0.72 0 5.473-1.656 8.137 2.232z"/>\r
-   <path fill="#bc8100" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.747 11.34-32.188 18.145-13.389 8.139-19.574 11.834-24.689 15.159-6.048 4.839-11.383 6.988-20.523 6.534-8.51-0.328-12.503-1.879-15.714-4.73-3.211-2.779-6.606-8.41-6.549-17.035-0.292-10.721 3.441-19.926 4.393-34.578 0.342-8.028-1.041-16.498-1.545-25.045-0.529-10.004-1.368-18.498 0.767-19.793 3.889-2.422 4.752-2.592 9.36-2.592 4.607 0 6.721 0.313 8.208 1.799 1.793 1.793 0.184 5.686-0.723 9.256-1.818 4.529-0.595 8.259 2.367 11.438 2.988 3.184 5.938 5.811 12.917 6.211 8.291 0.352 12.22-1.934 15.783-5.332 3.236-2.92 6.454-6.336 8.258-9.227 1.556-2.391 5.533-9.969 6.325-9.969 0.72-0.001 5.473-1.657 8.137 2.231z"/>\r
-   <path fill="#c18700" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.852 11.304-32.343 18-13.306 7.936-19.685 11.549-24.883 14.703-5.904 4.521-11.045 6.638-19.959 6.119-8.193-0.375-12.067-1.828-15.264-4.666-3.197-2.764-6.553-8.149-6.537-16.444-0.375-10.699 3.397-19.8 4.248-34.128 0.288-8.137-1.282-16.531-1.858-25.156-0.604-9.994-1.584-18.477 0.547-19.771 3.889-2.42 4.752-2.592 9.36-2.592 4.607 0 6.725 0.316 8.208 1.799 1.843 1.845 0.087 5.818-0.878 9.231-2.017 4.507-0.937 8.554 2.131 11.909 3.096 3.369 6.178 6.033 13.146 6.408 8.468 0.33 12.587-2.117 16.187-5.703 3.225-3.038 6.235-6.408 8.049-9.402 1.541-2.436 5.501-10.066 6.293-10.066 0.72-0.001 5.473-1.657 8.137 2.231z"/>\r
-   <path fill="#c68c00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.955 11.268-32.498 17.855-13.223 7.73-19.796 11.266-25.077 14.246-5.761 4.204-10.706 6.289-19.394 5.707-7.877-0.423-11.631-1.779-14.813-4.602-3.183-2.751-6.498-7.891-6.527-15.855-0.457-10.677 3.355-19.674 4.104-33.678 0.234-8.244-1.521-16.563-2.17-25.268-0.681-9.983-1.8-18.455 0.327-19.75 3.889-2.416 4.752-2.592 9.36-2.592 4.607 0 6.729 0.32 8.208 1.799 1.894 1.895-0.011 5.951-1.033 9.207-2.214 4.484-1.278 8.848 1.895 12.379 3.203 3.558 6.418 6.258 13.377 6.607 8.644 0.309 12.952-2.301 16.589-6.074 3.215-3.156 6.016-6.479 7.841-9.58 1.526-2.477 5.468-10.162 6.26-10.162 0.718 0.001 5.471-1.655 8.135 2.233z"/>\r
-   <path fill="#cc9200" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.061 11.232-32.652 17.712-13.141 7.524-19.908 10.979-25.272 13.788-5.616 3.888-10.368 5.939-18.828 5.292-7.56-0.468-11.195-1.728-14.363-4.536-3.168-2.736-6.444-7.632-6.517-15.264-0.54-10.656 3.313-19.549 3.96-33.229 0.181-8.352-1.764-16.596-2.483-25.38-0.757-9.972-2.017-18.433 0.107-19.728 3.889-2.412 4.752-2.592 9.36-2.592 4.607 0 6.731 0.323 8.208 1.799 1.944 1.945-0.108 6.084-1.188 9.181-2.412 4.464-1.62 9.144 1.656 12.853 3.313 3.744 6.66 6.479 13.608 6.803 8.819 0.289 13.319-2.483 16.991-6.443 3.204-3.275 5.797-6.553 7.633-9.756 1.512-2.52 5.436-10.26 6.228-10.26 0.719 0 5.472-1.656 8.136 2.232z"/>\r
-   <path fill="#d19800" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.164 11.195-32.808 17.568-13.057 7.318-20.019 10.695-25.466 13.33-5.473 3.571-10.03 5.592-18.263 4.879-7.243-0.516-10.761-1.678-13.914-4.472-3.153-2.722-6.391-7.372-6.506-14.674-0.623-10.634 3.27-19.422 3.816-32.778 0.126-8.459-2.005-16.627-2.797-25.49-0.832-9.961-2.232-18.412-0.112-19.707 3.889-2.408 4.752-2.592 9.36-2.592 4.607 0 6.736 0.328 8.208 1.799 1.995 1.996-0.205 6.219-1.343 9.156-2.61 4.442-1.962 9.438 1.419 13.323 3.42 3.931 6.9 6.703 13.838 7.002 8.997 0.267 13.687-2.668 17.395-6.815 3.194-3.395 5.577-6.623 7.424-9.932 1.497-2.564 5.403-10.357 6.195-10.357 0.721 0 5.474-1.656 8.138 2.232z"/>\r
-   <path fill="#d69e00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.27 11.16-32.962 17.424-12.975 7.114-20.132 10.412-25.661 12.874-5.327 3.254-9.69 5.242-17.697 4.464-6.927-0.563-10.325-1.627-13.464-4.406-3.14-2.707-6.337-7.113-6.494-14.084-0.706-10.611 3.225-19.295 3.672-32.328 0.072-8.567-2.247-16.66-3.111-25.603-0.907-9.95-2.448-18.39-0.331-19.685 3.889-2.404 4.752-2.592 9.36-2.592 4.607 0 6.739 0.332 8.208 1.799 2.045 2.045-0.302 6.352-1.497 9.131-2.808 4.421-2.304 9.734 1.18 13.795 3.528 4.119 7.144 6.927 14.069 7.199 9.173 0.246 14.055-2.851 17.799-7.185 3.182-3.514 5.356-6.696 7.214-10.108 1.483-2.607 5.371-10.455 6.163-10.455 0.719 0 5.472-1.656 8.136 2.232z"/>\r
-   <path fill="#dba300" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.373 11.124-33.116 17.279-12.893 6.91-20.243 10.127-25.855 12.418-5.184 2.937-9.353 4.892-17.133 4.05-6.609-0.609-9.889-1.577-13.014-4.343-3.125-2.692-6.282-6.854-6.483-13.492-0.789-10.592 3.182-19.17 3.528-31.879 0.018-8.676-2.488-16.692-3.425-25.713-0.982-9.94-2.664-18.369-0.551-19.664 3.889-2.401 4.752-2.592 9.36-2.592 4.607 0 6.743 0.334 8.208 1.799 2.095 2.097-0.399 6.484-1.652 9.105-3.006 4.398-2.646 10.029 0.943 14.268 3.636 4.305 7.384 7.148 14.299 7.397 9.349 0.224 14.422-3.034 18.202-7.558 3.171-3.631 5.137-6.768 7.005-10.284 1.469-2.649 5.339-10.552 6.131-10.552 0.72 0.001 5.473-1.655 8.137 2.233z"/>\r
-   <path fill="#e0a900" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.478 11.088-33.271 17.136-12.81 6.704-20.354 9.843-26.05 11.96-5.04 2.62-9.015 4.543-16.567 3.637-6.293-0.656-9.453-1.527-12.563-4.277-3.11-2.68-6.229-6.596-6.474-12.903-0.871-10.569 3.141-19.044 3.384-31.428-0.035-8.784-2.728-16.726-3.735-25.826-1.06-9.929-2.88-18.347-0.771-19.642 3.889-2.397 4.752-2.592 9.36-2.592 4.607 0 6.747 0.338 8.208 1.799 2.146 2.146-0.497 6.617-1.808 9.08-3.203 4.377-2.987 10.324 0.706 14.738 3.744 4.493 7.624 7.373 14.529 7.596 9.526 0.203 14.789-3.217 18.605-7.926 3.161-3.752 4.918-6.841 6.797-10.463 1.454-2.693 5.306-10.648 6.098-10.648 0.719-0.001 5.472-1.657 8.136 2.231z"/>\r
-   <path fill="#e5af00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.582 11.052-33.427 16.992-12.726 6.498-20.466 9.558-26.244 11.502-4.896 2.304-8.676 4.193-16.002 3.222-5.976-0.702-9.018-1.476-12.114-4.212-3.096-2.664-6.174-6.336-6.462-12.313-0.953-10.547 3.097-18.918 3.24-30.978-0.09-8.892-2.97-16.758-4.05-25.938-1.134-9.918-3.096-18.324-0.99-19.619 3.889-2.395 4.752-2.592 9.36-2.592 4.607 0 6.75 0.342 8.208 1.799 2.196 2.197-0.594 6.75-1.962 9.055-3.402 4.355-3.33 10.619 0.468 15.21 3.852 4.681 7.866 7.597 14.76 7.794 9.702 0.18 15.156-3.402 19.008-8.298 3.15-3.87 4.698-6.912 6.589-10.638 1.439-2.736 5.273-10.746 6.065-10.746 0.72 0 5.473-1.656 8.137 2.232z"/>\r
-   <path fill="#eab500" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.687 11.016-33.582 16.848-12.643 6.293-20.576 9.274-26.438 11.045-4.752 1.987-8.338 3.846-15.438 2.809-5.658-0.75-8.582-1.426-11.664-4.147-3.08-2.649-6.119-6.077-6.45-11.722-1.037-10.526 3.053-18.792 3.096-30.528-0.144-9-3.211-16.79-4.363-26.049-1.21-9.907-3.312-18.304-1.21-19.599 3.889-2.391 4.752-2.592 9.36-2.592 4.607 0 6.754 0.346 8.208 1.799 2.247 2.248-0.691 6.885-2.117 9.029-3.6 4.336-3.672 10.916 0.231 15.682 3.96 4.867 8.106 7.82 14.989 7.992 9.879 0.158 15.523-3.586 19.411-8.668 3.141-3.99 4.479-6.984 6.38-10.814 1.426-2.78 5.241-10.844 6.033-10.844 0.721-0.001 5.474-1.657 8.138 2.231z"/>\r
-   <path fill="#efba00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.791 10.98-33.735 16.703-12.562 6.089-20.69 8.99-26.633 10.589-4.608 1.67-7.999 3.496-14.872 2.394-5.343-0.796-8.147-1.375-11.215-4.082-3.066-2.636-6.065-5.818-6.439-11.132-1.12-10.504 3.009-18.666 2.952-30.077-0.198-9.109-3.453-16.822-4.677-26.162-1.285-9.896-3.528-18.281-1.43-19.576 3.889-2.387 4.752-2.592 9.36-2.592 4.607 0 6.757 0.35 8.208 1.799 2.297 2.297-0.788 7.018-2.271 9.004-3.798 4.314-4.014 11.211-0.008 16.154 4.068 5.055 8.35 8.043 15.221 8.189 10.056 0.137 15.892-3.77 19.815-9.039 3.128-4.107 4.258-7.057 6.17-10.99 1.411-2.824 5.209-10.941 6.001-10.941 0.72-0.001 5.473-1.657 8.137 2.231z"/>\r
-   <path fill="#f4c000" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.896 10.943-33.891 16.561-12.478 5.883-20.801 8.704-26.827 10.131-4.464 1.353-7.661 3.146-14.307 1.979-5.025-0.843-7.711-1.325-10.765-4.019-3.053-2.621-6.012-5.558-6.429-10.541-1.203-10.482 2.966-18.539 2.809-29.627-0.253-9.217-3.694-16.855-4.99-26.272-1.361-9.886-3.744-18.261-1.649-19.556 3.889-2.383 4.752-2.592 9.36-2.592 4.607 0 6.761 0.353 8.208 1.799 2.347 2.349-0.885 7.15-2.426 8.979-3.996 4.291-4.356 11.505-0.245 16.625 4.176 5.241 8.59 8.265 15.451 8.388 10.23 0.115 16.258-3.953 20.218-9.41 3.117-4.227 4.039-7.129 5.961-11.168 1.396-2.865 5.177-11.037 5.969-11.037 0.72 0 5.473-1.656 8.137 2.232z"/>\r
-   <path fill="#f9c600" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.999 10.908-34.046 16.416-12.395 5.678-20.912 8.421-27.021 9.674-4.32 1.036-7.322 2.797-13.741 1.566-4.709-0.891-7.275-1.275-10.314-3.953-3.037-2.607-5.958-5.299-6.419-9.951-1.284-10.461 2.925-18.414 2.664-29.178-0.306-9.324-3.934-16.887-5.302-26.385-1.437-9.875-3.96-18.238-1.869-19.533 3.889-2.379 4.752-2.592 9.36-2.592 4.607 0 6.765 0.356 8.208 1.799 2.397 2.398-0.983 7.283-2.581 8.955-4.194 4.269-4.698 11.799-0.482 17.096 4.284 5.429 8.83 8.488 15.682 8.586 10.407 0.094 16.625-4.137 20.621-9.781 3.106-4.345 3.819-7.199 5.753-11.344 1.382-2.909 5.144-11.135 5.936-11.135 0.718 0 5.471-1.656 8.135 2.232z"/>\r
-   <path fill="#fc0" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-22.104 10.872-34.2 16.271-12.313 5.473-21.024 8.137-27.217 9.217-4.176 0.72-6.983 2.447-13.176 1.151-4.392-0.937-6.84-1.224-9.864-3.888-3.023-2.592-5.903-5.04-6.407-9.359-1.368-10.441 2.88-18.289 2.52-28.729-0.36-9.432-4.176-16.92-5.616-26.496-1.512-9.864-4.176-18.217-2.088-19.512 3.889-2.377 4.752-2.592 9.36-2.592 4.607 0 6.768 0.359 8.208 1.799 2.448 2.449-1.08 7.416-2.736 8.929-4.392 4.248-5.04 12.096-0.72 17.567 4.392 5.617 9.072 8.713 15.912 8.785 10.584 0.071 16.992-4.32 21.023-10.152 3.097-4.465 3.601-7.272 5.544-11.521 1.368-2.952 5.112-11.231 5.904-11.231 0.72 0.001 5.473-1.655 8.137 2.233z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m236.263 275.762c-0.709-0.258-3.932-15.209-2.191-16.239 3.351-1.997 4.253-2.319 8.377-2.319s6.057 0.322 7.346 1.61c2.126 2.127-1.159 6.702-2.448 7.991-3.738 3.673-10.375 9.215-11.084 8.957z"/>\r
-   <path fill="#ffcc02" d="m236.492 275.286c-0.77-0.326-4.102-14.719-2.368-15.742 3.344-1.992 4.278-2.211 8.322-2.211 4.124 0 5.976 0.269 7.282 1.602 2.105 2.136-1.119 6.572-2.398 7.852-3.727 3.663-10.081 8.811-10.838 8.499z"/>\r
-   <path fill="#ffcc05" d="m236.721 274.809c-0.832-0.393-4.273-14.229-2.547-15.247 3.339-1.983 4.306-2.101 8.269-2.101 4.124 0 5.896 0.213 7.217 1.592 2.087 2.146-1.076 6.443-2.346 7.714-3.718 3.653-9.788 8.409-10.593 8.042z"/>\r
-   <path fill="#ffcc07" d="m236.949 274.333c-0.892-0.461-4.443-13.74-2.722-14.75 3.331-1.979 4.33-1.992 8.213-1.992 4.124 0 5.814 0.158 7.151 1.582 2.068 2.156-1.033 6.316-2.294 7.574-3.707 3.644-9.494 8.007-10.348 7.586z"/>\r
-   <path fill="#ffcd0a" d="m237.178 273.855c-0.954-0.528-4.614-13.249-2.9-14.254 3.326-1.972 4.355-1.882 8.158-1.882 4.124 0 5.734 0.104 7.089 1.572 2.048 2.166-0.993 6.187-2.243 7.437-3.699 3.634-9.202 7.605-10.104 7.127z"/>\r
-   <path fill="#ffcd0c" d="m237.407 273.377c-1.015-0.596-4.785-12.758-3.077-13.758 3.319-1.965 4.382-1.771 8.104-1.771 4.124 0 5.653 0.049 7.023 1.563 2.029 2.176-0.951 6.057-2.19 7.299-3.69 3.623-8.91 7.201-9.86 6.667z"/>\r
-   <path fill="#ffcd0f" d="m237.636 272.901c-1.077-0.662-4.956-12.27-3.256-13.261 3.313-1.959 4.408-1.663 8.05-1.663 4.124 0 5.573-0.006 6.959 1.553 2.01 2.186-0.908 5.93-2.14 7.159-3.679 3.614-8.615 6.8-9.613 6.212z"/>\r
-   <path fill="#ffcd11" d="m237.864 272.424c-1.137-0.731-5.126-11.779-3.431-12.766 3.306-1.951 4.433-1.553 7.994-1.553 4.123 0 5.492-0.061 6.895 1.543 1.991 2.193-0.867 5.801-2.089 7.021-3.669 3.606-8.321 6.397-9.369 5.755z"/>\r
-   <path fill="#ffce14" d="m238.093 271.948c-1.197-0.799-5.297-11.289-3.607-12.27 3.299-1.946 4.459-1.443 7.938-1.443 4.124 0 5.412-0.115 6.83 1.533 1.973 2.204-0.824 5.671-2.037 6.883-3.659 3.596-8.028 5.993-9.124 5.297z"/>\r
-   <path fill="#ffce16" d="m238.322 271.471c-1.26-0.867-5.468-10.801-3.786-11.773 3.293-1.939 4.485-1.334 7.884-1.334 4.124 0 5.332-0.171 6.767 1.524 1.953 2.213-0.783 5.542-1.985 6.743-3.651 3.586-7.736 5.591-8.88 4.84z"/>\r
-   <path fill="#ffce19" d="m238.551 270.995c-1.32-0.935-5.639-10.312-3.963-11.277 3.286-1.934 4.511-1.225 7.829-1.225 4.124 0 5.252-0.226 6.702 1.514 1.934 2.224-0.741 5.414-1.934 6.605-3.64 3.576-7.442 5.187-8.634 4.383z"/>\r
-   <path fill="#ffce1c" d="m238.779 270.517c-1.382-1.002-5.809-9.821-4.14-10.781 3.279-1.926 4.535-1.114 7.774-1.114 4.124 0 5.171-0.279 6.637 1.504 1.914 2.233-0.698 5.285-1.882 6.467-3.63 3.566-7.148 4.784-8.389 3.924z"/>\r
-   <path fill="#ffcf1e" d="m239.008 270.04c-1.442-1.068-5.979-9.33-4.316-10.283 3.272-1.922 4.562-1.006 7.72-1.006 4.124 0 5.09-0.334 6.572 1.494 1.895 2.244-0.657 5.156-1.83 6.328-3.622 3.556-6.857 4.383-8.146 3.467z"/>\r
-   <path fill="#ffcf21" d="m239.237 269.563c-1.505-1.137-6.151-8.841-4.495-9.788 3.267-1.914 4.588-0.896 7.666-0.896 4.124 0 5.009-0.389 6.508 1.486 1.875 2.252-0.616 5.025-1.778 6.188-3.613 3.548-6.564 3.981-7.901 3.01z"/>\r
-   <path fill="#ffcf23" d="m239.466 269.086c-1.565-1.205-6.321-8.352-4.672-9.293 3.262-1.906 4.613-0.785 7.61-0.785 4.124 0 4.93-0.444 6.444 1.476 1.855 2.261-0.573 4.897-1.728 6.052-3.601 3.537-6.269 3.575-7.654 2.55z"/>\r
-   <path fill="#ffcf26" d="m239.694 268.61c-1.627-1.273-6.492-7.861-4.849-8.796 3.255-1.901 4.64-0.677 7.556-0.677 4.124 0 4.849-0.499 6.379 1.466 1.837 2.271-0.531 4.769-1.675 5.912-3.593 3.528-5.977 3.174-7.411 2.095z"/>\r
-   <path fill="#ffd028" d="m239.923 268.133c-1.688-1.34-6.663-7.373-5.025-8.301 3.248-1.895 4.665-0.566 7.501-0.566 4.124 0 4.768-0.555 6.314 1.456 1.817 2.28-0.489 4.64-1.624 5.774-3.583 3.519-5.684 2.771-7.166 1.637z"/>\r
-   <path fill="#ffd02b" d="m240.152 267.657c-1.749-1.408-6.834-6.883-5.203-7.805 3.241-1.889 4.69-0.457 7.446-0.457 4.124 0 4.687-0.609 6.25 1.447 1.798 2.289-0.448 4.51-1.573 5.635-3.572 3.509-5.39 2.367-6.92 1.18z"/>\r
-   <path fill="#ffd02d" d="m240.381 267.178c-1.811-1.475-7.005-6.391-5.381-7.307 3.235-1.881 4.717-0.348 7.393-0.348 4.124 0 4.606-0.664 6.185 1.438 1.779 2.299-0.405 4.381-1.521 5.496-3.564 3.501-5.098 1.965-6.676 0.721z"/>\r
-   <path fill="#ffd030" d="m240.609 266.702c-1.871-1.543-7.175-5.902-5.557-6.811 3.228-1.875 4.741-0.238 7.336-0.238 4.124 0 4.526-0.719 6.122 1.428 1.759 2.31-0.364 4.252-1.471 5.357-3.552 3.49-4.803 1.562-6.43 0.264z"/>\r
-   <path fill="#ffd133" d="m240.838 266.225c-1.933-1.611-7.346-5.413-5.734-6.314 3.222-1.869 4.768-0.129 7.281-0.129 4.124 0 4.446-0.773 6.058 1.418 1.74 2.318-0.322 4.123-1.418 5.219-3.545 3.48-4.512 1.16-6.187-0.194z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m302.769 263.374c3.742 5.461-0.062 12.76 2.638 17.117-6.809-6.258-9.938-8.834-19.324 0.367 2.577-3.742 3.129-6.257 4.725-9.814 1.104-2.455 4.354-9.57 5.029-9.57 0.613-0.001 4.724-1.35 6.932 1.9z"/>\r
-   <path fill="#ffcc02" d="m302.73 263.413c3.655 5.334 0.035 12.601 2.578 16.723-6.668-6.098-9.729-8.666-18.908 0.322 2.421-3.527 3.025-6.094 4.605-9.592 1.122-2.462 4.243-9.302 4.951-9.311 0.628-0.008 4.617-1.318 6.774 1.858z"/>\r
-   <path fill="#ffcc05" d="m302.691 263.45c3.568 5.209 0.132 12.441 2.517 16.332-6.526-5.938-9.519-8.5-18.492 0.277 2.268-3.314 2.924-5.934 4.488-9.372 1.141-2.468 4.132-9.032 4.873-9.052 0.641-0.013 4.508-1.284 6.614 1.815z"/>\r
-   <path fill="#ffcc07" d="m302.652 263.487c3.48 5.086 0.229 12.282 2.457 15.939-6.386-5.777-9.311-8.332-18.076 0.232 2.111-3.1 2.819-5.771 4.369-9.15 1.158-2.475 4.021-8.762 4.795-8.791 0.655-0.019 4.399-1.254 6.455 1.77z"/>\r
-   <path fill="#ffcd0a" d="m302.614 263.524c3.393 4.96 0.323 12.123 2.396 15.549-6.245-5.617-9.102-8.164-17.66 0.188 1.955-2.887 2.716-5.611 4.251-8.93 1.176-2.481 3.91-8.494 4.716-8.533 0.67-0.027 4.291-1.219 6.297 1.726z"/>\r
-   <path fill="#ffcd0c" d="m302.575 263.562c3.306 4.835 0.419 11.964 2.335 15.155-6.104-5.457-8.891-7.996-17.244 0.143 1.8-2.673 2.613-5.449 4.133-8.707 1.194-2.488 3.8-8.225 4.638-8.273 0.684-0.036 4.182-1.189 6.138 1.682z"/>\r
-   <path fill="#ffcd0f" d="m302.536 263.599c3.219 4.71 0.517 11.805 2.275 14.765-5.963-5.299-8.683-7.83-16.828 0.098 1.644-2.461 2.51-5.289 4.015-8.486 1.212-2.496 3.688-7.956 4.559-8.016 0.698-0.04 4.075-1.155 5.979 1.639z"/>\r
-   <path fill="#ffcd11" d="m302.497 263.637c3.131 4.585 0.612 11.645 2.216 14.371-5.822-5.137-8.474-7.661-16.413 0.053 1.489-2.245 2.406-5.125 3.896-8.264 1.229-2.504 3.576-7.688 4.479-7.756 0.714-0.046 3.968-1.123 5.822 1.596z"/>\r
-   <path fill="#ffce14" d="m302.458 263.674c3.044 4.459 0.708 11.486 2.154 13.979-5.681-4.978-8.263-7.493-15.996 0.009 1.334-2.033 2.303-4.965 3.779-8.043 1.247-2.511 3.464-7.418 4.4-7.498 0.728-0.052 3.859-1.089 5.663 1.553z"/>\r
-   <path fill="#ffce16" d="m302.42 263.711c2.956 4.336 0.804 11.328 2.094 13.588-5.54-4.817-8.055-7.326-15.58-0.036 1.178-1.819 2.199-4.804 3.659-7.822 1.267-2.517 3.354-7.149 4.323-7.237 0.741-0.061 3.75-1.058 5.504 1.507z"/>\r
-   <path fill="#ffce19" d="m302.381 263.749c2.868 4.211 0.9 11.168 2.033 13.196-5.398-4.657-7.845-7.159-15.164-0.081 1.022-1.605 2.097-4.642 3.542-7.601 1.283-2.524 3.241-6.88 4.244-6.979 0.755-0.067 3.642-1.026 5.345 1.465z"/>\r
-   <path fill="#ffce1c" d="m302.342 263.788c2.78 4.084 0.997 11.008 1.973 12.803-5.258-4.498-7.635-6.991-14.748-0.127 0.867-1.391 1.994-4.479 3.424-7.379 1.302-2.531 3.13-6.61 4.166-6.719 0.768-0.074 3.532-0.992 5.185 1.422z"/>\r
-   <path fill="#ffcf1e" d="m302.302 263.825c2.693 3.959 1.093 10.85 1.913 12.411-5.117-4.338-7.427-6.825-14.333-0.172 0.713-1.177 1.891-4.317 3.307-7.157 1.318-2.537 3.018-6.342 4.086-6.461 0.784-0.08 3.426-0.959 5.027 1.379z"/>\r
-   <path fill="#ffcf21" d="m302.263 263.862c2.606 3.834 1.188 10.689 1.853 12.02-4.976-4.178-7.217-6.657-13.916-0.217 0.556-0.963 1.786-4.156 3.188-6.936 1.337-2.545 2.906-6.072 4.008-6.202 0.797-0.086 3.318-0.927 4.867 1.335z"/>\r
-   <path fill="#ffcf23" d="m302.225 263.899c2.519 3.71 1.285 10.531 1.791 11.628-4.835-4.019-7.008-6.489-13.5-0.262 0.4-0.75 1.684-3.994 3.068-6.714 1.356-2.553 2.797-5.805 3.931-5.943 0.813-0.093 3.209-0.895 4.71 1.291z"/>\r
-   <path fill="#ffcf26" d="m302.186 263.937c2.431 3.584 1.381 10.371 1.73 11.235-4.693-3.857-6.798-6.322-13.084-0.307 0.245-0.535 1.58-3.832 2.951-6.492 1.373-2.56 2.686-5.535 3.852-5.685 0.828-0.1 3.101-0.861 4.551 1.249z"/>\r
-   <path fill="#ffd028" d="m302.147 263.974c2.344 3.46 1.477 10.213 1.671 10.845-4.553-3.699-6.589-6.156-12.668-0.354 0.089-0.321 1.477-3.67 2.832-6.271 1.392-2.565 2.574-5.267 3.772-5.425 0.842-0.104 2.994-0.828 4.393 1.205z"/>\r
-   <path fill="#ffd02b" d="m302.108 264.012c2.257 3.334 1.573 10.053 1.61 10.451-4.412-3.537-6.38-5.987-12.253-0.396-0.064-0.109 1.374-3.51 2.716-6.05 1.408-2.573 2.462-4.997 3.693-5.166 0.856-0.112 2.886-0.796 4.234 1.161z"/>\r
-   <path fill="#ffd02d" d="m302.069 264.049c2.17 3.209 1.67 9.894 1.55 10.061-4.271-3.379-6.17-5.82-11.836-0.441-0.221 0.104 1.271-3.35 2.596-5.83 1.428-2.58 2.352-4.728 3.615-4.906 0.87-0.12 2.777-0.765 4.075 1.116z"/>\r
-   <path fill="#ffd030" d="m302.03 264.086c2.082 3.084 1.767 9.736 1.49 9.668-4.131-3.219-5.961-5.652-11.42-0.486-0.377 0.318 1.167-3.188 2.478-5.607 1.445-2.586 2.239-4.459 3.536-4.647 0.884-0.127 2.669-0.732 3.916 1.072z"/>\r
-   <path fill="#ffd133" d="m301.991 264.124c1.995 2.959 1.862 9.576 1.43 9.277-3.989-3.059-5.752-5.486-11.005-0.531-0.532 0.531 1.064-3.027 2.36-5.387 1.463-2.594 2.128-4.189 3.458-4.389 0.899-0.133 2.561-0.699 3.757 1.03z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m305.862 283.481c5.977 7.848 17.064 16.271 21.024 18.576 2.88 1.656 7.056 3.6 6.983 8.783-0.144 5.904-3.168 7.561-4.823 9.217-3.313 3.313-22.177 10.943-34.2 16.271-12.24 5.4-21.097 8.209-27.217 9.217-4.104 0.647-7.056 2.375-13.176 1.151-4.32-0.864-6.912-1.296-9.864-3.888-2.951-2.52-5.976-5.184-6.407-9.359-1.225-10.369 3.672-16.921 8.424-25.921 3.888-7.2 11.735-8.64 16.632-7.991 17.568 2.375 16.416-8.641 21.24-13.465 4.464-4.463 17.208-8.064 21.384-2.591z"/>\r
-   <path fill="#ffcc02" d="m305.81 283.553c5.962 7.83 17.024 16.234 20.975 18.533 2.873 1.652 7.039 3.592 6.969 8.764-0.145 5.891-3.161 7.542-4.813 9.195-3.304 3.304-22.34 10.992-34.24 16.088-12.259 5.176-20.647 7.873-26.802 8.959-4.077 0.684-7.156 2.394-13.258 1.177-4.304-0.854-6.767-1.231-9.707-3.812-2.939-2.51-5.756-4.961-6.185-9.117-1.211-10.34 3.365-16.657 8.044-25.65 3.89-7.375 11.791-8.434 16.665-7.777 17.514 2.414 16.206-8.959 21.02-13.772 4.452-4.454 17.166-8.047 21.332-2.588z"/>\r
-   <path fill="#ffcc05" d="m305.76 283.627c5.946 7.812 16.982 16.195 20.925 18.488 2.866 1.648 7.022 3.584 6.951 8.743-0.144 5.876-3.153 7.524-4.801 9.173-3.298 3.297-22.506 11.043-34.28 15.907-12.279 4.949-20.201 7.538-26.389 8.699-4.051 0.721-7.256 2.413-13.341 1.202-4.286-0.846-6.619-1.168-9.55-3.733-2.924-2.501-5.536-4.741-5.959-8.877-1.198-10.312 3.058-16.394 7.664-25.379 3.89-7.552 11.845-8.229 16.698-7.563 17.458 2.453 15.995-9.279 20.797-14.08 4.443-4.443 17.127-8.026 21.285-2.58z"/>\r
-   <path fill="#ffcc07" d="m305.707 283.702c5.935 7.791 16.943 16.156 20.876 18.444 2.859 1.644 7.007 3.574 6.935 8.722-0.144 5.862-3.146 7.508-4.79 9.151-3.288 3.289-22.668 11.093-34.319 15.726-12.298 4.723-19.753 7.202-25.974 8.44-4.024 0.756-7.357 2.431-13.423 1.226-4.27-0.836-6.473-1.101-9.394-3.654-2.911-2.492-5.317-4.52-5.735-8.635-1.185-10.285 2.75-16.133 7.284-25.109 3.892-7.727 11.9-8.023 16.731-7.35 17.402 2.494 15.785-9.599 20.575-14.389 4.433-4.432 17.087-8.007 21.234-2.572z"/>\r
-   <path fill="#ffcd0a" d="m305.655 283.774c5.92 7.773 16.904 16.119 20.826 18.4 2.854 1.642 6.99 3.566 6.919 8.703-0.143 5.848-3.138 7.488-4.779 9.129-3.28 3.281-22.832 11.143-34.358 15.543-12.317 4.498-19.307 6.867-25.561 8.182-3.997 0.793-7.457 2.45-13.506 1.251-4.252-0.828-6.325-1.036-9.236-3.577-2.896-2.482-5.096-4.298-5.51-8.393-1.172-10.258 2.443-15.869 6.904-24.84 3.892-7.901 11.955-7.818 16.763-7.135 17.349 2.532 15.576-9.918 20.355-14.697 4.422-4.422 17.046-7.987 21.183-2.566z"/>\r
-   <path fill="#ffcd0c" d="m305.603 283.847c5.906 7.756 16.864 16.081 20.777 18.358 2.846 1.635 6.973 3.557 6.901 8.68-0.142 5.835-3.131 7.472-4.767 9.107-3.273 3.273-22.997 11.193-34.399 15.361-12.337 4.273-18.858 6.533-25.146 7.924-3.971 0.829-7.557 2.469-13.588 1.276-4.234-0.82-6.179-0.972-9.078-3.5-2.884-2.474-4.878-4.076-5.287-8.152-1.158-10.229 2.137-15.606 6.523-24.569 3.895-8.076 12.01-7.611 16.797-6.92 17.293 2.571 15.366-10.236 20.134-15.004 4.412-4.411 17.006-7.969 21.133-2.561z"/>\r
-   <path fill="#ffcd0f" d="m305.552 283.92c5.892 7.736 16.824 16.043 20.728 18.313 2.839 1.634 6.957 3.55 6.886 8.66-0.142 5.821-3.124 7.454-4.756 9.086-3.266 3.267-23.161 11.243-34.438 15.179-12.356 4.047-18.411 6.198-24.733 7.666-3.943 0.865-7.656 2.486-13.67 1.301-4.218-0.812-6.032-0.908-8.922-3.422-2.869-2.465-4.656-3.855-5.063-7.91-1.145-10.203 1.83-15.344 6.145-24.299 3.895-8.252 12.064-7.408 16.83-6.707 17.237 2.61 15.154-10.557 19.912-15.313 4.399-4.399 16.963-7.949 21.081-2.554z"/>\r
-   <path fill="#ffcd11" d="m305.501 283.993c5.877 7.719 16.782 16.004 20.678 18.271 2.833 1.628 6.939 3.54 6.869 8.639-0.143 5.807-3.116 7.436-4.745 9.064-3.257 3.258-23.324 11.293-34.479 14.996-12.375 3.822-17.963 5.863-24.319 7.408-3.917 0.9-7.757 2.504-13.752 1.324-4.2-0.802-5.886-0.842-8.765-3.344-2.856-2.454-4.438-3.633-4.838-7.669-1.132-10.173 1.521-15.081 5.764-24.029 3.896-8.426 12.119-7.2 16.863-6.491 17.183 2.649 14.945-10.875 19.689-15.621 4.391-4.389 16.926-7.93 21.035-2.548z"/>\r
-   <path fill="#ffce14" d="m305.448 284.066c5.863 7.701 16.743 15.966 20.629 18.228 2.826 1.625 6.924 3.531 6.853 8.619-0.142 5.793-3.108 7.418-4.733 9.043-3.25 3.25-23.489 11.342-34.518 14.813-12.396 3.598-17.517 5.529-23.905 7.148-3.891 0.938-7.857 2.524-13.834 1.351-4.185-0.793-5.74-0.776-8.609-3.267-2.841-2.444-4.217-3.412-4.613-7.426-1.118-10.146 1.216-14.818 5.385-23.76 3.896-8.602 12.174-6.996 16.896-6.277 17.128 2.688 14.735-11.195 19.468-15.929 4.378-4.38 16.883-7.911 20.981-2.543z"/>\r
-   <path fill="#ffce16" d="m305.396 284.139c5.85 7.682 16.703 15.928 20.579 18.184 2.82 1.62 6.907 3.523 6.837 8.598-0.141 5.779-3.101 7.4-4.722 9.021-3.242 3.242-23.653 11.393-34.559 14.631-12.414 3.372-17.068 5.194-23.491 6.891-3.862 0.975-7.957 2.543-13.917 1.375-4.167-0.783-5.592-0.713-8.451-3.188-2.827-2.437-3.997-3.19-4.389-7.187-1.105-10.117 0.908-14.555 5.004-23.487 3.898-8.776 12.229-6.79 16.928-6.063 17.074 2.728 14.525-11.515 19.248-16.236 4.37-4.371 16.845-7.894 20.933-2.539z"/>\r
-   <path fill="#ffce19" d="m305.344 284.211c5.836 7.664 16.663 15.891 20.529 18.141 2.813 1.617 6.892 3.516 6.82 8.578-0.14 5.765-3.093 7.382-4.71 8.999-3.235 3.233-23.817 11.442-34.598 14.448-12.434 3.146-16.621 4.859-23.077 6.633-3.837 1.01-8.058 2.561-13.999 1.4-4.15-0.775-5.446-0.648-8.295-3.111-2.814-2.426-3.777-2.969-4.164-6.944-1.094-10.09 0.601-14.293 4.624-23.22 3.898-8.951 12.282-6.584 16.961-5.848 17.019 2.767 14.314-11.834 19.025-16.545 4.361-4.359 16.806-7.872 20.884-2.531z"/>\r
-   <path fill="#ffce1c" d="m305.292 284.286c5.822 7.646 16.623 15.852 20.481 18.096 2.806 1.613 6.874 3.507 6.804 8.558-0.141 5.751-3.086 7.364-4.699 8.978-3.227 3.227-23.981 11.492-34.638 14.267-12.453 2.921-16.173 4.524-22.663 6.374-3.81 1.046-8.158 2.578-14.082 1.424-4.133-0.766-5.299-0.583-8.137-3.033-2.801-2.416-3.558-2.748-3.94-6.703-1.08-10.062 0.293-14.029 4.244-22.947 3.9-9.127 12.338-6.379 16.994-5.635 16.964 2.805 14.105-12.152 18.805-16.853 4.348-4.351 16.763-7.856 20.831-2.526z"/>\r
-   <path fill="#ffcf1e" d="m305.241 284.358c5.808 7.627 16.582 15.814 20.432 18.053 2.799 1.609 6.856 3.498 6.787 8.536-0.141 5.738-3.079 7.347-4.688 8.957-3.219 3.218-24.145 11.541-34.677 14.084-12.473 2.695-15.727 4.188-22.25 6.115-3.783 1.083-8.258 2.599-14.163 1.448-4.116-0.756-5.153-0.518-7.981-2.954-2.786-2.408-3.337-2.526-3.716-6.462-1.066-10.034-0.013-13.766 3.864-22.678 3.901-9.303 12.393-6.172 17.027-5.42 16.908 2.844 13.896-12.473 18.583-17.16 4.338-4.337 16.723-7.835 20.782-2.519z"/>\r
-   <path fill="#ffcf21" d="m305.189 284.431c5.793 7.608 16.542 15.776 20.382 18.009 2.792 1.605 6.84 3.49 6.771 8.516-0.14 5.725-3.071 7.33-4.677 8.936-3.211 3.211-24.309 11.591-34.717 13.902-12.491 2.47-15.278 3.854-21.836 5.856-3.756 1.119-8.357 2.616-14.246 1.474-4.099-0.748-5.006-0.453-7.823-2.877-2.772-2.398-3.118-2.306-3.492-6.22-1.053-10.007-0.319-13.505 3.484-22.407 3.903-9.479 12.448-5.969 17.062-5.207 16.853 2.883 13.684-12.791 18.36-17.469 4.328-4.328 16.683-7.819 20.732-2.513z"/>\r
-   <path fill="#ffcf23" d="m305.137 284.504c5.778 7.59 16.503 15.736 20.332 17.965 2.786 1.602 6.825 3.482 6.755 8.496-0.139 5.709-3.064 7.311-4.665 8.912-3.204 3.203-24.474 11.642-34.759 13.721-12.51 2.244-14.829 3.52-21.421 5.598-3.729 1.155-8.457 2.635-14.327 1.499-4.082-0.739-4.86-0.389-7.667-2.8-2.76-2.389-2.897-2.083-3.268-5.979-1.04-9.979-0.627-13.24 3.104-22.138 3.903-9.653 12.503-5.762 17.093-4.991 16.799 2.922 13.475-13.111 18.141-17.777 4.318-4.316 16.643-7.799 20.682-2.506z"/>\r
-   <path fill="#ffcf26" d="m305.086 284.579c5.765 7.57 16.463 15.697 20.282 17.92 2.779 1.599 6.809 3.474 6.738 8.476-0.139 5.696-3.056 7.293-4.654 8.892-3.194 3.194-24.637 11.69-34.797 13.536-12.529 2.021-14.382 3.185-21.007 5.341-3.703 1.191-8.559 2.652-14.411 1.523-4.065-0.73-4.713-0.324-7.509-2.723-2.745-2.379-2.679-1.861-3.043-5.735-1.027-9.952-0.936-12.979 2.724-21.868 3.905-9.828 12.557-5.557 17.126-4.777 16.744 2.961 13.265-13.431 17.919-18.084 4.307-4.309 16.602-7.783 20.632-2.501z"/>\r
-   <path fill="#ffd028" d="m305.033 284.651c5.752 7.553 16.423 15.66 20.234 17.878 2.771 1.593 6.791 3.464 6.722 8.454-0.139 5.682-3.049 7.275-4.643 8.869-3.188 3.188-24.801 11.74-34.838 13.355-12.548 1.793-13.935 2.85-20.593 5.082-3.676 1.228-8.658 2.67-14.493 1.547-4.048-0.721-4.565-0.258-7.353-2.644-2.731-2.37-2.457-1.64-2.818-5.495-1.014-9.923-1.242-12.716 2.345-21.597 3.905-10.004 12.611-5.351 17.158-4.563 16.689 3 13.055-13.75 17.698-18.393 4.297-4.295 16.562-7.761 20.581-2.493z"/>\r
-   <path fill="#ffd02b" d="m304.982 284.724c5.737 7.534 16.382 15.622 20.184 17.834 2.766 1.59 6.774 3.456 6.705 8.433-0.138 5.67-3.041 7.26-4.631 8.85-3.18 3.179-24.966 11.789-34.877 13.172-12.568 1.568-13.487 2.515-20.179 4.824-3.65 1.263-8.759 2.688-14.575 1.572-4.031-0.713-4.42-0.195-7.196-2.566-2.718-2.361-2.238-1.42-2.594-5.254-1.001-9.896-1.549-12.453 1.964-21.328 3.907-10.178 12.666-5.145 17.192-4.348 16.634 3.039 12.844-14.068 17.476-18.701 4.285-4.286 16.521-7.743 20.531-2.488z"/>\r
-   <path fill="#ffd02d" d="m304.93 284.797c5.723 7.516 16.342 15.584 20.135 17.789 2.758 1.588 6.758 3.449 6.688 8.414-0.138 5.654-3.034 7.24-4.619 8.826-3.173 3.172-25.13 11.84-34.918 12.99-12.587 1.344-13.039 2.18-19.766 4.564-3.622 1.301-8.856 2.709-14.657 1.599-4.014-0.704-4.272-0.13-7.039-2.489-2.702-2.352-2.018-1.197-2.369-5.012-0.987-9.868-1.855-12.189 1.584-21.057 3.908-10.354 12.722-4.94 17.226-4.135 16.578 3.078 12.634-14.389 17.254-19.009 4.275-4.273 16.481-7.721 20.481-2.48z"/>\r
-   <path fill="#ffd030" d="m304.879 284.87c5.709 7.498 16.302 15.547 20.085 17.748 2.752 1.582 6.741 3.438 6.673 8.391-0.139 5.642-3.027 7.224-4.609 8.806-3.164 3.164-25.293 11.89-34.956 12.808-12.606 1.119-12.592 1.844-19.352 4.308-3.596 1.336-8.958 2.726-14.739 1.622-3.997-0.695-4.127-0.065-6.882-2.411-2.69-2.343-1.799-0.976-2.146-4.771-0.974-9.84-2.163-11.928 1.204-20.787 3.91-10.529 12.777-4.734 17.258-3.92 16.524 3.117 12.424-14.707 17.034-19.316 4.263-4.267 16.439-7.706 20.43-2.478z"/>\r
-   <path fill="#ffd133" d="m304.826 284.943c5.695 7.479 16.263 15.509 20.036 17.703 2.745 1.579 6.726 3.431 6.656 8.372-0.137 5.627-3.02 7.205-4.597 8.783-3.157 3.156-25.458 11.939-34.997 12.625-12.626 0.893-12.145 1.51-18.938 4.049-3.569 1.373-9.058 2.745-14.822 1.646-3.979-0.686-3.979 0-6.725-2.332-2.676-2.334-1.578-0.756-1.921-4.529-0.961-9.813-2.471-11.665 0.824-20.516 3.91-10.705 12.83-4.529 17.29-3.707 16.47 3.156 12.215-15.027 16.813-19.625 4.255-4.253 16.401-7.684 20.381-2.469z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#995900" d="m52.494 273.618c-6.479 4.68-22.896 4.248-27.072 9.719-4.104 5.473 0.145 13.393 0.072 28.08 0 6.265-1.08 11.017-1.8 14.832-1.008 4.824-1.656 8.209 0.36 11.664 3.672 6.121 9.575 7.633 43.344 14.688 18.072 3.744 35.136 13.464 46.584 14.399 11.448 0.865 13.896-2.951 20.88-9.144 6.912-6.192 9.144-4.248 8.928-17.856-0.216-13.535-8.928-17.567-18.792-33.191s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.208 13.248-14.688 17.929z"/>\r
-   <path fill="#9e5e00" d="m52.598 273.905c-6.397 4.702-22.475 3.788-27.062 9.512-4.154 5.414 0.228 13.276 0.098 27.955-0.025 6.23-1.152 10.881-1.937 14.877-1.037 4.871-1.678 8.201 0.349 11.619 3.787 6.162 9.695 7.123 43.456 14.168 18.061 3.737 34.541 13.307 46.343 14.112 11.186 0.792 13.564-2.829 20.463-8.96 6.896-6.195 9.024-4.277 8.858-17.406-0.075-13.521-8.305-17.349-18.169-32.973s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.153 13.479-14.583 18.216z"/>\r
-   <path fill="#a36400" d="m52.703 274.193c-6.314 4.724-22.054 3.327-27.051 9.304-4.204 5.356 0.31 13.16 0.123 27.828-0.051 6.198-1.225 10.748-2.074 14.924-1.065 4.918-1.699 8.194 0.339 11.571 3.902 6.206 9.813 6.617 43.567 13.651 18.05 3.73 33.948 13.146 46.101 13.824 10.923 0.72 13.234-2.707 20.045-8.777 6.885-6.199 8.907-4.305 8.792-16.956 0.064-13.507-7.683-17.129-17.547-32.753s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.1 13.709-14.479 18.504z"/>\r
-   <path fill="#a86a00" d="m52.807 274.481c-6.231 4.745-21.633 2.866-27.04 9.094-4.255 5.299 0.393 13.047 0.148 27.702-0.076 6.167-1.297 10.616-2.211 14.972-1.095 4.965-1.721 8.188 0.328 11.524 4.018 6.25 9.932 6.108 43.679 13.134 18.039 3.721 33.354 12.988 45.86 13.535 10.659 0.648 12.902-2.585 19.627-8.593 6.869-6.203 8.788-4.335 8.723-16.507 0.205-13.492-7.06-16.909-16.924-32.533s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.045 13.94-14.374 18.792z"/>\r
-   <path fill="#ad7000" d="m52.912 274.769c-6.149 4.767-21.211 2.405-27.029 8.885-4.306 5.242 0.476 12.931 0.173 27.576-0.101 6.136-1.368 10.483-2.347 15.019-1.123 5.012-1.742 8.181 0.316 11.478 4.133 6.293 10.052 5.603 43.791 12.614 18.028 3.716 32.76 12.83 45.619 13.248 10.396 0.576 12.57-2.463 19.21-8.409 6.854-6.206 8.668-4.363 8.653-16.056 0.347-13.479-6.437-16.69-16.301-32.314s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.991 14.169-14.269 19.079z"/>\r
-   <path fill="#b27500" d="m53.016 275.057c-6.066 4.787-20.79 1.943-27.019 8.676-4.355 5.184 0.559 12.816 0.198 27.45-0.126 6.103-1.44 10.351-2.484 15.065-1.151 5.059-1.764 8.172 0.307 11.431 4.248 6.336 10.17 5.094 43.901 12.096 18.019 3.708 32.166 12.672 45.378 12.96 10.135 0.504 12.24-2.34 18.792-8.227 6.841-6.209 8.551-4.391 8.586-15.605 0.486-13.464-5.813-16.47-15.678-32.094s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.937 14.399-14.165 19.368z"/>\r
-   <path fill="#b77b00" d="m53.121 275.344c-5.983 4.811-20.369 1.484-27.008 8.469-4.406 5.126 0.641 12.7 0.224 27.324-0.151 6.068-1.512 10.216-2.621 15.111-1.181 5.105-1.785 8.166 0.295 11.385 4.363 6.379 10.289 4.586 44.014 11.576 18.008 3.701 31.572 12.515 45.137 12.672 9.872 0.433 11.909-2.217 18.375-8.041 6.825-6.215 8.431-4.422 8.518-15.156 0.627-13.45-5.191-16.251-15.056-31.875s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.884 14.631-14.062 19.655z"/>\r
-   <path fill="#bc8100" d="m53.225 275.633c-5.9 4.832-19.948 1.023-26.997 8.259-4.457 5.069 0.724 12.585 0.249 27.198-0.177 6.037-1.584 10.082-2.758 15.158-1.21 5.152-1.808 8.158 0.284 11.338 4.479 6.422 10.407 4.078 44.125 11.059 17.997 3.693 30.979 12.355 44.896 12.384 9.608 0.36 11.578-2.095 17.957-7.858 6.812-6.217 8.313-4.449 8.45-14.707 0.766-13.435-4.569-16.03-14.434-31.654s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.829 14.859-13.956 19.943z"/>\r
-   <path fill="#c18700" d="m53.329 275.92c-5.817 4.854-19.526 0.563-26.985 8.051-4.507 5.011 0.807 12.47 0.273 27.072-0.201 6.004-1.655 9.949-2.894 15.205-1.239 5.199-1.829 8.151 0.273 11.291 4.594 6.465 10.526 3.57 44.236 10.541 17.985 3.686 30.384 12.196 44.655 12.096 9.345 0.287 11.245-1.973 17.539-7.676 6.797-6.221 8.193-4.479 8.381-14.256 0.906-13.42-3.946-15.812-13.811-31.436s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.774 15.094-13.851 20.232z"/>\r
-   <path fill="#c68c00" d="m53.433 276.209c-5.734 4.875-19.104 0.101-26.975 7.84-4.558 4.955 0.89 12.355 0.299 26.947-0.227 5.973-1.728 9.816-3.031 15.252-1.267 5.246-1.851 8.145 0.263 11.244 4.709 6.508 10.646 3.063 44.349 10.022 17.975 3.679 29.79 12.038 44.413 11.808 9.083 0.217 10.915-1.851 17.122-7.492 6.782-6.224 8.074-4.506 8.313-13.806 1.048-13.405-3.323-15.592-13.188-31.216s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.722 15.322-13.749 20.521z"/>\r
-   <path fill="#cc9200" d="m53.538 276.497c-5.651 4.896-18.684-0.359-26.964 7.633-4.607 4.896 0.972 12.24 0.324 26.82-0.252 5.939-1.8 9.684-3.168 15.299-1.296 5.293-1.872 8.137 0.252 11.196 4.824 6.552 10.764 2.556 44.46 9.505 17.964 3.672 29.196 11.879 44.172 11.52 8.82 0.144 10.584-1.729 16.704-7.309 6.768-6.228 7.956-4.535 8.244-13.355 1.188-13.393-2.7-15.372-12.564-30.996s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.668 15.551-13.644 20.807z"/>\r
-   <path fill="#d19800" d="m53.642 276.786c-5.569 4.918-18.263-0.82-26.953 7.424-4.658 4.838 1.055 12.123 0.35 26.693-0.277 5.907-1.872 9.551-3.305 15.346-1.325 5.34-1.894 8.129 0.241 11.15 4.938 6.596 10.883 2.048 44.571 8.984 17.953 3.666 28.602 11.723 43.931 11.232 8.558 0.072 10.253-1.605 16.287-7.123 6.753-6.232 7.837-4.566 8.175-12.906 1.329-13.379-2.077-15.153-11.941-30.777s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.614 15.783-13.54 21.097z"/>\r
-   <path fill="#d69e00" d="m53.747 277.073c-5.486 4.94-17.842-1.281-26.942 7.215-4.709 4.781 1.138 12.01 0.374 26.568-0.302 5.875-1.943 9.417-3.441 15.393-1.354 5.387-1.915 8.123 0.23 11.104 5.055 6.639 11.002 1.541 44.684 8.467 17.942 3.658 28.008 11.563 43.688 10.944 8.296 0 9.923-1.483 15.869-6.941 6.74-6.235 7.72-4.593 8.108-12.456 1.468-13.363-1.455-14.933-11.319-30.557s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.56 16.012-13.435 21.383z"/>\r
-   <path fill="#dba300" d="m53.851 277.361c-5.403 4.962-17.421-1.741-26.932 7.007-4.759 4.723 1.221 11.893 0.399 26.441-0.327 5.843-2.016 9.283-3.578 15.439-1.383 5.434-1.937 8.115 0.22 11.057 5.169 6.682 11.12 1.033 44.795 7.949 17.932 3.649 27.414 11.404 43.448 10.656 8.031-0.072 9.59-1.361 15.451-6.758 6.725-6.238 7.6-4.623 8.039-12.006 1.609-13.35-0.832-14.714-10.696-30.338s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.504 16.245-13.33 21.673z"/>\r
-   <path fill="#e0a900" d="m53.956 277.649c-5.321 4.982-16.999-2.203-26.921 6.797-4.81 4.666 1.303 11.779 0.425 26.316-0.353 5.811-2.088 9.15-3.715 15.486-1.411 5.48-1.959 8.108 0.208 11.01 5.285 6.725 11.239 0.525 44.907 7.431 17.92 3.644 26.819 11.246 43.207 10.368 7.769-0.145 9.259-1.239 15.034-6.574 6.71-6.242 7.479-4.65 7.97-11.557 1.75-13.334-0.209-14.493-10.073-30.117s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.452 16.474-13.226 21.96z"/>\r
-   <path fill="#e5af00" d="m54.06 277.937c-5.238 5.004-16.578-2.664-26.91 6.588-4.86 4.608 1.386 11.664 0.45 26.19-0.378 5.777-2.16 9.018-3.853 15.533-1.439 5.526-1.979 8.101 0.198 10.963 5.4 6.768 11.358 0.018 45.018 6.912 17.91 3.635 26.227 11.088 42.967 10.08 7.506-0.217 8.928-1.117 14.615-6.391 6.696-6.246 7.362-4.68 7.902-11.105 1.89-13.32 0.414-14.274-9.45-29.898s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.397 16.704-13.121 22.248z"/>\r
-   <path fill="#eab500" d="m54.165 278.225c-5.155 5.025-16.157-3.124-26.899 6.38-4.91 4.55 1.469 11.548 0.476 26.063-0.403 5.746-2.232 8.885-3.989 15.58-1.469 5.573-2.002 8.094 0.188 10.916 5.515 6.812 11.477-0.49 45.129 6.394 17.899 3.629 25.633 10.93 42.725 9.792 7.243-0.288 8.598-0.993 14.199-6.206 6.681-6.25 7.243-4.709 7.833-10.656 2.031-13.306 1.037-14.055-8.827-29.679s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.346 16.935-13.019 22.536z"/>\r
-   <path fill="#efba00" d="m54.269 278.513c-5.073 5.048-15.736-3.585-26.889 6.171-4.961 4.492 1.552 11.434 0.5 25.938-0.428 5.713-2.304 8.752-4.125 15.627-1.498 5.621-2.023 8.086 0.176 10.869 5.631 6.854 11.596-0.996 45.241 5.875 17.889 3.623 25.038 10.771 42.483 9.504 6.981-0.359 8.266-0.871 13.781-6.022 6.668-6.253 7.125-4.737 7.766-10.206 2.17-13.291 1.659-13.835-8.205-29.459s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.289 17.164-12.912 22.823z"/>\r
-   <path fill="#f4c000" d="m54.374 278.801c-4.99 5.068-15.314-4.047-26.878 5.962-5.012 4.435 1.634 11.317 0.525 25.812-0.453 5.682-2.376 8.618-4.263 15.674-1.526 5.668-2.045 8.08 0.166 10.822 5.745 6.898 11.714-1.505 45.353 5.357 17.878 3.613 24.444 10.613 42.243 9.216 6.717-0.433 7.934-0.749 13.362-5.839 6.653-6.258 7.007-4.768 7.697-9.756 2.312-13.277 2.282-13.616-7.582-29.24s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.235 17.395-12.807 23.112z"/>\r
-   <path fill="#f9c600" d="m54.477 279.088c-4.906 5.092-14.893-4.506-26.866 5.754-5.062 4.377 1.717 11.203 0.551 25.686-0.479 5.648-2.448 8.485-4.399 15.721-1.555 5.715-2.066 8.072 0.155 10.775 5.86 6.941 11.833-2.012 45.464 4.839 17.867 3.607 23.851 10.454 42.001 8.929 6.455-0.504 7.604-0.627 12.946-5.656 6.638-6.26 6.886-4.795 7.628-9.307 2.452-13.262 2.905-13.396-6.959-29.02s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.182 17.626-12.705 23.399z"/>\r
-   <path fill="#fc0" d="m54.582 279.377c-4.823 5.111-14.472-4.969-26.855 5.543-5.112 4.32 1.8 11.088 0.576 25.561-0.504 5.616-2.521 8.352-4.536 15.768-1.584 5.76-2.088 8.064 0.144 10.729 5.977 6.984 11.952-2.52 45.576 4.32 17.856 3.6 23.256 10.295 41.76 8.64 6.192-0.576 7.272-0.504 12.528-5.472 6.624-6.264 6.768-4.824 7.56-8.856 2.592-13.248 3.528-13.176-6.336-28.8s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.129 17.855-12.601 23.687z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m57.701 285.002c-4.278 4.539-18.28-1.36-24.892 3.631-4.732 3.5 2.398 7.908 1.426 20.873-0.389 4.926-3.824 5.834-2.398 12.64 1.103 5.121 2.27 4.991 4.214 7.325 5.315 6.223 4.084 1.686 34.355 7.777 16.011 3.242 20.938 9.271 37.596 7.779 5.575-0.518 6.612-0.453 11.279-4.926 5.964-5.575 2.917-4.408 3.565-7.973 2.269-11.863 0.453-13.938-8.428-28.004-8.88-14.066-8.102-14.844-13.936-24.113-5.834-9.141-13.872-25.799-20.549-25.93-5.25-0.129-8.297 2.723-11.603 6.094-3.305 3.372-5.768 19.643-10.629 24.827z"/>\r
-   <path fill="#ffcc02" d="m57.995 285.094c-4.461 4.701-18.604-1.196-25.06 3.705-4.701 3.514 2.578 8.05 1.608 20.68-0.4 4.896-3.733 5.877-2.458 12.634 0.986 5.093 2.357 4.938 4.334 7.201 5.686 6.131 4.673 1.826 34.119 7.743 15.918 3.211 20.815 9.215 37.372 7.732 5.541-0.513 6.479-0.463 11.155-4.849 5.865-5.407 2.858-4.287 3.412-8.058 2.066-11.787 0.442-13.981-8.188-27.649-8.83-13.983-8.143-14.698-13.941-23.913-5.8-9.085-13.701-25.805-20.338-25.934-5.219-0.129-8.248 2.705-11.533 6.057-3.287 3.352-5.644 19.505-10.482 24.651z"/>\r
-   <path fill="#ffcc05" d="m58.289 285.185c-4.644 4.866-18.93-1.031-25.229 3.78-4.669 3.527 2.759 8.191 1.792 20.488-0.413 4.866-3.642 5.918-2.519 12.625 0.872 5.066 2.447 4.887 4.455 7.078 6.057 6.04 5.263 1.969 33.883 7.709 15.825 3.18 20.693 9.159 37.148 7.686 5.508-0.506 6.345-0.471 11.03-4.77 5.768-5.24 2.803-4.168 3.26-8.142 1.865-11.716 0.432-14.027-7.949-27.298-8.78-13.899-8.183-14.553-13.948-23.713-5.764-9.03-13.529-25.811-20.126-25.938-5.188-0.129-8.198 2.688-11.465 6.021-3.266 3.331-5.517 19.368-10.332 24.474z"/>\r
-   <path fill="#ffcc07" d="m58.584 285.276c-4.827 5.03-19.255-0.865-25.397 3.855-4.639 3.541 2.938 8.332 1.975 20.295-0.425 4.838-3.551 5.961-2.578 12.619 0.757 5.039 2.536 4.834 4.575 6.955 6.428 5.949 5.852 2.108 33.646 7.674 15.733 3.147 20.571 9.103 36.925 7.639 5.475-0.501 6.211-0.48 10.905-4.693 5.67-5.072 2.745-4.045 3.107-8.224 1.663-11.642 0.42-14.073-7.711-26.946-8.73-13.814-8.223-14.406-13.952-23.511-5.729-8.976-13.358-25.817-19.916-25.944-5.156-0.127-8.148 2.674-11.396 5.984s-5.391 19.229-10.183 24.297z"/>\r
-   <path fill="#ffcd0a" d="m58.878 285.368c-5.01 5.193-19.579-0.701-25.565 3.93-4.607 3.555 3.117 8.475 2.157 20.102-0.437 4.809-3.459 6.004-2.639 12.613 0.643 5.011 2.626 4.781 4.695 6.83 6.799 5.857 6.442 2.25 33.411 7.64 15.641 3.118 20.45 9.048 36.701 7.593 5.44-0.494 6.076-0.488 10.781-4.615 5.57-4.904 2.688-3.926 2.954-8.308 1.462-11.569 0.409-14.118-7.472-26.593-8.68-13.732-8.263-14.262-13.958-23.311-5.695-8.922-13.188-25.824-19.705-25.951-5.125-0.127-8.1 2.658-11.326 5.949-3.227 3.289-5.266 19.091-10.034 24.121z"/>\r
-   <path fill="#ffcd0c" d="m59.173 285.458c-5.193 5.358-19.905-0.535-25.734 4.008-4.577 3.566 3.297 8.613 2.34 19.908-0.449 4.778-3.368 6.045-2.698 12.605 0.526 4.982 2.715 4.729 4.815 6.707 7.17 5.766 7.031 2.391 33.175 7.604 15.549 3.088 20.328 8.994 36.477 7.547 5.408-0.488 5.943-0.498 10.657-4.537 5.472-4.737 2.63-3.805 2.802-8.393 1.261-11.494 0.398-14.162-7.232-26.24-8.63-13.647-8.304-14.117-13.964-23.109-5.66-8.867-13.017-25.829-19.494-25.956-5.094-0.126-8.05 2.642-11.257 5.912-3.21 3.27-5.142 18.955-9.887 23.944z"/>\r
-   <path fill="#ffcd0f" d="m59.467 285.547c-5.376 5.523-20.229-0.369-25.903 4.084-4.545 3.58 3.478 8.756 2.523 19.715-0.461 4.75-3.277 6.088-2.758 12.599 0.411 4.955 2.804 4.677 4.936 6.584 7.541 5.675 7.621 2.532 32.938 7.569 15.456 3.056 20.206 8.938 36.253 7.5 5.375-0.482 5.811-0.506 10.533-4.459 5.374-4.57 2.572-3.686 2.649-8.477 1.058-11.42 0.387-14.209-6.995-25.888-8.58-13.563-8.344-13.972-13.969-22.909-5.626-8.813-12.846-25.834-19.283-25.961-5.063-0.125-8 2.625-11.188 5.877-3.188 3.251-5.015 18.818-9.736 23.766z"/>\r
-   <path fill="#ffcd11" d="m59.76 285.639c-5.559 5.688-20.555-0.205-26.071 4.158-4.515 3.594 3.657 8.896 2.706 19.521-0.473 4.721-3.186 6.131-2.818 12.594 0.297 4.926 2.894 4.623 5.057 6.459 7.911 5.584 8.21 2.674 32.703 7.535 15.362 3.025 20.084 8.883 36.027 7.453 5.342-0.477 5.677-0.515 10.409-4.381 5.275-4.402 2.516-3.564 2.497-8.561 0.855-11.348 0.375-14.254-6.756-25.535-8.53-13.479-8.385-13.825-13.976-22.709-5.59-8.758-12.673-25.842-19.071-25.965-5.031-0.125-7.951 2.608-11.119 5.838-3.168 3.232-4.888 18.684-9.588 23.593z"/>\r
-   <path fill="#ffce14" d="m60.055 285.73c-5.742 5.851-20.88-0.04-26.24 4.233-4.483 3.607 3.837 9.039 2.889 19.33-0.485 4.69-3.095 6.172-2.878 12.584 0.182 4.9 2.982 4.572 5.177 6.338 8.282 5.492 8.8 2.814 32.467 7.498 15.271 2.996 19.962 8.828 35.804 7.408 5.309-0.472 5.543-0.523 10.285-4.304 5.177-4.235 2.458-3.444 2.344-8.644 0.654-11.273 0.364-14.299-6.518-25.184-8.479-13.395-8.425-13.679-13.98-22.507-5.556-8.704-12.502-25.849-18.86-25.972-5-0.123-7.901 2.593-11.05 5.803s-4.765 18.547-9.44 23.417z"/>\r
-   <path fill="#ffce16" d="m60.349 285.821c-5.925 6.016-21.205 0.125-26.408 4.309-4.453 3.621 4.017 9.18 3.07 19.137-0.496 4.662-3.002 6.215-2.938 12.579 0.066 4.872 3.072 4.518 5.298 6.213 8.653 5.401 9.389 2.956 32.23 7.464 15.178 2.964 19.84 8.771 35.58 7.361 5.275-0.465 5.409-0.532 10.159-4.225 5.079-4.068 2.401-3.324 2.192-8.729 0.452-11.2 0.354-14.346-6.279-24.831-8.429-13.312-8.464-13.534-13.985-22.306-5.521-8.65-12.331-25.854-18.649-25.978-4.969-0.123-7.853 2.577-10.98 5.767-3.129 3.19-4.637 18.409-9.29 23.239z"/>\r
-   <path fill="#ffce19" d="m60.643 285.911c-6.107 6.18-21.529 0.291-26.577 4.385-4.421 3.635 4.197 9.322 3.254 18.945-0.508 4.631-2.911 6.256-2.997 12.571-0.049 4.845 3.161 4.465 5.418 6.089 9.023 5.309 9.979 3.098 31.994 7.43 15.085 2.934 19.718 8.717 35.355 7.314 5.242-0.459 5.276-0.541 10.036-4.148 4.98-3.899 2.344-3.203 2.039-8.811 0.25-11.127 0.342-14.391-6.04-24.479-8.38-13.228-8.505-13.389-13.991-22.105-5.486-8.596-12.16-25.859-18.438-25.982-4.938-0.123-7.803 2.561-10.911 5.73-3.109 3.17-4.513 18.272-9.142 23.061z"/>\r
-   <path fill="#ffce1c" d="m60.938 286.002c-6.291 6.344-21.855 0.455-26.746 4.459-4.391 3.648 4.377 9.463 3.437 18.752-0.521 4.603-2.82 6.299-3.058 12.564-0.163 4.817 3.251 4.413 5.539 5.965 9.395 5.219 10.567 3.24 31.758 7.396 14.993 2.903 19.597 8.661 35.132 7.269 5.209-0.453 5.143-0.55 9.912-4.07 4.882-3.732 2.286-3.082 1.887-8.895 0.048-11.053 0.329-14.436-5.802-24.126-8.33-13.144-8.545-13.243-13.997-21.905-5.451-8.541-11.988-25.865-18.228-25.988-4.906-0.121-7.753 2.545-10.843 5.695-3.088 3.149-4.385 18.132-8.991 22.884z"/>\r
-   <path fill="#ffcf1e" d="m61.232 286.092c-6.473 6.51-22.18 0.621-26.914 4.535-4.359 3.662 4.557 9.604 3.619 18.559-0.532 4.574-2.729 6.342-3.117 12.559-0.278 4.789 3.34 4.36 5.659 5.842 9.766 5.127 11.157 3.381 31.521 7.359 14.9 2.872 19.475 8.607 34.908 7.223 5.176-0.447 5.008-0.559 9.787-3.992 4.784-3.565 2.229-2.963 1.735-8.979-0.155-10.98 0.317-14.482-5.564-23.773-8.279-13.061-8.585-13.098-14.002-21.705-5.416-8.485-11.817-25.871-18.017-25.992-4.875-0.121-7.704 2.527-10.773 5.658-3.068 3.128-4.26 17.995-8.842 22.706z"/>\r
-   <path fill="#ffcf21" d="m61.526 286.184c-6.655 6.673-22.505 0.785-27.082 4.611-4.328 3.674 4.736 9.744 3.802 18.365-0.544 4.543-2.638 6.383-3.178 12.551-0.394 4.761 3.43 4.308 5.78 5.718 10.136 5.036 11.746 3.522 31.285 7.325 14.808 2.841 19.353 8.551 34.685 7.176 5.142-0.441 4.875-0.567 9.663-3.914 4.685-3.398 2.171-2.842 1.582-9.063-0.357-10.906 0.307-14.527-5.325-23.422-8.23-12.976-8.625-12.951-14.008-21.503-5.382-8.432-11.646-25.878-17.806-25.999-4.844-0.119-7.654 2.512-10.704 5.622-3.049 3.109-4.134 17.859-8.694 22.533z"/>\r
-   <path fill="#ffcf23" d="m61.821 286.275c-6.839 6.837-22.83 0.95-27.251 4.687-4.298 3.688 4.916 9.886 3.984 18.172-0.557 4.515-2.546 6.426-3.237 12.545-0.509 4.732 3.519 4.255 5.9 5.594 10.507 4.945 12.336 3.663 31.05 7.29 14.715 2.812 19.23 8.496 34.46 7.129 5.108-0.435 4.74-0.575 9.538-3.835 4.587-3.23 2.113-2.723 1.43-9.146-0.559-10.834 0.296-14.572-5.086-23.069-8.18-12.892-8.666-12.806-14.014-21.302-5.347-8.377-11.476-25.885-17.595-26.004-4.813-0.119-7.605 2.496-10.635 5.584-3.029 3.088-4.008 17.722-8.544 22.355z"/>\r
-   <path fill="#ffcf26" d="m62.115 286.366c-7.021 7.002-23.154 1.115-27.42 4.762-4.266 3.701 5.096 10.027 4.168 17.979-0.568 4.486-2.455 6.469-3.297 12.538-0.624 4.706 3.607 4.203 6.021 5.472 10.878 4.852 12.925 3.803 30.813 7.254 14.622 2.78 19.108 8.441 34.236 7.084 5.075-0.43 4.606-0.584 9.413-3.759 4.489-3.063 2.058-2.601 1.277-9.229-0.761-10.76 0.284-14.618-4.848-22.717-8.129-12.809-8.706-12.66-14.019-21.102-5.313-8.322-11.304-25.891-17.384-26.01-4.781-0.118-7.556 2.48-10.566 5.55-3.008 3.068-3.881 17.584-8.394 22.178z"/>\r
-   <path fill="#ffd028" d="m62.409 286.456c-7.204 7.166-23.479 1.281-27.588 4.838-4.235 3.715 5.275 10.168 4.351 17.787-0.58 4.455-2.364 6.51-3.357 12.53-0.738 4.679 3.697 4.149 6.142 5.347 11.249 4.763 13.515 3.946 30.577 7.221 14.529 2.748 18.986 8.386 34.012 7.037 5.043-0.424 4.474-0.594 9.289-3.68 4.392-2.897 2-2.481 1.125-9.314-0.963-10.686 0.273-14.664-4.608-22.364-8.079-12.726-8.746-12.517-14.024-20.901-5.277-8.269-11.133-25.896-17.173-26.015-4.75-0.116-7.506 2.464-10.497 5.513-2.992 3.047-3.759 17.447-8.249 22.001z"/>\r
-   <path fill="#ffd02b" d="m62.704 286.547c-7.388 7.33-23.805 1.445-27.757 4.912-4.204 3.729 5.455 10.311 4.533 17.594-0.593 4.427-2.272 6.553-3.417 12.523-0.854 4.651 3.786 4.098 6.262 5.225 11.619 4.671 14.104 4.087 30.341 7.185 14.438 2.72 18.864 8.33 33.787 6.991 5.01-0.418 4.341-0.604 9.166-3.604 4.292-2.729 1.942-2.359 0.972-9.396-1.163-10.613 0.263-14.709-4.369-22.012-8.03-12.641-8.787-12.371-14.03-20.7-5.243-8.214-10.962-25.903-16.962-26.021-4.719-0.117-7.457 2.447-10.428 5.477-2.972 3.029-3.632 17.313-8.098 21.826z"/>\r
-   <path fill="#ffd02d" d="m62.998 286.638c-7.57 7.493-24.13 1.61-27.925 4.987-4.174 3.742 5.635 10.451 4.716 17.4-0.604 4.398-2.182 6.596-3.478 12.518-0.969 4.623 3.875 4.045 6.382 5.101 11.991 4.579 14.694 4.228 30.105 7.149 14.345 2.688 18.743 8.275 33.563 6.944 4.977-0.411 4.207-0.61 9.042-3.524 4.193-2.562 1.884-2.239 0.819-9.481-1.366-10.538 0.251-14.754-4.133-21.659-7.979-12.557-8.825-12.224-14.034-20.498-5.208-8.16-10.791-25.91-16.751-26.027-4.688-0.114-7.407 2.433-10.358 5.441-2.951 3.01-3.505 17.174-7.948 21.649z"/>\r
-   <path fill="#ffd030" d="m63.292 286.729c-7.753 7.658-24.454 1.775-28.094 5.063-4.142 3.756 5.815 10.594 4.899 17.209-0.616 4.367-2.09 6.638-3.537 12.51-1.084 4.596 3.964 3.992 6.502 4.977 12.362 4.488 15.283 4.369 29.869 7.115 14.252 2.656 18.621 8.22 33.34 6.898 4.943-0.406 4.073-0.621 8.917-3.447 4.095-2.395 1.828-2.119 0.667-9.565-1.568-10.465 0.239-14.8-3.894-21.307-7.929-12.474-8.866-12.078-14.04-20.298-5.173-8.105-10.619-25.916-16.54-26.031-4.656-0.115-7.357 2.415-10.289 5.404-2.932 2.988-3.38 17.036-7.8 21.472z"/>\r
-   <path fill="#ffd133" d="m63.587 286.82c-7.937 7.822-24.78 1.94-28.263 5.138-4.111 3.77 5.995 10.734 5.081 17.016-0.627 4.339-1.998 6.68-3.597 12.504-1.199 4.568 4.054 3.939 6.623 4.854 12.732 4.396 15.873 4.51 29.633 7.08 14.16 2.625 18.499 8.164 33.116 6.852 4.909-0.4 3.939-0.629 8.793-3.369 3.997-2.227 1.77-1.999 0.514-9.648-1.771-10.393 0.228-14.846-3.654-20.955-7.88-12.39-8.907-11.934-14.046-20.098-5.139-8.051-10.448-25.922-16.329-26.037-4.625-0.113-7.309 2.398-10.221 5.368s-3.254 16.897-7.65 21.295z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m88.782 218.681c-0.936 2.088-1.728 20.017 2.952 27 4.68 6.911 3.312 10.872-1.872 5.616-5.4-5.112-8.928-12.816-9-18.145 0-3.096 2.376-15.84 3.313-17.208 1.007-1.44 5.327 1.153 4.607 2.737z"/>\r
-   <path fill="#030303" d="m88.692 219.032c-0.903 2.34-1.656 19.698 3.01 26.668 4.665 6.901 3.186 10.49-1.84 5.356-5.23-4.997-8.607-12.47-8.741-17.787-0.043-3.114 2.236-15.419 3.133-16.791 0.961-1.394 5.126 0.989 4.438 2.554z"/>\r
-   <path fill="#070707" d="m88.602 219.379c-0.871 2.593-1.584 19.383 3.067 26.338 4.65 6.891 3.06 10.109-1.808 5.098-5.062-4.882-8.287-12.125-8.481-17.432-0.087-3.131 2.095-14.998 2.952-16.373 0.915-1.345 4.926 0.828 4.27 2.369z"/>\r
-   <path fill="#0b0b0b" d="m88.512 219.729c-0.839 2.844-1.513 19.066 3.124 26.006 4.638 6.881 2.935 9.729-1.774 4.84-4.893-4.768-7.967-11.779-8.223-17.076-0.129-3.149 1.955-14.576 2.772-15.955 0.868-1.299 4.724 0.665 4.101 2.185z"/>\r
-   <path fill="#0f0f0f" d="m88.422 220.079c-0.806 3.096-1.439 18.748 3.183 25.674 4.623 6.869 2.809 9.347-1.742 4.58-4.724-4.651-7.646-11.434-7.963-16.719-0.173-3.168 1.814-14.154 2.592-15.537 0.819-1.252 4.52 0.504 3.93 2.002z"/>\r
-   <path fill="#131313" d="m88.332 220.426c-0.773 3.349-1.368 18.433 3.24 25.345 4.608 6.858 2.682 8.964-1.71 4.319-4.554-4.535-7.326-11.088-7.704-16.361-0.216-3.186 1.674-13.734 2.412-15.12 0.774-1.206 4.32 0.343 3.762 1.817z"/>\r
-   <path fill="#161616" d="m88.242 220.777c-0.741 3.601-1.296 18.115 3.298 25.013 4.594 6.848 2.556 8.582-1.678 4.061-4.385-4.421-7.006-10.742-7.444-16.006-0.26-3.203 1.533-13.313 2.231-14.702 0.728-1.16 4.118 0.18 3.593 1.634z"/>\r
-   <path fill="#1a1a1a" d="m88.152 221.125c-0.709 3.853-1.224 17.799 3.355 24.682 4.579 6.837 2.43 8.201-1.646 3.802-4.216-4.306-6.686-10.397-7.186-15.649-0.303-3.221 1.394-12.892 2.052-14.285 0.682-1.112 3.918 0.018 3.425 1.45z"/>\r
-   <path fill="#1e1e1e" d="m88.062 221.475c-0.677 4.104-1.152 17.482 3.413 24.35 4.564 6.826 2.304 7.82-1.613 3.543-4.046-4.191-6.365-10.051-6.927-15.293-0.345-3.24 1.253-12.47 1.872-13.867 0.634-1.066 3.716-0.144 3.255 1.267z"/>\r
-   <path fill="#222" d="m87.972 221.825c-0.645 4.355-1.08 17.164 3.47 24.018 4.551 6.816 2.179 7.439-1.58 3.285-3.877-4.076-6.044-9.707-6.667-14.938-0.389-3.258 1.112-12.049 1.691-13.449 0.587-1.019 3.514-0.306 3.086 1.084z"/>\r
-   <path fill="#262626" d="m87.883 222.172c-0.612 4.609-1.009 16.849 3.527 23.688 4.536 6.804 2.052 7.056-1.548 3.024-3.708-3.961-5.724-9.36-6.408-14.58-0.432-3.276 0.973-11.629 1.513-13.032 0.54-0.971 3.311-0.467 2.916 0.9z"/>\r
-   <path fill="#2a2a2a" d="m87.792 222.523c-0.579 4.86-0.936 16.531 3.586 23.356 4.521 6.793 1.926 6.675-1.516 2.765-3.539-3.845-5.403-9.015-6.148-14.224-0.476-3.293 0.831-11.207 1.332-12.614 0.493-0.925 3.11-0.63 2.746 0.717z"/>\r
-   <path fill="#2d2d2d" d="m87.702 222.872c-0.547 5.112-0.864 16.215 3.644 23.025 4.507 6.783 1.8 6.293-1.483 2.506-3.369-3.73-5.083-8.669-5.89-13.867-0.519-3.312 0.691-10.785 1.152-12.197 0.446-0.878 2.908-0.792 2.577 0.533z"/>\r
-   <path fill="#313131" d="m87.612 223.221c-0.515 5.363-0.792 15.898 3.701 22.693 4.492 6.772 1.674 5.912-1.451 2.248-3.2-3.615-4.763-8.324-5.63-13.512-0.563-3.33 0.551-10.363 0.972-11.779 0.399-0.831 2.707-0.953 2.408 0.35z"/>\r
-   <path fill="#353535" d="m87.522 223.57c-0.482 5.616-0.72 15.581 3.758 22.363 4.479 6.761 1.549 5.53-1.418 1.987-3.031-3.5-4.442-7.978-5.371-13.154-0.604-3.348 0.41-9.943 0.792-11.361 0.352-0.785 2.506-1.115 2.239 0.165z"/>\r
-   <path fill="#393939" d="m87.432 223.918c-0.45 5.869-0.648 15.265 3.815 22.033 4.464 6.75 1.422 5.147-1.386 1.728-2.862-3.384-4.122-7.632-5.112-12.798-0.647-3.366 0.271-9.522 0.612-10.944 0.307-0.737 2.305-1.278 2.071-0.019z"/>\r
-   <path fill="#3d3d3d" d="m87.343 224.269c-0.418 6.12-0.576 14.946 3.873 21.7 4.45 6.74 1.296 4.767-1.354 1.469-2.692-3.27-3.802-7.286-4.853-12.441-0.691-3.383 0.129-9.101 0.432-10.527 0.26-0.691 2.103-1.44 1.902-0.201z"/>\r
-   <path fill="#414141" d="m87.252 224.618c-0.385 6.373-0.504 14.631 3.932 21.369 4.436 6.729 1.17 4.385-1.321 1.211-2.523-3.154-3.481-6.941-4.594-12.086-0.734-3.402-0.011-8.68 0.252-10.109 0.212-0.644 1.901-1.602 1.731-0.385z"/>\r
-   <path fill="#444" d="m87.162 224.967c-0.353 6.623-0.432 14.314 3.989 21.037 4.421 6.719 1.044 4.004-1.289 0.951-2.354-3.039-3.161-6.595-4.334-11.729-0.778-3.42-0.151-8.258 0.071-9.691 0.166-0.597 1.7-1.763 1.563-0.568z"/>\r
-   <path fill="#484848" d="m87.072 225.316c-0.32 6.876-0.36 13.997 4.047 20.707 4.406 6.707 0.918 3.622-1.257 0.692-2.186-2.924-2.841-6.25-4.075-11.373-0.82-3.438-0.292-7.838-0.108-9.273 0.119-0.551 1.498-1.926 1.393-0.753z"/>\r
-   <path fill="#4c4c4c" d="m86.982 225.665c-0.288 7.129-0.288 13.68 4.104 20.377 4.393 6.695 0.792 3.24-1.224 0.432s-2.52-5.904-3.816-11.016c-0.863-3.457-0.432-7.416-0.287-8.856 0.071-0.505 1.295-2.089 1.223-0.937z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m88.782 218.681c4.32-9.433 6.696-19.584 12.888-29.448 6.12-9.792 3.672-13.608-0.863-8.64-4.536 4.968-9.504 15.48-9.504 15.48s-5.832 9.216-7.128 19.872c-0.217 1.8 3.887 4.248 4.607 2.736z"/>\r
-   <path fill="#020202" d="m88.968 218.071c4.279-9.5 6.615-19.246 12.586-28.802 5.901-9.488 3.608-13.279-0.764-8.472-4.403 4.847-9.302 15.236-9.368 15.381 0 0-5.637 8.993-6.877 19.239-0.209 1.771 3.72 4.145 4.423 2.654z"/>\r
-   <path fill="#050505" d="m89.152 217.459c4.239-9.566 6.535-18.908 12.284-28.155 5.683-9.183 3.547-12.95-0.663-8.303-4.27 4.725-9.099 14.991-9.231 15.282 0 0-5.442 8.766-6.627 18.605-0.201 1.741 3.554 4.042 4.237 2.571z"/>\r
-   <path fill="#070707" d="m89.338 216.849c4.199-9.634 6.454-18.572 11.981-27.51 5.465-8.878 3.484-12.621-0.563-8.135-4.137 4.605-8.896 14.748-9.096 15.184 0 0-5.247 8.542-6.376 17.972-0.192 1.713 3.387 3.937 4.054 2.489z"/>\r
-   <path fill="#0a0a0a" d="m89.522 216.239c4.159-9.701 6.375-18.234 11.68-26.865 5.247-8.573 3.422-12.292-0.461-7.966-4.005 4.483-8.693 14.503-8.96 15.085 0 0-5.053 8.317-6.126 17.337-0.186 1.684 3.219 3.837 3.867 2.409z"/>\r
-   <path fill="#0c0c0c" d="m89.708 215.627c4.118-9.769 6.294-17.897 11.376-26.218 5.029-8.268 3.36-11.962-0.359-7.797-3.871 4.361-8.49 14.259-8.823 14.985 0 0-4.858 8.093-5.876 16.706-0.179 1.653 3.051 3.731 3.682 2.324z"/>\r
-   <path fill="#0f0f0f" d="m89.893 215.017c4.077-9.836 6.213-17.56 11.073-25.573 4.812-7.963 3.298-11.633-0.259-7.629-3.738 4.241-8.288 14.015-8.688 14.887 0 0-4.663 7.868-5.625 16.072-0.169 1.624 2.886 3.628 3.499 2.243z"/>\r
-   <path fill="#111" d="m90.078 214.407c4.037-9.904 6.133-17.224 10.772-24.928 4.593-7.658 3.234-11.304-0.159-7.46-3.605 4.119-8.085 13.771-8.551 14.788 0 0-4.47 7.645-5.375 15.439-0.162 1.594 2.718 3.524 3.313 2.161z"/>\r
-   <path fill="#141414" d="m90.263 213.795c3.997-9.971 6.052-16.885 10.47-24.281 4.374-7.353 3.172-10.975-0.059-7.291-3.472 3.998-7.882 13.526-8.415 14.689 0 0-4.273 7.418-5.124 14.805-0.154 1.565 2.551 3.421 3.128 2.078z"/>\r
-   <path fill="#161616" d="m90.449 213.184c3.956-10.037 5.972-16.548 10.167-23.635 4.156-7.048 3.11-10.645 0.043-7.123-3.34 3.877-7.68 13.283-8.279 14.591 0 0-4.08 7.194-4.874 14.172-0.147 1.535 2.383 3.317 2.943 1.995z"/>\r
-   <path fill="#191919" d="m90.634 212.573c3.916-10.105 5.892-16.209 9.865-22.989 3.938-6.743 3.047-10.316 0.144-6.954-3.207 3.755-7.477 13.038-8.143 14.491 0 0-3.886 6.969-4.624 13.54-0.139 1.506 2.217 3.213 2.758 1.912z"/>\r
-   <path fill="#1c1c1c" d="m90.819 211.963c3.875-10.174 5.811-15.874 9.563-22.344 3.721-6.438 2.984-9.987 0.244-6.785-3.073 3.634-7.274 12.793-8.007 14.392 0 0-3.69 6.745-4.373 12.905-0.131 1.477 2.049 3.112 2.573 1.832z"/>\r
-   <path fill="#1e1e1e" d="m91.004 211.352c3.836-10.24 5.73-15.536 9.262-21.698 3.501-6.133 2.922-9.658 0.344-6.617-2.94 3.513-7.071 12.55-7.87 14.293 0 0-3.496 6.521-4.123 12.272-0.124 1.447 1.881 3.009 2.387 1.75z"/>\r
-   <path fill="#212121" d="m91.189 210.741c3.795-10.307 5.649-15.198 8.958-21.052 3.284-5.828 2.859-9.328 0.445-6.448-2.808 3.392-6.868 12.305-7.734 14.195 0 0-3.301 6.295-3.872 11.639-0.115 1.418 1.715 2.904 2.203 1.666z"/>\r
-   <path fill="#232323" d="m91.375 210.129c3.754-10.373 5.569-14.86 8.655-20.405 3.066-5.523 2.797-8.999 0.547-6.279-2.675 3.27-6.666 12.061-7.599 14.097 0 0-3.106 6.07-3.622 11.004-0.107 1.388 1.548 2.801 2.019 1.583z"/>\r
-   <path fill="#262626" d="m91.559 209.519c3.714-10.44 5.489-14.523 8.354-19.76 2.847-5.218 2.735-8.67 0.647-6.111-2.542 3.149-6.463 11.817-7.462 13.997 0 0-2.912 5.848-3.372 10.373-0.099 1.357 1.381 2.697 1.833 1.501z"/>\r
-   <path fill="#282828" d="m91.745 208.909c3.674-10.509 5.408-14.187 8.051-19.115 2.629-4.913 2.672-8.341 0.748-5.942-2.409 3.028-6.261 11.573-7.326 13.898 0 0-2.717 5.621-3.121 9.738-0.092 1.33 1.213 2.595 1.648 1.421z"/>\r
-   <path fill="#2b2b2b" d="m91.929 208.297c3.634-10.575 5.328-13.848 7.75-18.468 2.41-4.608 2.609-8.011 0.848-5.773-2.275 2.906-6.058 11.328-7.189 13.799 0 0-2.522 5.397-2.871 9.106-0.084 1.299 1.046 2.491 1.462 1.336z"/>\r
-   <path fill="#2d2d2d" d="m92.115 207.687c3.593-10.643 5.247-13.512 7.447-17.823 2.191-4.303 2.547-7.682 0.949-5.605-2.144 2.786-5.855 11.085-7.055 13.701 0 0-2.327 5.172-2.62 8.473-0.076 1.269 0.881 2.386 1.279 1.254z"/>\r
-   <path fill="#303030" d="m92.301 207.077c3.552-10.71 5.167-13.175 7.145-17.178 1.974-3.998 2.484-7.353 1.05-5.436-2.011 2.664-5.652 10.84-6.918 13.602 0 0-2.133 4.947-2.37 7.839-0.07 1.24 0.712 2.283 1.093 1.173z"/>\r
-   <path fill="#333" d="m92.485 206.465c3.513-10.778 5.087-12.837 6.843-16.531s2.422-7.024 1.15-5.268c-1.877 2.543-5.449 10.596-6.781 13.502 0 0-1.938 4.724-2.12 7.207-0.061 1.211 0.545 2.18 0.908 1.09z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m273.03 225.592c2.088-5.903 1.872-20.951-3.456-30.671-1.872-3.528-3.672-7.632-4.752-7.848-1.152-0.216-3.24 2.088-3.024 2.448 0.288 0.576 10.009 14.256 7.992 32.832-0.144 1.513 2.736 4.608 3.24 3.239z"/>\r
-   <path fill="#030303" d="m272.936 224.831c2.025-5.719 1.753-20.379-3.344-29.663-1.815-3.407-3.535-7.374-4.595-7.59-1.122-0.214-3.125 2.022-2.925 2.367 0.258 0.562 9.605 13.778 7.729 31.753-0.129 1.487 2.647 4.456 3.135 3.133z"/>\r
-   <path fill="#070707" d="m272.841 224.068c1.967-5.532 1.637-19.808-3.228-28.654-1.762-3.286-3.401-7.115-4.44-7.332-1.091-0.211-3.009 1.956-2.824 2.287 0.227 0.548 9.201 13.299 7.466 30.672-0.118 1.463 2.555 4.305 3.026 3.027z"/>\r
-   <path fill="#0b0b0b" d="m272.747 223.305c1.904-5.348 1.518-19.235-3.115-27.645-1.706-3.165-3.265-6.856-4.282-7.073-1.062-0.21-2.896 1.889-2.727 2.206 0.197 0.534 8.799 12.821 7.203 29.592-0.103 1.44 2.466 4.153 2.921 2.92z"/>\r
-   <path fill="#0f0f0f" d="m272.652 222.542c1.843-5.162 1.398-18.662-3.001-26.635-1.65-3.044-3.13-6.598-4.127-6.815-1.03-0.207-2.779 1.823-2.626 2.126 0.167 0.52 8.396 12.341 6.94 28.511-0.09 1.416 2.376 4.001 2.814 2.813z"/>\r
-   <path fill="#131313" d="m272.558 221.779c1.78-4.976 1.279-18.09-2.889-25.626-1.595-2.923-2.994-6.34-3.97-6.557-1-0.205-2.664 1.756-2.527 2.045 0.137 0.506 7.993 11.861 6.679 27.432-0.078 1.392 2.285 3.849 2.707 2.706z"/>\r
-   <path fill="#161616" d="m272.463 221.016c1.721-4.79 1.163-17.518-2.773-24.617-1.539-2.802-2.858-6.081-3.814-6.299-0.969-0.203-2.548 1.691-2.427 1.965 0.106 0.492 7.59 11.383 6.415 26.352-0.065 1.369 2.194 3.697 2.599 2.599z"/>\r
-   <path fill="#1a1a1a" d="m272.369 220.254c1.659-4.605 1.044-16.946-2.66-23.609-1.483-2.681-2.723-5.822-3.658-6.04-0.938-0.201-2.434 1.624-2.326 1.884 0.074 0.478 7.185 10.904 6.15 25.271-0.051 1.344 2.106 3.546 2.494 2.494z"/>\r
-   <path fill="#1e1e1e" d="m272.274 219.491c1.598-4.42 0.926-16.373-2.546-22.6-1.43-2.56-2.587-5.564-3.501-5.782-0.908-0.198-2.319 1.558-2.229 1.804 0.044 0.464 6.782 10.425 5.889 24.19-0.037 1.321 2.016 3.396 2.387 2.388z"/>\r
-   <path fill="#222" d="m272.18 218.728c1.535-4.233 0.807-15.802-2.434-21.59-1.373-2.439-2.452-5.306-3.345-5.524-0.877-0.197-2.203 1.491-2.128 1.723 0.014 0.45 6.379 9.947 5.625 23.111-0.023 1.297 1.927 3.242 2.282 2.28z"/>\r
-   <path fill="#262626" d="m272.085 217.965c1.476-4.049 0.69-15.229-2.318-20.582-1.317-2.317-2.316-5.046-3.188-5.265-0.847-0.194-2.088 1.425-2.029 1.642-0.016 0.436 5.977 9.468 5.362 22.032-0.011 1.272 1.835 3.089 2.173 2.173z"/>\r
-   <path fill="#2a2a2a" d="m271.991 217.202c1.413-3.861 0.571-14.656-2.206-19.572-1.262-2.196-2.18-4.788-3.032-5.007-0.815-0.191-1.973 1.36-1.929 1.562-0.047 0.422 5.573 8.988 5.099 20.951 0.003 1.247 1.746 2.939 2.068 2.066z"/>\r
-   <path fill="#2d2d2d" d="m271.896 216.439c1.353-3.677 0.453-14.084-2.091-18.563-1.207-2.076-2.045-4.529-2.876-4.749-0.786-0.19-1.858 1.293-1.83 1.481-0.077 0.408 5.17 8.51 4.836 19.87 0.017 1.226 1.656 2.789 1.961 1.961z"/>\r
-   <path fill="#313131" d="m271.802 215.676c1.29-3.491 0.334-13.512-1.979-17.553-1.151-1.956-1.909-4.272-2.72-4.493-0.755-0.187-1.742 1.227-1.73 1.401-0.106 0.394 4.768 8.031 4.573 18.791 0.031 1.202 1.567 2.637 1.856 1.854z"/>\r
-   <path fill="#353535" d="m271.707 214.915c1.23-3.307 0.217-12.94-1.864-16.545-1.096-1.834-1.773-4.014-2.563-4.234-0.725-0.185-1.627 1.16-1.631 1.32-0.138 0.38 4.364 7.552 4.311 17.71 0.042 1.176 1.475 2.485 1.747 1.749z"/>\r
-   <path fill="#393939" d="m271.613 214.151c1.168-3.119 0.098-12.367-1.751-15.535-1.04-1.714-1.638-3.755-2.407-3.976-0.693-0.183-1.512 1.094-1.531 1.24-0.168 0.366 3.962 7.074 4.049 16.63 0.055 1.153 1.384 2.332 1.64 1.641z"/>\r
-   <path fill="#3d3d3d" d="m271.518 213.388c1.106-2.935-0.021-11.796-1.638-14.527-0.983-1.592-1.502-3.496-2.25-3.716-0.664-0.181-1.396 1.028-1.432 1.159-0.198 0.352 3.558 6.594 3.785 15.549 0.07 1.13 1.296 2.183 1.535 1.535z"/>\r
-   <path fill="#414141" d="m271.424 212.625c1.047-2.75-0.139-11.223-1.522-13.518-0.93-1.471-1.367-3.238-2.094-3.459-0.635-0.178-1.282 0.962-1.333 1.079-0.229 0.338 3.153 6.114 3.521 14.47 0.083 1.106 1.205 2.03 1.428 1.428z"/>\r
-   <path fill="#444" d="m271.329 211.862c0.985-2.563-0.256-10.65-1.409-12.508-0.874-1.35-1.23-2.979-1.938-3.2-0.604-0.177-1.166 0.895-1.233 0.998-0.259 0.324 2.751 5.636 3.259 13.39 0.096 1.082 1.115 1.876 1.321 1.32z"/>\r
-   <path fill="#484848" d="m271.235 211.099c0.923-2.377-0.375-10.077-1.296-11.499-0.818-1.229-1.097-2.72-1.781-2.942-0.573-0.174-1.052 0.829-1.134 0.918-0.289 0.309 2.348 5.156 2.996 12.309 0.11 1.058 1.025 1.726 1.215 1.214z"/>\r
-   <path fill="#4c4c4c" d="m271.14 210.336c0.861-2.192-0.493-9.506-1.183-10.49-0.763-1.107-0.96-2.463-1.625-2.684-0.542-0.172-0.936 0.762-1.034 0.836-0.319 0.297 1.945 4.68 2.733 11.229 0.124 1.035 0.936 1.576 1.109 1.109z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m264.822 187.073c-10.224-13.968-23.472-18.504-22.104-14.112 0 0 10.152 5.76 19.08 16.56 1.728 2.088 4.608-0.288 3.024-2.448z"/>\r
-   <path fill="#030303" d="m264.372 186.687c-9.924-13.495-22.894-17.912-21.539-13.7 0.018 0.012 9.901 5.614 18.609 16.071 1.678 2.016 4.467-0.285 2.93-2.371z"/>\r
-   <path fill="#070707" d="m263.922 186.3c-9.624-13.022-22.316-17.319-20.975-13.287 0.036 0.023 9.652 5.467 18.139 15.582 1.628 1.943 4.325-0.283 2.836-2.295z"/>\r
-   <path fill="#0b0b0b" d="m263.472 185.913c-9.324-12.549-21.739-16.726-20.41-12.874 0.053 0.034 9.4 5.32 17.668 15.093 1.578 1.871 4.183-0.28 2.742-2.219z"/>\r
-   <path fill="#0f0f0f" d="m263.022 185.527c-9.024-12.077-21.162-16.134-19.847-12.462 0.071 0.045 9.151 5.174 17.198 14.604 1.529 1.798 4.043-0.278 2.649-2.142z"/>\r
-   <path fill="#131313" d="m262.571 185.14c-8.723-11.603-20.583-15.541-19.28-12.049 0.088 0.056 8.901 5.027 16.728 14.114 1.477 1.726 3.899-0.275 2.552-2.065z"/>\r
-   <path fill="#161616" d="m262.121 184.753c-8.423-11.13-20.006-14.948-18.716-11.636 0.106 0.067 8.651 4.88 16.257 13.625 1.428 1.654 3.759-0.272 2.459-1.989z"/>\r
-   <path fill="#1a1a1a" d="m261.671 184.367c-8.124-10.658-19.428-14.356-18.15-11.224 0.124 0.078 8.399 4.734 15.785 13.136 1.378 1.581 3.617-0.27 2.365-1.912z"/>\r
-   <path fill="#1e1e1e" d="m261.221 183.98c-7.824-10.185-18.851-13.763-17.588-10.811 0.143 0.089 8.151 4.587 15.315 12.647 1.33 1.508 3.477-0.267 2.273-1.836z"/>\r
-   <path fill="#222" d="m260.771 183.593c-7.524-9.711-18.273-13.17-17.022-10.398 0.159 0.1 7.9 4.44 14.844 12.158 1.279 1.436 3.335-0.265 2.178-1.76z"/>\r
-   <path fill="#262626" d="m260.321 183.206c-7.224-9.238-17.695-12.578-16.458-9.985 0.177 0.111 7.65 4.293 14.374 11.668 1.229 1.364 3.193-0.262 2.084-1.683z"/>\r
-   <path fill="#2a2a2a" d="m259.871 182.82c-6.924-8.766-17.118-11.986-15.893-9.573 0.193 0.122 7.398 4.147 13.902 11.179 1.18 1.291 3.053-0.259 1.991-1.606z"/>\r
-   <path fill="#2d2d2d" d="m259.42 182.433c-6.623-8.293-16.539-11.393-15.328-9.16 0.214 0.133 7.15 4 13.434 10.69 1.128 1.219 2.909-0.257 1.894-1.53z"/>\r
-   <path fill="#313131" d="m258.97 182.046c-6.323-7.819-15.963-10.8-14.764-8.747 0.23 0.144 6.899 3.853 12.962 10.201 1.08 1.146 2.769-0.254 1.802-1.454z"/>\r
-   <path fill="#353535" d="m258.52 181.66c-6.023-7.347-15.384-10.208-14.199-8.335 0.248 0.155 6.649 3.707 12.492 9.712 1.028 1.073 2.627-0.252 1.707-1.377z"/>\r
-   <path fill="#393939" d="m258.07 181.273c-5.723-6.874-14.807-9.615-13.634-7.922 0.265 0.166 6.398 3.56 12.021 9.222 0.978 1.002 2.485-0.249 1.613-1.3z"/>\r
-   <path fill="#3d3d3d" d="m257.62 180.886c-5.423-6.401-14.229-9.021-13.07-7.509 0.283 0.177 6.149 3.413 11.552 8.733 0.927 0.929 2.343-0.246 1.518-1.224z"/>\r
-   <path fill="#414141" d="m257.17 180.5c-5.124-5.928-13.65-8.43-12.505-7.097 0.301 0.188 5.898 3.267 11.079 8.244 0.879 0.856 2.203-0.244 1.426-1.147z"/>\r
-   <path fill="#444" d="m256.719 180.113c-4.823-5.455-13.073-7.837-11.94-6.684 0.319 0.199 5.649 3.12 10.609 7.755 0.829 0.784 2.061-0.241 1.331-1.071z"/>\r
-   <path fill="#484848" d="m256.269 179.726c-4.523-4.982-12.495-7.244-11.375-6.271 0.336 0.21 5.397 2.973 10.138 7.266 0.779 0.711 1.92-0.239 1.237-0.995z"/>\r
-   <path fill="#4c4c4c" d="m255.819 179.339c-4.223-4.509-11.918-6.652-10.812-5.859 0.354 0.222 5.148 2.827 9.668 6.777 0.73 0.639 1.779-0.236 1.144-0.918z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m273.03 225.592c0.144 6.265-5.76 22.248-7.992 21.673-2.52-0.576 0.504-5.257 2.809-13.177 0.936-3.312 1.655-11.447 1.943-11.735 0.936-0.936 3.24 1.728 3.24 3.239z"/>\r
-   <path fill="#050505" d="m272.846 226.116c0.103 6.082-5.638 21.594-7.797 21.018-2.422-0.567 0.548-5.146 2.814-12.928 0.899-3.178 1.595-10.947 1.887-11.25 0.914-0.927 3.147 1.527 3.096 3.16z"/>\r
-   <path fill="#0a0a0a" d="m272.662 226.637c0.063 5.902-5.514 20.939-7.601 20.363-2.323-0.558 0.592-5.035 2.82-12.681 0.861-3.041 1.534-10.446 1.83-10.761 0.89-0.917 3.054 1.327 2.951 3.079z"/>\r
-   <path fill="#0f0f0f" d="m272.478 227.159c0.021 5.721-5.392 20.284-7.405 19.711-2.224-0.55 0.635-4.927 2.827-12.434 0.824-2.907 1.473-9.945 1.773-10.273 0.866-0.911 2.959 1.125 2.805 2.996z"/>\r
-   <path fill="#141414" d="m272.294 227.68c-0.02 5.539-5.268 19.63-7.21 19.057-2.125-0.541 0.68-4.816 2.835-12.186 0.786-2.771 1.412-9.445 1.717-9.786 0.84-0.901 2.863 0.924 2.658 2.915z"/>\r
-   <path fill="#191919" d="m272.11 228.202c-0.063 5.359-5.146 18.977-7.014 18.403-2.027-0.532 0.722-4.706 2.841-11.938 0.748-2.637 1.351-8.944 1.659-9.299 0.818-0.893 2.77 0.722 2.514 2.834z"/>\r
-   <path fill="#1e1e1e" d="m271.926 228.723c-0.103 5.179-5.021 18.322-6.818 17.75-1.928-0.523 0.766-4.596 2.848-11.691 0.711-2.5 1.29-8.443 1.603-8.811 0.792-0.885 2.674 0.522 2.367 2.752z"/>\r
-   <path fill="#232323" d="m271.742 229.245c-0.144 4.998-4.9 17.668-6.623 17.096-1.83-0.514 0.811-4.485 2.854-11.442 0.673-2.366 1.229-7.944 1.545-8.325 0.771-0.876 2.583 0.32 2.224 2.671z"/>\r
-   <path fill="#282828" d="m271.558 229.766c-0.186 4.816-4.777 17.013-6.428 16.443-1.731-0.506 0.854-4.377 2.86-11.196 0.636-2.231 1.168-7.443 1.488-7.837 0.749-0.866 2.49 0.119 2.08 2.59z"/>\r
-   <path fill="#2d2d2d" d="m271.374 230.288c-0.226 4.637-4.653 16.359-6.231 15.789-1.632-0.496 0.896-4.266 2.866-10.947 0.6-2.098 1.107-6.943 1.433-7.351 0.722-0.859 2.393-0.081 1.932 2.509z"/>\r
-   <path fill="#333" d="m271.19 230.809c-0.268 4.456-4.531 15.705-6.036 15.136-1.534-0.489 0.94-4.155 2.873-10.7 0.561-1.961 1.046-6.443 1.375-6.863 0.7-0.848 2.3-0.282 1.788 2.427z"/>\r
-   <path fill="#383838" d="m271.006 231.331c-0.308 4.275-4.407 15.051-5.841 14.482-1.435-0.48 0.984-4.046 2.88-10.453 0.524-1.826 0.985-5.941 1.318-6.375 0.676-0.84 2.206-0.483 1.643 2.346z"/>\r
-   <path fill="#3d3d3d" d="m270.822 231.853c-0.35 4.093-4.285 14.396-5.645 13.828-1.338-0.472 1.027-3.937 2.886-10.206 0.485-1.691 0.924-5.441 1.261-5.887 0.653-0.832 2.113-0.684 1.498 2.265z"/>\r
-   <path fill="#424242" d="m270.638 232.374c-0.392 3.914-4.162 13.742-5.45 13.176-1.238-0.463 1.072-3.826 2.893-9.959 0.449-1.555 0.863-4.94 1.204-5.399 0.629-0.824 2.019-0.886 1.353 2.182z"/>\r
-   <path fill="#474747" d="m270.454 232.896c-0.432 3.731-4.039 13.087-5.254 12.521-1.14-0.453 1.115-3.715 2.9-9.711 0.411-1.42 0.802-4.439 1.146-4.912 0.606-0.815 1.925-1.086 1.208 2.102z"/>\r
-   <path fill="#4c4c4c" d="m270.27 233.417c-0.474 3.553-3.916 12.434-5.06 11.869-1.041-0.445 1.159-3.606 2.907-9.463 0.373-1.287 0.741-3.941 1.089-4.427 0.583-0.806 1.832-1.287 1.064 2.021z"/>\r
-   <path fill="#515151" d="m270.086 233.939c-0.514 3.37-3.793 11.778-4.862 11.214-0.942-0.436 1.201-3.496 2.913-9.216 0.336-1.151 0.68-3.438 1.032-3.938 0.558-0.797 1.736-1.489 0.917 1.94z"/>\r
-   <path fill="#565656" d="m269.902 234.461c-0.555 3.188-3.671 11.123-4.667 10.56-0.844-0.429 1.246-3.386 2.919-8.968 0.298-1.016 0.619-2.939 0.976-3.451 0.535-0.788 1.643-1.689 0.772 1.859z"/>\r
-   <path fill="#5b5b5b" d="m269.718 234.982c-0.597 3.009-3.548 10.47-4.472 9.907-0.745-0.42 1.29-3.275 2.926-8.721 0.262-0.881 0.559-2.438 0.919-2.963 0.511-0.781 1.549-1.89 0.627 1.777z"/>\r
-   <path fill="#606060" d="m269.534 235.504c-0.638 2.828-3.425 9.814-4.276 9.252-0.646-0.409 1.333-3.166 2.933-8.473 0.224-0.746 0.497-1.938 0.862-2.476 0.487-0.769 1.454-2.09 0.481 1.697z"/>\r
-   <path fill="#666" d="m269.35 236.025c-0.68 2.647-3.303 9.161-4.081 8.599-0.548-0.4 1.377-3.056 2.938-8.225 0.187-0.611 0.437-1.438 0.806-1.988 0.464-0.763 1.361-2.293 0.337 1.614z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m251.07 187.865c-1.537 1.622-2.903 9.991 0.938 12.893 3.844 2.818 10.59-2.391 10.59-5.379-0.086-6.746-9.991-9.222-11.528-7.514z"/>\r
-   <path fill="#010101" d="m251.207 188.006c-1.559 1.611-2.876 9.823 0.857 12.667 3.731 2.764 10.349-2.273 10.384-5.279-0.047-6.576-9.681-9.083-11.241-7.388z"/>\r
-   <path fill="#030303" d="m251.344 188.146c-1.582 1.601-2.85 9.653 0.774 12.438 3.62 2.709 10.109-2.154 10.178-5.177-0.007-6.404-9.37-8.943-10.952-7.261z"/>\r
-   <path fill="#050505" d="m251.481 188.287c-1.604 1.589-2.823 9.484 0.691 12.211 3.511 2.653 9.869-2.037 9.975-5.078 0.031-6.232-9.061-8.802-10.666-7.133z"/>\r
-   <path fill="#070707" d="m251.617 188.427c-1.626 1.579-2.795 9.316 0.611 11.984 3.397 2.6 9.629-1.918 9.768-4.976 0.071-6.062-8.751-8.664-10.379-7.008z"/>\r
-   <path fill="#090909" d="m251.754 188.567c-1.648 1.568-2.768 9.146 0.529 11.758 3.287 2.543 9.389-1.802 9.563-4.875 0.109-5.892-8.441-8.525-10.092-6.883z"/>\r
-   <path fill="#0b0b0b" d="m251.891 188.708c-1.671 1.557-2.741 8.978 0.445 11.529 3.177 2.489 9.15-1.683 9.358-4.774 0.15-5.72-8.13-8.385-9.803-6.755z"/>\r
-   <path fill="#0d0d0d" d="m252.028 188.848c-1.694 1.546-2.715 8.809 0.364 11.302 3.064 2.435 8.908-1.565 9.152-4.673 0.189-5.549-7.82-8.245-9.516-6.629z"/>\r
-   <path fill="#0f0f0f" d="m252.165 188.989c-1.716 1.535-2.688 8.64 0.282 11.074 2.953 2.38 8.669-1.447 8.948-4.572 0.226-5.378-7.512-8.106-9.23-6.502z"/>\r
-   <path fill="#111" d="m252.301 189.129c-1.737 1.524-2.659 8.471 0.2 10.847 2.844 2.325 8.431-1.33 8.743-4.471 0.266-5.207-7.201-7.966-8.943-6.376z"/>\r
-   <path fill="#131313" d="m252.438 189.269c-1.76 1.514-2.633 8.304 0.118 10.619 2.73 2.271 8.189-1.212 8.538-4.369 0.305-5.036-6.892-7.827-8.656-6.25z"/>\r
-   <path fill="#151515" d="m252.575 189.41c-1.783 1.503-2.606 8.133 0.036 10.391 2.62 2.216 7.949-1.094 8.332-4.268 0.344-4.865-6.581-7.687-8.368-6.123z"/>\r
-   <path fill="#161616" d="m252.712 189.55c-1.805 1.492-2.58 7.965-0.046 10.164 2.508 2.162 7.709-0.975 8.127-4.167 0.383-4.694-6.272-7.548-8.081-5.997z"/>\r
-   <path fill="#181818" d="m252.849 189.691c-1.828 1.481-2.554 7.796-0.129 9.937 2.397 2.105 7.47-0.857 7.922-4.066 0.423-4.524-5.961-7.409-7.793-5.871z"/>\r
-   <path fill="#1a1a1a" d="m252.985 189.831c-1.85 1.47-2.525 7.626-0.21 9.708 2.286 2.053 7.229-0.74 7.717-3.964 0.461-4.352-5.652-7.269-7.507-5.744z"/>\r
-   <path fill="#1c1c1c" d="m253.122 189.971c-1.872 1.46-2.499 7.459-0.292 9.482 2.175 1.996 6.989-0.623 7.511-3.865 0.501-4.18-5.341-7.128-7.219-5.617z"/>\r
-   <path fill="#1e1e1e" d="m253.259 190.112c-1.895 1.448-2.472 7.289-0.375 9.254 2.064 1.942 6.75-0.504 7.308-3.763 0.539-4.01-5.033-6.99-6.933-5.491z"/>\r
-   <path fill="#202020" d="m253.396 190.252c-1.917 1.438-2.445 7.122-0.457 9.027 1.953 1.888 6.51-0.386 7.102-3.662 0.578-3.839-4.722-6.85-6.645-5.365z"/>\r
-   <path fill="#222" d="m253.533 190.393c-1.939 1.426-2.418 6.951-0.539 8.799 1.841 1.832 6.271-0.268 6.896-3.561 0.618-3.668-4.412-6.711-6.357-5.238z"/>\r
-   <path fill="#242424" d="m253.669 190.533c-1.961 1.416-2.391 6.783-0.621 8.572 1.731 1.776 6.03-0.149 6.692-3.46 0.657-3.497-4.102-6.571-6.071-5.112z"/>\r
-   <path fill="#262626" d="m253.806 190.673c-1.984 1.405-2.364 6.615-0.703 8.344 1.619 1.724 5.79-0.032 6.485-3.358 0.697-3.326-3.791-6.432-5.782-4.986z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m250.71 256.698c1.513 1.512 2.809-2.232 4.32-3.457 1.512-1.224 3.96-3.888 8.856-3.888s4.535-0.144 4.319-2.017c-0.144-1.799-1.584-1.655-5.903-1.008-4.32 0.576-7.2 2.809-8.929 4.824-1.654 1.945-3.527 4.681-2.663 5.546z"/>\r
-   <path fill="#050505" d="m251.043 256.331c1.459 1.449 2.703-2.121 4.205-3.308 1.501-1.187 3.931-3.731 8.64-3.731 4.71-0.002 4.415-0.129 4.209-1.94-0.139-1.743-1.543-1.593-5.749-0.979-4.207 0.543-7.029 2.703-8.712 4.648-1.616 1.877-3.438 4.474-2.593 5.31z"/>\r
-   <path fill="#0a0a0a" d="m251.376 255.961c1.406 1.389 2.6-2.008 4.089-3.156 1.491-1.148 3.901-3.576 8.425-3.577 4.521-0.001 4.293-0.11 4.096-1.862-0.132-1.688-1.501-1.531-5.594-0.951-4.093 0.51-6.857 2.596-8.495 4.471-1.575 1.812-3.348 4.271-2.521 5.075z"/>\r
-   <path fill="#0f0f0f" d="m251.709 255.594c1.354 1.326 2.494-1.895 3.975-3.008 1.479-1.111 3.871-3.42 8.207-3.422s4.171-0.094 3.984-1.785c-0.126-1.631-1.46-1.467-5.438-0.924-3.979 0.479-6.687 2.492-8.28 4.297-1.533 1.747-3.257 4.066-2.448 4.842z"/>\r
-   <path fill="#141414" d="m252.042 255.226c1.302 1.265 2.39-1.783 3.858-2.856 1.47-1.076 3.842-3.266 7.991-3.268s4.05-0.077 3.873-1.709c-0.119-1.575-1.419-1.404-5.284-0.895-3.865 0.444-6.515 2.385-8.063 4.121-1.49 1.678-3.165 3.861-2.375 4.607z"/>\r
-   <path fill="#191919" d="m252.374 254.859c1.249 1.202 2.285-1.671 3.744-2.708 1.458-1.037 3.813-3.109 7.774-3.111 3.963-0.004 3.929-0.061 3.761-1.633-0.113-1.519-1.377-1.341-5.128-0.867-3.751 0.414-6.344 2.279-7.847 3.945-1.449 1.613-3.075 3.656-2.304 4.374z"/>\r
-   <path fill="#1e1e1e" d="m252.707 254.491c1.196 1.141 2.182-1.559 3.628-2.558 1.448-1 3.783-2.954 7.56-2.957 3.775-0.003 3.806-0.043 3.648-1.556-0.106-1.461-1.336-1.277-4.974-0.838-3.637 0.379-6.172 2.174-7.63 3.77-1.408 1.546-2.984 3.451-2.232 4.139z"/>\r
-   <path fill="#232323" d="m253.04 254.124c1.144 1.078 2.076-1.447 3.514-2.41 1.437-0.961 3.753-2.797 7.342-2.799 3.589-0.004 3.685-0.027 3.537-1.48-0.101-1.405-1.294-1.215-4.818-0.811-3.524 0.349-6.001 2.068-7.415 3.594-1.367 1.48-2.894 3.245-2.16 3.906z"/>\r
-   <path fill="#282828" d="m253.373 253.754c1.09 1.018 1.972-1.334 3.398-2.258 1.426-0.926 3.723-2.642 7.125-2.646 3.402-0.005 3.563-0.011 3.426-1.403-0.095-1.349-1.253-1.15-4.664-0.781-3.409 0.314-5.829 1.961-7.198 3.418-1.325 1.415-2.803 3.041-2.087 3.67z"/>\r
-   <path fill="#2d2d2d" d="m253.706 253.388c1.038 0.954 1.866-1.222 3.282-2.11 1.416-0.887 3.694-2.486 6.909-2.49 3.217-0.004 3.441 0.008 3.313-1.326-0.088-1.293-1.212-1.088-4.508-0.754-3.296 0.283-5.658 1.857-6.981 3.244-1.284 1.345-2.712 2.836-2.015 3.436z"/>\r
-   <path fill="#333" d="m254.039 253.02c0.985 0.893 1.762-1.109 3.167-1.96s3.664-2.33 6.693-2.335c3.029-0.006 3.32 0.023 3.202-1.249-0.082-1.237-1.171-1.024-4.354-0.726-3.182 0.25-5.485 1.75-6.765 3.066-1.243 1.282-2.622 2.634-1.943 3.204z"/>\r
-   <path fill="#383838" d="m254.372 252.652c0.933 0.831 1.657-0.998 3.051-1.81 1.396-0.813 3.636-2.174 6.478-2.18 2.843-0.006 3.199 0.039 3.09-1.172-0.076-1.181-1.129-0.963-4.198-0.697-3.068 0.217-5.314 1.644-6.55 2.891-1.202 1.214-2.531 2.427-1.871 2.968z"/>\r
-   <path fill="#3d3d3d" d="m254.704 252.284c0.88 0.771 1.553-0.885 2.938-1.66 1.383-0.775 3.604-2.019 6.26-2.024 2.656-0.007 3.078 0.058 2.979-1.095-0.069-1.125-1.088-0.899-4.044-0.67-2.954 0.185-5.144 1.539-6.333 2.715-1.16 1.148-2.441 2.222-1.8 2.734z"/>\r
-   <path fill="#424242" d="m255.037 251.917c0.827 0.707 1.448-0.773 2.821-1.51 1.373-0.738 3.576-1.863 6.044-1.871 2.47-0.007 2.956 0.074 2.867-1.018-0.063-1.068-1.046-0.836-3.889-0.641-2.841 0.151-4.973 1.433-6.116 2.539-1.119 1.083-2.35 2.018-1.727 2.501z"/>\r
-   <path fill="#474747" d="m255.37 251.549c0.774 0.645 1.344-0.661 2.706-1.362 1.362-0.7 3.545-1.706 5.828-1.713 2.283-0.009 2.834 0.09 2.754-0.942-0.057-1.012-1.005-0.773-3.733-0.613-2.727 0.119-4.801 1.328-5.899 2.365-1.078 1.013-2.26 1.81-1.656 2.265z"/>\r
-   <path fill="#4c4c4c" d="m255.703 251.181c0.721 0.584 1.239-0.55 2.59-1.212 1.353-0.663 3.517-1.551 5.612-1.559 2.096-0.009 2.713 0.107 2.643-0.865-0.051-0.955-0.964-0.709-3.577-0.584-2.613 0.086-4.631 1.222-5.686 2.188-1.035 0.949-2.168 1.607-1.582 2.032z"/>\r
-   <path fill="#515151" d="m256.036 250.813c0.669 0.521 1.134-0.436 2.476-1.063 1.341-0.625 3.485-1.395 5.395-1.402 1.91-0.01 2.591 0.124 2.531-0.789-0.044-0.898-0.922-0.646-3.423-0.557-2.499 0.055-4.458 1.117-5.469 2.014-0.994 0.882-2.077 1.402-1.51 1.797z"/>\r
-   <path fill="#565656" d="m256.369 250.446c0.616 0.459 1.029-0.324 2.36-0.912 1.33-0.589 3.456-1.24 5.178-1.248 1.723-0.01 2.47 0.141 2.42-0.713-0.039-0.842-0.881-0.582-3.268-0.527-2.387 0.021-4.287 1.01-5.252 1.836-0.953 0.816-1.987 1.199-1.438 1.564z"/>\r
-   <path fill="#5b5b5b" d="m256.701 250.079c0.564 0.397 0.926-0.213 2.245-0.764s3.427-1.084 4.963-1.093c1.536-0.011 2.348 0.157 2.307-0.636-0.031-0.785-0.839-0.52-3.112-0.5-2.271-0.01-4.116 0.906-5.035 1.662-0.913 0.751-1.898 0.993-1.368 1.331z"/>\r
-   <path fill="#606060" d="m257.034 249.709c0.511 0.336 0.821-0.1 2.13-0.612 1.309-0.515 3.397-0.929 4.746-0.938 1.351-0.01 2.227 0.176 2.196-0.558-0.026-0.729-0.799-0.457-2.958-0.472-2.158-0.043-3.945 0.799-4.82 1.486-0.87 0.682-1.805 0.788-1.294 1.094z"/>\r
-   <path fill="#666" d="m257.367 249.342c0.458 0.273 0.716 0.012 2.014-0.465 1.299-0.476 3.368-0.771 4.53-0.781 1.163-0.012 2.105 0.191 2.084-0.482-0.02-0.673-0.757-0.393-2.803-0.443-2.044-0.076-3.773 0.693-4.604 1.311-0.828 0.616-1.714 0.582-1.221 0.86z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m270.222 247.265c0 2.304 4.68 3.096 9.144 3.743 4.392 0.648 7.92 1.513 8.136 6.121 0.216 4.535-0.936 7.775 1.08 7.416 4.32-0.793 5.904-5.473 5.832-7.633 0-2.16-3.168-6.047-8.855-8.207-4.177-1.584-7.2-2.305-10.872-2.449-4.897-0.214-4.465 1.009-4.465 1.009z"/>\r
-   <path fill="#030303" d="m270.348 247.304c0.012 2.239 4.643 2.97 9.049 3.639 4.352 0.675 7.75 1.511 8.11 6.002 0.345 4.415-0.854 7.515 1.136 7.188 4.145-0.739 5.688-5.2 5.607-7.332-0.015-2.151-3.118-5.91-8.733-8.038-4.129-1.563-7.11-2.298-10.74-2.452-4.754-0.217-4.438 0.952-4.429 0.993z"/>\r
-   <path fill="#070707" d="m270.474 247.342c0.023 2.174 4.605 2.845 8.953 3.533 4.312 0.701 7.58 1.508 8.087 5.885 0.471 4.295-0.771 7.252 1.189 6.963 3.97-0.689 5.472-4.93 5.384-7.033-0.028-2.145-3.068-5.773-8.61-7.87-4.082-1.543-7.022-2.291-10.609-2.456-4.612-0.218-4.412 0.896-4.394 0.978z"/>\r
-   <path fill="#0b0b0b" d="m270.6 247.379c0.035 2.109 4.568 2.721 8.857 3.431 4.271 0.728 7.411 1.506 8.063 5.767 0.599 4.174-0.689 6.988 1.245 6.735 3.795-0.638 5.257-4.66 5.159-6.733-0.044-2.137-3.019-5.636-8.488-7.701-4.035-1.522-6.933-2.285-10.478-2.459-4.469-0.219-4.384 0.837-4.358 0.96z"/>\r
-   <path fill="#0f0f0f" d="m270.726 247.418c0.047 2.043 4.531 2.595 8.762 3.324 4.232 0.754 7.242 1.504 8.039 5.649 0.725 4.052-0.608 6.728 1.299 6.509 3.621-0.586 5.041-4.389 4.937-6.436-0.06-2.127-2.971-5.496-8.367-7.53-3.988-1.502-6.842-2.278-10.346-2.464-4.328-0.22-4.359 0.784-4.324 0.948z"/>\r
-   <path fill="#131313" d="m270.852 247.458c0.059 1.978 4.495 2.469 8.667 3.219 4.19 0.781 7.071 1.502 8.014 5.531 0.854 3.932-0.526 6.465 1.354 6.283 3.445-0.535 4.824-4.119 4.712-6.137-0.074-2.119-2.92-5.359-8.245-7.361-3.941-1.482-6.753-2.271-10.213-2.469-4.186-0.221-4.333 0.726-4.289 0.934z"/>\r
-   <path fill="#161616" d="m270.978 247.495c0.07 1.914 4.458 2.344 8.57 3.115 4.151 0.807 6.903 1.5 7.99 5.413 0.98 3.812-0.443 6.202 1.409 6.056 3.271-0.482 4.609-3.848 4.488-5.836-0.088-2.111-2.871-5.222-8.123-7.193-3.894-1.461-6.663-2.264-10.081-2.471-4.043-0.223-4.306 0.67-4.253 0.916z"/>\r
-   <path fill="#1a1a1a" d="m271.104 247.534c0.082 1.848 4.422 2.219 8.476 3.01 4.111 0.832 6.734 1.498 7.965 5.295 1.108 3.69-0.36 5.94 1.464 5.83 3.097-0.433 4.394-3.578 4.265-5.537-0.104-2.104-2.821-5.084-8-7.023-3.848-1.441-6.575-2.26-9.949-2.477-3.905-0.223-4.283 0.613-4.221 0.902z"/>\r
-   <path fill="#1e1e1e" d="m271.23 247.573c0.094 1.781 4.385 2.092 8.381 2.904 4.07 0.859 6.563 1.495 7.939 5.178 1.236 3.568-0.278 5.678 1.52 5.602 2.921-0.381 4.177-3.305 4.04-5.237-0.118-2.097-2.771-4.946-7.878-6.854-3.8-1.42-6.485-2.252-9.817-2.479-3.762-0.226-4.256 0.556-4.185 0.886z"/>\r
-   <path fill="#222" d="m271.356 247.61c0.105 1.717 4.348 1.969 8.285 2.801 4.029 0.885 6.395 1.493 7.916 5.059 1.362 3.449-0.197 5.416 1.573 5.377 2.746-0.329 3.962-3.036 3.816-4.939-0.133-2.087-2.722-4.808-7.756-6.684-3.753-1.4-6.396-2.247-9.686-2.484-3.618-0.227-4.227 0.499-4.148 0.87z"/>\r
-   <path fill="#262626" d="m271.482 247.648c0.118 1.651 4.311 1.843 8.189 2.694 3.99 0.914 6.226 1.492 7.892 4.943 1.491 3.328-0.115 5.152 1.629 5.149 2.571-0.278 3.746-2.765 3.592-4.64-0.146-2.08-2.672-4.672-7.634-6.516-3.705-1.38-6.306-2.24-9.553-2.488-3.478-0.225-4.203 0.446-4.115 0.858z"/>\r
-   <path fill="#2a2a2a" d="m271.608 247.687c0.129 1.587 4.273 1.716 8.094 2.59 3.95 0.938 6.056 1.489 7.867 4.825 1.618 3.206-0.033 4.891 1.684 4.922 2.396-0.227 3.53-2.494 3.368-4.34-0.162-2.072-2.623-4.534-7.512-6.348-3.658-1.358-6.216-2.232-9.421-2.492-3.336-0.226-4.177 0.39-4.08 0.843z"/>\r
-   <path fill="#2d2d2d" d="m271.734 247.725c0.141 1.521 4.237 1.591 7.999 2.484 3.909 0.967 5.886 1.488 7.842 4.707 1.746 3.086 0.05 4.629 1.739 4.697 2.221-0.176 3.313-2.225 3.144-4.041-0.177-2.064-2.572-4.396-7.389-6.178-3.612-1.339-6.128-2.227-9.29-2.497-3.194-0.227-4.151 0.334-4.045 0.828z"/>\r
-   <path fill="#313131" d="m271.86 247.763c0.153 1.456 4.2 1.466 7.903 2.381 3.869 0.991 5.717 1.485 7.817 4.589 1.873 2.965 0.132 4.365 1.794 4.469 2.046-0.123 3.099-1.953 2.92-3.742-0.191-2.055-2.523-4.258-7.267-6.008-3.565-1.318-6.038-2.22-9.158-2.5-3.051-0.229-4.124 0.276-4.009 0.811z"/>\r
-   <path fill="#353535" d="m271.986 247.801c0.165 1.392 4.163 1.341 7.808 2.275 3.829 1.018 5.547 1.483 7.794 4.473 2 2.843 0.213 4.103 1.848 4.242 1.873-0.074 2.883-1.683 2.696-3.443-0.206-2.047-2.474-4.12-7.145-5.838-3.517-1.299-5.948-2.215-9.026-2.506-2.91-0.229-4.099 0.221-3.975 0.797z"/>\r
-   <path fill="#393939" d="m272.112 247.84c0.176 1.326 4.126 1.215 7.712 2.17 3.789 1.045 5.378 1.482 7.771 4.354 2.127 2.723 0.295 3.842 1.901 4.016 1.698-0.021 2.667-1.412 2.474-3.144-0.222-2.038-2.426-3.981-7.023-5.669-3.47-1.277-5.859-2.208-8.894-2.509-2.769-0.231-4.074 0.164-3.941 0.782z"/>\r
-   <path fill="#3d3d3d" d="m272.238 247.877c0.188 1.262 4.089 1.09 7.617 2.066 3.749 1.071 5.208 1.479 7.745 4.236 2.255 2.602 0.377 3.578 1.957 3.789 1.522 0.029 2.451-1.141 2.249-2.844-0.236-2.033-2.375-3.846-6.901-5.5-3.423-1.258-5.769-2.203-8.762-2.514-2.626-0.231-4.046 0.109-3.905 0.767z"/>\r
-   <path fill="#414141" d="m272.364 247.917c0.2 1.195 4.052 0.965 7.522 1.961 3.708 1.098 5.037 1.477 7.72 4.119 2.383 2.479 0.46 3.315 2.012 3.562 1.348 0.081 2.236-0.87 2.025-2.545-0.251-2.022-2.325-3.707-6.778-5.331-3.377-1.237-5.681-2.195-8.631-2.518-2.485-0.233-4.02 0.05-3.87 0.752z"/>\r
-   <path fill="#444" d="m272.49 247.956c0.212 1.129 4.015 0.838 7.426 1.855 3.668 1.124 4.869 1.475 7.696 4 2.51 2.359 0.542 3.055 2.067 3.336 1.173 0.133 2.02-0.6 1.801-2.246-0.266-2.016-2.276-3.568-6.656-5.16-3.329-1.218-5.591-2.189-8.499-2.521-2.343-0.235-3.994-0.007-3.835 0.736z"/>\r
-   <path fill="#484848" d="m272.616 247.993c0.223 1.065 3.979 0.715 7.331 1.752 3.628 1.15 4.699 1.473 7.671 3.883 2.638 2.238 0.624 2.791 2.122 3.108 0.998 0.185 1.804-0.329 1.577-1.946-0.28-2.008-2.227-3.432-6.534-4.992-3.282-1.196-5.501-2.182-8.367-2.525-2.201-0.235-3.968-0.064-3.8 0.72z"/>\r
-   <path fill="#4c4c4c" d="m272.742 248.032c0.235 1 3.941 0.588 7.235 1.645 3.588 1.178 4.529 1.472 7.646 3.766 2.766 2.118 0.706 2.529 2.177 2.883 0.823 0.235 1.589-0.059 1.354-1.648-0.295-1.998-2.177-3.293-6.412-4.822-3.235-1.176-5.412-2.176-8.235-2.529-2.059-0.239-3.942-0.119-3.765 0.705z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#4c4c4c" d="m287.565 252.854c1.646 1 1.353 2.059 2.412 2.766 0.528 0.352 1.412 0.352 0.882-1-0.706-1.588-1.294-2.472-4.941-3.943-2.353-0.941-1.882 0.059 1.647 2.177z"/>\r
-   <path fill="#505050" d="m287.609 252.868c1.605 0.975 1.32 2.008 2.353 2.696 0.517 0.343 1.377 0.343 0.86-0.976-0.689-1.549-1.262-2.41-4.82-3.846-2.295-0.917-1.836 0.059 1.607 2.126z"/>\r
-   <path fill="#545454" d="m287.652 252.879c1.567 0.951 1.287 1.957 2.294 2.629 0.503 0.334 1.343 0.334 0.839-0.951-0.671-1.51-1.23-2.35-4.699-3.749-2.238-0.893-1.79 0.058 1.566 2.071z"/>\r
-   <path fill="#575757" d="m287.696 252.891c1.526 0.926 1.254 1.908 2.235 2.563 0.489 0.325 1.308 0.325 0.816-0.928-0.653-1.471-1.199-2.289-4.578-3.652-2.179-0.872-1.743 0.055 1.527 2.017z"/>\r
-   <path fill="#5b5b5b" d="m287.74 252.903c1.485 0.902 1.22 1.857 2.175 2.494 0.479 0.318 1.274 0.318 0.796-0.902-0.637-1.432-1.167-2.229-4.457-3.556-2.122-0.849-1.697 0.054 1.486 1.964z"/>\r
-   <path fill="#5f5f5f" d="m287.783 252.915c1.446 0.879 1.188 1.808 2.117 2.426 0.464 0.31 1.239 0.31 0.773-0.877-0.619-1.394-1.136-2.168-4.336-3.459-2.064-0.826-1.65 0.052 1.446 1.91z"/>\r
-   <path fill="#636363" d="m287.827 252.926c1.405 0.854 1.154 1.758 2.057 2.359 0.452 0.301 1.205 0.301 0.754-0.853-0.603-1.354-1.104-2.108-4.216-3.363-2.007-0.801-1.605 0.053 1.405 1.857z"/>\r
-   <path fill="#676767" d="m287.871 252.94c1.364 0.828 1.121 1.705 1.998 2.29 0.438 0.292 1.17 0.292 0.731-0.828-0.585-1.315-1.072-2.047-4.095-3.267-1.948-0.779-1.558 0.05 1.366 1.805z"/>\r
-   <path fill="#6b6b6b" d="m287.914 252.952c1.325 0.805 1.088 1.655 1.94 2.223 0.425 0.283 1.135 0.283 0.709-0.803-0.568-1.277-1.041-1.988-3.974-3.17-1.891-0.757-1.512 0.047 1.325 1.75z"/>\r
-   <path fill="#6e6e6e" d="m287.958 252.963c1.284 0.779 1.056 1.605 1.88 2.156 0.413 0.274 1.102 0.274 0.688-0.779-0.551-1.238-1.009-1.926-3.853-3.073-1.833-0.733-1.466 0.046 1.285 1.696z"/>\r
-   <path fill="#727272" d="m288.002 252.976c1.243 0.755 1.021 1.554 1.821 2.087 0.399 0.266 1.066 0.266 0.666-0.755-0.533-1.199-0.977-1.865-3.731-2.976-1.776-0.71-1.421 0.045 1.244 1.644z"/>\r
-   <path fill="#767676" d="m288.045 252.989c1.203 0.73 0.989 1.504 1.763 2.02 0.387 0.257 1.031 0.257 0.645-0.731-0.516-1.159-0.946-1.805-3.61-2.879-1.72-0.688-1.376 0.042 1.202 1.59z"/>\r
-   <path fill="#7a7a7a" d="m288.089 253c1.163 0.705 0.955 1.453 1.703 1.951 0.373 0.25 0.997 0.25 0.623-0.705-0.499-1.121-0.914-1.744-3.489-2.783-1.661-0.664-1.329 0.041 1.163 1.537z"/>\r
-   <path fill="#7e7e7e" d="m288.133 253.012c1.122 0.682 0.923 1.404 1.644 1.885 0.361 0.24 0.962 0.24 0.602-0.682-0.481-1.082-0.882-1.684-3.367-2.687-1.605-0.64-1.285 0.041 1.121 1.484z"/>\r
-   <path fill="#828282" d="m288.176 253.025c1.082 0.657 0.89 1.353 1.586 1.815 0.348 0.232 0.927 0.232 0.578-0.656-0.463-1.043-0.85-1.623-3.245-2.59-1.547-0.618-1.237 0.039 1.081 1.431z"/>\r
-   <path fill="#858585" d="m288.22 253.038c1.042 0.631 0.855 1.301 1.524 1.748 0.335 0.223 0.894 0.223 0.559-0.633-0.446-1.005-0.818-1.563-3.125-2.492-1.488-0.596-1.19 0.037 1.042 1.377z"/>\r
-   <path fill="#898989" d="m288.264 253.049c1.001 0.607 0.821 1.252 1.466 1.681 0.322 0.214 0.857 0.214 0.536-0.608-0.43-0.965-0.786-1.502-3.004-2.396-1.43-0.573-1.144 0.034 1.002 1.323z"/>\r
-   <path fill="#8d8d8d" d="m288.307 253.061c0.961 0.584 0.79 1.201 1.407 1.613 0.309 0.205 0.823 0.205 0.515-0.584-0.412-0.926-0.755-1.441-2.883-2.299-1.373-0.548-1.098 0.034 0.961 1.27z"/>\r
-   <path fill="#919191" d="m288.351 253.073c0.921 0.559 0.756 1.151 1.348 1.547 0.296 0.196 0.789 0.196 0.493-0.56-0.395-0.888-0.723-1.381-2.762-2.204-1.315-0.525-1.052 0.033 0.921 1.217z"/>\r
-   <path fill="#959595" d="m288.395 253.084c0.88 0.535 0.723 1.102 1.289 1.479 0.282 0.189 0.754 0.189 0.471-0.534-0.377-0.849-0.691-1.321-2.641-2.106-1.257-0.505-1.006 0.031 0.881 1.161z"/>\r
-   <path fill="#999" d="m288.438 253.097c0.84 0.51 0.689 1.05 1.229 1.409 0.271 0.181 0.721 0.181 0.45-0.51-0.36-0.81-0.66-1.26-2.52-2.01-1.199-0.48-0.959 0.031 0.841 1.111z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path d="m222.275 107.427c-0.738 0.902 0.574 8.365 5.412 13.285 4.839 4.838 7.791 4.838 9.759 2.706 3.771-4.018 0.738-7.791-1.558-10.415-2.297-2.624-5.248-1.722-7.955-4.346-2.706-2.624-4.592-2.46-5.658-1.23z"/>\r
-   <path fill="#050505" d="m222.345 107.494c-0.732 0.895 0.569 8.3 5.369 13.182 4.803 4.801 7.731 4.801 9.685 2.685 3.742-3.987 0.731-7.73-1.546-10.334-2.278-2.604-5.208-1.709-7.894-4.312-2.684-2.604-4.556-2.441-5.614-1.221z"/>\r
-   <path fill="#0a0a0a" d="m222.416 107.561c-0.727 0.888 0.565 8.235 5.328 13.079 4.763 4.763 7.67 4.763 9.607 2.664 3.713-3.956 0.727-7.67-1.534-10.253-2.26-2.584-5.166-1.696-7.831-4.279-2.664-2.583-4.521-2.422-5.57-1.211z"/>\r
-   <path fill="#0f0f0f" d="m222.486 107.628c-0.721 0.881 0.561 8.17 5.286 12.976 4.726 4.725 7.608 4.725 9.532 2.642 3.684-3.924 0.72-7.609-1.522-10.172-2.243-2.563-5.126-1.682-7.77-4.244-2.643-2.563-4.485-2.403-5.526-1.202z"/>\r
-   <path fill="#141414" d="m222.556 107.695c-0.716 0.874 0.557 8.105 5.243 12.872 4.689 4.688 7.55 4.688 9.456 2.622 3.655-3.893 0.716-7.549-1.51-10.091-2.224-2.543-5.085-1.669-7.707-4.211-2.621-2.543-4.449-2.384-5.482-1.192z"/>\r
-   <path fill="#191919" d="m222.627 107.762c-0.71 0.867 0.552 8.04 5.202 12.769 4.65 4.65 7.488 4.65 9.379 2.601 3.626-3.862 0.71-7.489-1.497-10.011s-5.044-1.655-7.646-4.177-4.414-2.364-5.438-1.182z"/>\r
-   <path fill="#1e1e1e" d="m222.697 107.829c-0.704 0.86 0.547 7.975 5.16 12.666 4.613 4.612 7.428 4.612 9.304 2.579 3.596-3.83 0.703-7.427-1.486-9.929-2.188-2.502-5.003-1.642-7.584-4.143-2.579-2.502-4.378-2.346-5.394-1.173z"/>\r
-   <path fill="#232323" d="m222.767 107.896c-0.697 0.853 0.543 7.91 5.117 12.562 4.576 4.575 7.367 4.575 9.229 2.559 3.567-3.8 0.698-7.367-1.473-9.848-2.171-2.482-4.963-1.629-7.522-4.11s-4.343-2.326-5.351-1.163z"/>\r
-   <path fill="#282828" d="m222.838 107.963c-0.691 0.846 0.538 7.845 5.076 12.459 4.537 4.537 7.307 4.537 9.152 2.538 3.537-3.769 0.691-7.307-1.461-9.768-2.154-2.461-4.922-1.615-7.461-4.076-2.538-2.461-4.307-2.307-5.306-1.153z"/>\r
-   <path fill="#2d2d2d" d="m222.908 108.03c-0.686 0.839 0.534 7.78 5.034 12.355 4.5 4.499 7.246 4.499 9.076 2.516 3.509-3.737 0.686-7.246-1.449-9.686-2.135-2.441-4.881-1.602-7.399-4.042-2.516-2.44-4.271-2.287-5.262-1.143z"/>\r
-   <path fill="#333" d="m222.978 108.096c-0.681 0.832 0.529 7.715 4.992 12.253 4.463 4.462 7.186 4.462 9.001 2.496 3.479-3.706 0.68-7.186-1.438-9.605-2.118-2.42-4.841-1.588-7.337-4.008s-4.235-2.27-5.218-1.136z"/>\r
-   <path fill="#383838" d="m223.048 108.163c-0.674 0.825 0.526 7.65 4.95 12.15 4.425 4.425 7.125 4.425 8.925 2.475 3.45-3.675 0.676-7.125-1.425-9.525-2.099-2.4-4.8-1.575-7.274-3.975-2.475-2.399-4.201-2.25-5.176-1.125z"/>\r
-   <path fill="#3d3d3d" d="m223.119 108.23c-0.669 0.818 0.521 7.585 4.908 12.047 4.387 4.387 7.063 4.387 8.849 2.453 3.42-3.643 0.669-7.064-1.413-9.443-2.082-2.38-4.759-1.562-7.214-3.941-2.453-2.38-4.164-2.231-5.13-1.116z"/>\r
-   <path fill="#424242" d="m223.189 108.297c-0.663 0.811 0.516 7.52 4.866 11.944 4.35 4.349 7.004 4.349 8.772 2.432 3.392-3.612 0.663-7.004-1.4-9.363-2.064-2.359-4.719-1.548-7.151-3.907-2.433-2.359-4.129-2.212-5.087-1.106z"/>\r
-   <path fill="#474747" d="m223.259 108.364c-0.656 0.804 0.513 7.455 4.824 11.84 4.313 4.312 6.944 4.312 8.697 2.412 3.362-3.582 0.658-6.944-1.388-9.282-2.046-2.339-4.679-1.535-7.09-3.874-2.411-2.338-4.093-2.192-5.043-1.096z"/>\r
-   <path fill="#4c4c4c" d="m223.33 108.431c-0.651 0.797 0.507 7.39 4.782 11.737 4.274 4.274 6.882 4.274 8.621 2.39 3.332-3.55 0.651-6.883-1.377-9.201s-4.636-1.521-7.028-3.839c-2.39-2.318-4.057-2.174-4.998-1.087z"/>\r
-   <path fill="#515151" d="m223.4 108.498c-0.646 0.79 0.503 7.325 4.74 11.634 4.236 4.236 6.821 4.236 8.545 2.369 3.304-3.519 0.646-6.822-1.364-9.12s-4.596-1.508-6.966-3.806c-2.369-2.298-4.022-2.154-4.955-1.077z"/>\r
-   <path fill="#565656" d="m223.47 108.565c-0.641 0.783 0.499 7.26 4.697 11.53 4.199 4.199 6.763 4.199 8.471 2.349 3.273-3.488 0.64-6.762-1.353-9.039-1.993-2.278-4.556-1.495-6.905-3.773-2.347-2.277-3.985-2.135-4.91-1.067z"/>\r
-   <path fill="#5b5b5b" d="m223.541 108.632c-0.635 0.776 0.493 7.195 4.656 11.427 4.161 4.161 6.701 4.161 8.393 2.327 3.245-3.456 0.636-6.701-1.34-8.958-1.975-2.257-4.514-1.48-6.843-3.738-2.327-2.257-3.95-2.116-4.866-1.058z"/>\r
-   <path fill="#606060" d="m223.611 108.699c-0.629 0.769 0.489 7.13 4.614 11.324 4.124 4.123 6.64 4.123 8.317 2.306 3.215-3.425 0.628-6.641-1.328-8.877-1.957-2.237-4.474-1.468-6.78-3.705-2.306-2.236-3.915-2.097-4.823-1.048z"/>\r
-   <path fill="#666" d="m223.681 108.765c-0.623 0.762 0.484 7.065 4.571 11.221 4.086 4.086 6.58 4.086 8.242 2.285 3.187-3.394 0.623-6.58-1.315-8.796-1.939-2.217-4.434-1.455-6.72-3.671-2.284-2.216-3.878-2.078-4.778-1.039z"/>\r
-  </g>\r
-  <g transform="translate(-12.4048,10.0005)">\r
-   <path fill="#fc0" d="m137.79 109.277c1.978 1.366 2.031 1.607 4.948 3.514 4.64 3.768 12.885 4.616 16.922 4.75 9.233 1.467 25.738-7.161 32.273-11.111 3.291-2.463 9.38-7.551 11.659-7.637 1.405 1.485-0.66 1.792-3.587 3.775-3.906 2.779-7.25 5.156-13.172 8.515-6.338 3.316-16.078 8.794-28.548 8.054-6.542-0.959-6.566-1.024-10.606-3.086-2.4-1.732-7.901-4.608-9.889-6.774z"/>\r
-   <linearGradient id="al" x1="129.342" gradientUnits="userSpaceOnUse" x2="195.598" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.305" y2="259.305">\r
-    <stop stop-color="#FAC700" offset="0"/>\r
-    <stop stop-color="#F7C400" offset=".415"/>\r
-    <stop stop-color="#F7C400" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#al)" d="m137.742 109.259c1.926 1.274 2.165 1.643 5.083 3.554 4.616 3.734 12.716 4.616 16.796 4.763 9.365 1.452 26.05-7.294 32.356-11.159 3.357-2.506 9.344-7.498 11.595-7.604 1.365 1.472-0.728 1.768-3.688 3.814-3.889 2.753-7.119 5.065-12.972 8.383-6.29 3.291-16.078 8.795-28.536 8.104-6.561-0.945-6.851-1.07-10.758-3.079-2.468-1.755-7.876-4.587-9.876-6.776z"/>\r
-   <linearGradient id="am" x1="129.293" gradientUnits="userSpaceOnUse" x2="195.554" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.311" y2="259.311">\r
-    <stop stop-color="#F6C200" offset="0"/>\r
-    <stop stop-color="#EFBC00" offset=".415"/>\r
-    <stop stop-color="#EFBC00" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#am)" d="m137.693 109.24c1.876 1.183 2.3 1.68 5.218 3.595 4.593 3.7 12.548 4.616 16.67 4.776 9.498 1.437 26.364-7.428 32.44-11.207 3.425-2.55 9.308-7.444 11.528-7.57 1.326 1.457-0.795 1.743-3.788 3.854-3.87 2.725-6.99 4.973-12.771 8.25-6.243 3.266-16.078 8.796-28.525 8.154-6.579-0.931-7.134-1.117-10.908-3.073-2.536-1.779-7.852-4.567-9.864-6.779z"/>\r
-   <linearGradient id="an" x1="129.245" gradientUnits="userSpaceOnUse" x2="195.51" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.317" y2="259.317">\r
-    <stop stop-color="#F1BD00" offset="0"/>\r
-    <stop stop-color="#E8B500" offset=".415"/>\r
-    <stop stop-color="#E8B500" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#an)" d="m137.645 109.222c1.825 1.091 2.434 1.715 5.352 3.635 4.569 3.665 12.38 4.615 16.544 4.789 9.631 1.422 26.677-7.562 32.524-11.255 3.491-2.594 9.271-7.392 11.463-7.538 1.287 1.442-0.861 1.718-3.889 3.893-3.853 2.699-6.86 4.882-12.57 8.119-6.195 3.241-16.078 8.797-28.513 8.203-6.6-0.916-7.418-1.163-11.061-3.066-2.603-1.801-7.826-4.546-9.85-6.78z"/>\r
-   <linearGradient id="ao" x1="129.196" gradientUnits="userSpaceOnUse" x2="195.465" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.322" y2="259.322">\r
-    <stop stop-color="#EDB800" offset="0"/>\r
-    <stop stop-color="#E0AD00" offset=".415"/>\r
-    <stop stop-color="#E0AD00" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ao)" d="m137.596 109.203c1.774 1 2.568 1.752 5.487 3.676 4.545 3.631 12.211 4.615 16.418 4.801 9.764 1.408 26.989-7.695 32.608-11.302 3.557-2.637 9.236-7.338 11.396-7.505 1.247 1.427-0.928 1.693-3.99 3.932-3.833 2.672-6.729 4.791-12.369 7.986-6.148 3.217-16.078 8.799-28.501 8.254-6.619-0.902-7.702-1.21-11.21-3.059-2.672-1.825-7.803-4.525-9.839-6.783z"/>\r
-   <linearGradient id="ap" x1="129.148" gradientUnits="userSpaceOnUse" x2="195.422" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.327" y2="259.327">\r
-    <stop stop-color="#E9B300" offset="0"/>\r
-    <stop stop-color="#D8A500" offset=".415"/>\r
-    <stop stop-color="#D8A500" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ap)" d="m137.548 109.184c1.724 0.909 2.703 1.788 5.622 3.717 4.522 3.597 12.043 4.615 16.292 4.814 9.896 1.393 27.303-7.829 32.692-11.35 3.624-2.681 9.2-7.286 11.331-7.472 1.208 1.412-0.995 1.668-4.092 3.972-3.814 2.644-6.6 4.698-12.168 7.853-6.101 3.192-16.077 8.8-28.489 8.303-6.638-0.887-7.986-1.256-11.361-3.052-2.741-1.848-7.779-4.504-9.827-6.785z"/>\r
-   <linearGradient id="aq" x1="129.099" gradientUnits="userSpaceOnUse" x2="195.379" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.332" y2="259.332">\r
-    <stop stop-color="#E4AE00" offset="0"/>\r
-    <stop stop-color="#D19E00" offset=".415"/>\r
-    <stop stop-color="#D19E00" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#aq)" d="m137.499 109.166c1.673 0.817 2.838 1.824 5.757 3.757 4.499 3.562 11.875 4.614 16.166 4.827 10.029 1.378 27.615-7.963 32.776-11.398 3.691-2.725 9.164-7.232 11.265-7.439 1.169 1.397-1.061 1.644-4.191 4.01-3.796 2.618-6.469 4.608-11.968 7.722-6.053 3.167-16.077 8.801-28.478 8.353-6.657-0.873-8.27-1.303-11.512-3.046-2.809-1.87-7.755-4.483-9.815-6.786z"/>\r
-   <linearGradient id="ar" x1="129.051" gradientUnits="userSpaceOnUse" x2="195.338" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.336" y2="259.336">\r
-    <stop stop-color="#E0A900" offset="0"/>\r
-    <stop stop-color="#C99600" offset=".415"/>\r
-    <stop stop-color="#C99600" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ar)" d="m137.451 109.147c1.622 0.726 2.972 1.86 5.892 3.798 4.475 3.528 11.705 4.614 16.04 4.84 10.161 1.362 27.929-8.097 32.859-11.447 3.757-2.767 9.128-7.178 11.2-7.405 1.13 1.382-1.128 1.619-4.294 4.049-3.777 2.592-6.339 4.517-11.767 7.589-6.005 3.143-16.077 8.803-28.466 8.404-6.676-0.859-8.553-1.35-11.663-3.039-2.876-1.894-7.729-4.462-9.801-6.789z"/>\r
-   <linearGradient id="w" x1="129.003" gradientUnits="userSpaceOnUse" x2="195.296" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.34" y2="259.34">\r
-    <stop stop-color="#DCA400" offset="0"/>\r
-    <stop stop-color="#C18E00" offset=".415"/>\r
-    <stop stop-color="#C18E00" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#w)" d="m137.403 109.129c1.571 0.634 3.105 1.896 6.026 3.838 4.45 3.494 11.536 4.614 15.913 4.852 10.295 1.348 28.241-8.23 32.943-11.494 3.824-2.811 9.092-7.125 11.134-7.373 1.092 1.367-1.194 1.594-4.394 4.088-3.759 2.565-6.209 4.425-11.566 7.457-5.957 3.118-16.077 8.804-28.454 8.453-6.694-0.844-8.837-1.396-11.813-3.032-2.945-1.916-7.706-4.44-9.789-6.789z"/>\r
-   <linearGradient id="x" x1="128.954" gradientUnits="userSpaceOnUse" x2="195.255" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.343" y2="259.343">\r
-    <stop stop-color="#D79F00" offset="0"/>\r
-    <stop stop-color="#BA8700" offset=".415"/>\r
-    <stop stop-color="#BA8700" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#x)" d="m137.354 109.11c1.521 0.543 3.241 1.932 6.161 3.879 4.428 3.459 11.368 4.613 15.788 4.865 10.427 1.333 28.554-8.364 33.026-11.542 3.892-2.855 9.057-7.073 11.068-7.339 1.052 1.353-1.261 1.569-4.495 4.127-3.74 2.538-6.078 4.334-11.365 7.325-5.91 3.093-16.077 8.805-28.441 8.503-6.716-0.83-9.121-1.443-11.966-3.026-3.012-1.939-7.68-4.42-9.776-6.792z"/>\r
-   <linearGradient id="y" x1="128.906" gradientUnits="userSpaceOnUse" x2="195.216" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.348" y2="259.348">\r
-    <stop stop-color="#D39B00" offset="0"/>\r
-    <stop stop-color="#B27F00" offset=".415"/>\r
-    <stop stop-color="#B27F00" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#y)" d="m137.306 109.091c1.47 0.451 3.375 1.969 6.296 3.919 4.403 3.426 11.2 4.614 15.662 4.879 10.559 1.318 28.865-8.498 33.109-11.59 3.958-2.899 9.021-7.02 11.003-7.306 1.013 1.337-1.328 1.544-4.596 4.167-3.722 2.511-5.949 4.242-11.165 7.192-5.862 3.068-16.077 8.807-28.43 8.553-6.734-0.816-9.405-1.489-12.116-3.019-3.08-1.963-7.656-4.4-9.763-6.795z"/>\r
-   <linearGradient id="z" x1="128.857" gradientUnits="userSpaceOnUse" x2="195.176" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.35" y2="259.35">\r
-    <stop stop-color="#CF9600" offset="0"/>\r
-    <stop stop-color="#a70" offset=".415"/>\r
-    <stop stop-color="#a70" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#z)" d="m137.257 109.073c1.421 0.359 3.511 2.005 6.432 3.959 4.38 3.392 11.032 4.614 15.536 4.892 10.691 1.303 29.179-8.631 33.193-11.638 4.024-2.942 8.984-6.967 10.938-7.274 0.973 1.323-1.396 1.521-4.697 4.206-3.703 2.484-5.818 4.151-10.964 7.06-5.814 3.043-16.077 8.808-28.418 8.603-6.753-0.802-9.689-1.535-12.268-3.012-3.149-1.986-7.632-4.378-9.752-6.796z"/>\r
-   <linearGradient id="aa" x1="128.809" gradientUnits="userSpaceOnUse" x2="195.137" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.354" y2="259.354">\r
-    <stop stop-color="#CA9100" offset="0"/>\r
-    <stop stop-color="#A37000" offset=".415"/>\r
-    <stop stop-color="#A37000" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#aa)" d="m137.209 109.054c1.368 0.268 3.645 2.041 6.565 4 4.356 3.357 10.864 4.613 15.41 4.904 10.824 1.289 29.493-8.764 33.277-11.685 4.092-2.986 8.948-6.914 10.871-7.241 0.935 1.308-1.461 1.496-4.797 4.245-3.685 2.457-5.688 4.06-10.763 6.928-5.768 3.018-16.077 8.809-28.407 8.653-6.771-0.788-9.972-1.582-12.418-3.006-3.216-2.008-7.607-4.357-9.738-6.798z"/>\r
-   <linearGradient id="ab" x1="128.76" gradientUnits="userSpaceOnUse" x2="195.099" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.356" y2="259.356">\r
-    <stop stop-color="#C68C00" offset="0"/>\r
-    <stop stop-color="#9B6800" offset=".415"/>\r
-    <stop stop-color="#9B6800" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ab)" d="m137.16 109.036c1.318 0.176 3.779 2.077 6.701 4.04 4.333 3.323 10.695 4.613 15.284 4.917 10.957 1.274 29.805-8.898 33.36-11.733 4.158-3.03 8.912-6.86 10.807-7.208 0.894 1.292-1.528 1.471-4.899 4.284-3.666 2.43-5.558 3.968-10.562 6.796-5.72 2.993-16.077 8.81-28.396 8.702-6.791-0.773-10.256-1.628-12.568-2.999-3.285-2.031-7.583-4.336-9.727-6.799z"/>\r
-   <linearGradient id="ac" x1="128.712" gradientUnits="userSpaceOnUse" x2="195.062" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.358" y2="259.358">\r
-    <stop stop-color="#C28700" offset="0"/>\r
-    <stop stop-color="#936000" offset=".415"/>\r
-    <stop stop-color="#936000" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ac)" d="m137.112 109.017c1.267 0.085 3.912 2.113 6.835 4.081 4.31 3.289 10.527 4.613 15.158 4.93 11.09 1.258 30.118-9.032 33.445-11.782 4.225-3.072 8.877-6.807 10.739-7.174 0.855 1.278-1.595 1.446-5 4.323-3.647 2.404-5.427 3.877-10.36 6.663-5.673 2.969-16.077 8.812-28.384 8.753-6.811-0.759-10.54-1.675-12.719-2.992-3.353-2.055-7.559-4.315-9.714-6.802z"/>\r
-   <linearGradient id="ad" x1="128.663" gradientUnits="userSpaceOnUse" x2="195.025" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.36" y2="259.36">\r
-    <stop stop-color="#BD8200" offset="0"/>\r
-    <stop stop-color="#8C5900" offset=".415"/>\r
-    <stop stop-color="#8C5900" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ad)" d="m137.063 108.998c1.217-0.006 4.047 2.15 6.97 4.122 4.286 3.254 10.359 4.612 15.032 4.943 11.223 1.243 30.431-9.166 33.53-11.83 4.289-3.116 8.84-6.753 10.673-7.141 0.815 1.263-1.661 1.421-5.101 4.362-3.63 2.377-5.298 3.785-10.161 6.531-5.624 2.944-16.075 8.813-28.37 8.802-6.83-0.744-10.824-1.721-12.87-2.985-3.422-2.077-7.535-4.294-9.703-6.804z"/>\r
-   <linearGradient id="ae" x1="128.615" gradientUnits="userSpaceOnUse" x2="194.989" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.362" y2="259.362">\r
-    <stop stop-color="#B97D00" offset="0"/>\r
-    <stop stop-color="#845100" offset=".415"/>\r
-    <stop stop-color="#845100" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ae)" d="m137.015 108.98c1.166-0.098 4.181 2.185 7.104 4.162 4.262 3.22 10.19 4.612 14.906 4.955 11.354 1.229 30.743-9.299 33.613-11.877 4.356-3.16 8.804-6.7 10.607-7.108 0.776 1.248-1.728 1.397-5.202 4.401-3.61 2.35-5.167 3.694-9.96 6.399-5.576 2.919-16.076 8.814-28.358 8.852-6.85-0.73-11.108-1.768-13.021-2.979-3.489-2.1-7.51-4.273-9.689-6.805z"/>\r
-   <linearGradient id="af" x1="128.567" gradientUnits="userSpaceOnUse" x2="194.954" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.364" y2="259.364">\r
-    <stop stop-color="#B57800" offset="0"/>\r
-    <stop stop-color="#7C4900" offset=".415"/>\r
-    <stop stop-color="#7C4900" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#af)" d="m136.967 108.961c1.115-0.189 4.315 2.222 7.239 4.203 4.239 3.186 10.021 4.612 14.78 4.968 11.488 1.214 31.057-9.433 33.697-11.925 4.424-3.203 8.768-6.647 10.542-7.075 0.736 1.233-1.795 1.372-5.303 4.44-3.593 2.323-5.038 3.603-9.759 6.266-5.529 2.895-16.077 8.816-28.348 8.903-6.868-0.716-11.392-1.815-13.172-2.972-3.557-2.124-7.485-4.252-9.676-6.808z"/>\r
-   <linearGradient id="ah" x1="128.518" gradientUnits="userSpaceOnUse" x2="194.918" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.366" y2="259.366">\r
-    <stop stop-color="#B07300" offset="0"/>\r
-    <stop stop-color="#754200" offset=".415"/>\r
-    <stop stop-color="#754200" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ah)" d="m136.918 108.943c1.064-0.281 4.45 2.257 7.374 4.243 4.216 3.151 9.854 4.611 14.654 4.981 11.621 1.199 31.37-9.567 33.781-11.973 4.49-3.247 8.731-6.594 10.476-7.042 0.698 1.218-1.861 1.347-5.403 4.479-3.573 2.296-4.906 3.511-9.558 6.134-5.48 2.87-16.076 8.817-28.336 8.952-6.887-0.701-11.675-1.861-13.323-2.965-3.626-2.146-7.462-4.231-9.665-6.809z"/>\r
-   <linearGradient id="ai" x1="128.47" gradientUnits="userSpaceOnUse" x2="194.886" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.367" y2="259.367">\r
-    <stop stop-color="#AC6E00" offset="0"/>\r
-    <stop stop-color="#6D3A00" offset=".415"/>\r
-    <stop stop-color="#6D3A00" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#ai)" d="m136.87 108.924c1.013-0.372 4.584 2.294 7.509 4.284 4.191 3.117 9.685 4.611 14.528 4.994 11.753 1.184 31.682-9.701 33.864-12.021 4.557-3.291 8.695-6.542 10.411-7.009 0.657 1.203-1.929 1.322-5.504 4.518-3.557 2.269-4.777 3.42-9.358 6.002-5.434 2.845-16.076 8.818-28.324 9.002-6.907-0.687-11.959-1.908-13.474-2.959-3.694-2.169-7.437-4.21-9.652-6.811z"/>\r
-   <linearGradient id="aj" x1="128.421" gradientUnits="userSpaceOnUse" x2="194.85" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.369" y2="259.369">\r
-    <stop stop-color="#A86A00" offset="0"/>\r
-    <stop stop-color="#663200" offset=".415"/>\r
-    <stop stop-color="#663200" offset="1"/>\r
-   </linearGradient>\r
-   <path fill="url(#aj)" d="m136.821 108.905c0.963-0.464 4.719 2.33 7.644 4.324 4.168 3.083 9.517 4.611 14.402 5.007 11.886 1.169 31.995-9.834 33.948-12.069 4.624-3.334 8.66-6.487 10.345-6.976 0.619 1.188-1.995 1.298-5.604 4.558-3.537 2.242-4.647 3.328-9.157 5.869-5.386 2.82-16.076 8.82-28.313 9.052-6.926-0.673-12.243-1.954-13.625-2.952-3.762-2.192-7.413-4.189-9.64-6.813z"/>\r
-  </g>\r
- </g>\r
-</svg>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 349.46883 405.12272">
+ <title>Tux</title>
+ <desc>For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg</desc>
+ <radialGradient id="ag" gradientUnits="userSpaceOnUse" cy="-551.04" cx="274.822" gradientTransform="matrix(.5671 0 0 -.2835 81.263 201.645)" r="165.384">
+  <stop stop-opacity=".502" offset="0"/>
+  <stop stop-opacity="0" offset="1"/>
+ </radialGradient>
+ <path fill="url(#ag)" d="m330.892 357.885c0 25.898-41.989 46.893-93.785 46.893-51.795 0-93.784-20.994-93.784-46.893s41.989-46.893 93.784-46.893c51.795 0.001 93.785 20.995 93.785 46.893z"/>
+ <radialGradient id="ak" gradientUnits="userSpaceOnUse" cy="-551.042" cx="268.794" gradientTransform="matrix(.5823 0 0 -.2835 -61.6052 201.14)" r="165.383">
+  <stop stop-opacity=".502" offset="0"/>
+  <stop stop-opacity="0" offset="1"/>
+ </radialGradient>
+ <path fill="url(#ak)" d="m191.223 357.381c0 25.897-43.117 46.892-96.306 46.892-53.188 0-96.305-20.994-96.305-46.892s43.117-46.893 96.305-46.893c53.188 0.001 96.306 20.995 96.306 46.893z"/>
+ <g transform="translate(8.99996 9.00046)">
+  <path d="m292.327 256.606c-4.752 19.584-28.872 60.48-41.688 78.48-12.815 18.072-11.231 34.344-34.92 28.008-23.616-6.336-30.24-5.184-54.647-3.744-24.265 1.439-19.009-0.721-34.2 6.12-15.12 6.84-65.88-82.944-69.984-99.647-4.031-16.705-5.976-14.689 4.536-32.761 10.513-18.071 12.024-35.928 25.92-57.816 13.896-21.96 29.952-33.12 28.8-49.896-4.535-62.28-8.136-93.384 19.513-107.784 26.352-13.68 48.384-5.544 57.096-0.864 3.744 2.016 11.376 5.904 17.064 12.744 5.688 6.696 10.8 16.848 13.68 29.664 5.904 25.704-2.448 17.208 4.248 46.656 6.624 29.375 20.088 43.775 36.504 67.031 16.414 23.257 33.55 61.633 28.078 83.809z"/>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#666" d="m148.47 94.049c4.319-1.728 3.592-1.958 6.472-8.222 2.304-4.824 4.328-6.898 4.256-14.242 0-7.2-2.232-9.648-5.616-14.328-3.24-4.464-8.424-4.68-11.664-4.104-1.872 0.288-4.319 2.664-5.976 6.192-1.08 2.376-1.944 5.4-2.017 8.568-0.216 8.496 0.505 11.736 2.448 17.496 2.305 6.769 7.921 10.297 12.097 8.64z"/>
+   <path fill="#6d6d6d" d="m148.47 94.023c4.293-1.717 3.563-1.954 6.425-8.178 2.289-4.793 4.312-6.861 4.271-14.164 0.027-7.152-2.162-9.702-5.488-14.201-3.296-4.345-8.376-4.509-11.593-3.953-1.916 0.283-4.354 2.569-6.038 5.968-1.159 2.31-2.016 5.353-2.087 8.535-0.212 8.438 0.547 11.691 2.46 17.417 2.268 6.731 7.901 10.221 12.05 8.576z"/>
+   <path fill="#757575" d="m148.471 93.996c4.264-1.706 3.533-1.95 6.377-8.133 2.273-4.762 4.296-6.823 4.288-14.085 0.053-7.105-2.093-9.756-5.363-14.075-3.35-4.225-8.327-4.338-11.52-3.801-1.961 0.278-4.389 2.474-6.099 5.744-1.242 2.245-2.089 5.305-2.16 8.501-0.207 8.38 0.591 11.647 2.473 17.34 2.231 6.691 7.881 10.144 12.004 8.509z"/>
+   <path fill="#7c7c7c" d="m148.471 93.969c4.235-1.694 3.506-1.946 6.329-8.089 2.26-4.731 4.28-6.786 4.304-14.006 0.081-7.058-2.021-9.811-5.236-13.948-3.403-4.105-8.278-4.167-11.446-3.649-2.006 0.273-4.424 2.379-6.16 5.519-1.322 2.179-2.161 5.257-2.232 8.468-0.202 8.323 0.636 11.603 2.486 17.261 2.191 6.654 7.859 10.068 11.955 8.444z"/>
+   <path fill="#848484" d="m148.471 93.943c4.209-1.684 3.477-1.942 6.282-8.045 2.245-4.7 4.266-6.749 4.319-13.928 0.107-7.01-1.95-9.864-5.109-13.821-3.458-3.985-8.23-3.996-11.375-3.498-2.049 0.268-4.458 2.284-6.222 5.295-1.403 2.114-2.233 5.21-2.303 8.435-0.198 8.265 0.679 11.559 2.498 17.183 2.156 6.615 7.842 9.992 11.91 8.379z"/>
+   <path fill="#8c8c8c" d="m148.471 93.916c4.181-1.672 3.448-1.938 6.235-8 2.23-4.668 4.249-6.711 4.335-13.85 0.134-6.962-1.88-9.918-4.982-13.695-3.513-3.865-8.183-3.825-11.303-3.347-2.094 0.263-4.492 2.189-6.283 5.07-1.484 2.049-2.306 5.163-2.375 8.401-0.193 8.207 0.723 11.515 2.511 17.105 2.118 6.58 7.821 9.919 11.862 8.316z"/>
+   <path fill="#939393" d="m148.472 93.889c4.152-1.661 3.419-1.934 6.188-7.956 2.215-4.638 4.233-6.674 4.35-13.771 0.161-6.915-1.809-9.972-4.854-13.568-3.567-3.746-8.134-3.654-11.23-3.195-2.138 0.259-4.527 2.094-6.345 4.847-1.564 1.983-2.378 5.115-2.447 8.368-0.188 8.149 0.767 11.47 2.523 17.026 2.079 6.54 7.8 9.841 11.815 8.249z"/>
+   <path fill="#9b9b9b" d="m148.472 93.863c4.125-1.65 3.391-1.93 6.141-7.912 2.2-4.607 4.217-6.637 4.366-13.693 0.188-6.868-1.739-10.026-4.729-13.441-3.621-3.626-8.085-3.484-11.157-3.044-2.183 0.253-4.562 1.999-6.406 4.622-1.646 1.918-2.45 5.068-2.52 8.335-0.185 8.091 0.811 11.426 2.535 16.948 2.044 6.502 7.782 9.766 11.77 8.185z"/>
+   <path fill="#a3a3a3" d="m148.472 93.836c4.097-1.639 3.361-1.926 6.094-7.867 2.185-4.576 4.201-6.599 4.382-13.614 0.214-6.82-1.669-10.081-4.603-13.315-3.676-3.506-8.036-3.313-11.084-2.893-2.229 0.249-4.598 1.904-6.47 4.398-1.726 1.852-2.521 5.021-2.591 8.301-0.18 8.034 0.854 11.382 2.548 16.87 2.008 6.465 7.763 9.691 11.724 8.12z"/>
+   <path fill="#aaa" d="m148.472 93.809c4.069-1.628 3.334-1.922 6.047-7.823 2.17-4.544 4.185-6.562 4.396-13.536 0.242-6.772-1.597-10.134-4.475-13.188-3.73-3.387-7.989-3.142-11.013-2.741-2.271 0.243-4.632 1.809-6.53 4.173-1.808 1.787-2.594 4.974-2.662 8.268-0.176 7.976 0.897 11.337 2.56 16.792 1.97 6.427 7.743 9.615 11.677 8.055z"/>
+   <path fill="#b2b2b2" d="m148.473 93.782c4.041-1.617 3.304-1.918 5.999-7.778 2.154-4.514 4.169-6.524 4.412-13.458 0.269-6.725-1.526-10.188-4.349-13.062-3.784-3.267-7.939-2.971-10.939-2.589-2.316 0.238-4.666 1.714-6.592 3.949-1.888 1.721-2.667 4.926-2.734 8.234-0.171 7.918 0.941 11.293 2.572 16.713 1.933 6.391 7.723 9.541 11.631 7.991z"/>
+   <path fill="#bababa" d="m148.473 93.756c4.014-1.606 3.275-1.914 5.951-7.734 2.141-4.482 4.153-6.487 4.43-13.379 0.295-6.678-1.457-10.243-4.223-12.935-3.839-3.147-7.892-2.8-10.867-2.438-2.36 0.233-4.701 1.619-6.653 3.725-1.969 1.656-2.739 4.879-2.806 8.201-0.167 7.86 0.984 11.249 2.585 16.636 1.895 6.35 7.702 9.462 11.583 7.924z"/>
+   <path fill="#c1c1c1" d="m148.473 93.729c3.985-1.595 3.247-1.91 5.904-7.69 2.125-4.451 4.138-6.45 4.445-13.3 0.321-6.63-1.387-10.297-4.096-12.808-3.894-3.028-7.844-2.629-10.795-2.287-2.405 0.229-4.735 1.524-6.716 3.5-2.049 1.59-2.811 4.831-2.878 8.167-0.161 7.802 1.029 11.205 2.599 16.557 1.859 6.314 7.683 9.389 11.537 7.861z"/>
+   <path fill="#c9c9c9" d="m148.473 93.702c3.958-1.583 3.219-1.906 5.857-7.646 2.11-4.42 4.121-6.412 4.46-13.222 0.35-6.583-1.315-10.351-3.969-12.682-3.947-2.908-7.794-2.458-10.722-2.135-2.45 0.224-4.771 1.429-6.777 3.276-2.13 1.525-2.883 4.784-2.95 8.135-0.157 7.745 1.073 11.16 2.611 16.479 1.821 6.276 7.663 9.313 11.49 7.795z"/>
+   <path fill="#d1d1d1" d="m148.474 93.676c3.93-1.573 3.188-1.902 5.809-7.601 2.097-4.389 4.107-6.375 4.477-13.144 0.375-6.535-1.245-10.404-3.842-12.555-4.002-2.788-7.747-2.287-10.65-1.984-2.493 0.219-4.805 1.334-6.837 3.052-2.213 1.459-2.957 4.736-3.022 8.101-0.153 7.687 1.116 11.116 2.623 16.401 1.782 6.237 7.642 9.237 11.442 7.73z"/>
+   <path fill="#d8d8d8" d="m148.474 93.649c3.901-1.562 3.16-1.898 5.762-7.557 2.082-4.358 4.091-6.338 4.493-13.065 0.401-6.487-1.176-10.458-3.716-12.428-4.057-2.668-7.698-2.116-10.578-1.832-2.538 0.214-4.839 1.239-6.899 2.827-2.292 1.394-3.029 4.689-3.094 8.068-0.148 7.629 1.16 11.072 2.636 16.322 1.746 6.2 7.623 9.161 11.396 7.665z"/>
+   <path fill="#e0e0e0" d="m148.474 93.622c3.875-1.55 3.132-1.894 5.715-7.512 2.066-4.327 4.075-6.3 4.508-12.987 0.429-6.44-1.104-10.513-3.588-12.302-4.111-2.549-7.65-1.945-10.506-1.681-2.582 0.209-4.874 1.144-6.961 2.604-2.373 1.328-3.102 4.642-3.165 8.034-0.145 7.571 1.204 11.027 2.647 16.244 1.709 6.162 7.604 9.086 11.35 7.6z"/>
+   <path fill="#e8e8e8" d="m148.474 93.596c3.847-1.54 3.104-1.89 5.668-7.468 2.052-4.296 4.059-6.263 4.523-12.908 0.456-6.393-1.034-10.567-3.462-12.175-4.165-2.429-7.601-1.774-10.433-1.529-2.627 0.204-4.908 1.049-7.023 2.379-2.453 1.263-3.173 4.594-3.236 8.001-0.141 7.514 1.247 10.983 2.659 16.166 1.673 6.123 7.585 9.008 11.304 7.534z"/>
+   <path fill="#efefef" d="m148.475 93.569c3.817-1.528 3.073-1.886 5.62-7.424 2.036-4.265 4.043-6.226 4.539-12.83 0.482-6.345-0.964-10.621-3.336-12.048-4.219-2.31-7.552-1.604-10.359-1.378-2.672 0.199-4.943 0.954-7.084 2.155-2.535 1.197-3.246 4.546-3.311 7.967-0.135 7.456 1.292 10.939 2.673 16.087 1.636 6.087 7.565 8.935 11.258 7.471z"/>
+   <path fill="#f7f7f7" d="m148.475 93.542c3.791-1.517 3.046-1.882 5.572-7.379 2.022-4.234 4.027-6.188 4.556-12.751 0.51-6.297-0.894-10.675-3.208-11.921-4.274-2.19-7.505-1.433-10.289-1.227-2.715 0.194-4.978 0.859-7.146 1.93-2.614 1.132-3.317 4.5-3.381 7.935-0.131 7.398 1.335 10.895 2.686 16.009 1.597 6.047 7.544 8.858 11.21 7.404z"/>
+   <path fill="#fff" d="m148.475 93.516c3.763-1.506 3.017-1.878 5.525-7.335 2.007-4.203 4.012-6.151 4.571-12.673 0.536-6.25-0.823-10.729-3.082-11.795-4.328-2.07-7.456-1.262-10.216-1.075-2.76 0.189-5.012 0.764-7.207 1.706-2.696 1.066-3.39 4.452-3.453 7.901-0.126 7.34 1.379 10.85 2.698 15.931 1.561 6.01 7.525 8.782 11.164 7.34z"/>
+  </g>
+  <path d="m132.033 74.7465c2.16 0 4.896 1.44 6.191 3.384 1.368 1.944 2.376 4.68 2.376 7.776 0 4.608-0.504 9.72-3.239 11.304-0.864 0.504-2.736 0.936-3.816 0.936-2.448 0-2.664-1.584-4.968-3.96-0.792-0.864-3.168-5.04-3.168-8.496 0-2.16-0.504-5.256 1.368-7.992 1.296-2.016 2.952-2.952 5.256-2.952z"/>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m143.862 68.608c0.844-1.305 4.222-0.69 5.45 1.996 1.229 2.687 0.998 8.522 0.153 8.829-2.226 0.691-1.535-2.534-3.454-5.451-1.919-2.762-2.994-4.067-2.149-5.374z"/>
+   <path fill="#070707" d="m143.916 68.664c0.833-1.289 4.169-0.681 5.381 1.971 1.215 2.653 0.985 8.414 0.152 8.717-2.198 0.682-1.516-2.502-3.411-5.382-1.895-2.728-2.956-4.017-2.122-5.306z"/>
+   <path fill="#0f0f0f" d="m143.97 68.719c0.822-1.272 4.114-0.673 5.312 1.945 1.198 2.619 0.973 8.306 0.15 8.605-2.169 0.673-1.497-2.47-3.367-5.313-1.871-2.692-2.918-3.964-2.095-5.237z"/>
+   <path fill="#161616" d="m144.024 68.774c0.812-1.255 4.062-0.664 5.243 1.92 1.182 2.585 0.96 8.198 0.147 8.493-2.141 0.665-1.477-2.438-3.323-5.244-1.846-2.657-2.88-3.913-2.067-5.169z"/>
+   <path fill="#1e1e1e" d="m144.078 68.829c0.801-1.239 4.008-0.655 5.174 1.895 1.167 2.551 0.947 8.09 0.146 8.381-2.113 0.656-1.458-2.405-3.28-5.174-1.821-2.623-2.842-3.863-2.04-5.102z"/>
+   <path fill="#262626" d="m144.132 68.884c0.791-1.222 3.955-0.646 5.105 1.87 1.151 2.517 0.935 7.982 0.144 8.27-2.085 0.647-1.438-2.374-3.235-5.105-1.798-2.589-2.805-3.812-2.014-5.035z"/>
+   <path fill="#2d2d2d" d="m144.186 68.939c0.779-1.206 3.9-0.638 5.036 1.844 1.135 2.483 0.922 7.874 0.142 8.158-2.057 0.639-1.419-2.341-3.192-5.037-1.773-2.552-2.766-3.758-1.986-4.965z"/>
+   <path fill="#353535" d="m144.24 68.994c0.769-1.189 3.848-0.629 4.967 1.819 1.12 2.449 0.909 7.766 0.141 8.046-2.028 0.629-1.399-2.31-3.148-4.967-1.75-2.518-2.73-3.708-1.96-4.898z"/>
+   <path fill="#3d3d3d" d="m144.294 69.049c0.76-1.172 3.794-0.621 4.898 1.793 1.104 2.415 0.896 7.658 0.138 7.934-2 0.621-1.38-2.277-3.104-4.898-1.725-2.482-2.691-3.655-1.932-4.829z"/>
+   <path fill="#444" d="m144.348 69.104c0.748-1.156 3.74-0.612 4.829 1.768 1.088 2.38 0.884 7.55 0.136 7.822-1.973 0.612-1.36-2.245-3.062-4.829-1.699-2.448-2.651-3.604-1.903-4.761z"/>
+   <path fill="#4c4c4c" d="m144.402 69.16c0.737-1.14 3.687-0.603 4.76 1.743 1.073 2.347 0.871 7.442 0.134 7.71-1.943 0.604-1.341-2.213-3.017-4.76-1.676-2.414-2.614-3.554-1.877-4.693z"/>
+   <path fill="#545454" d="m144.456 69.215c0.727-1.123 3.634-0.595 4.691 1.717 1.057 2.313 0.857 7.334 0.132 7.598-1.916 0.595-1.321-2.181-2.973-4.691-1.652-2.378-2.577-3.501-1.85-4.624z"/>
+   <path fill="#5b5b5b" d="m144.51 69.27c0.717-1.106 3.58-0.585 4.622 1.692 1.041 2.278 0.847 7.226 0.131 7.486-1.888 0.586-1.303-2.149-2.93-4.622-1.628-2.343-2.539-3.45-1.823-4.556z"/>
+   <path fill="#636363" d="m144.564 69.325c0.705-1.09 3.526-0.577 4.553 1.667 1.026 2.245 0.833 7.118 0.128 7.375-1.858 0.577-1.282-2.117-2.885-4.553-1.604-2.309-2.501-3.399-1.796-4.489z"/>
+   <path fill="#6b6b6b" d="m144.618 69.38c0.694-1.073 3.473-0.568 4.483 1.642 1.011 2.21 0.82 7.01 0.127 7.263-1.831 0.568-1.264-2.084-2.842-4.484-1.578-2.274-2.462-3.347-1.768-4.421z"/>
+   <path fill="#727272" d="m144.672 69.435c0.685-1.057 3.42-0.56 4.414 1.617 0.995 2.176 0.81 6.902 0.125 7.15-1.803 0.56-1.243-2.053-2.798-4.415-1.554-2.238-2.425-3.295-1.741-4.352z"/>
+   <path fill="#7a7a7a" d="m144.726 69.49c0.673-1.041 3.365-0.551 4.345 1.591 0.979 2.143 0.796 6.794 0.123 7.039-1.775 0.551-1.224-2.021-2.754-4.346-1.53-2.203-2.387-3.244-1.714-4.284z"/>
+   <path fill="#828282" d="m144.78 69.545c0.662-1.023 3.313-0.542 4.276 1.566 0.964 2.108 0.782 6.686 0.121 6.926-1.746 0.542-1.204-1.988-2.711-4.276-1.505-2.167-2.348-3.192-1.686-4.216z"/>
+   <path fill="#898989" d="m144.834 69.6c0.652-1.007 3.259-0.533 4.207 1.541s0.771 6.578 0.119 6.815c-1.718 0.534-1.185-1.956-2.666-4.207-1.482-2.134-2.311-3.142-1.66-4.149z"/>
+   <path fill="#919191" d="m144.888 69.655c0.641-0.99 3.206-0.524 4.138 1.516 0.933 2.04 0.758 6.47 0.117 6.703-1.69 0.525-1.165-1.924-2.623-4.138-1.457-2.098-2.273-3.09-1.632-4.081z"/>
+   <path fill="#999" d="m144.942 69.71c0.63-0.974 3.152-0.516 4.069 1.49s0.744 6.362 0.114 6.591c-1.662 0.516-1.146-1.892-2.579-4.069-1.432-2.062-2.234-3.037-1.604-4.012z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#666" d="m193.11 94.985c10.8-1.152 14.616-5.328 16.56-12.6 1.729-6.48 1.801-13.68-3.023-22.104-4.536-8.063-7.128-9.36-13.681-9.864-10.079-0.864-14.832 6.192-17.063 11.232-2.376 5.472-1.872 4.68-1.729 11.592 0.145 7.272 4.245 9.299 6.766 13.835 2.519 4.465 10.946 7.982 12.17 7.909z"/>
+   <path fill="#6d6d6d" d="m193.115 94.944c10.759-1.131 14.618-5.354 16.515-12.569 1.701-6.525 1.785-13.686-3.002-21.912-4.434-7.797-7.038-9.081-13.512-9.581-10.049-0.861-14.941 5.873-17.181 10.874-2.304 5.28-1.878 4.718-1.726 11.539 0.16 7.268 4.268 9.223 6.784 13.76 2.521 4.475 10.898 7.962 12.122 7.889z"/>
+   <path fill="#757575" d="m193.12 94.902c10.718-1.11 14.62-5.379 16.469-12.538 1.676-6.57 1.771-13.692-2.979-21.721-4.331-7.53-6.947-8.801-13.344-9.297-10.018-0.858-15.05 5.553-17.298 10.516-2.229 5.087-1.885 4.757-1.722 11.487 0.176 7.264 4.289 9.146 6.803 13.686 2.52 4.485 10.848 7.942 12.071 7.867z"/>
+   <path fill="#7c7c7c" d="m193.126 94.861c10.675-1.09 14.621-5.405 16.423-12.507 1.648-6.616 1.756-13.698-2.958-21.529-4.229-7.263-6.856-8.522-13.176-9.014-9.985-0.854-15.158 5.234-17.414 10.158-2.156 4.895-1.891 4.795-1.719 11.434 0.193 7.26 4.31 9.07 6.822 13.611 2.52 4.495 10.798 7.922 12.022 7.847z"/>
+   <path fill="#848484" d="m193.131 94.82c10.635-1.069 14.623-5.431 16.377-12.476 1.622-6.661 1.741-13.704-2.936-21.337-4.126-6.996-6.767-8.242-13.008-8.73-9.955-0.852-15.267 4.915-17.53 9.8-2.084 4.703-1.896 4.833-1.716 11.38 0.209 7.256 4.332 8.995 6.841 13.537 2.52 4.505 10.748 7.902 11.972 7.826z"/>
+   <path fill="#8c8c8c" d="m193.136 94.778c10.593-1.048 14.625-5.457 16.331-12.445 1.596-6.706 1.726-13.709-2.913-21.145-4.025-6.729-6.678-7.963-12.841-8.447-9.924-0.848-15.375 4.595-17.647 9.441-2.01 4.51-1.903 4.872-1.712 11.328 0.225 7.251 4.354 8.918 6.858 13.462 2.521 4.517 10.7 7.883 11.924 7.806z"/>
+   <path fill="#939393" d="m193.141 94.737c10.552-1.027 14.627-5.482 16.286-12.414 1.568-6.751 1.711-13.715-2.893-20.954-3.922-6.462-6.586-7.683-12.672-8.163-9.892-0.845-15.483 4.276-17.764 9.083-1.938 4.318-1.909 4.91-1.709 11.275 0.24 7.247 4.375 8.842 6.878 13.387 2.521 4.528 10.651 7.863 11.874 7.786z"/>
+   <path fill="#9b9b9b" d="m193.146 94.695c10.51-1.007 14.63-5.508 16.241-12.382 1.542-6.796 1.694-13.721-2.87-20.762-3.82-6.195-6.496-7.404-12.504-7.879-9.861-0.842-15.592 3.956-17.882 8.725-1.863 4.126-1.915 4.949-1.706 11.223 0.258 7.243 4.397 8.766 6.897 13.313 2.521 4.535 10.601 7.841 11.824 7.762z"/>
+   <path fill="#a3a3a3" d="m193.151 94.654c10.469-0.986 14.632-5.534 16.196-12.351 1.515-6.842 1.68-13.727-2.85-20.57-3.717-5.928-6.405-7.125-12.335-7.596-9.83-0.839-15.7 3.637-17.998 8.367-1.791 3.933-1.922 4.987-1.703 11.169 0.273 7.239 4.419 8.689 6.916 13.238 2.521 4.547 10.551 7.822 11.774 7.743z"/>
+   <path fill="#aaa" d="m193.157 94.612c10.427-0.965 14.633-5.56 16.149-12.32 1.488-6.887 1.666-13.733-2.826-20.379-3.615-5.661-6.316-6.845-12.168-7.313-9.799-0.835-15.809 3.317-18.114 8.009-1.718 3.741-1.928 5.025-1.7 11.117 0.29 7.235 4.44 8.613 6.936 13.163 2.519 4.558 10.499 7.804 11.723 7.723z"/>
+   <path fill="#b2b2b2" d="m193.162 94.571c10.386-0.944 14.635-5.585 16.104-12.289 1.462-6.932 1.649-13.739-2.806-20.188-3.512-5.394-6.225-6.565-11.999-7.029-9.768-0.833-15.917 2.998-18.23 7.651-1.646 3.549-1.935 5.064-1.697 11.064 0.306 7.231 4.462 8.537 6.954 13.088 2.52 4.569 10.451 7.784 11.674 7.703z"/>
+   <path fill="#bababa" d="m193.167 94.529c10.345-0.923 14.638-5.611 16.059-12.258 1.436-6.977 1.636-13.744-2.782-19.995-3.41-5.127-6.135-6.286-11.832-6.746-9.736-0.829-16.025 2.679-18.347 7.293-1.572 3.356-1.941 5.103-1.694 11.011 0.322 7.227 4.484 8.461 6.973 13.014 2.519 4.579 10.4 7.764 11.623 7.681z"/>
+   <path fill="#c1c1c1" d="m193.172 94.488c10.304-0.903 14.64-5.637 16.014-12.227 1.409-7.022 1.62-13.75-2.762-19.804-3.308-4.86-6.044-6.006-11.662-6.462-9.705-0.826-16.135 2.359-18.466 6.935-1.498 3.164-1.945 5.141-1.689 10.958 0.338 7.223 4.506 8.385 6.991 12.939 2.519 4.59 10.351 7.744 11.574 7.661z"/>
+   <path fill="#c9c9c9" d="m193.177 94.447c10.262-0.882 14.641-5.663 15.967-12.196 1.383-7.068 1.605-13.756-2.738-19.612-3.206-4.593-5.954-5.727-11.496-6.179-9.673-0.823-16.242 2.04-18.581 6.577-1.425 2.972-1.952 5.179-1.687 10.906 0.354 7.219 4.526 8.308 7.01 12.865 2.52 4.598 10.302 7.723 11.525 7.639z"/>
+   <path fill="#d1d1d1" d="m193.182 94.405c10.221-0.861 14.643-5.688 15.922-12.165 1.355-7.113 1.591-13.762-2.717-19.42-3.104-4.326-5.864-5.448-11.327-5.895-9.644-0.82-16.352 1.721-18.698 6.219-1.353 2.779-1.959 5.217-1.684 10.853 0.369 7.214 4.549 8.232 7.028 12.79 2.521 4.609 10.254 7.703 11.476 7.618z"/>
+   <path fill="#d8d8d8" d="m193.187 94.364c10.179-0.841 14.645-5.714 15.876-12.133 1.33-7.158 1.576-13.768-2.694-19.229-3.001-4.059-5.773-5.168-11.16-5.612-9.61-0.817-16.459 1.401-18.813 5.861-1.279 2.586-1.965 5.256-1.682 10.8 0.387 7.21 4.571 8.156 7.049 12.715 2.519 4.619 10.202 7.684 11.424 7.598z"/>
+   <path fill="#e0e0e0" d="m193.193 94.322c10.137-0.82 14.646-5.74 15.83-12.103 1.303-7.203 1.561-13.773-2.673-19.037-2.898-3.792-5.684-4.889-10.991-5.328-9.58-0.813-16.568 1.082-18.931 5.502-1.206 2.395-1.972 5.294-1.679 10.747 0.403 7.207 4.592 8.08 7.067 12.641 2.521 4.631 10.154 7.666 11.377 7.578z"/>
+   <path fill="#e8e8e8" d="m193.198 94.281c10.096-0.799 14.648-5.766 15.785-12.071 1.275-7.249 1.545-13.779-2.651-18.845-2.796-3.525-5.593-4.609-10.823-5.044-9.549-0.81-16.677 0.762-19.048 5.145-1.133 2.202-1.978 5.333-1.675 10.694 0.419 7.202 4.614 8.003 7.086 12.566 2.52 4.638 10.103 7.643 11.326 7.555z"/>
+   <path fill="#efefef" d="m193.203 94.239c10.055-0.778 14.65-5.792 15.739-12.04 1.25-7.293 1.531-13.785-2.629-18.653-2.694-3.258-5.502-4.33-10.655-4.761-9.517-0.807-16.785 0.443-19.165 4.786-1.059 2.01-1.983 5.372-1.671 10.642 0.435 7.198 4.636 7.928 7.104 12.492 2.52 4.649 10.055 7.624 11.277 7.534z"/>
+   <path fill="#f7f7f7" d="m193.208 94.198c10.014-0.757 14.652-5.817 15.694-12.009 1.223-7.339 1.516-13.792-2.607-18.462-2.592-2.991-5.413-4.05-10.486-4.478-9.487-0.804-16.895 0.124-19.282 4.428-0.986 1.817-1.989 5.41-1.668 10.589 0.451 7.194 4.657 7.851 7.123 12.417 2.519 4.661 10.004 7.605 11.226 7.515z"/>
+   <path fill="#fff" d="m193.213 94.156c9.973-0.737 14.654-5.843 15.648-11.978 1.197-7.384 1.501-13.797-2.585-18.27-2.489-2.724-5.322-3.771-10.319-4.194-9.455-0.801-17.002-0.196-19.397 4.07-0.913 1.625-1.996 5.448-1.665 10.536 0.467 7.19 4.679 7.775 7.142 12.342 2.519 4.671 9.954 7.586 11.176 7.494z"/>
+  </g>
+  <path d="m179.841 74.4585c5.4 0 8.568 4.824 9.648 11.016 0.432 2.808-0.216 6.048-1.944 8.28-1.944 2.592-5.4 4.176-8.208 4.176-2.664 0-5.688 0.432-7.271-1.728-1.584-2.232-1.944-7.2-1.944-10.728 0-3.96 1.152-6.768 3.168-9 1.511-1.657 4.247-2.016 6.551-2.016z"/>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m192.591 66.68c0.98-0.653 2.612 0 4.489 2.122 2.039 2.285 2.938 4.08 0.489 5.385-1.877 0.98-2.448-1.958-3.59-3.182-1.795-1.959-3.346-3.02-1.388-4.325z"/>
+   <path fill="#070707" d="m192.631 66.738c0.96-0.649 2.573 0 4.423 2.09 2.009 2.251 2.864 4.02 0.481 5.305-1.837 0.977-2.403-1.929-3.525-3.135-1.768-1.925-3.296-2.965-1.379-4.26z"/>
+   <path fill="#0f0f0f" d="m192.671 66.797c0.939-0.645 2.534 0 4.356 2.059 1.978 2.217 2.792 3.958 0.474 5.225-1.798 0.974-2.357-1.9-3.46-3.087-1.742-1.895-3.247-2.913-1.37-4.197z"/>
+   <path fill="#161616" d="m192.711 66.855c0.919-0.641 2.495 0 4.289 2.027 1.948 2.184 2.721 3.898 0.467 5.146-1.759 0.971-2.313-1.871-3.396-3.041-1.715-1.861-3.197-2.858-1.36-4.132z"/>
+   <path fill="#1e1e1e" d="m192.751 66.914c0.899-0.637 2.457 0 4.223 1.996 1.918 2.149 2.647 3.838 0.46 5.065-1.72 0.968-2.269-1.842-3.331-2.993-1.689-1.83-3.148-2.805-1.352-4.068z"/>
+   <path fill="#262626" d="m192.791 66.973c0.878-0.633 2.418 0 4.155 1.964 1.888 2.116 2.576 3.777 0.453 4.986-1.68 0.965-2.224-1.813-3.267-2.946-1.661-1.798-3.097-2.752-1.341-4.004z"/>
+   <path fill="#2d2d2d" d="m192.831 67.031c0.858-0.629 2.379 0 4.089 1.933 1.857 2.082 2.503 3.717 0.445 4.906-1.641 0.961-2.178-1.784-3.201-2.898-1.636-1.767-3.048-2.7-1.333-3.941z"/>
+   <path fill="#353535" d="m192.87 67.09c0.838-0.625 2.341 0 4.023 1.902 1.827 2.047 2.431 3.656 0.438 4.826-1.601 0.958-2.133-1.755-3.137-2.852-1.608-1.735-2.998-2.646-1.324-3.876z"/>
+   <path fill="#3d3d3d" d="m192.91 67.148c0.818-0.621 2.302 0 3.956 1.87 1.797 2.014 2.359 3.596 0.431 4.746-1.562 0.956-2.088-1.726-3.071-2.804-1.583-1.702-2.95-2.592-1.316-3.812z"/>
+   <path fill="#444" d="m192.95 67.207c0.798-0.617 2.263 0 3.889 1.839 1.768 1.98 2.287 3.535 0.425 4.666-1.523 0.952-2.043-1.697-3.008-2.757-1.556-1.671-2.899-2.539-1.306-3.748z"/>
+   <path fill="#4c4c4c" d="m192.99 67.266c0.777-0.614 2.224 0 3.823 1.807 1.735 1.946 2.214 3.474 0.416 4.586-1.483 0.949-1.998-1.667-2.942-2.709-1.529-1.639-2.85-2.486-1.297-3.684z"/>
+   <path fill="#545454" d="m193.03 67.325c0.757-0.61 2.185 0 3.756 1.775 1.706 1.912 2.143 3.414 0.409 4.506-1.444 0.946-1.953-1.639-2.878-2.663-1.502-1.606-2.799-2.431-1.287-3.618z"/>
+   <path fill="#5b5b5b" d="m193.07 67.383c0.736-0.605 2.146 0 3.688 1.744 1.677 1.878 2.07 3.353 0.402 4.426-1.405 0.943-1.908-1.609-2.813-2.615-1.475-1.575-2.749-2.378-1.277-3.555z"/>
+   <path fill="#636363" d="m193.11 67.442c0.716-0.602 2.106 0 3.622 1.712 1.646 1.844 1.998 3.293 0.395 4.347-1.364 0.94-1.862-1.581-2.748-2.568-1.449-1.543-2.701-2.326-1.269-3.491z"/>
+   <path fill="#6b6b6b" d="m193.15 67.5c0.696-0.598 2.069 0 3.556 1.681 1.615 1.811 1.925 3.232 0.387 4.267-1.325 0.937-1.818-1.552-2.683-2.521-1.423-1.511-2.651-2.272-1.26-3.427z"/>
+   <path fill="#727272" d="m193.19 67.559c0.675-0.594 2.03 0 3.489 1.649 1.585 1.777 1.853 3.172 0.38 4.187-1.287 0.935-1.774-1.522-2.619-2.473-1.396-1.48-2.601-2.219-1.25-3.363z"/>
+   <path fill="#7a7a7a" d="m193.23 67.618c0.654-0.59 1.991 0 3.422 1.618 1.555 1.743 1.781 3.111 0.373 4.107-1.247 0.931-1.729-1.494-2.554-2.426-1.369-1.448-2.551-2.166-1.241-3.299z"/>
+   <path fill="#828282" d="m193.269 67.677c0.635-0.586 1.953 0 3.355 1.586 1.525 1.708 1.709 3.05 0.366 4.026-1.208 0.928-1.684-1.464-2.489-2.378-1.342-1.416-2.501-2.112-1.232-3.234z"/>
+   <path fill="#898989" d="m193.309 67.735c0.614-0.582 1.914 0 3.29 1.555 1.493 1.675 1.636 2.99 0.357 3.947-1.169 0.925-1.639-1.435-2.424-2.332-1.316-1.384-2.452-2.058-1.223-3.17z"/>
+   <path fill="#919191" d="m193.349 67.794c0.595-0.578 1.875 0 3.223 1.523 1.464 1.641 1.564 2.93 0.351 3.867-1.129 0.922-1.594-1.406-2.359-2.284-1.29-1.352-2.403-2.005-1.215-3.106z"/>
+   <path fill="#999" d="m193.389 67.853c0.573-0.574 1.836 0 3.155 1.492 1.435 1.607 1.492 2.869 0.345 3.787-1.091 0.919-1.55-1.377-2.295-2.237-1.263-1.32-2.353-1.953-1.205-3.042z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m165.498 69.906c1.693-0.654 3.012-0.69 5.63 1.036 3.166 2.088 1.705 5.245-0.779 4.601-2.146-0.556-2.417-0.681-4.391-1.086-3.101-0.648-3.641-3.322-0.46-4.551z"/>
+   <path fill="#050505" d="m165.564 70.033c1.658-0.629 2.973-0.656 5.555 1.026 3.066 2.009 1.654 5.012-0.805 4.38-2.131-0.547-2.345-0.656-4.284-1.052-3.055-0.634-3.587-3.173-0.466-4.354z"/>
+   <path fill="#0a0a0a" d="m165.63 70.16c1.623-0.604 2.935-0.622 5.481 1.015 2.965 1.93 1.602 4.779-0.83 4.159-2.119-0.539-2.274-0.63-4.179-1.018-3.009-0.618-3.533-3.022-0.472-4.156z"/>
+   <path fill="#0f0f0f" d="m165.696 70.287c1.587-0.579 2.895-0.587 5.406 1.005 2.864 1.851 1.551 4.546-0.855 3.938-2.105-0.53-2.203-0.605-4.073-0.983-2.963-0.604-3.48-2.873-0.478-3.96z"/>
+   <path fill="#141414" d="m165.761 70.413c1.553-0.553 2.856-0.553 5.331 0.995 2.766 1.772 1.5 4.313-0.88 3.717-2.092-0.521-2.131-0.58-3.967-0.949-2.916-0.588-3.425-2.723-0.484-3.763z"/>
+   <path fill="#191919" d="m165.827 70.54c1.519-0.528 2.818-0.519 5.258 0.984 2.664 1.693 1.448 4.079-0.905 3.497-2.079-0.513-2.06-0.554-3.861-0.915-2.873-0.573-3.373-2.573-0.492-3.566z"/>
+   <path fill="#1e1e1e" d="m165.893 70.667c1.482-0.503 2.778-0.484 5.183 0.974 2.564 1.614 1.397 3.846-0.93 3.276-2.067-0.504-1.989-0.529-3.756-0.88-2.826-0.559-3.319-2.425-0.497-3.37z"/>
+   <path fill="#232323" d="m165.959 70.793c1.447-0.478 2.74-0.45 5.108 0.964 2.464 1.535 1.345 3.613-0.955 3.055-2.053-0.496-1.917-0.503-3.651-0.846-2.779-0.543-3.264-2.274-0.502-3.173z"/>
+   <path fill="#282828" d="m166.025 70.92c1.412-0.453 2.701-0.416 5.034 0.954 2.362 1.456 1.293 3.38-0.981 2.834-2.04-0.487-1.845-0.478-3.545-0.812-2.733-0.528-3.21-2.125-0.508-2.976z"/>
+   <path fill="#2d2d2d" d="m166.09 71.047c1.378-0.428 2.663-0.382 4.96 0.943 2.264 1.377 1.242 3.146-1.006 2.613-2.026-0.478-1.773-0.453-3.438-0.777-2.688-0.513-3.158-1.974-0.516-2.779z"/>
+   <path fill="#333" d="m166.156 71.173c1.343-0.402 2.624-0.347 4.885 0.933 2.163 1.298 1.191 2.914-1.029 2.392-2.015-0.47-1.703-0.428-3.334-0.743-2.642-0.498-3.104-1.824-0.522-2.582z"/>
+   <path fill="#383838" d="m166.222 71.3c1.307-0.377 2.585-0.313 4.81 0.922 2.063 1.219 1.14 2.681-1.055 2.171-2.001-0.461-1.631-0.402-3.229-0.708-2.594-0.483-3.048-1.674-0.526-2.385z"/>
+   <path fill="#3d3d3d" d="m166.288 71.427c1.272-0.352 2.546-0.279 4.736 0.913 1.962 1.14 1.088 2.447-1.081 1.95-1.988-0.452-1.56-0.377-3.122-0.674-2.55-0.469-2.995-1.526-0.533-2.189z"/>
+   <path fill="#424242" d="m166.354 71.554c1.236-0.327 2.507-0.245 4.661 0.902 1.861 1.061 1.037 2.214-1.106 1.729-1.974-0.444-1.488-0.352-3.016-0.64-2.504-0.453-2.942-1.375-0.539-1.991z"/>
+   <path fill="#474747" d="m166.419 71.68c1.203-0.302 2.469-0.21 4.587 0.892 1.762 0.982 0.986 1.98-1.13 1.508-1.962-0.435-1.417-0.326-2.911-0.606-2.458-0.437-2.888-1.224-0.546-1.794z"/>
+   <path fill="#4c4c4c" d="m166.485 71.807c1.167-0.276 2.429-0.176 4.513 0.882 1.66 0.903 0.935 1.748-1.156 1.288-1.948-0.426-1.345-0.301-2.805-0.572-2.412-0.423-2.834-1.076-0.552-1.598z"/>
+   <path fill="#515151" d="m166.551 71.934c1.133-0.251 2.391-0.142 4.438 0.871 1.56 0.824 0.883 1.515-1.181 1.067-1.936-0.417-1.274-0.275-2.699-0.537-2.366-0.408-2.781-0.926-0.558-1.401z"/>
+   <path fill="#565656" d="m166.617 72.061c1.097-0.227 2.351-0.108 4.363 0.861 1.46 0.745 0.831 1.281-1.206 0.846-1.922-0.409-1.202-0.25-2.594-0.503-2.319-0.393-2.726-0.777-0.563-1.204z"/>
+   <path fill="#5b5b5b" d="m166.683 72.187c1.062-0.201 2.312-0.073 4.289 0.851 1.358 0.666 0.778 1.048-1.231 0.625-1.91-0.4-1.131-0.225-2.489-0.469-2.274-0.377-2.672-0.626-0.569-1.007z"/>
+   <path fill="#606060" d="m166.748 72.314c1.027-0.176 2.274-0.04 4.215 0.84 1.26 0.587 0.729 0.815-1.256 0.404-1.896-0.392-1.06-0.2-2.383-0.435-2.228-0.361-2.619-0.475-0.576-0.809z"/>
+   <path fill="#666" d="m166.814 72.44c0.992-0.151 2.234-0.005 4.14 0.83 1.159 0.508 0.677 0.582-1.281 0.183-1.883-0.383-0.987-0.174-2.276-0.4-2.183-0.346-2.566-0.325-0.583-0.613z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#666" d="m159.99 128.249c-9.36 0.36-24.192-25.848-24.552-14.976-0.288 9.216 0.216 9.072 0.216 18 0 5.976-2.736 6.408-8.64 15.408-3.024 4.752-5.4 9.864-7.272 15.048-1.152 3.096-2.232 6.336-3.096 9.504-0.36 1.584-1.008 3.24-1.368 4.824-2.952 10.872-13.464 24.264-15.912 35.136-2.448 10.8-5.328 17.712-4.968 32.185 0.36 14.472 0.504 10.295 4.896 13.896 4.32 3.601 8.784 6.983 15.624 13.032 7.2 6.264 22.177 17.208 24.192 20.592 2.16 3.456 2.088 11.232 0.792 13.752-1.296 2.448-12.6 3.816-12.528 3.816-0.071 0 9.864 13.68 11.809 15.623 1.872 1.873 9.936 10.873 42.768 4.752 18.504-3.455 32.832-13.823 43.2-23.832 13.392-13.031 6.624-16.775 8.352-23.327 2.521-9.433 10.729-12.96 12.601-23.616 0.216-1.512 0.72-2.664 2.088-4.896 2.088-3.168 1.584-9.432 1.584-15.191 0-14.977-1.729-30.24-5.185-41.472-3.168-10.512-8.208-17.856-12.527-27.36-8.641-18.936-8.208-27.432-15.912-39.528-8.784-13.968-4.464-23.256-16.128-22.68-14.546 0.79-26.282 20.734-40.034 21.31z"/>
+   <path fill="#6d6d6d" d="m159.973 129.334c-9.281 0.353-23.746-25.511-24.242-15.179-0.316 8.755 0.1 8.678 0.03 17.247-0.15 5.87-2.953 6.637-8.727 15.481-3.013 4.763-5.273 9.812-6.993 14.877-0.968 3.253-1.56 6.422-2.43 9.526-0.415 1.642-1.497 3.187-2.185 5.042-3.254 10.78-13.545 24.182-15.961 34.877-2.466 10.81-5.37 17.694-4.961 32.141 0.366 14 0.395 10.177 4.773 13.816 4.283 3.616 8.839 7.069 15.662 13.103 7.183 6.248 22.237 17.216 24.243 20.588 2.149 3.444 2.131 11.317 0.844 13.823-1.284 2.439-12.579 3.875-12.508 3.875-0.071 0 9.815 13.566 11.757 15.508 1.87 1.87 9.902 10.809 42.678 4.704 18.524-3.455 33.124-13.753 43.078-23.856 12.789-12.762 6.107-16.773 7.826-23.291 2.513-9.416 11.277-12.961 13.143-23.602 0.216-1.508 0.754-2.654 2.113-4.876 2.096-3.202 1.561-9.447 1.582-15.185 0.067-15.027-1.705-30.234-5.159-41.434-3.171-10.483-8.204-17.817-12.515-27.305-8.624-18.906-8.221-27.415-15.933-39.474-8.586-13.613-4.601-22.583-16.011-21.99-14.374 0.826-26.375 21.016-40.104 21.584z"/>
+   <path fill="#757575" d="m159.955 130.419c-9.201 0.346-23.299-25.175-23.931-15.383-0.344 8.295-0.017 8.284-0.156 16.494-0.301 5.764-3.17 6.867-8.812 15.555-3.002 4.774-5.148 9.76-6.714 14.706-0.784 3.41-0.889 6.508-1.764 9.548-0.471 1.699-1.986 3.133-3.003 5.259-3.554 10.688-13.624 24.1-16.009 34.619-2.483 10.82-5.411 17.678-4.954 32.097 0.373 13.528 0.285 10.058 4.651 13.739 4.244 3.632 8.893 7.154 15.699 13.171 7.167 6.233 22.299 17.224 24.294 20.585 2.142 3.432 2.175 11.404 0.896 13.896-1.271 2.428-12.558 3.932-12.486 3.932-0.071 0 9.768 13.453 11.705 15.392 1.867 1.867 9.867 10.744 42.588 4.655 18.545-3.453 33.415-13.682 42.956-23.879 12.187-12.492 5.591-16.771 7.3-23.258 2.507-9.398 11.826-12.959 13.687-23.586 0.215-1.5 0.788-2.643 2.138-4.854 2.104-3.235 1.538-9.462 1.58-15.178 0.133-15.076-1.681-30.228-5.135-41.394-3.173-10.455-8.199-17.779-12.501-27.25-8.609-18.877-8.234-27.399-15.952-39.42-8.389-13.258-4.739-21.911-15.895-21.301-14.21 0.859-26.474 21.295-40.182 21.855z"/>
+   <path fill="#7c7c7c" d="m159.938 131.504c-9.122 0.338-22.854-24.838-23.622-15.586-0.37 7.833-0.131 7.89-0.341 15.741-0.452 5.657-3.388 7.096-8.899 15.628-2.99 4.785-5.021 9.708-6.433 14.535-0.602 3.566-0.218 6.594-1.099 9.57-0.526 1.756-2.475 3.08-3.82 5.477-3.854 10.596-13.703 24.016-16.057 34.361-2.501 10.829-5.453 17.66-4.948 32.052 0.38 13.059 0.177 9.939 4.529 13.66 4.208 3.648 8.948 7.239 15.739 13.242 7.149 6.217 22.358 17.232 24.345 20.581 2.13 3.42 2.216 11.489 0.946 13.968-1.259 2.417-12.538 3.99-12.466 3.99-0.072 0 9.718 13.34 11.653 15.275 1.865 1.864 9.833 10.681 42.498 4.607 18.565-3.453 33.706-13.609 42.834-23.902 11.583-12.223 5.074-16.771 6.774-23.223 2.499-9.382 12.375-12.959 14.229-23.57 0.215-1.496 0.821-2.633 2.162-4.834 2.111-3.271 1.516-9.478 1.578-15.173 0.199-15.125-1.657-30.221-5.109-41.354-3.177-10.427-8.196-17.741-12.488-27.195-8.594-18.848-8.247-27.383-15.972-39.366-8.192-12.903-4.877-21.239-15.779-20.612-14.041 0.894-26.569 21.576-40.254 22.128z"/>
+   <path fill="#848484" d="m159.921 132.589c-9.043 0.331-22.406-24.502-23.312-15.79-0.398 7.373-0.247 7.496-0.527 14.988-0.602 5.551-3.604 7.326-8.984 15.702-2.98 4.796-4.896 9.656-6.154 14.364-0.417 3.723 0.455 6.679-0.432 9.592-0.582 1.813-2.964 3.026-4.639 5.694-4.153 10.504-13.782 23.936-16.104 34.104-2.519 10.838-5.495 17.643-4.941 32.008 0.387 12.586 0.067 9.819 4.407 13.582 4.171 3.664 9.002 7.324 15.777 13.311 7.132 6.201 22.419 17.24 24.396 20.576 2.12 3.41 2.259 11.578 0.998 14.041-1.247 2.408-12.517 4.049-12.446 4.049-0.07 0 9.67 13.227 11.604 15.16 1.861 1.861 9.798 10.615 42.409 4.558 18.584-3.45 33.996-13.538 42.711-23.926 10.979-11.952 4.557-16.769 6.248-23.187 2.491-9.367 12.924-12.959 14.771-23.557 0.215-1.49 0.856-2.622 2.188-4.813 2.118-3.305 1.491-9.494 1.575-15.166 0.267-15.174-1.635-30.215-5.086-41.314-3.179-10.399-8.19-17.703-12.473-27.141-8.579-18.818-8.262-27.366-15.994-39.312-7.993-12.547-5.013-20.565-15.661-19.922-13.876 0.927-26.669 21.855-40.331 22.399z"/>
+   <path fill="#8c8c8c" d="m159.903 133.674c-8.963 0.323-21.961-24.165-23.001-15.994-0.426 6.912-0.363 7.102-0.713 14.236-0.753 5.445-3.821 7.554-9.071 15.775-2.969 4.807-4.768 9.604-5.875 14.192-0.232 3.881 1.128 6.766 0.234 9.615-0.638 1.87-3.452 2.972-5.455 5.911-4.455 10.413-13.862 23.853-16.153 33.845-2.537 10.849-5.537 17.625-4.935 31.963 0.393 12.115-0.042 9.701 4.285 13.505 4.133 3.68 9.057 7.409 15.814 13.38 7.116 6.188 22.48 17.248 24.447 20.574 2.109 3.398 2.301 11.662 1.049 14.113-1.235 2.396-12.496 4.104-12.425 4.104-0.071 0 9.622 13.114 11.552 15.045 1.86 1.858 9.763 10.552 42.319 4.509 18.604-3.449 34.288-13.467 42.589-23.949 10.377-11.682 4.04-16.766 5.721-23.15 2.486-9.35 13.474-12.959 15.316-23.542 0.214-1.483 0.89-2.611 2.213-4.793 2.126-3.339 1.468-9.507 1.573-15.158 0.333-15.224-1.611-30.208-5.062-41.276-3.181-10.37-8.186-17.664-12.459-27.085-8.563-18.789-8.275-27.35-16.014-39.258-7.796-12.192-5.151-19.893-15.545-19.233-13.707 0.961-26.763 22.134-40.404 22.671z"/>
+   <path fill="#939393" d="m159.886 134.759c-8.885 0.316-21.516-23.829-22.691-16.197-0.454 6.451-0.479 6.708-0.899 13.482-0.903 5.339-4.038 7.784-9.157 15.849-2.957 4.818-4.642 9.552-5.595 14.021-0.05 4.037 1.799 6.852 0.9 9.637-0.693 1.928-3.941 2.919-6.273 6.129-4.756 10.32-13.941 23.77-16.201 33.587-2.555 10.858-5.579 17.608-4.928 31.92 0.399 11.644-0.151 9.581 4.162 13.424 4.096 3.697 9.111 7.494 15.854 13.451 7.099 6.17 22.541 17.256 24.498 20.569 2.1 3.387 2.344 11.75 1.101 14.186-1.223 2.387-12.476 4.163-12.404 4.163-0.071 0 9.573 13.001 11.5 14.929 1.857 1.856 9.729 10.488 42.229 4.461 18.625-3.449 34.579-13.396 42.467-23.973 9.774-11.412 3.523-16.764 5.195-23.115 2.479-9.334 14.022-12.959 15.858-23.527 0.214-1.479 0.924-2.601 2.238-4.772 2.134-3.373 1.445-9.522 1.571-15.151 0.399-15.273-1.587-30.201-5.036-41.237-3.185-10.342-8.184-17.625-12.446-27.03-8.548-18.76-8.288-27.333-16.034-39.204-7.598-11.837-5.289-19.221-15.428-18.544-13.543 0.994-26.863 22.413-40.481 22.942z"/>
+   <path fill="#9b9b9b" d="m159.868 135.844c-8.805 0.308-21.068-23.492-22.381-16.401-0.481 5.991-0.594 6.314-1.085 12.73-1.053 5.232-4.253 8.013-9.243 15.922-2.946 4.829-4.515 9.5-5.314 13.85 0.133 4.194 2.471 6.937 1.565 9.658-0.749 1.986-4.43 2.866-7.091 6.347-5.056 10.229-14.021 23.689-16.249 33.329-2.572 10.868-5.621 17.591-4.921 31.876 0.405 11.172-0.261 9.463 4.04 13.346 4.058 3.713 9.166 7.58 15.892 13.521 7.082 6.155 22.601 17.265 24.548 20.567 2.092 3.373 2.388 11.834 1.152 14.256-1.21 2.377-12.454 4.222-12.383 4.222-0.071 0 9.523 12.888 11.45 14.813 1.854 1.854 9.692 10.424 42.138 4.412 18.645-3.447 34.871-13.324 42.345-23.996 9.171-11.143 3.007-16.762 4.669-23.08 2.472-9.317 14.572-12.959 16.401-23.514 0.214-1.473 0.958-2.588 2.265-4.75 2.142-3.408 1.421-9.539 1.568-15.145 0.466-15.324-1.564-30.196-5.012-41.198-3.187-10.313-8.179-17.587-12.433-26.976-8.533-18.73-8.301-27.316-16.054-39.149-7.401-11.482-5.426-18.548-15.313-17.855-13.373 1.029-26.958 22.694-40.554 23.215z"/>
+   <path fill="#a3a3a3" d="m159.851 136.929c-8.727 0.301-20.622-23.156-22.071-16.604-0.509 5.529-0.71 5.919-1.271 11.976-1.203 5.126-4.47 8.243-9.328 15.996-2.936 4.84-4.39 9.448-5.036 13.679 0.316 4.351 3.143 7.023 2.231 9.68-0.804 2.043-4.919 2.812-7.908 6.563-5.356 10.137-14.101 23.607-16.298 33.072-2.589 10.877-5.661 17.574-4.913 31.832 0.412 10.699-0.37 9.342 3.918 13.268 4.021 3.729 9.221 7.664 15.93 13.59 7.064 6.139 22.661 17.271 24.599 20.563 2.081 3.363 2.43 11.922 1.204 14.33-1.198 2.365-12.434 4.278-12.363 4.278-0.07 0 9.477 12.774 11.399 14.697 1.851 1.851 9.659 10.36 42.048 4.364 18.666-3.447 35.162-13.254 42.223-24.021 8.568-10.873 2.49-16.761 4.144-23.045 2.464-9.301 15.121-12.958 16.943-23.498 0.215-1.467 0.992-2.579 2.29-4.729 2.148-3.441 1.398-9.553 1.566-15.139 0.532-15.373-1.541-30.189-4.987-41.158-3.188-10.285-8.174-17.549-12.419-26.921-8.518-18.701-8.313-27.3-16.073-39.096-7.204-11.126-5.564-17.875-15.196-17.165-13.21 1.064-27.058 22.975-40.632 23.488z"/>
+   <path fill="#aaa" d="m159.834 138.014c-8.646 0.293-20.176-22.819-21.761-16.808-0.536 5.069-0.826 5.526-1.457 11.224-1.354 5.02-4.687 8.472-9.416 16.069-2.924 4.851-4.262 9.396-4.756 13.508 0.501 4.507 3.814 7.109 2.897 9.702-0.858 2.1-5.406 2.759-8.725 6.782-5.657 10.045-14.181 23.524-16.347 32.812-2.606 10.888-5.703 17.557-4.906 31.787 0.418 10.229-0.479 9.225 3.795 13.189 3.984 3.745 9.275 7.749 15.968 13.66 7.048 6.124 22.723 17.279 24.651 20.559 2.07 3.352 2.472 12.008 1.255 14.402-1.186 2.355-12.414 4.337-12.343 4.337-0.071 0 9.428 12.66 11.348 14.581 1.85 1.848 9.624 10.297 41.958 4.314 18.687-3.444 35.453-13.18 42.102-24.043 7.965-10.602 1.973-16.758 3.616-23.01 2.457-9.283 15.67-12.957 17.487-23.482 0.214-1.461 1.026-2.568 2.315-4.709 2.155-3.477 1.375-9.568 1.563-15.131 0.6-15.424-1.518-30.184-4.963-41.119-3.192-10.257-8.17-17.511-12.405-26.866-8.502-18.672-8.328-27.284-16.095-39.042-7.005-10.771-5.701-17.203-15.078-16.476-13.04 1.098-27.152 23.255-40.703 23.76z"/>
+   <path fill="#b2b2b2" d="m159.816 139.099c-8.567 0.286-19.729-22.483-21.45-17.012-0.563 4.608-0.942 5.132-1.643 10.471-1.506 4.914-4.904 8.701-9.502 16.143-2.913 4.862-4.137 9.344-4.477 13.336 0.685 4.665 4.486 7.195 3.564 9.725-0.915 2.157-5.897 2.705-9.543 6.999-5.958 9.953-14.262 23.443-16.396 32.554-2.624 10.898-5.745 17.54-4.9 31.744 0.426 9.757-0.588 9.105 3.674 13.111 3.945 3.761 9.33 7.834 16.006 13.729 7.032 6.109 22.783 17.288 24.702 20.557 2.06 3.338 2.515 12.094 1.306 14.473-1.173 2.346-12.392 4.395-12.321 4.395-0.07 0 9.379 12.549 11.296 14.465 1.847 1.848 9.591 10.234 41.868 4.268 18.706-3.444 35.745-13.11 41.979-24.066 7.361-10.332 1.456-16.757 3.091-22.974 2.45-9.269 16.219-12.958 18.03-23.47 0.213-1.455 1.06-2.557 2.34-4.688 2.164-3.509 1.352-9.583 1.562-15.124 0.665-15.473-1.494-30.177-4.938-41.08-3.195-10.228-8.166-17.472-12.393-26.811-8.486-18.642-8.341-27.267-16.114-38.987-6.809-10.416-5.838-16.531-14.962-15.787-12.873 1.129-27.25 23.531-40.779 24.029z"/>
+   <path fill="#bababa" d="m159.799 140.184c-8.487 0.279-19.282-22.146-21.141-17.215-0.591 4.147-1.057 4.737-1.828 9.717-1.656 4.808-5.121 8.931-9.588 16.217-2.902 4.873-4.01 9.292-4.197 13.165 0.868 4.822 5.158 7.281 4.23 9.747-0.971 2.215-6.385 2.651-10.361 7.216-6.258 9.861-14.339 23.36-16.442 32.297-2.643 10.906-5.787 17.521-4.894 31.699 0.432 9.285-0.697 8.986 3.552 13.032 3.908 3.776 9.384 7.919 16.043 13.799 7.016 6.093 22.845 17.296 24.753 20.552 2.051 3.328 2.559 12.18 1.358 14.547-1.161 2.334-12.372 4.451-12.301 4.451-0.071 0 9.33 12.436 11.245 14.35 1.844 1.844 9.555 10.17 41.777 4.219 18.727-3.443 36.036-13.039 41.857-24.09 6.759-10.063 0.939-16.756 2.565-22.939 2.442-9.25 16.768-12.957 18.572-23.453 0.213-1.451 1.095-2.547 2.365-4.668 2.171-3.543 1.329-9.599 1.56-15.117 0.732-15.522-1.471-30.172-4.913-41.042-3.197-10.2-8.161-17.433-12.379-26.756-8.471-18.612-8.354-27.25-16.135-38.933-6.609-10.061-5.976-15.858-14.845-15.098-12.706 1.165-27.347 23.813-40.853 24.303z"/>
+   <path fill="#c1c1c1" d="m159.781 141.269c-8.408 0.271-18.837-21.81-20.83-17.419-0.619 3.687-1.173 4.344-2.014 8.965-1.808 4.701-5.338 9.16-9.674 16.29-2.892 4.884-3.885 9.24-3.918 12.994 1.052 4.978 5.829 7.367 4.896 9.769-1.026 2.272-6.874 2.598-11.178 7.434-6.56 9.769-14.419 23.277-16.491 32.039-2.66 10.916-5.829 17.504-4.887 31.656 0.438 8.813-0.807 8.867 3.43 12.953 3.87 3.793 9.438 8.004 16.082 13.868 6.997 6.077 22.904 17.304 24.803 20.55 2.041 3.314 2.601 12.266 1.409 14.617-1.149 2.324-12.351 4.51-12.28 4.51-0.07 0 9.282 12.321 11.194 14.233 1.841 1.842 9.521 10.106 41.688 4.17 18.746-3.44 36.326-12.967 41.734-24.112 6.156-9.793 0.423-16.754 2.038-22.904 2.438-9.235 17.318-12.957 19.117-23.438 0.212-1.444 1.128-2.536 2.39-4.647 2.18-3.578 1.306-9.613 1.558-15.11 0.799-15.571-1.447-30.165-4.889-41.002-3.2-10.172-8.156-17.395-12.364-26.701-8.456-18.583-8.367-27.234-16.155-38.88-6.413-9.705-6.114-15.185-14.729-14.408-12.541 1.197-27.445 24.091-40.93 24.573z"/>
+   <path fill="#c9c9c9" d="m159.764 142.354c-8.329 0.264-18.392-21.473-20.521-17.622-0.646 3.225-1.289 3.949-2.2 8.211-1.957 4.596-5.555 9.39-9.761 16.364-2.879 4.895-3.757 9.188-3.638 12.823 1.235 5.135 6.502 7.453 5.562 9.791-1.081 2.329-7.362 2.544-11.995 7.651-6.859 9.677-14.499 23.195-16.54 31.78-2.677 10.927-5.87 17.488-4.879 31.611 0.444 8.344-0.916 8.748 3.307 12.875 3.834 3.81 9.492 8.09 16.121 13.939 6.98 6.061 22.965 17.311 24.854 20.545 2.031 3.303 2.643 12.352 1.461 14.69-1.137 2.313-12.33 4.567-12.26 4.567-0.07 0 9.233 12.209 11.143 14.117 1.839 1.84 9.486 10.043 41.599 4.122 18.767-3.44 36.618-12.896 41.612-24.137 5.554-9.522-0.094-16.751 1.513-22.868 2.43-9.219 17.866-12.957 19.659-23.424 0.213-1.439 1.162-2.525 2.415-4.627 2.188-3.612 1.282-9.629 1.556-15.104 0.865-15.621-1.424-30.158-4.864-40.962-3.202-10.144-8.153-17.357-12.351-26.646-8.441-18.554-8.381-27.218-16.176-38.826-6.216-9.35-6.251-14.513-14.612-13.719-12.374 1.235-27.543 24.375-41.005 24.849z"/>
+   <path fill="#d1d1d1" d="m159.747 143.439c-8.25 0.256-17.944-21.137-20.21-17.826-0.675 2.765-1.406 3.555-2.386 7.459-2.108 4.489-5.772 9.619-9.847 16.437-2.869 4.906-3.631 9.136-3.358 12.652 1.419 5.292 7.174 7.538 6.228 9.812-1.137 2.387-7.852 2.491-12.813 7.869-7.161 9.586-14.579 23.114-16.588 31.522-2.695 10.938-5.912 17.471-4.873 31.568 0.451 7.871-1.025 8.629 3.185 12.797 3.796 3.824 9.547 8.174 16.158 14.008 6.964 6.047 23.026 17.32 24.905 20.541 2.021 3.292 2.686 12.439 1.513 14.764-1.125 2.303-12.31 4.625-12.239 4.625-0.07 0 9.186 12.094 11.092 14.002 1.836 1.836 9.45 9.978 41.509 4.072 18.786-3.439 36.909-12.824 41.49-24.16 4.948-9.252-0.611-16.748 0.985-22.832 2.423-9.203 18.415-12.957 20.203-23.41 0.212-1.434 1.196-2.514 2.44-4.605 2.193-3.646 1.259-9.645 1.553-15.098 0.932-15.67-1.4-30.151-4.84-40.922-3.205-10.115-8.148-17.319-12.336-26.592-8.427-18.524-8.396-27.201-16.197-38.771-6.017-8.995-6.388-13.84-14.495-13.03-12.207 1.266-27.64 24.652-41.079 25.118z"/>
+   <path fill="#d8d8d8" d="m159.729 144.524c-8.17 0.249-17.498-20.8-19.9-18.03-0.702 2.304-1.521 3.162-2.571 6.706-2.259 4.383-5.988 9.848-9.933 16.511-2.858 4.917-3.504 9.084-3.079 12.48 1.604 5.449 7.846 7.625 6.895 9.835-1.193 2.444-8.342 2.438-13.631 8.087-7.461 9.493-14.658 23.031-16.637 31.262-2.712 10.947-5.953 17.455-4.865 31.524 0.458 7.399-1.135 8.511 3.063 12.718 3.758 3.842 9.601 8.26 16.196 14.078 6.946 6.031 23.087 17.328 24.956 20.538 2.011 3.28 2.729 12.524 1.563 14.835-1.112 2.293-12.289 4.684-12.218 4.684-0.071 0 9.136 11.981 11.04 13.886 1.834 1.834 9.417 9.913 41.419 4.024 18.807-3.438 37.2-12.752 41.368-24.184 4.346-8.982-1.128-16.747 0.46-22.798 2.416-9.187 18.964-12.956 20.746-23.394 0.211-1.429 1.229-2.504 2.465-4.586 2.202-3.681 1.236-9.658 1.551-15.091 0.998-15.72-1.377-30.146-4.814-40.884-3.208-10.086-8.145-17.28-12.323-26.536-8.411-18.495-8.408-27.185-16.217-38.717-5.82-8.64-6.526-13.168-14.38-12.341-12.04 1.303-27.736 24.934-41.154 25.393z"/>
+   <path fill="#e0e0e0" d="m159.712 145.609c-8.091 0.241-17.052-20.464-19.59-18.233-0.729 1.843-1.637 2.767-2.757 5.953-2.409 4.276-6.206 10.077-10.02 16.584-2.847 4.928-3.378 9.032-2.8 12.309 1.787 5.606 8.519 7.711 7.561 9.857-1.248 2.502-8.829 2.384-14.448 8.304-7.761 9.402-14.738 22.95-16.684 31.006-2.731 10.955-5.996 17.436-4.859 31.48 0.464 6.928-1.244 8.389 2.939 12.639 3.722 3.857 9.656 8.344 16.234 14.148 6.932 6.014 23.148 17.336 25.008 20.533 2 3.268 2.771 12.611 1.615 14.907-1.1 2.282-12.268 4.741-12.198 4.741-0.069 0 9.089 11.867 10.989 13.77 1.831 1.831 9.382 9.85 41.329 3.977 18.827-3.438 37.492-12.683 41.246-24.207 3.743-8.715-1.646-16.746-0.066-22.762 2.409-9.171 19.514-12.957 21.289-23.381 0.211-1.422 1.265-2.494 2.49-4.564 2.21-3.715 1.213-9.674 1.549-15.084 1.065-15.77-1.354-30.139-4.791-40.844-3.21-10.058-8.14-17.241-12.309-26.481-8.396-18.466-8.421-27.168-16.237-38.664-5.622-8.284-6.663-12.495-14.262-11.651-11.872 1.335-27.833 25.212-41.228 25.663z"/>
+   <path fill="#e8e8e8" d="m159.694 146.694c-8.012 0.234-16.605-20.127-19.279-18.437-0.757 1.383-1.753 2.373-2.943 5.2-2.56 4.171-6.423 10.307-10.105 16.658-2.835 4.939-3.251 8.979-2.52 12.138 1.97 5.763 9.189 7.796 8.226 9.879-1.303 2.559-9.318 2.33-15.265 8.521-8.063 9.31-14.818 22.867-16.733 30.748-2.748 10.967-6.037 17.419-4.853 31.436 0.472 6.457-1.353 8.271 2.818 12.562 3.685 3.873 9.711 8.429 16.273 14.218 6.913 6 23.207 17.344 25.058 20.529 1.991 3.257 2.814 12.697 1.666 14.98-1.087 2.271-12.247 4.799-12.177 4.799-0.07 0 9.04 11.755 10.938 13.654 1.829 1.828 9.349 9.785 41.239 3.926 18.847-3.435 37.783-12.609 41.124-24.229 3.14-8.444-2.161-16.743-0.592-22.728 2.401-9.152 20.062-12.955 21.831-23.364 0.211-1.417 1.298-2.483 2.516-4.544 2.217-3.748 1.19-9.689 1.547-15.076 1.132-15.82-1.331-30.133-4.766-40.806-3.213-10.03-8.136-17.203-12.296-26.427-8.38-18.436-8.435-27.151-16.257-38.609-5.425-7.929-6.802-11.822-14.146-10.962-11.706 1.368-27.931 25.491-41.304 25.934z"/>
+   <path fill="#efefef" d="m159.677 147.779c-7.934 0.226-16.16-19.791-18.97-18.64-0.785 0.921-1.869 1.979-3.13 4.447-2.71 4.064-6.639 10.536-10.19 16.731-2.824 4.95-3.125 8.928-2.24 11.967 2.152 5.919 9.86 7.882 8.892 9.901-1.358 2.616-9.808 2.277-16.083 8.739-8.363 9.218-14.896 22.784-16.781 30.489-2.766 10.977-6.079 17.402-4.846 31.393 0.478 5.984-1.462 8.152 2.696 12.482 3.646 3.889 9.765 8.514 16.311 14.287 6.896 5.983 23.269 17.352 25.109 20.526 1.98 3.245 2.855 12.782 1.718 15.052-1.076 2.262-12.227 4.857-12.156 4.857-0.07 0 8.991 11.641 10.887 13.537 1.826 1.826 9.313 9.723 41.148 3.879 18.868-3.434 38.074-12.538 41.002-24.254 2.537-8.174-2.678-16.741-1.119-22.69 2.396-9.138 20.612-12.957 22.375-23.351 0.212-1.412 1.332-2.473 2.541-4.523 2.226-3.783 1.166-9.704 1.545-15.07 1.197-15.869-1.307-30.125-4.741-40.766-3.215-10.002-8.131-17.165-12.282-26.372-8.365-18.407-8.447-27.135-16.277-38.555-5.228-7.574-6.938-11.15-14.029-10.272-11.541 1.402-28.029 25.771-41.38 26.206z"/>
+   <path fill="#f7f7f7" d="m159.66 148.864c-7.854 0.219-15.714-19.454-18.66-18.844-0.812 0.461-1.983 1.585-3.314 3.694-2.86 3.958-6.856 10.766-10.278 16.805-2.813 4.961-2.998 8.876-1.96 11.796 2.337 6.076 10.533 7.968 9.558 9.923-1.415 2.673-10.296 2.223-16.899 8.956-8.664 9.126-14.978 22.702-16.83 30.23-2.783 10.986-6.121 17.386-4.839 31.349 0.484 5.515-1.571 8.033 2.573 12.403 3.609 3.906 9.82 8.6 16.35 14.357 6.88 5.969 23.329 17.36 25.16 20.523 1.971 3.232 2.898 12.869 1.77 15.124-1.063 2.252-12.206 4.915-12.136 4.915-0.07 0 8.942 11.527 10.835 13.422 1.824 1.822 9.279 9.658 41.059 3.83 18.889-3.434 38.366-12.467 40.881-24.278 1.934-7.903-3.195-16.739-1.646-22.655 2.388-9.121 21.161-12.955 22.918-23.336 0.211-1.404 1.366-2.461 2.566-4.502 2.232-3.816 1.143-9.719 1.542-15.063 1.265-15.92-1.283-30.12-4.717-40.727-3.219-9.974-8.128-17.127-12.269-26.317-8.349-18.378-8.461-27.119-16.298-38.501-5.029-7.219-7.075-10.478-13.912-9.584-11.373 1.438-28.126 26.053-41.454 26.48z"/>
+   <path fill="#fff" d="m159.642 149.949c-7.774 0.211-15.268-19.118-18.35-19.048-0.84 0-2.1 1.191-3.501 2.941-3.011 3.852-7.072 10.995-10.363 16.878-2.803 4.972-2.872 8.824-1.682 11.625 2.521 6.233 11.205 8.054 10.225 9.945-1.471 2.731-10.785 2.17-17.719 9.174-8.964 9.034-15.056 22.621-16.877 29.973-2.801 10.995-6.163 17.368-4.832 31.304 0.49 5.043-1.681 7.914 2.451 12.325 3.571 3.923 9.874 8.685 16.387 14.427 6.863 5.953 23.391 17.368 25.211 20.521 1.962 3.221 2.942 12.954 1.821 15.196-1.051 2.24-12.185 4.972-12.115 4.972-0.069 0 8.895 11.416 10.784 13.307 1.821 1.82 9.244 9.595 40.97 3.781 18.907-3.431 38.656-12.396 40.758-24.302 1.331-7.633-3.712-16.736-2.171-22.619 2.381-9.104 21.71-12.956 23.461-23.321 0.21-1.399 1.399-2.45 2.591-4.481 2.24-3.852 1.12-9.734 1.54-15.057 1.331-15.968-1.26-30.113-4.692-40.688-3.221-9.945-8.123-17.088-12.255-26.262-8.334-18.348-8.474-27.102-16.318-38.447-4.832-6.863-7.213-9.805-13.796-8.894-11.205 1.469-28.222 26.33-41.528 26.75z"/>
+  </g>
+  <path fill="#995900" d="m152.553 88.8575c5.256-0.648 12.456 0.648 15.769 3.096 3.096 2.304 5.256 3.528 8.063 4.464 9.433 3.096 21.816 4.536 21.24 13.032-0.648 10.151-3.6 14.688-12.024 17.351-6.768 2.088-18.863 13.824-28.224 13.824-4.176 0-10.008 0.216-13.392-1.008-3.24-1.152-7.776-6.624-13.104-11.016-5.328-4.32-10.296-8.928-10.439-14.976-0.217-6.407 3.96-8.496 9.863-13.607 3.097-2.736 8.712-7.272 12.601-9.288 3.599-1.799 5.903-1.439 9.647-1.872z"/>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#9e5f00" d="m165.068 78.951c5.225-0.644 12.384 0.645 15.677 3.079 3.078 2.29 5.227 3.51 8.018 4.438 9.375 3.078 21.729 4.529 21.159 12.973-0.641 10.09-3.669 14.581-12.041 17.223-6.723 2.073-18.768 13.589-28.07 13.64-4.21 0.032-9.926 0.234-13.287-0.977-3.215-1.142-7.737-6.608-13.031-10.969-5.291-4.292-10.26-8.774-10.317-14.765-0.153-6.252 3.912-8.411 9.773-13.488 3.071-2.71 8.594-7.303 12.463-9.333 3.563-1.803 5.933-1.392 9.656-1.821z"/>
+   <path fill="#a36400" d="m165.177 79.044c5.195-0.641 12.313 0.64 15.587 3.06 3.06 2.278 5.194 3.494 7.971 4.413 9.317 3.06 21.641 4.522 21.078 12.914-0.634 10.027-3.737 14.474-12.058 17.094-6.678 2.057-18.673 13.352-27.919 13.454-4.241 0.064-9.842 0.252-13.18-0.945-3.19-1.133-7.7-6.592-12.96-10.921-5.254-4.264-10.222-8.622-10.192-14.555-0.093-6.099 3.863-8.329 9.681-13.369 3.048-2.685 8.478-7.335 12.328-9.379 3.526-1.804 5.963-1.338 9.664-1.766z"/>
+   <path fill="#a86a00" d="m165.287 79.138c5.165-0.637 12.241 0.637 15.496 3.043 3.042 2.264 5.165 3.476 7.924 4.387 9.26 3.042 21.556 4.515 20.998 12.854-0.627 9.968-3.805 14.368-12.074 16.967-6.633 2.042-18.576 13.117-27.766 13.27-4.276 0.096-9.759 0.27-13.075-0.914-3.165-1.123-7.661-6.577-12.887-10.874-5.217-4.236-10.187-8.468-10.069-14.345-0.03-5.943 3.815-8.244 9.589-13.249 3.023-2.66 8.36-7.366 12.191-9.424 3.49-1.808 5.993-1.291 9.673-1.715z"/>
+   <path fill="#ad7000" d="m165.396 79.23c5.135-0.633 12.17 0.633 15.404 3.025 3.025 2.251 5.137 3.46 7.88 4.361 9.201 3.025 21.467 4.508 20.917 12.796-0.62 9.905-3.874 14.26-12.093 16.837-6.586 2.027-18.479 12.882-27.611 13.086-4.311 0.127-9.677 0.287-12.971-0.883-3.14-1.113-7.622-6.561-12.814-10.826-5.18-4.208-10.148-8.315-9.945-14.135 0.031-5.789 3.768-8.16 9.497-13.129 2.999-2.635 8.244-7.398 12.055-9.47 3.454-1.808 6.023-1.24 9.681-1.662z"/>
+   <path fill="#b27600" d="m165.506 79.325c5.105-0.63 12.099 0.629 15.314 3.007 3.007 2.237 5.104 3.442 7.832 4.335 9.145 3.007 21.38 4.501 20.837 12.737-0.614 9.844-3.943 14.154-12.109 16.709-6.541 2.011-18.385 12.645-27.46 12.9-4.342 0.16-9.592 0.306-12.862-0.851-3.115-1.103-7.584-6.545-12.743-10.779-5.144-4.18-10.112-8.162-9.821-13.924 0.092-5.634 3.718-8.076 9.405-13.009 2.975-2.609 8.126-7.429 11.919-9.514 3.416-1.812 6.052-1.192 9.688-1.611z"/>
+   <path fill="#b77b00" d="m165.615 79.417c5.075-0.626 12.026 0.626 15.224 2.989 2.989 2.225 5.075 3.425 7.786 4.31 9.087 2.989 21.292 4.494 20.756 12.678-0.606 9.781-4.012 14.046-12.126 16.581-6.496 1.997-18.289 12.41-27.307 12.716-4.376 0.191-9.51 0.323-12.758-0.82-3.09-1.094-7.546-6.53-12.671-10.732-5.106-4.152-10.074-8.008-9.697-13.713 0.155-5.479 3.67-7.992 9.313-12.889 2.951-2.585 8.011-7.461 11.783-9.56 3.38-1.814 6.083-1.143 9.697-1.56z"/>
+   <path fill="#bc8100" d="m165.725 79.511c5.044-0.622 11.954 0.622 15.133 2.972 2.971 2.211 5.045 3.408 7.739 4.284 9.029 2.971 21.205 4.487 20.675 12.619-0.6 9.719-4.079 13.939-12.143 16.451-6.45 1.982-18.192 12.175-27.153 12.532-4.41 0.223-9.428 0.341-12.653-0.789-3.065-1.084-7.507-6.514-12.598-10.684-5.069-4.124-10.038-7.855-9.574-13.504 0.217-5.324 3.622-7.908 9.222-12.77 2.926-2.559 7.894-7.492 11.646-9.605 3.344-1.816 6.113-1.092 9.706-1.506z"/>
+   <path fill="#c18700" d="m165.834 79.604c5.015-0.618 11.883 0.619 15.043 2.954 2.953 2.198 5.015 3.391 7.693 4.259 8.972 2.953 21.118 4.48 20.594 12.559-0.593 9.66-4.147 13.833-12.159 16.324-6.405 1.967-18.098 11.94-27.002 12.347-4.441 0.255-9.343 0.359-12.546-0.757-3.04-1.074-7.469-6.498-12.526-10.637-5.032-4.096-10-7.701-9.45-13.293 0.278-5.169 3.574-7.823 9.13-12.649 2.903-2.534 7.776-7.524 11.511-9.651 3.306-1.821 6.141-1.044 9.712-1.456z"/>
+   <path fill="#c68d00" d="m165.944 79.697c4.984-0.615 11.811 0.614 14.952 2.936 2.935 2.184 4.983 3.374 7.646 4.233 8.915 2.935 21.031 4.473 20.515 12.5-0.586 9.597-4.218 13.726-12.177 16.195-6.36 1.951-18.002 11.703-26.849 12.162-4.476 0.287-9.261 0.377-12.441-0.726-3.015-1.064-7.431-6.482-12.453-10.589-4.995-4.068-9.965-7.549-9.326-13.083 0.34-5.015 3.524-7.741 9.038-12.531 2.878-2.508 7.658-7.555 11.374-9.696 3.269-1.82 6.171-0.992 9.721-1.401z"/>
+   <path fill="#cc9200" d="m166.054 79.791c4.952-0.61 11.738 0.611 14.86 2.918 2.918 2.172 4.954 3.357 7.601 4.207 8.857 2.918 20.942 4.466 20.432 12.442-0.578 9.536-4.285 13.62-12.192 16.066-6.314 1.936-17.906 11.468-26.696 11.978-4.509 0.319-9.178 0.394-12.335-0.696-2.989-1.054-7.393-6.466-12.382-10.541-4.959-4.04-9.928-7.395-9.202-12.873 0.401-4.859 3.477-7.655 8.945-12.411 2.854-2.482 7.542-7.586 11.239-9.741 3.233-1.824 6.201-0.943 9.73-1.349z"/>
+   <path fill="#d19800" d="m166.163 79.883c4.923-0.606 11.668 0.608 14.771 2.901 2.9 2.158 4.924 3.339 7.554 4.181 8.801 2.9 20.855 4.459 20.352 12.383-0.571 9.474-4.353 13.512-12.21 15.938-6.269 1.921-17.81 11.233-26.543 11.793-4.542 0.351-9.094 0.413-12.229-0.664-2.965-1.044-7.354-6.45-12.311-10.494-4.921-4.012-9.89-7.241-9.079-12.662 0.465-4.705 3.431-7.571 8.855-12.29 2.83-2.458 7.425-7.618 11.102-9.787 3.197-1.827 6.231-0.893 9.738-1.299z"/>
+   <path fill="#d69e00" d="m166.273 79.978c4.893-0.603 11.596 0.603 14.679 2.882 2.883 2.145 4.895 3.323 7.507 4.156 8.744 2.882 20.77 4.452 20.272 12.324-0.565 9.412-4.422 13.406-12.228 15.81-6.224 1.905-17.714 10.996-26.39 11.608-4.576 0.383-9.012 0.431-12.124-0.633-2.94-1.034-7.316-6.434-12.237-10.446-4.884-3.984-9.854-7.089-8.955-12.452 0.525-4.551 3.382-7.489 8.764-12.171 2.805-2.432 7.307-7.649 10.965-9.832 3.16-1.829 6.261-0.845 9.747-1.246z"/>
+   <path fill="#dba300" d="m166.382 80.07c4.863-0.599 11.525 0.6 14.59 2.865 2.864 2.131 4.862 3.305 7.461 4.13 8.686 2.864 20.682 4.445 20.19 12.264-0.559 9.352-4.491 13.299-12.244 15.681-6.179 1.89-17.619 10.761-26.237 11.423-4.608 0.415-8.929 0.449-12.018-0.601-2.915-1.024-7.277-6.418-12.166-10.399-4.847-3.956-9.815-6.935-8.831-12.241 0.587-4.396 3.333-7.404 8.671-12.051 2.782-2.407 7.191-7.681 10.83-9.878 3.123-1.829 6.29-0.793 9.754-1.193z"/>
+   <path fill="#e0a900" d="m166.492 80.164c4.832-0.595 11.453 0.596 14.498 2.847 2.847 2.118 4.833 3.289 7.414 4.104 8.629 2.846 20.595 4.438 20.111 12.205-0.553 9.29-4.56 13.193-12.262 15.553-6.134 1.875-17.522 10.526-26.085 11.239-4.642 0.447-8.845 0.467-11.912-0.57-2.89-1.015-7.238-6.402-12.093-10.351-4.81-3.928-9.78-6.782-8.708-12.032 0.649-4.241 3.285-7.32 8.58-11.932 2.757-2.381 7.073-7.712 10.693-9.923 3.088-1.831 6.321-0.743 9.764-1.14z"/>
+   <path fill="#e5af00" d="m166.601 80.257c4.803-0.592 11.382 0.592 14.407 2.829 2.829 2.105 4.804 3.271 7.368 4.079 8.571 2.828 20.507 4.431 20.029 12.146-0.544 9.228-4.627 13.085-12.277 15.423-6.089 1.861-17.427 10.29-25.932 11.055-4.676 0.478-8.763 0.484-11.807-0.539-2.865-1.005-7.2-6.387-12.021-10.304-4.772-3.9-9.742-6.629-8.583-11.821 0.711-4.085 3.236-7.236 8.487-11.812 2.732-2.357 6.957-7.744 10.557-9.968 3.052-1.834 6.351-0.694 9.772-1.088z"/>
+   <path fill="#eab500" d="m166.711 80.351c4.772-0.588 11.31 0.589 14.317 2.811 2.811 2.092 4.771 3.254 7.321 4.054 8.514 2.81 20.42 4.424 19.948 12.087-0.538 9.165-4.695 12.979-12.294 15.295-6.044 1.845-17.332 10.054-25.779 10.869-4.708 0.511-8.68 0.503-11.7-0.507-2.84-0.995-7.163-6.371-11.949-10.257-4.736-3.872-9.706-6.475-8.46-11.61 0.773-3.931 3.188-7.152 8.396-11.692 2.709-2.331 6.839-7.775 10.421-10.013 3.013-1.839 6.38-0.645 9.779-1.037z"/>
+   <path fill="#efba00" d="m166.82 80.443c4.742-0.584 11.238 0.585 14.226 2.794 2.794 2.078 4.743 3.237 7.276 4.027 8.456 2.793 20.332 4.417 19.868 12.029-0.531 9.104-4.766 12.872-12.313 15.167-5.997 1.83-17.234 9.819-25.626 10.685-4.742 0.542-8.596 0.52-11.595-0.476-2.815-0.985-7.124-6.355-11.877-10.209-4.699-3.844-9.668-6.322-8.336-11.4 0.835-3.778 3.14-7.068 8.304-11.573 2.686-2.306 6.724-7.807 10.285-10.059 2.978-1.84 6.411-0.595 9.788-0.985z"/>
+   <path fill="#f4c000" d="m166.93 80.537c4.711-0.58 11.166 0.582 14.135 2.776 2.775 2.066 4.713 3.22 7.229 4.002 8.399 2.775 20.246 4.41 19.787 11.969-0.522 9.043-4.832 12.765-12.328 15.039-5.952 1.815-17.139 9.584-25.473 10.501-4.776 0.574-8.513 0.538-11.49-0.445-2.79-0.976-7.085-6.34-11.804-10.162-4.662-3.816-9.632-6.168-8.213-11.189 0.896-3.623 3.092-6.984 8.213-11.454 2.66-2.281 6.604-7.838 10.147-10.104 2.942-1.844 6.441-0.547 9.797-0.933z"/>
+   <path fill="#f9c600" d="m167.039 80.63c4.683-0.577 11.095 0.577 14.045 2.758 2.758 2.052 4.683 3.203 7.184 3.976 8.341 2.757 20.157 4.403 19.706 11.91-0.518 8.981-4.901 12.659-12.346 14.911-5.906 1.799-17.044 9.347-25.32 10.315-4.809 0.606-8.431 0.556-11.384-0.413-2.765-0.966-7.048-6.324-11.732-10.114-4.625-3.788-9.594-6.016-8.088-10.98 0.958-3.467 3.043-6.9 8.12-11.333 2.637-2.256 6.488-7.87 10.013-10.15 2.902-1.844 6.468-0.495 9.802-0.88z"/>
+  </g>
+  <path fill="#fc0" d="m154.744 90.7245c4.65-0.573 11.022 0.574 13.954 2.74 2.739 2.039 4.651 3.186 7.136 3.951 8.284 2.739 20.071 4.396 19.626 11.851-0.51 8.919-4.97 12.551-12.362 14.781-5.861 1.784-16.947 9.112-25.168 10.131-4.842 0.638-8.347 0.574-11.277-0.382-2.74-0.956-7.01-6.308-11.66-10.067-4.588-3.76-9.559-5.862-7.965-10.769 1.02-3.313 2.995-6.816 8.028-11.213 2.612-2.23 6.371-7.901 9.876-10.195 2.867-1.847 6.499-0.447 9.812-0.828z"/>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m167.982 83.609c1.008 2.088 3.6 2.376 5.328 3.312 1.655 0.936 2.592 1.152 3.239 0.792 1.44-0.792 0.36-3.384-1.079-4.32-1.368-0.935-8.064-1.151-7.488 0.216z"/>
+   <path fill="#f9c600" d="m168.125 83.631c0.982 2.035 3.508 2.316 5.193 3.229 1.614 0.912 2.526 1.123 3.158 0.771 1.402-0.771 0.35-3.298-1.054-4.21-1.332-0.913-7.859-1.123-7.297 0.21z"/>
+   <path fill="#f4c000" d="m168.267 83.653c0.957 1.982 3.418 2.255 5.058 3.144 1.572 0.889 2.461 1.094 3.076 0.752 1.367-0.752 0.342-3.213-1.025-4.101-1.299-0.889-7.656-1.094-7.109 0.205z"/>
+   <path fill="#efba00" d="m168.409 83.674c0.932 1.929 3.327 2.195 4.924 3.06 1.53 0.865 2.395 1.064 2.993 0.732 1.331-0.732 0.333-3.127-0.998-3.992-1.264-0.864-7.451-1.064-6.919 0.2z"/>
+   <path fill="#eab500" d="m168.552 83.696c0.905 1.876 3.234 2.135 4.787 2.977 1.488 0.841 2.329 1.035 2.912 0.711 1.294-0.711 0.323-3.041-0.971-3.882-1.228-0.841-7.246-1.036-6.728 0.194z"/>
+   <path fill="#e5af00" d="m168.694 83.718c0.881 1.823 3.144 2.075 4.653 2.892 1.446 0.818 2.264 1.006 2.83 0.692 1.257-0.692 0.313-2.956-0.943-3.773-1.195-0.818-7.043-1.007-6.54 0.189z"/>
+   <path fill="#e0a900" d="m168.837 83.739c0.855 1.771 3.053 2.015 4.519 2.809 1.403 0.793 2.198 0.977 2.747 0.671 1.221-0.671 0.306-2.87-0.916-3.664-1.161-0.793-6.839-0.976-6.35 0.184z"/>
+   <path fill="#dba300" d="m168.979 83.761c0.829 1.718 2.962 1.955 4.383 2.725 1.363 0.77 2.132 0.948 2.666 0.651 1.184-0.651 0.296-2.784-0.889-3.554-1.125-0.77-6.634-0.948-6.16 0.178z"/>
+   <path fill="#d69e00" d="m169.121 83.782c0.804 1.665 2.871 1.895 4.249 2.641 1.32 0.747 2.066 0.918 2.583 0.631 1.148-0.631 0.287-2.698-0.861-3.444-1.091-0.746-6.43-0.919-5.971 0.172z"/>
+   <path fill="#d19800" d="m169.264 83.804c0.777 1.612 2.778 1.834 4.112 2.557 1.279 0.723 2.001 0.889 2.501 0.611 1.112-0.611 0.278-2.612-0.834-3.335-1.055-0.722-6.224-0.889-5.779 0.167z"/>
+   <path fill="#cc9200" d="m169.406 83.826c0.753 1.559 2.688 1.774 3.979 2.473 1.236 0.699 1.936 0.86 2.42 0.591 1.074-0.591 0.269-2.527-0.808-3.226-1.021-0.699-6.021-0.86-5.591 0.162z"/>
+   <path fill="#c68c00" d="m169.549 83.847c0.728 1.506 2.597 1.714 3.844 2.389 1.194 0.675 1.869 0.831 2.337 0.571 1.039-0.571 0.26-2.441-0.779-3.116-0.988-0.675-5.818-0.831-5.402 0.156z"/>
+   <path fill="#c18700" d="m169.691 83.869c0.702 1.453 2.506 1.654 3.709 2.305 1.152 0.652 1.803 0.802 2.254 0.551 1.002-0.551 0.251-2.355-0.751-3.006-0.953-0.652-5.613-0.802-5.212 0.15z"/>
+   <path fill="#bc8100" d="m169.833 83.89c0.677 1.4 2.415 1.594 3.574 2.221 1.111 0.628 1.738 0.772 2.173 0.531 0.965-0.531 0.241-2.27-0.725-2.897-0.917-0.627-5.408-0.772-5.022 0.145z"/>
+   <path fill="#b77b00" d="m169.976 83.912c0.65 1.347 2.322 1.533 3.438 2.137 1.069 0.604 1.673 0.743 2.091 0.511 0.93-0.511 0.233-2.184-0.696-2.788-0.884-0.603-5.205-0.743-4.833 0.14z"/>
+   <path fill="#b27500" d="m170.118 83.934c0.626 1.294 2.232 1.473 3.304 2.053 1.027 0.581 1.606 0.714 2.009 0.491 0.893-0.491 0.224-2.098-0.669-2.678-0.85-0.58-5.001-0.715-4.644 0.134z"/>
+   <path fill="#ad7000" d="m170.261 83.955c0.6 1.242 2.14 1.413 3.168 1.97 0.984 0.557 1.541 0.685 1.927 0.47 0.855-0.47 0.214-2.012-0.644-2.569-0.812-0.555-4.794-0.684-4.451 0.129z"/>
+   <path fill="#a86a00" d="m170.403 83.977c0.574 1.189 2.05 1.353 3.034 1.886 0.942 0.533 1.475 0.656 1.844 0.45 0.82-0.45 0.205-1.926-0.615-2.459-0.779-0.533-4.591-0.656-4.263 0.123z"/>
+   <path fill="#a36400" d="m170.545 83.998c0.55 1.136 1.959 1.292 2.899 1.802 0.901 0.509 1.41 0.626 1.762 0.43 0.783-0.43 0.197-1.841-0.587-2.35-0.745-0.508-4.387-0.626-4.074 0.118z"/>
+   <path fill="#9e5e00" d="m170.688 84.02c0.522 1.083 1.867 1.232 2.764 1.718 0.859 0.486 1.343 0.597 1.68 0.41 0.746-0.41 0.188-1.755-0.561-2.241-0.709-0.484-4.182-0.597-3.883 0.113z"/>
+   <path fill="#995900" d="m170.83 84.042c0.498 1.03 1.776 1.172 2.629 1.634 0.817 0.462 1.278 0.568 1.599 0.39 0.71-0.39 0.178-1.669-0.533-2.131-0.676-0.461-3.979-0.568-3.695 0.107z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m152.875 86.29c-0.325 0.813 1.952 2.359 3.091 1.301 1.222-1.057 2.686-2.033 3.175-2.359 2.195-1.465 1.383-2.522-2.278-1.871-3.663 0.651-3.663 2.115-3.988 2.929z"/>
+   <path fill="#f9c600" d="m152.934 86.279c-0.318 0.794 1.906 2.304 3.019 1.271 1.193-1.033 2.623-1.986 3.102-2.305 2.145-1.431 1.351-2.463-2.226-1.828-3.578 0.637-3.578 2.067-3.895 2.862z"/>
+   <path fill="#f4c000" d="m152.993 86.269c-0.31 0.775 1.861 2.25 2.948 1.241 1.164-1.008 2.56-1.939 3.026-2.25 2.095-1.397 1.319-2.405-2.173-1.784-3.491 0.62-3.491 2.017-3.801 2.793z"/>
+   <path fill="#efba00" d="m153.051 86.258c-0.302 0.757 1.817 2.195 2.878 1.211 1.136-0.984 2.497-1.892 2.952-2.195 2.044-1.363 1.287-2.347-2.118-1.741-3.409 0.606-3.409 1.968-3.712 2.725z"/>
+   <path fill="#eab500" d="m153.11 86.248c-0.295 0.738 1.771 2.141 2.805 1.181 1.108-0.959 2.437-1.845 2.88-2.141 1.993-1.329 1.255-2.289-2.066-1.698-3.324 0.591-3.324 1.92-3.619 2.658z"/>
+   <path fill="#e5af00" d="m153.169 86.238c-0.287 0.719 1.727 2.086 2.733 1.151 1.08-0.935 2.374-1.798 2.807-2.086 1.942-1.296 1.224-2.23-2.015-1.655s-3.238 1.87-3.525 2.59z"/>
+   <path fill="#e0a900" d="m153.228 86.228c-0.28 0.7 1.681 2.032 2.661 1.121 1.052-0.91 2.312-1.751 2.732-2.031 1.893-1.262 1.191-2.172-1.961-1.611-3.152 0.559-3.152 1.82-3.432 2.521z"/>
+   <path fill="#dba300" d="m153.286 86.217c-0.271 0.681 1.636 1.977 2.591 1.09 1.023-0.886 2.25-1.704 2.659-1.977 1.84-1.228 1.159-2.114-1.909-1.568-3.068 0.547-3.068 1.773-3.341 2.455z"/>
+   <path fill="#d69e00" d="m153.345 86.207c-0.265 0.662 1.591 1.922 2.519 1.061 0.995-0.862 2.188-1.657 2.586-1.922 1.789-1.194 1.127-2.055-1.855-1.525-2.985 0.53-2.985 1.723-3.25 2.386z"/>
+   <path fill="#d19800" d="m153.404 86.197c-0.257 0.643 1.546 1.868 2.447 1.03 0.967-0.837 2.126-1.61 2.512-1.868 1.739-1.16 1.095-1.997-1.803-1.481-2.899 0.516-2.899 1.674-3.156 2.319z"/>
+   <path fill="#cc9200" d="m153.463 86.187c-0.25 0.625 1.5 1.813 2.375 1 0.939-0.813 2.064-1.563 2.439-1.813 1.688-1.126 1.063-1.938-1.75-1.438-2.814 0.5-2.814 1.625-3.064 2.251z"/>
+   <path fill="#c68c00" d="m153.521 86.176c-0.242 0.605 1.456 1.758 2.304 0.97 0.911-0.788 2.002-1.516 2.366-1.758 1.637-1.092 1.031-1.88-1.698-1.395-2.729 0.486-2.729 1.576-2.972 2.183z"/>
+   <path fill="#c18700" d="m153.58 86.166c-0.233 0.587 1.41 1.704 2.233 0.939 0.882-0.763 1.938-1.469 2.292-1.704 1.586-1.058 0.999-1.822-1.646-1.352-2.644 0.472-2.644 1.529-2.879 2.117z"/>
+   <path fill="#bc8100" d="m153.639 86.156c-0.228 0.568 1.364 1.649 2.16 0.91 0.854-0.739 1.878-1.422 2.219-1.649 1.536-1.024 0.967-1.764-1.593-1.308s-2.559 1.477-2.786 2.047z"/>
+   <path fill="#b77b00" d="m153.698 86.146c-0.22 0.549 1.32 1.594 2.089 0.879 0.825-0.715 1.815-1.375 2.146-1.595 1.484-0.99 0.935-1.705-1.54-1.265s-2.475 1.43-2.695 1.981z"/>
+   <path fill="#b27500" d="m153.756 86.135c-0.211 0.53 1.275 1.54 2.019 0.85 0.797-0.69 1.753-1.328 2.072-1.54 1.434-0.957 0.902-1.646-1.487-1.221s-2.391 1.38-2.604 1.911z"/>
+   <path fill="#ad7000" d="m153.815 86.125c-0.204 0.512 1.229 1.486 1.946 0.82 0.769-0.666 1.69-1.281 1.997-1.486 1.385-0.922 0.871-1.588-1.434-1.178s-2.304 1.331-2.509 1.844z"/>
+   <path fill="#a86a00" d="m153.874 86.114c-0.196 0.493 1.185 1.431 1.875 0.79 0.74-0.642 1.628-1.234 1.924-1.431 1.332-0.889 0.84-1.53-1.381-1.135s-2.221 1.283-2.418 1.776z"/>
+   <path fill="#a36400" d="m153.933 86.104c-0.189 0.474 1.139 1.376 1.803 0.759 0.712-0.617 1.566-1.187 1.851-1.376 1.281-0.855 0.808-1.472-1.329-1.092-2.135 0.38-2.135 1.234-2.325 1.709z"/>
+   <path fill="#9e5e00" d="m153.991 86.094c-0.181 0.455 1.095 1.322 1.732 0.729 0.684-0.592 1.504-1.14 1.776-1.321 1.231-0.821 0.775-1.414-1.274-1.048-2.051 0.364-2.051 1.184-2.234 1.64z"/>
+   <path fill="#995900" d="m154.05 86.083c-0.174 0.436 1.05 1.267 1.66 0.699 0.656-0.568 1.442-1.093 1.704-1.267 1.181-0.787 0.743-1.355-1.223-1.005s-1.966 1.136-2.141 1.573z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m156.951 107.887c-0.229 2.858 6.343-4.286 6.743-4.915 0.856-1.543 3.715-5.886 4.172-7.715 0.857-3.2 2.401-5.543 1.429-8.915-0.343-1.086-2.742-1.372-3.829-0.687-3.086 1.829-2.629 4.058-2.972 6.115-1.143 5.831-5.143 11.717-5.543 16.117z"/>
+   <path fill="#ffcc02" d="m157.22 107.441c-0.22 2.787 6.178-4.188 6.566-4.802 0.833-1.506 3.614-5.745 4.056-7.529 0.831-3.122 2.333-5.408 1.382-8.695-0.337-1.058-2.678-1.333-3.735-0.663-3.006 1.788-2.557 3.96-2.889 5.967-1.105 5.685-4.997 11.431-5.38 15.722z"/>
+   <path fill="#ffcc05" d="m157.488 106.995c-0.209 2.715 6.014-4.091 6.392-4.69 0.811-1.469 3.513-5.603 3.941-7.342 0.804-3.043 2.264-5.273 1.331-8.474-0.329-1.031-2.61-1.295-3.64-0.64-2.927 1.747-2.486 3.863-2.806 5.818-1.068 5.541-4.851 11.146-5.218 15.328z"/>
+   <path fill="#ffcc07" d="m157.757 106.548c-0.198 2.645 5.85-3.993 6.217-4.577 0.785-1.431 3.409-5.461 3.824-7.156 0.779-2.964 2.196-5.138 1.282-8.253-0.322-1.003-2.543-1.257-3.545-0.618-2.847 1.706-2.414 3.766-2.722 5.67-1.031 5.398-4.706 10.862-5.056 14.934z"/>
+   <path fill="#ffcd0a" d="m158.026 106.102c-0.189 2.573 5.684-3.896 6.04-4.465 0.762-1.394 3.309-5.32 3.709-6.969 0.753-2.886 2.129-5.004 1.233-8.033-0.315-0.976-2.478-1.219-3.45-0.595-2.768 1.665-2.343 3.668-2.64 5.522-0.993 5.254-4.558 10.577-4.892 14.54z"/>
+   <path fill="#ffcd0c" d="m158.294 105.655c-0.179 2.503 5.52-3.798 5.865-4.351 0.738-1.357 3.207-5.179 3.594-6.783 0.727-2.807 2.061-4.869 1.185-7.813-0.309-0.948-2.411-1.18-3.356-0.572-2.687 1.623-2.271 3.571-2.556 5.374-0.958 5.11-4.414 10.291-4.732 14.145z"/>
+   <path fill="#ffcd0f" d="m158.563 105.209c-0.169 2.431 5.354-3.701 5.688-4.239 0.715-1.319 3.106-5.037 3.479-6.596 0.7-2.728 1.992-4.734 1.135-7.592-0.301-0.92-2.344-1.142-3.261-0.549-2.608 1.583-2.199 3.474-2.473 5.226-0.919 4.965-4.267 10.005-4.568 13.75z"/>
+   <path fill="#ffcd11" d="m158.831 104.762c-0.159 2.361 5.19-3.602 5.515-4.126 0.69-1.282 3.004-4.896 3.361-6.409 0.674-2.649 1.924-4.599 1.087-7.372-0.295-0.893-2.277-1.104-3.167-0.526-2.527 1.541-2.128 3.376-2.389 5.077-0.883 4.822-4.122 9.721-4.407 13.356z"/>
+   <path fill="#ffce14" d="m159.1 104.316c-0.149 2.289 5.024-3.505 5.338-4.014 0.667-1.244 2.901-4.754 3.247-6.223 0.646-2.571 1.854-4.464 1.037-7.151-0.287-0.865-2.211-1.065-3.072-0.504-2.448 1.5-2.056 3.279-2.306 4.929-0.845 4.679-3.976 9.437-4.244 12.963z"/>
+   <path fill="#ffce16" d="m159.369 103.869c-0.139 2.219 4.86-3.407 5.162-3.9 0.643-1.208 2.801-4.613 3.131-6.037 0.622-2.492 1.787-4.329 0.988-6.93-0.28-0.838-2.146-1.027-2.978-0.481-2.368 1.459-1.983 3.182-2.223 4.781-0.807 4.533-3.829 9.151-4.08 12.567z"/>
+   <path fill="#ffce19" d="m159.637 103.423c-0.13 2.147 4.695-3.31 4.986-3.788 0.62-1.17 2.699-4.471 3.016-5.85 0.596-2.414 1.719-4.195 0.939-6.71-0.273-0.81-2.079-0.989-2.883-0.458-2.289 1.418-1.913 3.084-2.139 4.632-0.77 4.391-3.684 8.866-3.919 12.174z"/>
+   <path fill="#ffce1c" d="m159.906 102.977c-0.119 2.076 4.531-3.213 4.811-3.676 0.597-1.133 2.599-4.33 2.899-5.664 0.57-2.335 1.651-4.06 0.891-6.49-0.267-0.782-2.012-0.95-2.787-0.435-2.21 1.377-1.842 2.987-2.057 4.484-0.734 4.247-3.539 8.582-3.757 11.781z"/>
+   <path fill="#ffcf1e" d="m160.174 102.53c-0.108 2.005 4.366-3.115 4.637-3.563 0.571-1.096 2.496-4.189 2.784-5.478 0.543-2.256 1.581-3.925 0.841-6.269-0.26-0.754-1.945-0.912-2.693-0.412-2.129 1.336-1.77 2.889-1.973 4.336-0.697 4.103-3.394 8.297-3.596 11.386z"/>
+   <path fill="#ffcf21" d="m160.443 102.084c-0.099 1.934 4.201-3.018 4.46-3.45 0.548-1.059 2.394-4.047 2.668-5.291 0.517-2.178 1.514-3.79 0.793-6.049-0.253-0.727-1.879-0.874-2.599-0.39-2.051 1.295-1.698 2.792-1.891 4.188-0.658 3.959-3.246 8.012-3.431 10.992z"/>
+   <path fill="#ffcf23" d="m160.712 101.637c-0.089 1.863 4.036-2.919 4.283-3.337 0.526-1.021 2.294-3.905 2.553-5.104 0.491-2.099 1.447-3.655 0.744-5.828-0.246-0.699-1.813-0.835-2.505-0.367-1.969 1.253-1.625 2.694-1.805 4.04-0.623 3.814-3.101 7.726-3.27 10.596z"/>
+   <path fill="#ffcf26" d="m160.98 101.191c-0.079 1.792 3.872-2.822 4.107-3.225 0.502-0.984 2.192-3.764 2.438-4.918 0.464-2.02 1.378-3.52 0.694-5.607-0.238-0.672-1.746-0.797-2.41-0.344-1.89 1.212-1.555 2.597-1.723 3.891-0.583 3.671-2.953 7.442-3.106 10.203z"/>
+   <path fill="#ffd028" d="m161.249 100.744c-0.068 1.721 3.707-2.724 3.933-3.112 0.478-0.947 2.091-3.623 2.321-4.731 0.439-1.942 1.311-3.386 0.646-5.387-0.232-0.645-1.68-0.758-2.316-0.321-1.81 1.171-1.481 2.5-1.639 3.743-0.548 3.527-2.809 7.156-2.945 9.808z"/>
+   <path fill="#ffd02b" d="m161.517 100.298c-0.06 1.65 3.543-2.627 3.757-2.999 0.454-0.91 1.989-3.481 2.206-4.545 0.413-1.863 1.242-3.25 0.597-5.167-0.225-0.617-1.613-0.72-2.221-0.298-1.73 1.13-1.411 2.402-1.557 3.595-0.509 3.383-2.662 6.871-2.782 9.414z"/>
+   <path fill="#ffd02d" d="m161.786 99.852c-0.049 1.579 3.377-2.529 3.581-2.887 0.431-0.872 1.887-3.34 2.091-4.359 0.387-1.784 1.173-3.116 0.547-4.946-0.217-0.589-1.546-0.682-2.126-0.275-1.649 1.089-1.339 2.305-1.472 3.446-0.474 3.24-2.518 6.587-2.621 9.021z"/>
+   <path fill="#ffd030" d="m162.055 99.405c-0.039 1.508 3.212-2.432 3.404-2.773 0.407-0.835 1.786-3.199 1.976-4.172 0.359-1.706 1.104-2.981 0.499-4.726-0.211-0.562-1.481-0.644-2.032-0.253-1.571 1.048-1.268 2.208-1.389 3.298-0.436 3.096-2.372 6.302-2.458 8.626z"/>
+   <path fill="#ffd133" d="m162.323 98.958c-0.029 1.437 3.048-2.334 3.23-2.661 0.383-0.798 1.684-3.057 1.858-3.986 0.334-1.627 1.037-2.846 0.45-4.505-0.204-0.534-1.414-0.605-1.938-0.23-1.49 1.007-1.195 2.11-1.306 3.15-0.397 2.953-2.224 6.018-2.294 8.232z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m179.646 95.994c-3.168 3.456-5.4 6.767-7.2 9-1.872 2.304-6.48 5.04-4.176 7.704 1.943 2.376 9.936-1.944 16.128-6.552 6.12-4.608 15.696-8.711 11.016-13.967-2.448-2.664-8.208-2.088-10.439-0.648-1.729 1.078-2.737 1.655-5.329 4.463z"/>
+   <path fill="#ffcc02" d="m179.782 96.147c-3.118 3.378-5.313 6.628-7.086 8.809-1.841 2.249-6.375 4.945-4.13 7.534 1.893 2.31 9.724-1.943 15.795-6.469 6.001-4.525 15.38-8.574 10.82-13.682-2.387-2.588-8.022-1.998-10.209-0.584-1.692 1.062-2.665 1.67-5.19 4.392z"/>
+   <path fill="#ffcc05" d="m179.919 96.3c-3.068 3.3-5.227 6.488-6.973 8.619-1.81 2.193-6.271 4.85-4.085 7.364 1.843 2.243 9.513-1.943 15.463-6.386 5.882-4.442 15.064-8.437 10.623-13.396-2.323-2.513-7.835-1.907-9.978-0.52-1.655 1.044-2.593 1.684-5.05 4.319z"/>
+   <path fill="#ffcc07" d="m180.055 96.454c-3.02 3.222-5.14 6.347-6.859 8.428-1.78 2.138-6.166 4.754-4.04 7.194 1.793 2.177 9.302-1.942 15.131-6.303 5.762-4.359 14.748-8.299 10.427-13.11-2.261-2.437-7.648-1.817-9.747-0.456-1.619 1.025-2.522 1.698-4.912 4.247z"/>
+   <path fill="#ffcd0a" d="m180.191 96.607c-2.97 3.143-5.052 6.207-6.745 8.237-1.749 2.082-6.063 4.659-3.994 7.023 1.743 2.111 9.09-1.941 14.798-6.219 5.644-4.276 14.433-8.162 10.231-12.824-2.199-2.361-7.463-1.727-9.518-0.392-1.581 1.008-2.45 1.713-4.772 4.175z"/>
+   <path fill="#ffcd0c" d="m180.327 96.761c-2.92 3.065-4.965 6.066-6.631 8.047-1.718 2.027-5.957 4.564-3.949 6.853 1.693 2.044 8.878-1.94 14.466-6.136 5.524-4.194 14.116-8.024 10.034-12.538-2.137-2.286-7.275-1.636-9.285-0.328-1.546 0.988-2.38 1.726-4.635 4.102z"/>
+   <path fill="#ffcd0f" d="m180.464 96.914c-2.871 2.987-4.879 5.926-6.518 7.857-1.688 1.971-5.854 4.468-3.903 6.683 1.643 1.978 8.666-1.94 14.133-6.053 5.404-4.111 13.801-7.887 9.839-12.251-2.075-2.21-7.091-1.546-9.056-0.264-1.509 0.969-2.308 1.738-4.495 4.028z"/>
+   <path fill="#ffcd11" d="m180.6 97.067c-2.821 2.909-4.792 5.786-6.404 7.667-1.657 1.916-5.748 4.373-3.858 6.512 1.593 1.912 8.455-1.938 13.802-5.969 5.284-4.028 13.484-7.75 9.641-11.966-2.012-2.134-6.902-1.456-8.823-0.199-1.474 0.951-2.238 1.752-4.358 3.955z"/>
+   <path fill="#ffce14" d="m180.736 97.221c-2.771 2.83-4.705 5.645-6.29 7.476-1.626 1.86-5.644 4.278-3.813 6.342 1.542 1.845 8.244-1.938 13.47-5.886 5.166-3.945 13.169-7.612 9.444-11.68-1.949-2.059-6.716-1.365-8.592-0.135-1.437 0.933-2.166 1.766-4.219 3.883z"/>
+   <path fill="#ffce16" d="m180.872 97.375c-2.722 2.752-4.617 5.504-6.176 7.286-1.595 1.805-5.539 4.182-3.767 6.172 1.49 1.779 8.031-1.937 13.136-5.803 5.046-3.862 12.853-7.475 9.249-11.394-1.889-1.983-6.53-1.274-8.362-0.071-1.4 0.914-2.095 1.779-4.08 3.81z"/>
+   <path fill="#ffce19" d="m181.009 97.528c-2.673 2.674-4.53 5.364-6.063 7.095-1.564 1.749-5.435 4.087-3.722 6.001 1.44 1.713 7.82-1.936 12.804-5.719 4.927-3.78 12.537-7.338 9.052-11.108-1.825-1.907-6.343-1.185-8.13-0.007-1.364 0.896-2.024 1.793-3.941 3.738z"/>
+   <path fill="#ffce1c" d="m181.145 97.682c-2.623 2.595-4.444 5.225-5.949 6.904-1.534 1.693-5.33 3.992-3.676 5.831 1.39 1.646 7.608-1.935 12.471-5.636 4.808-3.697 12.221-7.2 8.856-10.822-1.764-1.832-6.157-1.094-7.9 0.057-1.327 0.878-1.952 1.807-3.802 3.666z"/>
+   <path fill="#ffcf1e" d="m181.281 97.835c-2.573 2.517-4.357 5.084-5.835 6.714-1.503 1.638-5.226 3.896-3.631 5.661 1.34 1.58 7.396-1.935 12.139-5.553 4.689-3.614 11.905-7.063 8.659-10.536-1.701-1.756-5.97-1.004-7.668 0.121-1.291 0.86-1.881 1.821-3.664 3.593z"/>
+   <path fill="#ffcf21" d="m181.417 97.988c-2.522 2.439-4.27 4.944-5.721 6.524-1.472 1.582-5.121 3.801-3.586 5.491 1.29 1.513 7.186-1.934 11.807-5.47 4.569-3.531 11.589-6.926 8.463-10.25-1.639-1.68-5.783-0.914-7.438 0.186-1.254 0.84-1.809 1.834-3.525 3.519z"/>
+   <path fill="#ffcf23" d="m181.554 98.142c-2.476 2.361-4.185 4.803-5.608 6.333-1.441 1.527-5.017 3.706-3.54 5.32 1.24 1.447 6.974-1.933 11.474-5.386 4.45-3.448 11.273-6.788 8.268-9.964-1.577-1.605-5.599-0.823-7.207 0.25-1.22 0.822-1.74 1.848-3.387 3.447z"/>
+   <path fill="#ffcf26" d="m181.69 98.295c-2.425 2.283-4.098 4.663-5.494 6.143-1.411 1.471-4.912 3.61-3.495 5.15 1.19 1.381 6.763-1.932 11.142-5.303 4.331-3.366 10.957-6.65 8.07-9.679-1.514-1.529-5.411-0.732-6.976 0.313-1.182 0.805-1.667 1.863-3.247 3.376z"/>
+   <path fill="#ffd028" d="m181.826 98.449c-2.375 2.204-4.009 4.522-5.38 5.952-1.38 1.416-4.808 3.515-3.449 4.98 1.14 1.314 6.551-1.932 10.81-5.22 4.211-3.283 10.641-6.513 7.874-9.393-1.452-1.454-5.226-0.642-6.745 0.378-1.147 0.786-1.597 1.876-3.11 3.303z"/>
+   <path fill="#ffd02b" d="m181.962 98.602c-2.324 2.127-3.922 4.382-5.266 5.762-1.349 1.36-4.703 3.42-3.404 4.809 1.089 1.248 6.34-1.93 10.478-5.136 4.092-3.2 10.325-6.376 7.677-9.106-1.389-1.378-5.038-0.552-6.513 0.441-1.111 0.768-1.526 1.89-2.972 3.23z"/>
+   <path fill="#ffd02d" d="m182.099 98.756c-2.276 2.048-3.836 4.241-5.153 5.571-1.318 1.305-4.599 3.324-3.359 4.639 1.039 1.182 6.128-1.93 10.146-5.053 3.973-3.117 10.009-6.238 7.48-8.82-1.328-1.303-4.852-0.462-6.282 0.506-1.074 0.748-1.454 1.903-2.832 3.157z"/>
+   <path fill="#ffd030" d="m182.235 98.909c-2.228 1.97-3.749 4.101-5.039 5.381-1.288 1.249-4.494 3.229-3.313 4.469 0.988 1.115 5.916-1.929 9.813-4.97 3.853-3.034 9.693-6.101 7.285-8.535-1.267-1.227-4.666-0.371-6.052 0.57-1.038 0.731-1.384 1.918-2.694 3.085z"/>
+   <path fill="#ffd133" d="m182.371 99.063c-2.177 1.892-3.662 3.96-4.925 5.19-1.257 1.193-4.39 3.133-3.268 4.298 0.938 1.049 5.704-1.928 9.479-4.886 3.734-2.952 9.377-5.963 7.088-8.249-1.203-1.151-4.479-0.281-5.821 0.634-0.999 0.713-1.31 1.931-2.553 3.013z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fff" d="m186.414 168.569c0.864-2.808 28.872-9.432 33.48-7.272 4.536 2.16 26.279 33.768 22.392 35.496-3.888 1.657-12.24-10.512-24.408-16.128s-32.328-9.216-31.464-12.096z"/>
+   <path fill="#f9f9f9" d="m187.239 168.626c0.848-2.761 28.145-9.076 32.69-6.997 4.476 2.079 25.768 32.897 21.943 34.591-3.824 1.625-11.965-10.346-23.94-15.874-11.976-5.527-31.541-8.89-30.693-11.72z"/>
+   <path fill="#f4f4f4" d="m188.063 168.683c0.832-2.714 27.418-8.72 31.899-6.722 4.417 1.998 25.259 32.026 21.497 33.685-3.76 1.595-11.689-10.18-23.474-15.619-11.782-5.438-30.754-8.565-29.922-11.344z"/>
+   <path fill="#efefef" d="m188.888 168.74c0.814-2.668 26.69-8.364 31.109-6.447 4.357 1.917 24.746 31.155 21.049 32.779-3.695 1.563-11.416-10.014-23.007-15.364-11.59-5.349-29.967-8.239-29.151-10.968z"/>
+   <path fill="#eaeaea" d="m189.712 168.797c0.801-2.621 25.964-8.009 30.32-6.173 4.299 1.837 24.235 30.285 20.603 31.874-3.633 1.532-11.142-9.847-22.54-15.109-11.4-5.261-29.182-7.914-28.383-10.592z"/>
+   <path fill="#e5e5e5" d="m190.537 168.853c0.783-2.573 25.236-7.652 29.53-5.897 4.239 1.756 23.723 29.414 20.155 30.968-3.569 1.501-10.867-9.681-22.074-14.854-11.206-5.172-28.395-7.589-27.611-10.217z"/>
+   <path fill="#e0e0e0" d="m191.361 168.91c0.768-2.527 24.51-7.296 28.74-5.622 4.18 1.675 23.212 28.543 19.708 30.063-3.505 1.469-10.593-9.516-21.607-14.6-11.014-5.083-27.608-7.263-26.841-9.841z"/>
+   <path fill="#dbdbdb" d="m192.186 168.967c0.751-2.48 23.781-6.941 27.95-5.347 4.119 1.593 22.7 27.671 19.26 29.157-3.441 1.438-10.318-9.349-21.141-14.345-10.821-4.994-26.821-6.938-26.069-9.465z"/>
+   <path fill="#d6d6d6" d="m193.01 169.024c0.735-2.433 23.057-6.585 27.16-5.073 4.062 1.513 22.19 26.801 18.813 28.252-3.377 1.407-10.043-9.183-20.673-14.09-10.629-4.906-26.035-6.612-25.3-9.089z"/>
+   <path fill="#d1d1d1" d="m193.835 169.081c0.72-2.387 22.328-6.229 26.37-4.798 4.001 1.432 21.678 25.93 18.365 27.346-3.313 1.376-9.768-9.017-20.206-13.835-10.437-4.817-25.248-6.287-24.529-8.713z"/>
+   <path fill="#ccc" d="m194.659 169.137c0.703-2.339 21.603-5.873 25.58-4.521 3.942 1.351 21.167 25.059 17.918 26.44-3.249 1.345-9.493-8.851-19.739-13.58-10.245-4.729-24.462-5.963-23.759-8.339z"/>
+   <path fill="#c6c6c6" d="m195.484 169.194c0.687-2.292 20.874-5.517 24.79-4.247 3.882 1.27 20.655 24.188 17.47 25.535-3.185 1.314-9.219-8.685-19.271-13.326-10.054-4.639-23.676-5.636-22.989-7.962z"/>
+   <path fill="#c1c1c1" d="m196.308 169.251c0.671-2.246 20.147-5.161 24-3.973 3.822 1.19 20.145 23.318 17.022 24.63-3.121 1.283-8.943-8.519-18.805-13.071-9.859-4.551-22.888-5.311-22.217-7.586z"/>
+   <path fill="#bcbcbc" d="m197.133 169.308c0.654-2.199 19.421-4.805 23.21-3.698 3.764 1.109 19.634 22.447 16.575 23.724-3.057 1.252-8.669-8.353-18.338-12.816-9.668-4.462-22.102-4.985-21.447-7.21z"/>
+   <path fill="#b7b7b7" d="m197.957 169.365c0.64-2.152 18.693-4.45 22.42-3.423 3.705 1.027 19.122 21.575 16.129 22.818-2.993 1.221-8.395-8.186-17.872-12.561-9.476-4.373-21.315-4.66-20.677-6.834z"/>
+   <path fill="#b2b2b2" d="m198.782 169.421c0.622-2.105 17.966-4.093 21.63-3.147 3.646 0.946 18.61 20.704 15.681 21.912-2.93 1.19-8.12-8.02-17.404-12.306-9.284-4.284-20.53-4.335-19.907-6.459z"/>
+   <path fill="#adadad" d="m199.606 169.478c0.606-2.058 17.239-3.737 20.84-2.873 3.586 0.866 18.099 19.834 15.234 21.008-2.866 1.158-7.847-7.855-16.938-12.052-9.091-4.196-19.742-4.009-19.136-6.083z"/>
+   <path fill="#a8a8a8" d="m200.431 169.535c0.59-2.011 16.512-3.382 20.05-2.598 3.525 0.785 17.588 18.963 14.786 20.102-2.803 1.127-7.571-7.688-16.472-11.797-8.898-4.107-18.955-3.684-18.364-5.707z"/>
+   <path fill="#a3a3a3" d="m201.255 169.592c0.574-1.965 15.785-3.026 19.261-2.323 3.467 0.704 17.076 18.092 14.339 19.196-2.738 1.096-7.296-7.522-16.004-11.542-8.707-4.018-18.17-3.358-17.596-5.331z"/>
+   <path fill="#9e9e9e" d="m202.08 169.649c0.559-1.918 15.059-2.67 18.47-2.048 3.407 0.623 16.565 17.221 13.892 18.29-2.674 1.065-7.022-7.356-15.537-11.287-8.515-3.929-17.383-3.033-16.825-4.955z"/>
+   <path fill="#999" d="m202.904 169.705c0.542-1.871 14.331-2.314 17.68-1.773 3.349 0.542 16.055 16.35 13.444 17.385-2.61 1.034-6.747-7.19-15.07-11.032-8.322-3.841-16.596-2.708-16.054-4.58z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fff" d="m151.134 211.625c2.881 0.144 0.145 16.271 0.145 32.903s2.231 22.464 0.144 24.552-5.688-5.399-5.688-22.031c-0.001-16.632 2.519-35.568 5.399-35.424z"/>
+   <path fill="#f9f9f9" d="m151.105 212.016c2.783 0.162 0.109 16.052 0.097 32.419-0.012 16.366 2.188 22.208 0.164 24.237-2.02 2.029-5.561-5.383-5.546-21.752 0.012-16.367 2.502-35.065 5.285-34.904z"/>
+   <path fill="#f4f4f4" d="m151.075 212.407c2.687 0.18 0.076 15.832 0.051 31.934-0.023 16.102 2.143 21.951 0.185 23.924-1.953 1.968-5.435-5.367-5.405-21.473 0.024-16.103 2.484-34.564 5.169-34.385z"/>
+   <path fill="#efefef" d="m151.046 212.797c2.588 0.197 0.041 15.613 0.004 31.449-0.036 15.836 2.098 21.694 0.204 23.609-1.886 1.907-5.308-5.352-5.263-21.195 0.037-15.835 2.467-34.058 5.055-33.863z"/>
+   <path fill="#eaeaea" d="m151.017 213.189c2.49 0.214 0.007 15.392-0.043 30.962-0.05 15.571 2.052 21.439 0.224 23.297-1.818 1.848-5.181-5.334-5.122-20.916 0.049-15.571 2.45-33.557 4.941-33.343z"/>
+   <path fill="#e5e5e5" d="m150.987 213.581c2.394 0.23-0.027 15.17-0.089 30.477s2.007 21.182 0.244 22.982c-1.751 1.787-5.055-5.32-4.98-20.638 0.061-15.305 2.431-33.053 4.825-32.821z"/>
+   <path fill="#e0e0e0" d="m150.958 213.971c2.297 0.248-0.062 14.951-0.136 29.99-0.074 15.041 1.962 20.927 0.264 22.668-1.683 1.728-4.928-5.301-4.839-20.356 0.074-15.04 2.414-32.551 4.711-32.302z"/>
+   <path fill="#dbdbdb" d="m150.928 214.362c2.199 0.266-0.096 14.73-0.182 29.506-0.087 14.775 1.915 20.67 0.282 22.354-1.615 1.667-4.8-5.286-4.696-20.078 0.087-14.776 2.397-32.048 4.596-31.782z"/>
+   <path fill="#d6d6d6" d="m150.899 214.752c2.102 0.283-0.13 14.511-0.229 29.021-0.099 14.511 1.87 20.413 0.303 22.04-1.549 1.607-4.674-5.27-4.556-19.799 0.1-14.51 2.38-31.545 4.482-31.262z"/>
+   <path fill="#d1d1d1" d="m150.87 215.144c2.005 0.301-0.165 14.29-0.274 28.535-0.112 14.245 1.824 20.155 0.321 21.725-1.479 1.548-4.547-5.252-4.413-19.519 0.11-14.245 2.361-31.043 4.366-30.741z"/>
+   <path fill="#ccc" d="m150.84 215.536c1.908 0.317-0.197 14.069-0.32 28.049-0.124 13.979 1.779 19.899 0.342 21.412-1.413 1.486-4.42-5.238-4.272-19.242 0.122-13.979 2.343-30.54 4.25-30.219z"/>
+   <path fill="#c6c6c6" d="m150.811 215.926c1.811 0.334-0.233 13.85-0.368 27.564-0.136 13.713 1.735 19.643 0.362 21.096-1.346 1.428-4.293-5.219-4.131-18.961 0.136-13.712 2.327-30.035 4.137-29.699z"/>
+   <path fill="#c1c1c1" d="m150.781 216.317c1.714 0.354-0.267 13.629-0.414 27.078s1.69 19.387 0.382 20.783c-1.277 1.367-4.166-5.203-3.989-18.682 0.148-13.449 2.308-29.533 4.021-29.179z"/>
+   <path fill="#bcbcbc" d="m150.752 216.708c1.616 0.371-0.301 13.41-0.461 26.594-0.161 13.184 1.646 19.13 0.402 20.469-1.211 1.307-4.04-5.188-3.847-18.402 0.16-13.185 2.29-29.033 3.906-28.661z"/>
+   <path fill="#b7b7b7" d="m150.723 217.099c1.519 0.387-0.336 13.188-0.509 26.106-0.173 12.92 1.601 18.875 0.423 20.156-1.144 1.246-3.913-5.171-3.706-18.123 0.172-12.919 2.273-28.529 3.792-28.139z"/>
+   <path fill="#b2b2b2" d="m150.693 217.491c1.422 0.404-0.37 12.969-0.554 25.621-0.186 12.653 1.555 18.617 0.441 19.842-1.076 1.187-3.786-5.156-3.563-17.846 0.184-12.652 2.255-28.024 3.676-27.617z"/>
+   <path fill="#adadad" d="m150.664 217.881c1.325 0.422-0.404 12.748-0.601 25.136-0.198 12.388 1.51 18.36 0.462 19.528-1.008 1.125-3.66-5.139-3.423-17.566 0.197-12.389 2.238-27.521 3.562-27.098z"/>
+   <path fill="#a8a8a8" d="m150.634 218.272c1.229 0.439-0.438 12.527-0.646 24.65-0.21 12.123 1.464 18.104 0.48 19.213-0.939 1.066-3.531-5.121-3.279-17.285 0.208-12.123 2.219-27.019 3.445-26.578z"/>
+   <path fill="#a3a3a3" d="m150.605 218.663c1.13 0.457-0.474 12.309-0.694 24.166-0.222 11.857 1.419 17.848 0.501 18.899-0.873 1.006-3.405-5.106-3.139-17.009 0.222-11.855 2.202-26.515 3.332-26.056z"/>
+   <path fill="#9e9e9e" d="m150.576 219.054c1.033 0.474-0.507 12.088-0.741 23.68-0.234 11.593 1.374 17.591 0.521 18.585-0.806 0.946-3.279-5.089-2.997-16.729 0.233-11.591 2.184-26.011 3.217-25.536z"/>
+   <path fill="#999" d="m150.546 219.444c0.937 0.492-0.541 11.868-0.787 23.195-0.246 11.326 1.329 17.335 0.541 18.271-0.737 0.885-3.151-5.074-2.855-16.449 0.245-11.328 2.166-25.509 3.101-25.017z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fff" d="m157.434 167.161c1.735 0.192 12.437-2.218 12.822-1.254 0.386 0.772-6.651 2.893-8.966 5.303-0.771 0.771-2.796 2.603-4.049 2.41-0.964-0.096-1.543-2.121-2.989-3.664-3.471-3.47-5.688-3.181-5.013-4.531 0.579-1.06 5.207 1.446 8.195 1.736z"/>
+   <path fill="#fbfbfb" d="m157.479 167.201c1.7 0.188 12.176-2.171 12.554-1.227 0.377 0.755-6.512 2.832-8.778 5.191-0.755 0.755-2.736 2.549-3.964 2.36-0.942-0.094-1.51-2.077-2.926-3.587-3.398-3.397-5.568-3.115-4.907-4.436 0.565-1.038 5.096 1.415 8.021 1.699z"/>
+   <path fill="#f8f8f8" d="m157.525 167.241c1.663 0.184 11.914-2.124 12.283-1.201 0.369 0.739-6.372 2.771-8.589 5.08-0.738 0.739-2.679 2.494-3.879 2.309-0.924-0.092-1.479-2.032-2.863-3.51-3.325-3.324-5.449-3.048-4.803-4.341 0.555-1.015 4.988 1.385 7.851 1.663z"/>
+   <path fill="#f5f5f5" d="m157.57 167.281c1.626 0.18 11.652-2.078 12.014-1.175 0.361 0.723-6.231 2.711-8.4 4.969-0.723 0.722-2.619 2.439-3.793 2.258-0.903-0.09-1.446-1.987-2.802-3.433-3.252-3.251-5.329-2.981-4.695-4.245 0.54-0.993 4.876 1.354 7.676 1.626z"/>
+   <path fill="#f2f2f2" d="m157.615 167.321c1.59 0.176 11.391-2.031 11.745-1.148 0.352 0.706-6.093 2.649-8.212 4.856-0.707 0.707-2.562 2.385-3.709 2.208-0.883-0.088-1.413-1.943-2.738-3.356-3.179-3.178-5.209-2.914-4.591-4.15 0.529-0.971 4.768 1.324 7.505 1.59z"/>
+   <path fill="#efefef" d="m157.66 167.361c1.554 0.172 11.13-1.985 11.475-1.122 0.346 0.69-5.952 2.589-8.022 4.745-0.69 0.69-2.503 2.33-3.624 2.157-0.863-0.086-1.381-1.898-2.675-3.279-3.106-3.105-5.09-2.847-4.486-4.055 0.517-0.948 4.658 1.294 7.332 1.554z"/>
+   <path fill="#ebebeb" d="m157.705 167.401c1.518 0.168 10.868-1.938 11.206-1.096 0.336 0.674-5.813 2.528-7.835 4.634-0.674 0.674-2.444 2.275-3.539 2.106-0.842-0.084-1.348-1.853-2.612-3.202-3.032-3.032-4.97-2.78-4.38-3.959 0.505-0.926 4.549 1.263 7.16 1.517z"/>
+   <path fill="#e8e8e8" d="m157.751 167.441c1.48 0.164 10.606-1.892 10.936-1.069 0.329 0.657-5.673 2.467-7.646 4.522-0.658 0.657-2.385 2.22-3.453 2.055-0.822-0.082-1.315-1.809-2.549-3.124-2.96-2.96-4.851-2.714-4.275-3.865 0.491-0.904 4.438 1.233 6.987 1.481z"/>
+   <path fill="#e5e5e5" d="m157.796 167.481c1.444 0.16 10.346-1.845 10.666-1.043 0.32 0.641-5.532 2.406-7.458 4.41-0.641 0.642-2.325 2.166-3.367 2.005-0.803-0.08-1.284-1.764-2.486-3.047-2.887-2.887-4.732-2.647-4.17-3.769 0.48-0.882 4.329 1.202 6.815 1.444z"/>
+   <path fill="#e2e2e2" d="m157.841 167.521c1.407 0.156 10.083-1.799 10.397-1.017 0.312 0.625-5.394 2.346-7.271 4.299-0.625 0.625-2.267 2.111-3.282 1.954-0.782-0.078-1.251-1.719-2.423-2.97-2.814-2.814-4.612-2.58-4.065-3.674 0.469-0.859 4.221 1.172 6.644 1.408z"/>
+   <path fill="#dfdfdf" d="m157.886 167.56c1.37 0.152 9.821-1.751 10.127-0.99 0.304 0.609-5.254 2.285-7.081 4.188-0.609 0.609-2.208 2.056-3.198 1.903-0.761-0.076-1.218-1.675-2.36-2.893-2.741-2.741-4.492-2.513-3.959-3.579 0.456-0.837 4.111 1.142 6.471 1.371z"/>
+   <path fill="#dbdbdb" d="m157.931 167.6c1.335 0.148 9.561-1.704 9.857-0.963 0.296 0.592-5.114 2.223-6.893 4.076-0.593 0.593-2.149 2.001-3.113 1.853-0.741-0.074-1.186-1.631-2.297-2.817-2.668-2.667-4.373-2.446-3.854-3.483 0.445-0.815 4.003 1.111 6.3 1.334z"/>
+   <path fill="#d8d8d8" d="m157.977 167.64c1.298 0.144 9.299-1.658 9.587-0.937 0.288 0.576-4.974 2.163-6.704 3.964-0.576 0.577-2.091 1.947-3.027 1.803-0.721-0.072-1.153-1.586-2.234-2.74-2.596-2.594-4.253-2.379-3.748-3.388 0.431-0.792 3.891 1.081 6.126 1.298z"/>
+   <path fill="#d5d5d5" d="m158.022 167.68c1.261 0.14 9.037-1.611 9.317-0.911 0.28 0.56-4.834 2.102-6.516 3.853-0.56 0.561-2.032 1.892-2.942 1.752-0.7-0.07-1.12-1.541-2.172-2.663-2.521-2.521-4.133-2.312-3.643-3.292 0.421-0.77 3.784 1.05 5.956 1.261z"/>
+   <path fill="#d2d2d2" d="m158.067 167.72c1.225 0.136 8.775-1.564 9.049-0.884 0.271 0.543-4.695 2.041-6.327 3.741-0.545 0.544-1.974 1.837-2.857 1.701-0.682-0.068-1.09-1.497-2.109-2.585-2.449-2.449-4.014-2.246-3.538-3.198 0.407-0.748 3.673 1.02 5.782 1.225z"/>
+   <path fill="#cfcfcf" d="m158.112 167.76c1.188 0.132 8.515-1.518 8.779-0.858 0.264 0.527-4.555 1.98-6.139 3.63-0.527 0.528-1.915 1.782-2.772 1.65-0.66-0.066-1.057-1.452-2.046-2.508-2.376-2.376-3.895-2.179-3.433-3.103 0.397-0.725 3.565 0.99 5.611 1.189z"/>
+   <path fill="#ccc" d="m158.157 167.8c1.152 0.128 8.253-1.472 8.51-0.832 0.255 0.511-4.415 1.92-5.95 3.518-0.512 0.512-1.855 1.728-2.688 1.6-0.64-0.064-1.023-1.407-1.983-2.431-2.303-2.303-3.773-2.112-3.326-3.007 0.383-0.703 3.454 0.959 5.437 1.152z"/>
+   <path fill="#c8c8c8" d="m158.203 167.84c1.115 0.124 7.991-1.425 8.239-0.805 0.248 0.494-4.274 1.858-5.761 3.406-0.496 0.496-1.798 1.673-2.603 1.549-0.62-0.063-0.992-1.363-1.921-2.354-2.229-2.229-3.655-2.045-3.221-2.912 0.372-0.681 3.346 0.929 5.267 1.116z"/>
+   <path fill="#c5c5c5" d="m158.248 167.88c1.079 0.12 7.73-1.379 7.97-0.779 0.239 0.478-4.135 1.798-5.572 3.295-0.479 0.479-1.739 1.618-2.518 1.498-0.6-0.06-0.959-1.318-1.857-2.277-2.157-2.157-3.535-1.978-3.116-2.816 0.359-0.659 3.235 0.898 5.093 1.079z"/>
+   <path fill="#c2c2c2" d="m158.293 167.92c1.042 0.116 7.469-1.332 7.701-0.753 0.231 0.462-3.995 1.737-5.385 3.184-0.463 0.463-1.68 1.563-2.432 1.447-0.579-0.058-0.927-1.273-1.796-2.2-2.084-2.084-3.415-1.911-3.01-2.721 0.348-0.636 3.127 0.868 4.922 1.043z"/>
+   <path fill="#bfbfbf" d="m158.338 167.959c1.007 0.112 7.207-1.285 7.432-0.726 0.223 0.446-3.855 1.676-5.196 3.072-0.447 0.447-1.621 1.509-2.347 1.397-0.56-0.056-0.895-1.229-1.732-2.123-2.011-2.011-3.296-1.844-2.905-2.626 0.334-0.614 3.016 0.838 4.748 1.006z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m194.253 11.922c-1.222 2.631-3.812 23.214-0.248 20.892 3.594-2.341 13.57-5.312 19.886-7.013 7.003-1.886-17.188-19.463-19.638-13.879z"/>
+   <path fill="#060606" d="m194.485 12.307c-1.21 2.594-3.704 22.255-0.234 20.007 3.491-2.262 13.077-5.1 19.039-6.782 6.59-1.905-16.436-18.609-18.805-13.225z"/>
+   <path fill="#0c0c0c" d="m194.717 12.691c-1.198 2.557-3.595 21.296-0.221 19.124 3.391-2.184 12.586-4.888 18.194-6.551 6.177-1.924-15.684-17.757-17.973-12.573z"/>
+   <path fill="#131313" d="m194.949 13.076c-1.187 2.52-3.487 20.337-0.207 18.239 3.288-2.105 12.093-4.676 17.348-6.321 5.763-1.941-14.933-16.903-17.141-11.918z"/>
+   <path fill="#191919" d="m195.181 13.46c-1.177 2.483-3.379 19.378-0.193 17.355 3.187-2.027 11.6-4.464 16.502-6.09 5.349-1.959-14.182-16.05-16.309-11.265z"/>
+   <path fill="#1f1f1f" d="m195.413 13.845c-1.164 2.446-3.27 18.419-0.18 16.471 3.086-1.949 11.107-4.252 15.657-5.859 4.935-1.978-13.43-15.198-15.477-10.612z"/>
+   <path fill="#262626" d="m195.645 14.229c-1.153 2.409-3.162 17.46-0.166 15.586 2.983-1.87 10.616-4.04 14.811-5.628 4.521-1.995-12.679-14.344-14.645-9.958z"/>
+   <path fill="#2c2c2c" d="m195.878 14.614c-1.142 2.372-3.055 16.501-0.152 14.702 2.882-1.792 10.123-3.828 13.965-5.398 4.107-2.013-11.929-13.49-13.813-9.304z"/>
+   <path fill="#333" d="m196.11 14.999c-1.131 2.335-2.946 15.542-0.14 13.817 2.78-1.713 9.631-3.616 13.119-5.167 3.695-2.031-11.175-12.637-12.979-8.65z"/>
+   <path fill="#393939" d="m196.342 15.383c-1.118 2.299-2.838 14.583-0.126 12.934 2.68-1.636 9.139-3.404 12.274-4.937 3.28-2.049-10.425-11.784-12.148-7.997z"/>
+   <path fill="#3f3f3f" d="m196.574 15.768c-1.108 2.261-2.729 13.624-0.112 12.049 2.577-1.557 8.646-3.192 11.429-4.706 2.865-2.068-9.675-10.931-11.317-7.343z"/>
+   <path fill="#464646" d="m196.806 16.152c-1.097 2.225-2.622 12.665-0.1 11.165 2.477-1.479 8.154-2.98 10.583-4.475 2.453-2.086-8.922-10.078-10.483-6.69z"/>
+   <path fill="#4c4c4c" d="m197.038 16.537c-1.085 2.188-2.513 11.706-0.085 10.28 2.374-1.4 7.661-2.768 9.737-4.244 2.039-2.104-8.171-9.225-9.652-6.036z"/>
+   <path fill="#525252" d="m197.27 16.921c-1.073 2.151-2.405 10.747-0.071 9.396 2.272-1.322 7.168-2.556 8.891-4.013 1.625-2.122-7.42-8.371-8.82-5.383z"/>
+   <path fill="#595959" d="m197.502 17.306c-1.062 2.113-2.297 9.788-0.058 8.512 2.172-1.244 6.677-2.344 8.046-3.783 1.211-2.14-6.669-7.518-7.988-4.729z"/>
+   <path fill="#5f5f5f" d="m197.734 17.69c-1.05 2.077-2.188 8.829-0.044 7.627 2.069-1.165 6.184-2.132 7.2-3.552 0.797-2.157-5.917-6.664-7.156-4.075z"/>
+   <path fill="#666" d="m197.966 18.075c-1.038 2.04-2.079 7.87-0.029 6.743 1.968-1.087 5.69-1.92 6.354-3.321 0.382-2.176-5.167-5.812-6.325-3.422z"/>
+   <path fill="#6c6c6c" d="m198.198 18.459c-1.027 2.003-1.972 6.911-0.017 5.859 1.866-1.008 5.198-1.708 5.509-3.09-0.03-2.194-4.415-4.959-5.492-2.769z"/>
+   <path fill="#727272" d="m198.43 18.844c-1.017 1.966-1.863 5.952-0.003 4.975 1.765-0.93 4.706-1.496 4.662-2.86-0.443-2.212-3.662-4.106-4.659-2.115z"/>
+   <path fill="#797979" d="m198.662 19.228c-1.004 1.929-1.755 4.993 0.011 4.09 1.663-0.852 4.215-1.284 3.817-2.629-0.858-2.23-2.912-3.251-3.828-1.461z"/>
+   <path fill="#7f7f7f" d="m198.894 19.612c-0.993 1.892-1.647 4.034 0.023 3.206 1.563-0.773 3.723-1.072 2.973-2.398-1.272-2.248-2.161-2.399-2.996-0.808z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m143.502 46.386c-0.72 2.16 8.712 5.112 10.801 6.984 2.808 2.52 3.023 7.488 6.336 5.472 2.159-1.296 0.504-4.176-3.456-8.568-5.833-6.481-13.033-5.689-13.681-3.888z"/>
+   <path fill="#050505" d="m143.991 46.582c-0.716 2.073 8.275 4.9 10.336 6.741 2.745 2.457 2.961 7.249 6.146 5.313 2.094-1.254 0.449-4.072-3.343-8.28-5.574-6.203-12.491-5.505-13.139-3.774z"/>
+   <path fill="#0a0a0a" d="m144.479 46.779c-0.71 1.987 7.839 4.688 9.873 6.498 2.682 2.394 2.897 7.009 5.956 5.154 2.028-1.212 0.395-3.968-3.228-7.993-5.319-5.926-11.953-5.321-12.601-3.659z"/>
+   <path fill="#0f0f0f" d="m144.967 46.976c-0.704 1.9 7.403 4.476 9.41 6.254 2.62 2.33 2.835 6.77 5.766 4.995 1.964-1.171 0.342-3.864-3.112-7.706-5.064-5.647-11.415-5.137-12.064-3.543z"/>
+   <path fill="#141414" d="m145.456 47.172c-0.701 1.813 6.966 4.263 8.946 6.011 2.557 2.266 2.772 6.53 5.575 4.835 1.897-1.129 0.287-3.76-2.998-7.418-4.807-5.369-10.874-4.952-11.523-3.428z"/>
+   <path fill="#191919" d="m145.944 47.369c-0.696 1.726 6.53 4.051 8.483 5.768 2.493 2.203 2.71 6.291 5.385 4.676 1.833-1.087 0.231-3.656-2.884-7.13-4.551-5.093-10.335-4.769-10.984-3.314z"/>
+   <path fill="#1e1e1e" d="m146.433 47.565c-0.692 1.64 6.093 3.839 8.019 5.525 2.431 2.14 2.647 6.052 5.194 4.517 1.768-1.046 0.179-3.552-2.77-6.843-4.293-4.814-9.794-4.585-10.443-3.199z"/>
+   <path fill="#232323" d="m146.921 47.762c-0.686 1.553 5.657 3.627 7.558 5.282 2.367 2.076 2.583 5.813 5.003 4.357 1.702-1.003 0.124-3.448-2.654-6.555-4.04-4.537-9.257-4.401-9.907-3.084z"/>
+   <path fill="#282828" d="m147.409 47.959c-0.681 1.466 5.221 3.415 7.094 5.039 2.305 2.013 2.521 5.573 4.813 4.198 1.637-0.962 0.07-3.344-2.54-6.268-3.782-4.26-8.717-4.218-9.367-2.969z"/>
+   <path fill="#2d2d2d" d="m147.898 48.156c-0.677 1.379 4.784 3.203 6.63 4.795 2.242 1.949 2.457 5.333 4.622 4.039 1.572-0.92 0.016-3.24-2.425-5.98-3.526-3.983-8.177-4.034-8.827-2.854z"/>
+   <path fill="#333" d="m148.386 48.353c-0.673 1.292 4.348 2.99 6.167 4.552 2.179 1.886 2.394 5.095 4.432 3.88 1.506-0.878-0.038-3.136-2.312-5.693-3.268-3.705-7.636-3.85-8.287-2.739z"/>
+   <path fill="#383838" d="m148.875 48.549c-0.668 1.206 3.911 2.778 5.703 4.309 2.116 1.823 2.331 4.855 4.242 3.721 1.439-0.836-0.093-3.032-2.197-5.405-3.013-3.428-7.098-3.667-7.748-2.625z"/>
+   <path fill="#3d3d3d" d="m149.363 48.746c-0.662 1.119 3.475 2.566 5.24 4.065 2.053 1.759 2.268 4.616 4.052 3.562 1.375-0.795-0.147-2.928-2.082-5.118-2.757-3.15-6.559-3.483-7.21-2.509z"/>
+   <path fill="#424242" d="m149.851 48.942c-0.657 1.032 3.039 2.354 4.776 3.823 1.99 1.696 2.205 4.376 3.861 3.402 1.31-0.753-0.201-2.824-1.967-4.831-2.5-2.871-6.018-3.298-6.67-2.394z"/>
+   <path fill="#474747" d="m150.34 49.139c-0.652 0.946 2.603 2.142 4.313 3.58 1.927 1.632 2.143 4.137 3.671 3.243 1.244-0.712-0.256-2.72-1.853-4.543-2.245-2.595-5.48-3.115-6.131-2.28z"/>
+   <path fill="#4c4c4c" d="m150.828 49.336c-0.647 0.859 2.166 1.93 3.851 3.336 1.863 1.569 2.079 3.898 3.48 3.084 1.179-0.67-0.31-2.616-1.739-4.255-1.988-2.317-4.94-2.932-5.592-2.165z"/>
+   <path fill="#515151" d="m151.317 49.533c-0.645 0.772 1.729 1.718 3.386 3.093 1.802 1.505 2.018 3.658 3.29 2.925 1.114-0.628-0.364-2.512-1.624-3.968-1.732-2.04-4.4-2.748-5.052-2.05z"/>
+   <path fill="#565656" d="m151.805 49.729c-0.639 0.685 1.293 1.505 2.923 2.85 1.738 1.442 1.954 3.419 3.1 2.766 1.048-0.586-0.418-2.408-1.509-3.681-1.476-1.762-3.862-2.563-4.514-1.935z"/>
+   <path fill="#5b5b5b" d="m152.293 49.926c-0.633 0.598 0.857 1.293 2.46 2.606 1.677 1.379 1.892 3.18 2.91 2.606 0.983-0.544-0.473-2.304-1.395-3.393-1.22-1.483-3.322-2.379-3.975-1.819z"/>
+   <path fill="#606060" d="m152.782 50.123c-0.629 0.512 0.42 1.081 1.996 2.363 1.613 1.315 1.828 2.94 2.719 2.447 0.918-0.502-0.525-2.2-1.28-3.105-0.963-1.207-2.782-2.196-3.435-1.705z"/>
+   <path fill="#666" d="m153.27 50.319c-0.624 0.425-0.017 0.869 1.533 2.12 1.55 1.252 1.765 2.701 2.528 2.288 0.853-0.461-0.581-2.096-1.166-2.818-0.706-0.929-2.242-2.012-2.895-1.59z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m193.47 45.594c-0.072 1.08 2.951 1.728 4.896 2.448 1.944 0.648 5.76 3.24 7.56 5.256 1.801 1.944 5.688 7.704 6.553 6.192 0.863-1.368-2.017-5.328-2.809-6.984s-3.239-5.256-7.128-6.48c-3.384-1.008-9-1.297-9.072-0.432z"/>
+   <path fill="#060606" d="m193.779 45.67c-0.071 1.05 2.869 1.685 4.758 2.387 1.891 0.633 5.598 3.161 7.345 5.122 1.747 1.893 5.535 7.493 6.376 6.027 0.84-1.328-1.936-5.173-2.738-6.795-0.8-1.622-3.175-5.09-6.952-6.301-3.282-0.995-8.718-1.28-8.789-0.44z"/>
+   <path fill="#0c0c0c" d="m194.088 45.747c-0.07 1.021 2.785 1.641 4.62 2.327 1.836 0.618 5.436 3.081 7.131 4.988 1.692 1.842 5.382 7.282 6.198 5.862 0.814-1.288-1.855-5.019-2.67-6.607-0.808-1.587-3.11-4.925-6.776-6.122-3.178-0.983-8.433-1.264-8.503-0.448z"/>
+   <path fill="#131313" d="m194.397 45.824c-0.071 0.991 2.702 1.598 4.481 2.267 1.782 0.603 5.272 3.001 6.916 4.854 1.64 1.791 5.229 7.071 6.022 5.697 0.788-1.248-1.776-4.865-2.603-6.418-0.815-1.554-3.044-4.759-6.599-5.942-3.073-0.973-8.148-1.251-8.217-0.458z"/>
+   <path fill="#191919" d="m194.706 45.9c-0.069 0.961 2.618 1.555 4.345 2.206 1.728 0.588 5.109 2.922 6.7 4.721 1.586 1.74 5.075 6.86 5.846 5.531 0.764-1.207-1.696-4.711-2.532-6.23-0.824-1.519-2.979-4.593-6.424-5.763-2.972-0.959-7.866-1.234-7.935-0.465z"/>
+   <path fill="#1f1f1f" d="m195.015 45.977c-0.07 0.931 2.534 1.511 4.207 2.146 1.672 0.573 4.945 2.843 6.485 4.586 1.531 1.689 4.921 6.649 5.668 5.367 0.738-1.167-1.616-4.557-2.464-6.042-0.832-1.485-2.914-4.428-6.247-5.583-2.868-0.948-7.581-1.219-7.649-0.474z"/>
+   <path fill="#262626" d="m195.324 46.054c-0.069 0.901 2.451 1.468 4.069 2.085 1.618 0.557 4.784 2.763 6.271 4.453 1.479 1.638 4.769 6.438 5.491 5.201 0.714-1.127-1.536-4.402-2.396-5.854-0.839-1.451-2.848-4.263-6.07-5.404-2.765-0.934-7.298-1.202-7.365-0.481z"/>
+   <path fill="#2c2c2c" d="m195.632 46.13c-0.067 0.872 2.369 1.424 3.933 2.025 1.563 0.542 4.621 2.684 6.056 4.318 1.424 1.587 4.615 6.228 5.315 5.036 0.688-1.086-1.456-4.248-2.326-5.665-0.848-1.416-2.783-4.097-5.896-5.224-2.662-0.923-7.015-1.187-7.082-0.49z"/>
+   <path fill="#333" d="m195.941 46.207c-0.068 0.842 2.285 1.381 3.794 1.964 1.51 0.527 4.458 2.605 5.842 4.185 1.37 1.536 4.461 6.016 5.138 4.871 0.662-1.046-1.377-4.093-2.258-5.476-0.855-1.382-2.718-3.932-5.718-5.045-2.56-0.911-6.732-1.172-6.798-0.499z"/>
+   <path fill="#393939" d="m196.25 46.284c-0.066 0.813 2.202 1.338 3.656 1.904 1.456 0.512 4.296 2.525 5.627 4.051 1.317 1.485 4.308 5.805 4.961 4.706 0.638-1.006-1.296-3.939-2.188-5.288-0.863-1.348-2.652-3.766-5.542-4.866-2.457-0.899-6.449-1.157-6.514-0.507z"/>
+   <path fill="#3f3f3f" d="m196.559 46.36c-0.067 0.783 2.118 1.295 3.518 1.844 1.402 0.497 4.133 2.446 5.412 3.917 1.263 1.434 4.155 5.594 4.785 4.541 0.612-0.966-1.217-3.785-2.12-5.1-0.872-1.313-2.587-3.6-5.366-4.687-2.353-0.886-6.165-1.141-6.229-0.515z"/>
+   <path fill="#464646" d="m196.868 46.437c-0.065 0.753 2.035 1.251 3.38 1.783 1.349 0.482 3.972 2.367 5.197 3.783 1.21 1.383 4.002 5.383 4.608 4.375 0.588-0.926-1.137-3.63-2.052-4.911-0.879-1.279-2.521-3.435-5.189-4.507-2.25-0.874-5.881-1.125-5.944-0.523z"/>
+   <path fill="#4c4c4c" d="m197.177 46.514c-0.066 0.723 1.95 1.208 3.241 1.723 1.293 0.467 3.809 2.287 4.983 3.649 1.155 1.332 3.848 5.172 4.431 4.21 0.563-0.885-1.057-3.476-1.982-4.723-0.888-1.245-2.456-3.269-5.014-4.328-2.146-0.862-5.597-1.109-5.659-0.531z"/>
+   <path fill="#525252" d="m197.486 46.591c-0.066 0.693 1.868 1.164 3.104 1.662 1.239 0.452 3.646 2.208 4.769 3.515 1.102 1.281 3.695 4.961 4.254 4.045 0.537-0.845-0.976-3.321-1.913-4.534-0.896-1.21-2.391-3.103-4.838-4.148-2.044-0.851-5.315-1.095-5.376-0.54z"/>
+   <path fill="#595959" d="m197.795 46.667c-0.064 0.664 1.784 1.121 2.968 1.602 1.184 0.437 3.481 2.128 4.552 3.381 1.049 1.23 3.542 4.75 4.078 3.88 0.512-0.805-0.897-3.167-1.846-4.346-0.902-1.176-2.325-2.938-4.66-3.969-1.942-0.838-5.031-1.078-5.092-0.548z"/>
+   <path fill="#5f5f5f" d="m198.104 46.744c-0.065 0.634 1.701 1.078 2.829 1.541 1.13 0.421 3.318 2.049 4.338 3.248 0.994 1.179 3.388 4.539 3.899 3.715 0.487-0.765-0.815-3.013-1.775-4.157-0.911-1.142-2.261-2.772-4.485-3.79-1.837-0.826-4.746-1.064-4.806-0.557z"/>
+   <path fill="#666" d="m198.413 46.821c-0.063 0.604 1.617 1.034 2.691 1.481 1.076 0.406 3.157 1.969 4.123 3.113 0.94 1.128 3.234 4.328 3.724 3.55 0.462-0.725-0.737-2.858-1.707-3.969-0.919-1.108-2.195-2.606-4.309-3.61-1.734-0.814-4.463-1.049-4.522-0.565z"/>
+   <path fill="#6c6c6c" d="m198.721 46.897c-0.063 0.574 1.534 0.991 2.554 1.42 1.021 0.391 2.994 1.89 3.908 2.979 0.887 1.077 3.082 4.117 3.548 3.384 0.436-0.685-0.657-2.704-1.64-3.78-0.927-1.074-2.13-2.44-4.132-3.431-1.631-0.8-4.179-1.031-4.238-0.572z"/>
+   <path fill="#727272" d="m199.03 46.974c-0.063 0.544 1.451 0.948 2.416 1.36 0.967 0.376 2.831 1.811 3.694 2.846 0.833 1.026 2.928 3.906 3.369 3.219 0.411-0.644-0.576-2.549-1.569-3.592-0.936-1.04-2.064-2.275-3.956-3.251-1.528-0.79-3.896-1.017-3.954-0.582z"/>
+   <path fill="#797979" d="m199.339 47.051c-0.062 0.515 1.368 0.904 2.278 1.299 0.913 0.361 2.669 1.731 3.479 2.712 0.779 0.975 2.774 3.695 3.193 3.054 0.386-0.604-0.497-2.396-1.501-3.403-0.942-1.005-1.999-2.11-3.78-3.072-1.424-0.778-3.612-1.002-3.669-0.59z"/>
+   <path fill="#7f7f7f" d="m199.648 47.127c-0.063 0.485 1.284 0.861 2.14 1.239 0.859 0.346 2.506 1.652 3.265 2.578 0.726 0.924 2.621 3.484 3.017 2.889 0.361-0.564-0.417-2.241-1.432-3.215-0.951-0.971-1.935-1.944-3.604-2.893-1.323-0.765-3.33-0.986-3.386-0.598z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#995900" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.017 11.592-31.104 19.152-13.968 9.576-18.792 13.824-23.328 18.359-7.056 7.057-13.752 9.432-24.48 9.432s-15.552-2.231-18.863-5.184c-3.313-2.88-6.984-10.225-6.624-21.168 0.288-10.872 3.744-20.809 5.399-37.729 0.721-7.271 0.648-16.271 0.648-24.264 0-10.08 0.144-18.648 2.304-19.943 3.889-2.448 4.752-2.592 9.36-2.592 4.607 0 6.696 0.287 8.208 1.799 1.439 1.44 0.864 4.752 0.359 9.433-0.432 4.681 1.801 6.192 4.032 8.136 2.232 1.872 4.248 4.248 11.305 4.824 7.056 0.504 9.647-0.648 12.96-2.736 3.312-2.088 7.991-5.832 9.72-7.992 1.656-2.088 5.76-9.287 6.552-9.287 0.719 0 5.472-1.656 8.136 2.232z"/>
+   <path fill="#9e5e00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.12 11.556-31.26 19.008-13.885 9.371-18.903 13.54-23.521 17.902-6.912 6.74-13.414 9.084-23.915 9.019-10.411-0.047-15.116-2.181-18.414-5.118-3.297-2.867-6.931-9.966-6.613-20.578 0.205-10.851 3.701-20.683 5.256-37.279 0.666-7.379 0.407-16.303 0.335-24.375-0.076-10.068-0.072-18.627 2.084-19.922 3.889-2.444 4.752-2.592 9.36-2.592 4.607 0 6.7 0.291 8.208 1.799 1.491 1.492 0.767 4.887 0.205 9.408-0.63 4.658 1.458 6.486 3.795 8.607 2.34 2.059 4.489 4.471 11.534 5.021 7.232 0.482 10.015-0.832 13.362-3.106 3.303-2.207 7.773-5.903 9.513-8.168 1.641-2.132 5.727-9.386 6.519-9.386 0.719 0 5.472-1.656 8.136 2.232z"/>
+   <path fill="#a36400" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.226 11.52-31.414 18.863-13.803 9.166-19.016 13.256-23.717 17.447-6.768 6.422-13.075 8.733-23.35 8.604-10.094-0.094-14.682-2.131-17.964-5.055-3.283-2.852-6.876-9.705-6.603-19.987 0.122-10.828 3.657-20.556 5.112-36.828 0.612-7.487 0.165-16.336 0.021-24.487-0.15-10.058-0.287-18.605 1.865-19.9 3.889-2.44 4.752-2.592 9.36-2.592 4.607 0 6.703 0.295 8.208 1.799 1.541 1.541 0.67 5.02 0.051 9.383-0.828 4.637 1.116 6.781 3.556 9.078 2.448 2.248 4.731 4.695 11.766 5.221 7.409 0.461 10.383-1.016 13.767-3.477 3.29-2.326 7.552-5.977 9.302-8.346 1.627-2.175 5.695-9.482 6.487-9.482 0.72-0.001 5.473-1.657 8.137 2.231z"/>
+   <path fill="#a86a00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.329 11.484-31.568 18.72-13.721 8.961-19.127 12.972-23.911 16.989-6.624 6.105-12.737 8.384-22.785 8.189-9.777-0.141-14.245-2.08-17.514-4.99-3.27-2.836-6.822-9.445-6.591-19.396 0.038-10.807 3.613-20.43 4.968-36.378 0.558-7.597-0.076-16.368-0.292-24.599-0.228-10.047-0.504-18.584 1.645-19.879 3.889-2.438 4.752-2.592 9.36-2.592 4.607 0 6.707 0.299 8.208 1.799 1.591 1.593 0.573 5.152-0.104 9.357-1.025 4.615 0.774 7.077 3.319 9.551 2.556 2.434 4.972 4.918 11.995 5.418 7.585 0.439 10.75-1.199 14.17-3.849 3.279-2.444 7.333-6.048 9.093-8.521 1.613-2.219 5.663-9.58 6.455-9.58 0.719 0.001 5.472-1.655 8.136 2.233z"/>
+   <path fill="#ad7000" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.434 11.447-31.724 18.576-13.637 8.756-19.238 12.687-24.106 16.531-6.479 5.789-12.397 8.035-22.219 7.776-9.461-0.188-13.809-2.03-17.063-4.925-3.254-2.823-6.769-9.188-6.581-18.807-0.043-10.785 3.571-20.305 4.824-35.928 0.504-7.705-0.316-16.402-0.604-24.711-0.303-10.037-0.72-18.563 1.425-19.857 3.889-2.434 4.752-2.592 9.36-2.592 4.607 0 6.711 0.303 8.208 1.799 1.642 1.643 0.475 5.285-0.259 9.332-1.225 4.594 0.432 7.373 3.082 10.022 2.664 2.621 5.212 5.142 12.225 5.616 7.762 0.418 11.117-1.383 14.573-4.219 3.269-2.563 7.113-6.121 8.885-8.698 1.598-2.261 5.63-9.677 6.422-9.677 0.719 0.002 5.472-1.654 8.136 2.234z"/>
+   <path fill="#b27500" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.538 11.412-31.879 18.432-13.554 8.551-19.35 12.402-24.3 16.074-6.336 5.473-12.06 7.686-21.654 7.361-9.144-0.233-13.374-1.979-16.613-4.859-3.24-2.809-6.714-8.928-6.57-18.216-0.126-10.765 3.528-20.179 4.68-35.478 0.45-7.813-0.558-16.435-0.918-24.822-0.378-10.026-0.936-18.541 1.206-19.836 3.889-2.43 4.752-2.592 9.36-2.592 4.607 0 6.714 0.305 8.208 1.799 1.691 1.693 0.378 5.418-0.414 9.307-1.422 4.572 0.09 7.668 2.844 10.494 2.772 2.808 5.454 5.363 12.456 5.814 7.938 0.396 11.484-1.566 14.977-4.591 3.258-2.682 6.894-6.192 8.676-8.874 1.584-2.304 5.598-9.773 6.39-9.773 0.718 0 5.471-1.656 8.135 2.232z"/>
+   <path fill="#b77b00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.643 11.376-32.033 18.288-13.472 8.345-19.461 12.118-24.494 15.616-6.192 5.156-11.723 7.338-21.089 6.949-8.827-0.281-12.938-1.93-16.164-4.795-3.226-2.795-6.66-8.67-6.56-17.627-0.209-10.742 3.485-20.052 4.536-35.027 0.396-7.92-0.799-16.467-1.23-24.934-0.454-10.015-1.152-18.52 0.985-19.814 3.889-2.426 4.752-2.592 9.36-2.592 4.607 0 6.718 0.31 8.208 1.799 1.743 1.744 0.281 5.553-0.569 9.281-1.62 4.551-0.252 7.963 2.607 10.967 2.88 2.994 5.694 5.586 12.686 6.012 8.115 0.373 11.852-1.75 15.379-4.961 3.248-2.801 6.676-6.264 8.469-9.051 1.568-2.348 5.564-9.871 6.356-9.871 0.72 0 5.473-1.656 8.137 2.232z"/>
+   <path fill="#bc8100" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.747 11.34-32.188 18.145-13.389 8.139-19.574 11.834-24.689 15.159-6.048 4.839-11.383 6.988-20.523 6.534-8.51-0.328-12.503-1.879-15.714-4.73-3.211-2.779-6.606-8.41-6.549-17.035-0.292-10.721 3.441-19.926 4.393-34.578 0.342-8.028-1.041-16.498-1.545-25.045-0.529-10.004-1.368-18.498 0.767-19.793 3.889-2.422 4.752-2.592 9.36-2.592 4.607 0 6.721 0.313 8.208 1.799 1.793 1.793 0.184 5.686-0.723 9.256-1.818 4.529-0.595 8.259 2.367 11.438 2.988 3.184 5.938 5.811 12.917 6.211 8.291 0.352 12.22-1.934 15.783-5.332 3.236-2.92 6.454-6.336 8.258-9.227 1.556-2.391 5.533-9.969 6.325-9.969 0.72-0.001 5.473-1.657 8.137 2.231z"/>
+   <path fill="#c18700" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.852 11.304-32.343 18-13.306 7.936-19.685 11.549-24.883 14.703-5.904 4.521-11.045 6.638-19.959 6.119-8.193-0.375-12.067-1.828-15.264-4.666-3.197-2.764-6.553-8.149-6.537-16.444-0.375-10.699 3.397-19.8 4.248-34.128 0.288-8.137-1.282-16.531-1.858-25.156-0.604-9.994-1.584-18.477 0.547-19.771 3.889-2.42 4.752-2.592 9.36-2.592 4.607 0 6.725 0.316 8.208 1.799 1.843 1.845 0.087 5.818-0.878 9.231-2.017 4.507-0.937 8.554 2.131 11.909 3.096 3.369 6.178 6.033 13.146 6.408 8.468 0.33 12.587-2.117 16.187-5.703 3.225-3.038 6.235-6.408 8.049-9.402 1.541-2.436 5.501-10.066 6.293-10.066 0.72-0.001 5.473-1.657 8.137 2.231z"/>
+   <path fill="#c68c00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-20.955 11.268-32.498 17.855-13.223 7.73-19.796 11.266-25.077 14.246-5.761 4.204-10.706 6.289-19.394 5.707-7.877-0.423-11.631-1.779-14.813-4.602-3.183-2.751-6.498-7.891-6.527-15.855-0.457-10.677 3.355-19.674 4.104-33.678 0.234-8.244-1.521-16.563-2.17-25.268-0.681-9.983-1.8-18.455 0.327-19.75 3.889-2.416 4.752-2.592 9.36-2.592 4.607 0 6.729 0.32 8.208 1.799 1.894 1.895-0.011 5.951-1.033 9.207-2.214 4.484-1.278 8.848 1.895 12.379 3.203 3.558 6.418 6.258 13.377 6.607 8.644 0.309 12.952-2.301 16.589-6.074 3.215-3.156 6.016-6.479 7.841-9.58 1.526-2.477 5.468-10.162 6.26-10.162 0.718 0.001 5.471-1.655 8.135 2.233z"/>
+   <path fill="#cc9200" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.061 11.232-32.652 17.712-13.141 7.524-19.908 10.979-25.272 13.788-5.616 3.888-10.368 5.939-18.828 5.292-7.56-0.468-11.195-1.728-14.363-4.536-3.168-2.736-6.444-7.632-6.517-15.264-0.54-10.656 3.313-19.549 3.96-33.229 0.181-8.352-1.764-16.596-2.483-25.38-0.757-9.972-2.017-18.433 0.107-19.728 3.889-2.412 4.752-2.592 9.36-2.592 4.607 0 6.731 0.323 8.208 1.799 1.944 1.945-0.108 6.084-1.188 9.181-2.412 4.464-1.62 9.144 1.656 12.853 3.313 3.744 6.66 6.479 13.608 6.803 8.819 0.289 13.319-2.483 16.991-6.443 3.204-3.275 5.797-6.553 7.633-9.756 1.512-2.52 5.436-10.26 6.228-10.26 0.719 0 5.472-1.656 8.136 2.232z"/>
+   <path fill="#d19800" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.164 11.195-32.808 17.568-13.057 7.318-20.019 10.695-25.466 13.33-5.473 3.571-10.03 5.592-18.263 4.879-7.243-0.516-10.761-1.678-13.914-4.472-3.153-2.722-6.391-7.372-6.506-14.674-0.623-10.634 3.27-19.422 3.816-32.778 0.126-8.459-2.005-16.627-2.797-25.49-0.832-9.961-2.232-18.412-0.112-19.707 3.889-2.408 4.752-2.592 9.36-2.592 4.607 0 6.736 0.328 8.208 1.799 1.995 1.996-0.205 6.219-1.343 9.156-2.61 4.442-1.962 9.438 1.419 13.323 3.42 3.931 6.9 6.703 13.838 7.002 8.997 0.267 13.687-2.668 17.395-6.815 3.194-3.395 5.577-6.623 7.424-9.932 1.497-2.564 5.403-10.357 6.195-10.357 0.721 0 5.474-1.656 8.138 2.232z"/>
+   <path fill="#d69e00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.27 11.16-32.962 17.424-12.975 7.114-20.132 10.412-25.661 12.874-5.327 3.254-9.69 5.242-17.697 4.464-6.927-0.563-10.325-1.627-13.464-4.406-3.14-2.707-6.337-7.113-6.494-14.084-0.706-10.611 3.225-19.295 3.672-32.328 0.072-8.567-2.247-16.66-3.111-25.603-0.907-9.95-2.448-18.39-0.331-19.685 3.889-2.404 4.752-2.592 9.36-2.592 4.607 0 6.739 0.332 8.208 1.799 2.045 2.045-0.302 6.352-1.497 9.131-2.808 4.421-2.304 9.734 1.18 13.795 3.528 4.119 7.144 6.927 14.069 7.199 9.173 0.246 14.055-2.851 17.799-7.185 3.182-3.514 5.356-6.696 7.214-10.108 1.483-2.607 5.371-10.455 6.163-10.455 0.719 0 5.472-1.656 8.136 2.232z"/>
+   <path fill="#dba300" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.373 11.124-33.116 17.279-12.893 6.91-20.243 10.127-25.855 12.418-5.184 2.937-9.353 4.892-17.133 4.05-6.609-0.609-9.889-1.577-13.014-4.343-3.125-2.692-6.282-6.854-6.483-13.492-0.789-10.592 3.182-19.17 3.528-31.879 0.018-8.676-2.488-16.692-3.425-25.713-0.982-9.94-2.664-18.369-0.551-19.664 3.889-2.401 4.752-2.592 9.36-2.592 4.607 0 6.743 0.334 8.208 1.799 2.095 2.097-0.399 6.484-1.652 9.105-3.006 4.398-2.646 10.029 0.943 14.268 3.636 4.305 7.384 7.148 14.299 7.397 9.349 0.224 14.422-3.034 18.202-7.558 3.171-3.631 5.137-6.768 7.005-10.284 1.469-2.649 5.339-10.552 6.131-10.552 0.72 0.001 5.473-1.655 8.137 2.233z"/>
+   <path fill="#e0a900" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.478 11.088-33.271 17.136-12.81 6.704-20.354 9.843-26.05 11.96-5.04 2.62-9.015 4.543-16.567 3.637-6.293-0.656-9.453-1.527-12.563-4.277-3.11-2.68-6.229-6.596-6.474-12.903-0.871-10.569 3.141-19.044 3.384-31.428-0.035-8.784-2.728-16.726-3.735-25.826-1.06-9.929-2.88-18.347-0.771-19.642 3.889-2.397 4.752-2.592 9.36-2.592 4.607 0 6.747 0.338 8.208 1.799 2.146 2.146-0.497 6.617-1.808 9.08-3.203 4.377-2.987 10.324 0.706 14.738 3.744 4.493 7.624 7.373 14.529 7.596 9.526 0.203 14.789-3.217 18.605-7.926 3.161-3.752 4.918-6.841 6.797-10.463 1.454-2.693 5.306-10.648 6.098-10.648 0.719-0.001 5.472-1.657 8.136 2.231z"/>
+   <path fill="#e5af00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.582 11.052-33.427 16.992-12.726 6.498-20.466 9.558-26.244 11.502-4.896 2.304-8.676 4.193-16.002 3.222-5.976-0.702-9.018-1.476-12.114-4.212-3.096-2.664-6.174-6.336-6.462-12.313-0.953-10.547 3.097-18.918 3.24-30.978-0.09-8.892-2.97-16.758-4.05-25.938-1.134-9.918-3.096-18.324-0.99-19.619 3.889-2.395 4.752-2.592 9.36-2.592 4.607 0 6.75 0.342 8.208 1.799 2.196 2.197-0.594 6.75-1.962 9.055-3.402 4.355-3.33 10.619 0.468 15.21 3.852 4.681 7.866 7.597 14.76 7.794 9.702 0.18 15.156-3.402 19.008-8.298 3.15-3.87 4.698-6.912 6.589-10.638 1.439-2.736 5.273-10.746 6.065-10.746 0.72 0 5.473-1.656 8.137 2.232z"/>
+   <path fill="#eab500" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.687 11.016-33.582 16.848-12.643 6.293-20.576 9.274-26.438 11.045-4.752 1.987-8.338 3.846-15.438 2.809-5.658-0.75-8.582-1.426-11.664-4.147-3.08-2.649-6.119-6.077-6.45-11.722-1.037-10.526 3.053-18.792 3.096-30.528-0.144-9-3.211-16.79-4.363-26.049-1.21-9.907-3.312-18.304-1.21-19.599 3.889-2.391 4.752-2.592 9.36-2.592 4.607 0 6.754 0.346 8.208 1.799 2.247 2.248-0.691 6.885-2.117 9.029-3.6 4.336-3.672 10.916 0.231 15.682 3.96 4.867 8.106 7.82 14.989 7.992 9.879 0.158 15.523-3.586 19.411-8.668 3.141-3.99 4.479-6.984 6.38-10.814 1.426-2.78 5.241-10.844 6.033-10.844 0.721-0.001 5.474-1.657 8.138 2.231z"/>
+   <path fill="#efba00" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.791 10.98-33.735 16.703-12.562 6.089-20.69 8.99-26.633 10.589-4.608 1.67-7.999 3.496-14.872 2.394-5.343-0.796-8.147-1.375-11.215-4.082-3.066-2.636-6.065-5.818-6.439-11.132-1.12-10.504 3.009-18.666 2.952-30.077-0.198-9.109-3.453-16.822-4.677-26.162-1.285-9.896-3.528-18.281-1.43-19.576 3.889-2.387 4.752-2.592 9.36-2.592 4.607 0 6.757 0.35 8.208 1.799 2.297 2.297-0.788 7.018-2.271 9.004-3.798 4.314-4.014 11.211-0.008 16.154 4.068 5.055 8.35 8.043 15.221 8.189 10.056 0.137 15.892-3.77 19.815-9.039 3.128-4.107 4.258-7.057 6.17-10.99 1.411-2.824 5.209-10.941 6.001-10.941 0.72-0.001 5.473-1.657 8.137 2.231z"/>
+   <path fill="#f4c000" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.896 10.943-33.891 16.561-12.478 5.883-20.801 8.704-26.827 10.131-4.464 1.353-7.661 3.146-14.307 1.979-5.025-0.843-7.711-1.325-10.765-4.019-3.053-2.621-6.012-5.558-6.429-10.541-1.203-10.482 2.966-18.539 2.809-29.627-0.253-9.217-3.694-16.855-4.99-26.272-1.361-9.886-3.744-18.261-1.649-19.556 3.889-2.383 4.752-2.592 9.36-2.592 4.607 0 6.761 0.353 8.208 1.799 2.347 2.349-0.885 7.15-2.426 8.979-3.996 4.291-4.356 11.505-0.245 16.625 4.176 5.241 8.59 8.265 15.451 8.388 10.23 0.115 16.258-3.953 20.218-9.41 3.117-4.227 4.039-7.129 5.961-11.168 1.396-2.865 5.177-11.037 5.969-11.037 0.72 0 5.473-1.656 8.137 2.232z"/>
+   <path fill="#f9c600" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-21.999 10.908-34.046 16.416-12.395 5.678-20.912 8.421-27.021 9.674-4.32 1.036-7.322 2.797-13.741 1.566-4.709-0.891-7.275-1.275-10.314-3.953-3.037-2.607-5.958-5.299-6.419-9.951-1.284-10.461 2.925-18.414 2.664-29.178-0.306-9.324-3.934-16.887-5.302-26.385-1.437-9.875-3.96-18.238-1.869-19.533 3.889-2.379 4.752-2.592 9.36-2.592 4.607 0 6.765 0.356 8.208 1.799 2.397 2.398-0.983 7.283-2.581 8.955-4.194 4.269-4.698 11.799-0.482 17.096 4.284 5.429 8.83 8.488 15.682 8.586 10.407 0.094 16.625-4.137 20.621-9.781 3.106-4.345 3.819-7.199 5.753-11.344 1.382-2.909 5.144-11.135 5.936-11.135 0.718 0 5.471-1.656 8.135 2.232z"/>
+   <path fill="#fc0" d="m303.631 262.529c4.464 6.479-0.145 14.904 3.096 20.089 5.328 8.496 16.056 17.063 20.16 19.439 2.952 1.8 7.128 3.527 6.983 8.783-0.216 5.977-3.168 7.561-4.823 9.217-3.313 3.313-22.104 10.872-34.2 16.271-12.313 5.473-21.024 8.137-27.217 9.217-4.176 0.72-6.983 2.447-13.176 1.151-4.392-0.937-6.84-1.224-9.864-3.888-3.023-2.592-5.903-5.04-6.407-9.359-1.368-10.441 2.88-18.289 2.52-28.729-0.36-9.432-4.176-16.92-5.616-26.496-1.512-9.864-4.176-18.217-2.088-19.512 3.889-2.377 4.752-2.592 9.36-2.592 4.607 0 6.768 0.359 8.208 1.799 2.448 2.449-1.08 7.416-2.736 8.929-4.392 4.248-5.04 12.096-0.72 17.567 4.392 5.617 9.072 8.713 15.912 8.785 10.584 0.071 16.992-4.32 21.023-10.152 3.097-4.465 3.601-7.272 5.544-11.521 1.368-2.952 5.112-11.231 5.904-11.231 0.72 0.001 5.473-1.655 8.137 2.233z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m236.263 275.762c-0.709-0.258-3.932-15.209-2.191-16.239 3.351-1.997 4.253-2.319 8.377-2.319s6.057 0.322 7.346 1.61c2.126 2.127-1.159 6.702-2.448 7.991-3.738 3.673-10.375 9.215-11.084 8.957z"/>
+   <path fill="#ffcc02" d="m236.492 275.286c-0.77-0.326-4.102-14.719-2.368-15.742 3.344-1.992 4.278-2.211 8.322-2.211 4.124 0 5.976 0.269 7.282 1.602 2.105 2.136-1.119 6.572-2.398 7.852-3.727 3.663-10.081 8.811-10.838 8.499z"/>
+   <path fill="#ffcc05" d="m236.721 274.809c-0.832-0.393-4.273-14.229-2.547-15.247 3.339-1.983 4.306-2.101 8.269-2.101 4.124 0 5.896 0.213 7.217 1.592 2.087 2.146-1.076 6.443-2.346 7.714-3.718 3.653-9.788 8.409-10.593 8.042z"/>
+   <path fill="#ffcc07" d="m236.949 274.333c-0.892-0.461-4.443-13.74-2.722-14.75 3.331-1.979 4.33-1.992 8.213-1.992 4.124 0 5.814 0.158 7.151 1.582 2.068 2.156-1.033 6.316-2.294 7.574-3.707 3.644-9.494 8.007-10.348 7.586z"/>
+   <path fill="#ffcd0a" d="m237.178 273.855c-0.954-0.528-4.614-13.249-2.9-14.254 3.326-1.972 4.355-1.882 8.158-1.882 4.124 0 5.734 0.104 7.089 1.572 2.048 2.166-0.993 6.187-2.243 7.437-3.699 3.634-9.202 7.605-10.104 7.127z"/>
+   <path fill="#ffcd0c" d="m237.407 273.377c-1.015-0.596-4.785-12.758-3.077-13.758 3.319-1.965 4.382-1.771 8.104-1.771 4.124 0 5.653 0.049 7.023 1.563 2.029 2.176-0.951 6.057-2.19 7.299-3.69 3.623-8.91 7.201-9.86 6.667z"/>
+   <path fill="#ffcd0f" d="m237.636 272.901c-1.077-0.662-4.956-12.27-3.256-13.261 3.313-1.959 4.408-1.663 8.05-1.663 4.124 0 5.573-0.006 6.959 1.553 2.01 2.186-0.908 5.93-2.14 7.159-3.679 3.614-8.615 6.8-9.613 6.212z"/>
+   <path fill="#ffcd11" d="m237.864 272.424c-1.137-0.731-5.126-11.779-3.431-12.766 3.306-1.951 4.433-1.553 7.994-1.553 4.123 0 5.492-0.061 6.895 1.543 1.991 2.193-0.867 5.801-2.089 7.021-3.669 3.606-8.321 6.397-9.369 5.755z"/>
+   <path fill="#ffce14" d="m238.093 271.948c-1.197-0.799-5.297-11.289-3.607-12.27 3.299-1.946 4.459-1.443 7.938-1.443 4.124 0 5.412-0.115 6.83 1.533 1.973 2.204-0.824 5.671-2.037 6.883-3.659 3.596-8.028 5.993-9.124 5.297z"/>
+   <path fill="#ffce16" d="m238.322 271.471c-1.26-0.867-5.468-10.801-3.786-11.773 3.293-1.939 4.485-1.334 7.884-1.334 4.124 0 5.332-0.171 6.767 1.524 1.953 2.213-0.783 5.542-1.985 6.743-3.651 3.586-7.736 5.591-8.88 4.84z"/>
+   <path fill="#ffce19" d="m238.551 270.995c-1.32-0.935-5.639-10.312-3.963-11.277 3.286-1.934 4.511-1.225 7.829-1.225 4.124 0 5.252-0.226 6.702 1.514 1.934 2.224-0.741 5.414-1.934 6.605-3.64 3.576-7.442 5.187-8.634 4.383z"/>
+   <path fill="#ffce1c" d="m238.779 270.517c-1.382-1.002-5.809-9.821-4.14-10.781 3.279-1.926 4.535-1.114 7.774-1.114 4.124 0 5.171-0.279 6.637 1.504 1.914 2.233-0.698 5.285-1.882 6.467-3.63 3.566-7.148 4.784-8.389 3.924z"/>
+   <path fill="#ffcf1e" d="m239.008 270.04c-1.442-1.068-5.979-9.33-4.316-10.283 3.272-1.922 4.562-1.006 7.72-1.006 4.124 0 5.09-0.334 6.572 1.494 1.895 2.244-0.657 5.156-1.83 6.328-3.622 3.556-6.857 4.383-8.146 3.467z"/>
+   <path fill="#ffcf21" d="m239.237 269.563c-1.505-1.137-6.151-8.841-4.495-9.788 3.267-1.914 4.588-0.896 7.666-0.896 4.124 0 5.009-0.389 6.508 1.486 1.875 2.252-0.616 5.025-1.778 6.188-3.613 3.548-6.564 3.981-7.901 3.01z"/>
+   <path fill="#ffcf23" d="m239.466 269.086c-1.565-1.205-6.321-8.352-4.672-9.293 3.262-1.906 4.613-0.785 7.61-0.785 4.124 0 4.93-0.444 6.444 1.476 1.855 2.261-0.573 4.897-1.728 6.052-3.601 3.537-6.269 3.575-7.654 2.55z"/>
+   <path fill="#ffcf26" d="m239.694 268.61c-1.627-1.273-6.492-7.861-4.849-8.796 3.255-1.901 4.64-0.677 7.556-0.677 4.124 0 4.849-0.499 6.379 1.466 1.837 2.271-0.531 4.769-1.675 5.912-3.593 3.528-5.977 3.174-7.411 2.095z"/>
+   <path fill="#ffd028" d="m239.923 268.133c-1.688-1.34-6.663-7.373-5.025-8.301 3.248-1.895 4.665-0.566 7.501-0.566 4.124 0 4.768-0.555 6.314 1.456 1.817 2.28-0.489 4.64-1.624 5.774-3.583 3.519-5.684 2.771-7.166 1.637z"/>
+   <path fill="#ffd02b" d="m240.152 267.657c-1.749-1.408-6.834-6.883-5.203-7.805 3.241-1.889 4.69-0.457 7.446-0.457 4.124 0 4.687-0.609 6.25 1.447 1.798 2.289-0.448 4.51-1.573 5.635-3.572 3.509-5.39 2.367-6.92 1.18z"/>
+   <path fill="#ffd02d" d="m240.381 267.178c-1.811-1.475-7.005-6.391-5.381-7.307 3.235-1.881 4.717-0.348 7.393-0.348 4.124 0 4.606-0.664 6.185 1.438 1.779 2.299-0.405 4.381-1.521 5.496-3.564 3.501-5.098 1.965-6.676 0.721z"/>
+   <path fill="#ffd030" d="m240.609 266.702c-1.871-1.543-7.175-5.902-5.557-6.811 3.228-1.875 4.741-0.238 7.336-0.238 4.124 0 4.526-0.719 6.122 1.428 1.759 2.31-0.364 4.252-1.471 5.357-3.552 3.49-4.803 1.562-6.43 0.264z"/>
+   <path fill="#ffd133" d="m240.838 266.225c-1.933-1.611-7.346-5.413-5.734-6.314 3.222-1.869 4.768-0.129 7.281-0.129 4.124 0 4.446-0.773 6.058 1.418 1.74 2.318-0.322 4.123-1.418 5.219-3.545 3.48-4.512 1.16-6.187-0.194z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m302.769 263.374c3.742 5.461-0.062 12.76 2.638 17.117-6.809-6.258-9.938-8.834-19.324 0.367 2.577-3.742 3.129-6.257 4.725-9.814 1.104-2.455 4.354-9.57 5.029-9.57 0.613-0.001 4.724-1.35 6.932 1.9z"/>
+   <path fill="#ffcc02" d="m302.73 263.413c3.655 5.334 0.035 12.601 2.578 16.723-6.668-6.098-9.729-8.666-18.908 0.322 2.421-3.527 3.025-6.094 4.605-9.592 1.122-2.462 4.243-9.302 4.951-9.311 0.628-0.008 4.617-1.318 6.774 1.858z"/>
+   <path fill="#ffcc05" d="m302.691 263.45c3.568 5.209 0.132 12.441 2.517 16.332-6.526-5.938-9.519-8.5-18.492 0.277 2.268-3.314 2.924-5.934 4.488-9.372 1.141-2.468 4.132-9.032 4.873-9.052 0.641-0.013 4.508-1.284 6.614 1.815z"/>
+   <path fill="#ffcc07" d="m302.652 263.487c3.48 5.086 0.229 12.282 2.457 15.939-6.386-5.777-9.311-8.332-18.076 0.232 2.111-3.1 2.819-5.771 4.369-9.15 1.158-2.475 4.021-8.762 4.795-8.791 0.655-0.019 4.399-1.254 6.455 1.77z"/>
+   <path fill="#ffcd0a" d="m302.614 263.524c3.393 4.96 0.323 12.123 2.396 15.549-6.245-5.617-9.102-8.164-17.66 0.188 1.955-2.887 2.716-5.611 4.251-8.93 1.176-2.481 3.91-8.494 4.716-8.533 0.67-0.027 4.291-1.219 6.297 1.726z"/>
+   <path fill="#ffcd0c" d="m302.575 263.562c3.306 4.835 0.419 11.964 2.335 15.155-6.104-5.457-8.891-7.996-17.244 0.143 1.8-2.673 2.613-5.449 4.133-8.707 1.194-2.488 3.8-8.225 4.638-8.273 0.684-0.036 4.182-1.189 6.138 1.682z"/>
+   <path fill="#ffcd0f" d="m302.536 263.599c3.219 4.71 0.517 11.805 2.275 14.765-5.963-5.299-8.683-7.83-16.828 0.098 1.644-2.461 2.51-5.289 4.015-8.486 1.212-2.496 3.688-7.956 4.559-8.016 0.698-0.04 4.075-1.155 5.979 1.639z"/>
+   <path fill="#ffcd11" d="m302.497 263.637c3.131 4.585 0.612 11.645 2.216 14.371-5.822-5.137-8.474-7.661-16.413 0.053 1.489-2.245 2.406-5.125 3.896-8.264 1.229-2.504 3.576-7.688 4.479-7.756 0.714-0.046 3.968-1.123 5.822 1.596z"/>
+   <path fill="#ffce14" d="m302.458 263.674c3.044 4.459 0.708 11.486 2.154 13.979-5.681-4.978-8.263-7.493-15.996 0.009 1.334-2.033 2.303-4.965 3.779-8.043 1.247-2.511 3.464-7.418 4.4-7.498 0.728-0.052 3.859-1.089 5.663 1.553z"/>
+   <path fill="#ffce16" d="m302.42 263.711c2.956 4.336 0.804 11.328 2.094 13.588-5.54-4.817-8.055-7.326-15.58-0.036 1.178-1.819 2.199-4.804 3.659-7.822 1.267-2.517 3.354-7.149 4.323-7.237 0.741-0.061 3.75-1.058 5.504 1.507z"/>
+   <path fill="#ffce19" d="m302.381 263.749c2.868 4.211 0.9 11.168 2.033 13.196-5.398-4.657-7.845-7.159-15.164-0.081 1.022-1.605 2.097-4.642 3.542-7.601 1.283-2.524 3.241-6.88 4.244-6.979 0.755-0.067 3.642-1.026 5.345 1.465z"/>
+   <path fill="#ffce1c" d="m302.342 263.788c2.78 4.084 0.997 11.008 1.973 12.803-5.258-4.498-7.635-6.991-14.748-0.127 0.867-1.391 1.994-4.479 3.424-7.379 1.302-2.531 3.13-6.61 4.166-6.719 0.768-0.074 3.532-0.992 5.185 1.422z"/>
+   <path fill="#ffcf1e" d="m302.302 263.825c2.693 3.959 1.093 10.85 1.913 12.411-5.117-4.338-7.427-6.825-14.333-0.172 0.713-1.177 1.891-4.317 3.307-7.157 1.318-2.537 3.018-6.342 4.086-6.461 0.784-0.08 3.426-0.959 5.027 1.379z"/>
+   <path fill="#ffcf21" d="m302.263 263.862c2.606 3.834 1.188 10.689 1.853 12.02-4.976-4.178-7.217-6.657-13.916-0.217 0.556-0.963 1.786-4.156 3.188-6.936 1.337-2.545 2.906-6.072 4.008-6.202 0.797-0.086 3.318-0.927 4.867 1.335z"/>
+   <path fill="#ffcf23" d="m302.225 263.899c2.519 3.71 1.285 10.531 1.791 11.628-4.835-4.019-7.008-6.489-13.5-0.262 0.4-0.75 1.684-3.994 3.068-6.714 1.356-2.553 2.797-5.805 3.931-5.943 0.813-0.093 3.209-0.895 4.71 1.291z"/>
+   <path fill="#ffcf26" d="m302.186 263.937c2.431 3.584 1.381 10.371 1.73 11.235-4.693-3.857-6.798-6.322-13.084-0.307 0.245-0.535 1.58-3.832 2.951-6.492 1.373-2.56 2.686-5.535 3.852-5.685 0.828-0.1 3.101-0.861 4.551 1.249z"/>
+   <path fill="#ffd028" d="m302.147 263.974c2.344 3.46 1.477 10.213 1.671 10.845-4.553-3.699-6.589-6.156-12.668-0.354 0.089-0.321 1.477-3.67 2.832-6.271 1.392-2.565 2.574-5.267 3.772-5.425 0.842-0.104 2.994-0.828 4.393 1.205z"/>
+   <path fill="#ffd02b" d="m302.108 264.012c2.257 3.334 1.573 10.053 1.61 10.451-4.412-3.537-6.38-5.987-12.253-0.396-0.064-0.109 1.374-3.51 2.716-6.05 1.408-2.573 2.462-4.997 3.693-5.166 0.856-0.112 2.886-0.796 4.234 1.161z"/>
+   <path fill="#ffd02d" d="m302.069 264.049c2.17 3.209 1.67 9.894 1.55 10.061-4.271-3.379-6.17-5.82-11.836-0.441-0.221 0.104 1.271-3.35 2.596-5.83 1.428-2.58 2.352-4.728 3.615-4.906 0.87-0.12 2.777-0.765 4.075 1.116z"/>
+   <path fill="#ffd030" d="m302.03 264.086c2.082 3.084 1.767 9.736 1.49 9.668-4.131-3.219-5.961-5.652-11.42-0.486-0.377 0.318 1.167-3.188 2.478-5.607 1.445-2.586 2.239-4.459 3.536-4.647 0.884-0.127 2.669-0.732 3.916 1.072z"/>
+   <path fill="#ffd133" d="m301.991 264.124c1.995 2.959 1.862 9.576 1.43 9.277-3.989-3.059-5.752-5.486-11.005-0.531-0.532 0.531 1.064-3.027 2.36-5.387 1.463-2.594 2.128-4.189 3.458-4.389 0.899-0.133 2.561-0.699 3.757 1.03z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m305.862 283.481c5.977 7.848 17.064 16.271 21.024 18.576 2.88 1.656 7.056 3.6 6.983 8.783-0.144 5.904-3.168 7.561-4.823 9.217-3.313 3.313-22.177 10.943-34.2 16.271-12.24 5.4-21.097 8.209-27.217 9.217-4.104 0.647-7.056 2.375-13.176 1.151-4.32-0.864-6.912-1.296-9.864-3.888-2.951-2.52-5.976-5.184-6.407-9.359-1.225-10.369 3.672-16.921 8.424-25.921 3.888-7.2 11.735-8.64 16.632-7.991 17.568 2.375 16.416-8.641 21.24-13.465 4.464-4.463 17.208-8.064 21.384-2.591z"/>
+   <path fill="#ffcc02" d="m305.81 283.553c5.962 7.83 17.024 16.234 20.975 18.533 2.873 1.652 7.039 3.592 6.969 8.764-0.145 5.891-3.161 7.542-4.813 9.195-3.304 3.304-22.34 10.992-34.24 16.088-12.259 5.176-20.647 7.873-26.802 8.959-4.077 0.684-7.156 2.394-13.258 1.177-4.304-0.854-6.767-1.231-9.707-3.812-2.939-2.51-5.756-4.961-6.185-9.117-1.211-10.34 3.365-16.657 8.044-25.65 3.89-7.375 11.791-8.434 16.665-7.777 17.514 2.414 16.206-8.959 21.02-13.772 4.452-4.454 17.166-8.047 21.332-2.588z"/>
+   <path fill="#ffcc05" d="m305.76 283.627c5.946 7.812 16.982 16.195 20.925 18.488 2.866 1.648 7.022 3.584 6.951 8.743-0.144 5.876-3.153 7.524-4.801 9.173-3.298 3.297-22.506 11.043-34.28 15.907-12.279 4.949-20.201 7.538-26.389 8.699-4.051 0.721-7.256 2.413-13.341 1.202-4.286-0.846-6.619-1.168-9.55-3.733-2.924-2.501-5.536-4.741-5.959-8.877-1.198-10.312 3.058-16.394 7.664-25.379 3.89-7.552 11.845-8.229 16.698-7.563 17.458 2.453 15.995-9.279 20.797-14.08 4.443-4.443 17.127-8.026 21.285-2.58z"/>
+   <path fill="#ffcc07" d="m305.707 283.702c5.935 7.791 16.943 16.156 20.876 18.444 2.859 1.644 7.007 3.574 6.935 8.722-0.144 5.862-3.146 7.508-4.79 9.151-3.288 3.289-22.668 11.093-34.319 15.726-12.298 4.723-19.753 7.202-25.974 8.44-4.024 0.756-7.357 2.431-13.423 1.226-4.27-0.836-6.473-1.101-9.394-3.654-2.911-2.492-5.317-4.52-5.735-8.635-1.185-10.285 2.75-16.133 7.284-25.109 3.892-7.727 11.9-8.023 16.731-7.35 17.402 2.494 15.785-9.599 20.575-14.389 4.433-4.432 17.087-8.007 21.234-2.572z"/>
+   <path fill="#ffcd0a" d="m305.655 283.774c5.92 7.773 16.904 16.119 20.826 18.4 2.854 1.642 6.99 3.566 6.919 8.703-0.143 5.848-3.138 7.488-4.779 9.129-3.28 3.281-22.832 11.143-34.358 15.543-12.317 4.498-19.307 6.867-25.561 8.182-3.997 0.793-7.457 2.45-13.506 1.251-4.252-0.828-6.325-1.036-9.236-3.577-2.896-2.482-5.096-4.298-5.51-8.393-1.172-10.258 2.443-15.869 6.904-24.84 3.892-7.901 11.955-7.818 16.763-7.135 17.349 2.532 15.576-9.918 20.355-14.697 4.422-4.422 17.046-7.987 21.183-2.566z"/>
+   <path fill="#ffcd0c" d="m305.603 283.847c5.906 7.756 16.864 16.081 20.777 18.358 2.846 1.635 6.973 3.557 6.901 8.68-0.142 5.835-3.131 7.472-4.767 9.107-3.273 3.273-22.997 11.193-34.399 15.361-12.337 4.273-18.858 6.533-25.146 7.924-3.971 0.829-7.557 2.469-13.588 1.276-4.234-0.82-6.179-0.972-9.078-3.5-2.884-2.474-4.878-4.076-5.287-8.152-1.158-10.229 2.137-15.606 6.523-24.569 3.895-8.076 12.01-7.611 16.797-6.92 17.293 2.571 15.366-10.236 20.134-15.004 4.412-4.411 17.006-7.969 21.133-2.561z"/>
+   <path fill="#ffcd0f" d="m305.552 283.92c5.892 7.736 16.824 16.043 20.728 18.313 2.839 1.634 6.957 3.55 6.886 8.66-0.142 5.821-3.124 7.454-4.756 9.086-3.266 3.267-23.161 11.243-34.438 15.179-12.356 4.047-18.411 6.198-24.733 7.666-3.943 0.865-7.656 2.486-13.67 1.301-4.218-0.812-6.032-0.908-8.922-3.422-2.869-2.465-4.656-3.855-5.063-7.91-1.145-10.203 1.83-15.344 6.145-24.299 3.895-8.252 12.064-7.408 16.83-6.707 17.237 2.61 15.154-10.557 19.912-15.313 4.399-4.399 16.963-7.949 21.081-2.554z"/>
+   <path fill="#ffcd11" d="m305.501 283.993c5.877 7.719 16.782 16.004 20.678 18.271 2.833 1.628 6.939 3.54 6.869 8.639-0.143 5.807-3.116 7.436-4.745 9.064-3.257 3.258-23.324 11.293-34.479 14.996-12.375 3.822-17.963 5.863-24.319 7.408-3.917 0.9-7.757 2.504-13.752 1.324-4.2-0.802-5.886-0.842-8.765-3.344-2.856-2.454-4.438-3.633-4.838-7.669-1.132-10.173 1.521-15.081 5.764-24.029 3.896-8.426 12.119-7.2 16.863-6.491 17.183 2.649 14.945-10.875 19.689-15.621 4.391-4.389 16.926-7.93 21.035-2.548z"/>
+   <path fill="#ffce14" d="m305.448 284.066c5.863 7.701 16.743 15.966 20.629 18.228 2.826 1.625 6.924 3.531 6.853 8.619-0.142 5.793-3.108 7.418-4.733 9.043-3.25 3.25-23.489 11.342-34.518 14.813-12.396 3.598-17.517 5.529-23.905 7.148-3.891 0.938-7.857 2.524-13.834 1.351-4.185-0.793-5.74-0.776-8.609-3.267-2.841-2.444-4.217-3.412-4.613-7.426-1.118-10.146 1.216-14.818 5.385-23.76 3.896-8.602 12.174-6.996 16.896-6.277 17.128 2.688 14.735-11.195 19.468-15.929 4.378-4.38 16.883-7.911 20.981-2.543z"/>
+   <path fill="#ffce16" d="m305.396 284.139c5.85 7.682 16.703 15.928 20.579 18.184 2.82 1.62 6.907 3.523 6.837 8.598-0.141 5.779-3.101 7.4-4.722 9.021-3.242 3.242-23.653 11.393-34.559 14.631-12.414 3.372-17.068 5.194-23.491 6.891-3.862 0.975-7.957 2.543-13.917 1.375-4.167-0.783-5.592-0.713-8.451-3.188-2.827-2.437-3.997-3.19-4.389-7.187-1.105-10.117 0.908-14.555 5.004-23.487 3.898-8.776 12.229-6.79 16.928-6.063 17.074 2.728 14.525-11.515 19.248-16.236 4.37-4.371 16.845-7.894 20.933-2.539z"/>
+   <path fill="#ffce19" d="m305.344 284.211c5.836 7.664 16.663 15.891 20.529 18.141 2.813 1.617 6.892 3.516 6.82 8.578-0.14 5.765-3.093 7.382-4.71 8.999-3.235 3.233-23.817 11.442-34.598 14.448-12.434 3.146-16.621 4.859-23.077 6.633-3.837 1.01-8.058 2.561-13.999 1.4-4.15-0.775-5.446-0.648-8.295-3.111-2.814-2.426-3.777-2.969-4.164-6.944-1.094-10.09 0.601-14.293 4.624-23.22 3.898-8.951 12.282-6.584 16.961-5.848 17.019 2.767 14.314-11.834 19.025-16.545 4.361-4.359 16.806-7.872 20.884-2.531z"/>
+   <path fill="#ffce1c" d="m305.292 284.286c5.822 7.646 16.623 15.852 20.481 18.096 2.806 1.613 6.874 3.507 6.804 8.558-0.141 5.751-3.086 7.364-4.699 8.978-3.227 3.227-23.981 11.492-34.638 14.267-12.453 2.921-16.173 4.524-22.663 6.374-3.81 1.046-8.158 2.578-14.082 1.424-4.133-0.766-5.299-0.583-8.137-3.033-2.801-2.416-3.558-2.748-3.94-6.703-1.08-10.062 0.293-14.029 4.244-22.947 3.9-9.127 12.338-6.379 16.994-5.635 16.964 2.805 14.105-12.152 18.805-16.853 4.348-4.351 16.763-7.856 20.831-2.526z"/>
+   <path fill="#ffcf1e" d="m305.241 284.358c5.808 7.627 16.582 15.814 20.432 18.053 2.799 1.609 6.856 3.498 6.787 8.536-0.141 5.738-3.079 7.347-4.688 8.957-3.219 3.218-24.145 11.541-34.677 14.084-12.473 2.695-15.727 4.188-22.25 6.115-3.783 1.083-8.258 2.599-14.163 1.448-4.116-0.756-5.153-0.518-7.981-2.954-2.786-2.408-3.337-2.526-3.716-6.462-1.066-10.034-0.013-13.766 3.864-22.678 3.901-9.303 12.393-6.172 17.027-5.42 16.908 2.844 13.896-12.473 18.583-17.16 4.338-4.337 16.723-7.835 20.782-2.519z"/>
+   <path fill="#ffcf21" d="m305.189 284.431c5.793 7.608 16.542 15.776 20.382 18.009 2.792 1.605 6.84 3.49 6.771 8.516-0.14 5.725-3.071 7.33-4.677 8.936-3.211 3.211-24.309 11.591-34.717 13.902-12.491 2.47-15.278 3.854-21.836 5.856-3.756 1.119-8.357 2.616-14.246 1.474-4.099-0.748-5.006-0.453-7.823-2.877-2.772-2.398-3.118-2.306-3.492-6.22-1.053-10.007-0.319-13.505 3.484-22.407 3.903-9.479 12.448-5.969 17.062-5.207 16.853 2.883 13.684-12.791 18.36-17.469 4.328-4.328 16.683-7.819 20.732-2.513z"/>
+   <path fill="#ffcf23" d="m305.137 284.504c5.778 7.59 16.503 15.736 20.332 17.965 2.786 1.602 6.825 3.482 6.755 8.496-0.139 5.709-3.064 7.311-4.665 8.912-3.204 3.203-24.474 11.642-34.759 13.721-12.51 2.244-14.829 3.52-21.421 5.598-3.729 1.155-8.457 2.635-14.327 1.499-4.082-0.739-4.86-0.389-7.667-2.8-2.76-2.389-2.897-2.083-3.268-5.979-1.04-9.979-0.627-13.24 3.104-22.138 3.903-9.653 12.503-5.762 17.093-4.991 16.799 2.922 13.475-13.111 18.141-17.777 4.318-4.316 16.643-7.799 20.682-2.506z"/>
+   <path fill="#ffcf26" d="m305.086 284.579c5.765 7.57 16.463 15.697 20.282 17.92 2.779 1.599 6.809 3.474 6.738 8.476-0.139 5.696-3.056 7.293-4.654 8.892-3.194 3.194-24.637 11.69-34.797 13.536-12.529 2.021-14.382 3.185-21.007 5.341-3.703 1.191-8.559 2.652-14.411 1.523-4.065-0.73-4.713-0.324-7.509-2.723-2.745-2.379-2.679-1.861-3.043-5.735-1.027-9.952-0.936-12.979 2.724-21.868 3.905-9.828 12.557-5.557 17.126-4.777 16.744 2.961 13.265-13.431 17.919-18.084 4.307-4.309 16.602-7.783 20.632-2.501z"/>
+   <path fill="#ffd028" d="m305.033 284.651c5.752 7.553 16.423 15.66 20.234 17.878 2.771 1.593 6.791 3.464 6.722 8.454-0.139 5.682-3.049 7.275-4.643 8.869-3.188 3.188-24.801 11.74-34.838 13.355-12.548 1.793-13.935 2.85-20.593 5.082-3.676 1.228-8.658 2.67-14.493 1.547-4.048-0.721-4.565-0.258-7.353-2.644-2.731-2.37-2.457-1.64-2.818-5.495-1.014-9.923-1.242-12.716 2.345-21.597 3.905-10.004 12.611-5.351 17.158-4.563 16.689 3 13.055-13.75 17.698-18.393 4.297-4.295 16.562-7.761 20.581-2.493z"/>
+   <path fill="#ffd02b" d="m304.982 284.724c5.737 7.534 16.382 15.622 20.184 17.834 2.766 1.59 6.774 3.456 6.705 8.433-0.138 5.67-3.041 7.26-4.631 8.85-3.18 3.179-24.966 11.789-34.877 13.172-12.568 1.568-13.487 2.515-20.179 4.824-3.65 1.263-8.759 2.688-14.575 1.572-4.031-0.713-4.42-0.195-7.196-2.566-2.718-2.361-2.238-1.42-2.594-5.254-1.001-9.896-1.549-12.453 1.964-21.328 3.907-10.178 12.666-5.145 17.192-4.348 16.634 3.039 12.844-14.068 17.476-18.701 4.285-4.286 16.521-7.743 20.531-2.488z"/>
+   <path fill="#ffd02d" d="m304.93 284.797c5.723 7.516 16.342 15.584 20.135 17.789 2.758 1.588 6.758 3.449 6.688 8.414-0.138 5.654-3.034 7.24-4.619 8.826-3.173 3.172-25.13 11.84-34.918 12.99-12.587 1.344-13.039 2.18-19.766 4.564-3.622 1.301-8.856 2.709-14.657 1.599-4.014-0.704-4.272-0.13-7.039-2.489-2.702-2.352-2.018-1.197-2.369-5.012-0.987-9.868-1.855-12.189 1.584-21.057 3.908-10.354 12.722-4.94 17.226-4.135 16.578 3.078 12.634-14.389 17.254-19.009 4.275-4.273 16.481-7.721 20.481-2.48z"/>
+   <path fill="#ffd030" d="m304.879 284.87c5.709 7.498 16.302 15.547 20.085 17.748 2.752 1.582 6.741 3.438 6.673 8.391-0.139 5.642-3.027 7.224-4.609 8.806-3.164 3.164-25.293 11.89-34.956 12.808-12.606 1.119-12.592 1.844-19.352 4.308-3.596 1.336-8.958 2.726-14.739 1.622-3.997-0.695-4.127-0.065-6.882-2.411-2.69-2.343-1.799-0.976-2.146-4.771-0.974-9.84-2.163-11.928 1.204-20.787 3.91-10.529 12.777-4.734 17.258-3.92 16.524 3.117 12.424-14.707 17.034-19.316 4.263-4.267 16.439-7.706 20.43-2.478z"/>
+   <path fill="#ffd133" d="m304.826 284.943c5.695 7.479 16.263 15.509 20.036 17.703 2.745 1.579 6.726 3.431 6.656 8.372-0.137 5.627-3.02 7.205-4.597 8.783-3.157 3.156-25.458 11.939-34.997 12.625-12.626 0.893-12.145 1.51-18.938 4.049-3.569 1.373-9.058 2.745-14.822 1.646-3.979-0.686-3.979 0-6.725-2.332-2.676-2.334-1.578-0.756-1.921-4.529-0.961-9.813-2.471-11.665 0.824-20.516 3.91-10.705 12.83-4.529 17.29-3.707 16.47 3.156 12.215-15.027 16.813-19.625 4.255-4.253 16.401-7.684 20.381-2.469z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#995900" d="m52.494 273.618c-6.479 4.68-22.896 4.248-27.072 9.719-4.104 5.473 0.145 13.393 0.072 28.08 0 6.265-1.08 11.017-1.8 14.832-1.008 4.824-1.656 8.209 0.36 11.664 3.672 6.121 9.575 7.633 43.344 14.688 18.072 3.744 35.136 13.464 46.584 14.399 11.448 0.865 13.896-2.951 20.88-9.144 6.912-6.192 9.144-4.248 8.928-17.856-0.216-13.535-8.928-17.567-18.792-33.191s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.208 13.248-14.688 17.929z"/>
+   <path fill="#9e5e00" d="m52.598 273.905c-6.397 4.702-22.475 3.788-27.062 9.512-4.154 5.414 0.228 13.276 0.098 27.955-0.025 6.23-1.152 10.881-1.937 14.877-1.037 4.871-1.678 8.201 0.349 11.619 3.787 6.162 9.695 7.123 43.456 14.168 18.061 3.737 34.541 13.307 46.343 14.112 11.186 0.792 13.564-2.829 20.463-8.96 6.896-6.195 9.024-4.277 8.858-17.406-0.075-13.521-8.305-17.349-18.169-32.973s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.153 13.479-14.583 18.216z"/>
+   <path fill="#a36400" d="m52.703 274.193c-6.314 4.724-22.054 3.327-27.051 9.304-4.204 5.356 0.31 13.16 0.123 27.828-0.051 6.198-1.225 10.748-2.074 14.924-1.065 4.918-1.699 8.194 0.339 11.571 3.902 6.206 9.813 6.617 43.567 13.651 18.05 3.73 33.948 13.146 46.101 13.824 10.923 0.72 13.234-2.707 20.045-8.777 6.885-6.199 8.907-4.305 8.792-16.956 0.064-13.507-7.683-17.129-17.547-32.753s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.1 13.709-14.479 18.504z"/>
+   <path fill="#a86a00" d="m52.807 274.481c-6.231 4.745-21.633 2.866-27.04 9.094-4.255 5.299 0.393 13.047 0.148 27.702-0.076 6.167-1.297 10.616-2.211 14.972-1.095 4.965-1.721 8.188 0.328 11.524 4.018 6.25 9.932 6.108 43.679 13.134 18.039 3.721 33.354 12.988 45.86 13.535 10.659 0.648 12.902-2.585 19.627-8.593 6.869-6.203 8.788-4.335 8.723-16.507 0.205-13.492-7.06-16.909-16.924-32.533s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-8.045 13.94-14.374 18.792z"/>
+   <path fill="#ad7000" d="m52.912 274.769c-6.149 4.767-21.211 2.405-27.029 8.885-4.306 5.242 0.476 12.931 0.173 27.576-0.101 6.136-1.368 10.483-2.347 15.019-1.123 5.012-1.742 8.181 0.316 11.478 4.133 6.293 10.052 5.603 43.791 12.614 18.028 3.716 32.76 12.83 45.619 13.248 10.396 0.576 12.57-2.463 19.21-8.409 6.854-6.206 8.668-4.363 8.653-16.056 0.347-13.479-6.437-16.69-16.301-32.314s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.991 14.169-14.269 19.079z"/>
+   <path fill="#b27500" d="m53.016 275.057c-6.066 4.787-20.79 1.943-27.019 8.676-4.355 5.184 0.559 12.816 0.198 27.45-0.126 6.103-1.44 10.351-2.484 15.065-1.151 5.059-1.764 8.172 0.307 11.431 4.248 6.336 10.17 5.094 43.901 12.096 18.019 3.708 32.166 12.672 45.378 12.96 10.135 0.504 12.24-2.34 18.792-8.227 6.841-6.209 8.551-4.391 8.586-15.605 0.486-13.464-5.813-16.47-15.678-32.094s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.937 14.399-14.165 19.368z"/>
+   <path fill="#b77b00" d="m53.121 275.344c-5.983 4.811-20.369 1.484-27.008 8.469-4.406 5.126 0.641 12.7 0.224 27.324-0.151 6.068-1.512 10.216-2.621 15.111-1.181 5.105-1.785 8.166 0.295 11.385 4.363 6.379 10.289 4.586 44.014 11.576 18.008 3.701 31.572 12.515 45.137 12.672 9.872 0.433 11.909-2.217 18.375-8.041 6.825-6.215 8.431-4.422 8.518-15.156 0.627-13.45-5.191-16.251-15.056-31.875s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.884 14.631-14.062 19.655z"/>
+   <path fill="#bc8100" d="m53.225 275.633c-5.9 4.832-19.948 1.023-26.997 8.259-4.457 5.069 0.724 12.585 0.249 27.198-0.177 6.037-1.584 10.082-2.758 15.158-1.21 5.152-1.808 8.158 0.284 11.338 4.479 6.422 10.407 4.078 44.125 11.059 17.997 3.693 30.979 12.355 44.896 12.384 9.608 0.36 11.578-2.095 17.957-7.858 6.812-6.217 8.313-4.449 8.45-14.707 0.766-13.435-4.569-16.03-14.434-31.654s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.829 14.859-13.956 19.943z"/>
+   <path fill="#c18700" d="m53.329 275.92c-5.817 4.854-19.526 0.563-26.985 8.051-4.507 5.011 0.807 12.47 0.273 27.072-0.201 6.004-1.655 9.949-2.894 15.205-1.239 5.199-1.829 8.151 0.273 11.291 4.594 6.465 10.526 3.57 44.236 10.541 17.985 3.686 30.384 12.196 44.655 12.096 9.345 0.287 11.245-1.973 17.539-7.676 6.797-6.221 8.193-4.479 8.381-14.256 0.906-13.42-3.946-15.812-13.811-31.436s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.774 15.094-13.851 20.232z"/>
+   <path fill="#c68c00" d="m53.433 276.209c-5.734 4.875-19.104 0.101-26.975 7.84-4.558 4.955 0.89 12.355 0.299 26.947-0.227 5.973-1.728 9.816-3.031 15.252-1.267 5.246-1.851 8.145 0.263 11.244 4.709 6.508 10.646 3.063 44.349 10.022 17.975 3.679 29.79 12.038 44.413 11.808 9.083 0.217 10.915-1.851 17.122-7.492 6.782-6.224 8.074-4.506 8.313-13.806 1.048-13.405-3.323-15.592-13.188-31.216s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.722 15.322-13.749 20.521z"/>
+   <path fill="#cc9200" d="m53.538 276.497c-5.651 4.896-18.684-0.359-26.964 7.633-4.607 4.896 0.972 12.24 0.324 26.82-0.252 5.939-1.8 9.684-3.168 15.299-1.296 5.293-1.872 8.137 0.252 11.196 4.824 6.552 10.764 2.556 44.46 9.505 17.964 3.672 29.196 11.879 44.172 11.52 8.82 0.144 10.584-1.729 16.704-7.309 6.768-6.228 7.956-4.535 8.244-13.355 1.188-13.393-2.7-15.372-12.564-30.996s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.668 15.551-13.644 20.807z"/>
+   <path fill="#d19800" d="m53.642 276.786c-5.569 4.918-18.263-0.82-26.953 7.424-4.658 4.838 1.055 12.123 0.35 26.693-0.277 5.907-1.872 9.551-3.305 15.346-1.325 5.34-1.894 8.129 0.241 11.15 4.938 6.596 10.883 2.048 44.571 8.984 17.953 3.666 28.602 11.723 43.931 11.232 8.558 0.072 10.253-1.605 16.287-7.123 6.753-6.232 7.837-4.566 8.175-12.906 1.329-13.379-2.077-15.153-11.941-30.777s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.614 15.783-13.54 21.097z"/>
+   <path fill="#d69e00" d="m53.747 277.073c-5.486 4.94-17.842-1.281-26.942 7.215-4.709 4.781 1.138 12.01 0.374 26.568-0.302 5.875-1.943 9.417-3.441 15.393-1.354 5.387-1.915 8.123 0.23 11.104 5.055 6.639 11.002 1.541 44.684 8.467 17.942 3.658 28.008 11.563 43.688 10.944 8.296 0 9.923-1.483 15.869-6.941 6.74-6.235 7.72-4.593 8.108-12.456 1.468-13.363-1.455-14.933-11.319-30.557s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.56 16.012-13.435 21.383z"/>
+   <path fill="#dba300" d="m53.851 277.361c-5.403 4.962-17.421-1.741-26.932 7.007-4.759 4.723 1.221 11.893 0.399 26.441-0.327 5.843-2.016 9.283-3.578 15.439-1.383 5.434-1.937 8.115 0.22 11.057 5.169 6.682 11.12 1.033 44.795 7.949 17.932 3.649 27.414 11.404 43.448 10.656 8.031-0.072 9.59-1.361 15.451-6.758 6.725-6.238 7.6-4.623 8.039-12.006 1.609-13.35-0.832-14.714-10.696-30.338s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.504 16.245-13.33 21.673z"/>
+   <path fill="#e0a900" d="m53.956 277.649c-5.321 4.982-16.999-2.203-26.921 6.797-4.81 4.666 1.303 11.779 0.425 26.316-0.353 5.811-2.088 9.15-3.715 15.486-1.411 5.48-1.959 8.108 0.208 11.01 5.285 6.725 11.239 0.525 44.907 7.431 17.92 3.644 26.819 11.246 43.207 10.368 7.769-0.145 9.259-1.239 15.034-6.574 6.71-6.242 7.479-4.65 7.97-11.557 1.75-13.334-0.209-14.493-10.073-30.117s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.452 16.474-13.226 21.96z"/>
+   <path fill="#e5af00" d="m54.06 277.937c-5.238 5.004-16.578-2.664-26.91 6.588-4.86 4.608 1.386 11.664 0.45 26.19-0.378 5.777-2.16 9.018-3.853 15.533-1.439 5.526-1.979 8.101 0.198 10.963 5.4 6.768 11.358 0.018 45.018 6.912 17.91 3.635 26.227 11.088 42.967 10.08 7.506-0.217 8.928-1.117 14.615-6.391 6.696-6.246 7.362-4.68 7.902-11.105 1.89-13.32 0.414-14.274-9.45-29.898s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.397 16.704-13.121 22.248z"/>
+   <path fill="#eab500" d="m54.165 278.225c-5.155 5.025-16.157-3.124-26.899 6.38-4.91 4.55 1.469 11.548 0.476 26.063-0.403 5.746-2.232 8.885-3.989 15.58-1.469 5.573-2.002 8.094 0.188 10.916 5.515 6.812 11.477-0.49 45.129 6.394 17.899 3.629 25.633 10.93 42.725 9.792 7.243-0.288 8.598-0.993 14.199-6.206 6.681-6.25 7.243-4.709 7.833-10.656 2.031-13.306 1.037-14.055-8.827-29.679s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.346 16.935-13.019 22.536z"/>
+   <path fill="#efba00" d="m54.269 278.513c-5.073 5.048-15.736-3.585-26.889 6.171-4.961 4.492 1.552 11.434 0.5 25.938-0.428 5.713-2.304 8.752-4.125 15.627-1.498 5.621-2.023 8.086 0.176 10.869 5.631 6.854 11.596-0.996 45.241 5.875 17.889 3.623 25.038 10.771 42.483 9.504 6.981-0.359 8.266-0.871 13.781-6.022 6.668-6.253 7.125-4.737 7.766-10.206 2.17-13.291 1.659-13.835-8.205-29.459s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.289 17.164-12.912 22.823z"/>
+   <path fill="#f4c000" d="m54.374 278.801c-4.99 5.068-15.314-4.047-26.878 5.962-5.012 4.435 1.634 11.317 0.525 25.812-0.453 5.682-2.376 8.618-4.263 15.674-1.526 5.668-2.045 8.08 0.166 10.822 5.745 6.898 11.714-1.505 45.353 5.357 17.878 3.613 24.444 10.613 42.243 9.216 6.717-0.433 7.934-0.749 13.362-5.839 6.653-6.258 7.007-4.768 7.697-9.756 2.312-13.277 2.282-13.616-7.582-29.24s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.235 17.395-12.807 23.112z"/>
+   <path fill="#f9c600" d="m54.477 279.088c-4.906 5.092-14.893-4.506-26.866 5.754-5.062 4.377 1.717 11.203 0.551 25.686-0.479 5.648-2.448 8.485-4.399 15.721-1.555 5.715-2.066 8.072 0.155 10.775 5.86 6.941 11.833-2.012 45.464 4.839 17.867 3.607 23.851 10.454 42.001 8.929 6.455-0.504 7.604-0.627 12.946-5.656 6.638-6.26 6.886-4.795 7.628-9.307 2.452-13.262 2.905-13.396-6.959-29.02s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.182 17.626-12.705 23.399z"/>
+   <path fill="#fc0" d="m54.582 279.377c-4.823 5.111-14.472-4.969-26.855 5.543-5.112 4.32 1.8 11.088 0.576 25.561-0.504 5.616-2.521 8.352-4.536 15.768-1.584 5.76-2.088 8.064 0.144 10.729 5.977 6.984 11.952-2.52 45.576 4.32 17.856 3.6 23.256 10.295 41.76 8.64 6.192-0.576 7.272-0.504 12.528-5.472 6.624-6.264 6.768-4.824 7.56-8.856 2.592-13.248 3.528-13.176-6.336-28.8s-11.448-18.504-18-28.872c-6.552-10.224-19.512-28.8-26.928-29.017-5.904-0.144-9.216 3.024-12.888 6.769s-7.129 17.855-12.601 23.687z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m57.701 285.002c-4.278 4.539-18.28-1.36-24.892 3.631-4.732 3.5 2.398 7.908 1.426 20.873-0.389 4.926-3.824 5.834-2.398 12.64 1.103 5.121 2.27 4.991 4.214 7.325 5.315 6.223 4.084 1.686 34.355 7.777 16.011 3.242 20.938 9.271 37.596 7.779 5.575-0.518 6.612-0.453 11.279-4.926 5.964-5.575 2.917-4.408 3.565-7.973 2.269-11.863 0.453-13.938-8.428-28.004-8.88-14.066-8.102-14.844-13.936-24.113-5.834-9.141-13.872-25.799-20.549-25.93-5.25-0.129-8.297 2.723-11.603 6.094-3.305 3.372-5.768 19.643-10.629 24.827z"/>
+   <path fill="#ffcc02" d="m57.995 285.094c-4.461 4.701-18.604-1.196-25.06 3.705-4.701 3.514 2.578 8.05 1.608 20.68-0.4 4.896-3.733 5.877-2.458 12.634 0.986 5.093 2.357 4.938 4.334 7.201 5.686 6.131 4.673 1.826 34.119 7.743 15.918 3.211 20.815 9.215 37.372 7.732 5.541-0.513 6.479-0.463 11.155-4.849 5.865-5.407 2.858-4.287 3.412-8.058 2.066-11.787 0.442-13.981-8.188-27.649-8.83-13.983-8.143-14.698-13.941-23.913-5.8-9.085-13.701-25.805-20.338-25.934-5.219-0.129-8.248 2.705-11.533 6.057-3.287 3.352-5.644 19.505-10.482 24.651z"/>
+   <path fill="#ffcc05" d="m58.289 285.185c-4.644 4.866-18.93-1.031-25.229 3.78-4.669 3.527 2.759 8.191 1.792 20.488-0.413 4.866-3.642 5.918-2.519 12.625 0.872 5.066 2.447 4.887 4.455 7.078 6.057 6.04 5.263 1.969 33.883 7.709 15.825 3.18 20.693 9.159 37.148 7.686 5.508-0.506 6.345-0.471 11.03-4.77 5.768-5.24 2.803-4.168 3.26-8.142 1.865-11.716 0.432-14.027-7.949-27.298-8.78-13.899-8.183-14.553-13.948-23.713-5.764-9.03-13.529-25.811-20.126-25.938-5.188-0.129-8.198 2.688-11.465 6.021-3.266 3.331-5.517 19.368-10.332 24.474z"/>
+   <path fill="#ffcc07" d="m58.584 285.276c-4.827 5.03-19.255-0.865-25.397 3.855-4.639 3.541 2.938 8.332 1.975 20.295-0.425 4.838-3.551 5.961-2.578 12.619 0.757 5.039 2.536 4.834 4.575 6.955 6.428 5.949 5.852 2.108 33.646 7.674 15.733 3.147 20.571 9.103 36.925 7.639 5.475-0.501 6.211-0.48 10.905-4.693 5.67-5.072 2.745-4.045 3.107-8.224 1.663-11.642 0.42-14.073-7.711-26.946-8.73-13.814-8.223-14.406-13.952-23.511-5.729-8.976-13.358-25.817-19.916-25.944-5.156-0.127-8.148 2.674-11.396 5.984s-5.391 19.229-10.183 24.297z"/>
+   <path fill="#ffcd0a" d="m58.878 285.368c-5.01 5.193-19.579-0.701-25.565 3.93-4.607 3.555 3.117 8.475 2.157 20.102-0.437 4.809-3.459 6.004-2.639 12.613 0.643 5.011 2.626 4.781 4.695 6.83 6.799 5.857 6.442 2.25 33.411 7.64 15.641 3.118 20.45 9.048 36.701 7.593 5.44-0.494 6.076-0.488 10.781-4.615 5.57-4.904 2.688-3.926 2.954-8.308 1.462-11.569 0.409-14.118-7.472-26.593-8.68-13.732-8.263-14.262-13.958-23.311-5.695-8.922-13.188-25.824-19.705-25.951-5.125-0.127-8.1 2.658-11.326 5.949-3.227 3.289-5.266 19.091-10.034 24.121z"/>
+   <path fill="#ffcd0c" d="m59.173 285.458c-5.193 5.358-19.905-0.535-25.734 4.008-4.577 3.566 3.297 8.613 2.34 19.908-0.449 4.778-3.368 6.045-2.698 12.605 0.526 4.982 2.715 4.729 4.815 6.707 7.17 5.766 7.031 2.391 33.175 7.604 15.549 3.088 20.328 8.994 36.477 7.547 5.408-0.488 5.943-0.498 10.657-4.537 5.472-4.737 2.63-3.805 2.802-8.393 1.261-11.494 0.398-14.162-7.232-26.24-8.63-13.647-8.304-14.117-13.964-23.109-5.66-8.867-13.017-25.829-19.494-25.956-5.094-0.126-8.05 2.642-11.257 5.912-3.21 3.27-5.142 18.955-9.887 23.944z"/>
+   <path fill="#ffcd0f" d="m59.467 285.547c-5.376 5.523-20.229-0.369-25.903 4.084-4.545 3.58 3.478 8.756 2.523 19.715-0.461 4.75-3.277 6.088-2.758 12.599 0.411 4.955 2.804 4.677 4.936 6.584 7.541 5.675 7.621 2.532 32.938 7.569 15.456 3.056 20.206 8.938 36.253 7.5 5.375-0.482 5.811-0.506 10.533-4.459 5.374-4.57 2.572-3.686 2.649-8.477 1.058-11.42 0.387-14.209-6.995-25.888-8.58-13.563-8.344-13.972-13.969-22.909-5.626-8.813-12.846-25.834-19.283-25.961-5.063-0.125-8 2.625-11.188 5.877-3.188 3.251-5.015 18.818-9.736 23.766z"/>
+   <path fill="#ffcd11" d="m59.76 285.639c-5.559 5.688-20.555-0.205-26.071 4.158-4.515 3.594 3.657 8.896 2.706 19.521-0.473 4.721-3.186 6.131-2.818 12.594 0.297 4.926 2.894 4.623 5.057 6.459 7.911 5.584 8.21 2.674 32.703 7.535 15.362 3.025 20.084 8.883 36.027 7.453 5.342-0.477 5.677-0.515 10.409-4.381 5.275-4.402 2.516-3.564 2.497-8.561 0.855-11.348 0.375-14.254-6.756-25.535-8.53-13.479-8.385-13.825-13.976-22.709-5.59-8.758-12.673-25.842-19.071-25.965-5.031-0.125-7.951 2.608-11.119 5.838-3.168 3.232-4.888 18.684-9.588 23.593z"/>
+   <path fill="#ffce14" d="m60.055 285.73c-5.742 5.851-20.88-0.04-26.24 4.233-4.483 3.607 3.837 9.039 2.889 19.33-0.485 4.69-3.095 6.172-2.878 12.584 0.182 4.9 2.982 4.572 5.177 6.338 8.282 5.492 8.8 2.814 32.467 7.498 15.271 2.996 19.962 8.828 35.804 7.408 5.309-0.472 5.543-0.523 10.285-4.304 5.177-4.235 2.458-3.444 2.344-8.644 0.654-11.273 0.364-14.299-6.518-25.184-8.479-13.395-8.425-13.679-13.98-22.507-5.556-8.704-12.502-25.849-18.86-25.972-5-0.123-7.901 2.593-11.05 5.803s-4.765 18.547-9.44 23.417z"/>
+   <path fill="#ffce16" d="m60.349 285.821c-5.925 6.016-21.205 0.125-26.408 4.309-4.453 3.621 4.017 9.18 3.07 19.137-0.496 4.662-3.002 6.215-2.938 12.579 0.066 4.872 3.072 4.518 5.298 6.213 8.653 5.401 9.389 2.956 32.23 7.464 15.178 2.964 19.84 8.771 35.58 7.361 5.275-0.465 5.409-0.532 10.159-4.225 5.079-4.068 2.401-3.324 2.192-8.729 0.452-11.2 0.354-14.346-6.279-24.831-8.429-13.312-8.464-13.534-13.985-22.306-5.521-8.65-12.331-25.854-18.649-25.978-4.969-0.123-7.853 2.577-10.98 5.767-3.129 3.19-4.637 18.409-9.29 23.239z"/>
+   <path fill="#ffce19" d="m60.643 285.911c-6.107 6.18-21.529 0.291-26.577 4.385-4.421 3.635 4.197 9.322 3.254 18.945-0.508 4.631-2.911 6.256-2.997 12.571-0.049 4.845 3.161 4.465 5.418 6.089 9.023 5.309 9.979 3.098 31.994 7.43 15.085 2.934 19.718 8.717 35.355 7.314 5.242-0.459 5.276-0.541 10.036-4.148 4.98-3.899 2.344-3.203 2.039-8.811 0.25-11.127 0.342-14.391-6.04-24.479-8.38-13.228-8.505-13.389-13.991-22.105-5.486-8.596-12.16-25.859-18.438-25.982-4.938-0.123-7.803 2.561-10.911 5.73-3.109 3.17-4.513 18.272-9.142 23.061z"/>
+   <path fill="#ffce1c" d="m60.938 286.002c-6.291 6.344-21.855 0.455-26.746 4.459-4.391 3.648 4.377 9.463 3.437 18.752-0.521 4.603-2.82 6.299-3.058 12.564-0.163 4.817 3.251 4.413 5.539 5.965 9.395 5.219 10.567 3.24 31.758 7.396 14.993 2.903 19.597 8.661 35.132 7.269 5.209-0.453 5.143-0.55 9.912-4.07 4.882-3.732 2.286-3.082 1.887-8.895 0.048-11.053 0.329-14.436-5.802-24.126-8.33-13.144-8.545-13.243-13.997-21.905-5.451-8.541-11.988-25.865-18.228-25.988-4.906-0.121-7.753 2.545-10.843 5.695-3.088 3.149-4.385 18.132-8.991 22.884z"/>
+   <path fill="#ffcf1e" d="m61.232 286.092c-6.473 6.51-22.18 0.621-26.914 4.535-4.359 3.662 4.557 9.604 3.619 18.559-0.532 4.574-2.729 6.342-3.117 12.559-0.278 4.789 3.34 4.36 5.659 5.842 9.766 5.127 11.157 3.381 31.521 7.359 14.9 2.872 19.475 8.607 34.908 7.223 5.176-0.447 5.008-0.559 9.787-3.992 4.784-3.565 2.229-2.963 1.735-8.979-0.155-10.98 0.317-14.482-5.564-23.773-8.279-13.061-8.585-13.098-14.002-21.705-5.416-8.485-11.817-25.871-18.017-25.992-4.875-0.121-7.704 2.527-10.773 5.658-3.068 3.128-4.26 17.995-8.842 22.706z"/>
+   <path fill="#ffcf21" d="m61.526 286.184c-6.655 6.673-22.505 0.785-27.082 4.611-4.328 3.674 4.736 9.744 3.802 18.365-0.544 4.543-2.638 6.383-3.178 12.551-0.394 4.761 3.43 4.308 5.78 5.718 10.136 5.036 11.746 3.522 31.285 7.325 14.808 2.841 19.353 8.551 34.685 7.176 5.142-0.441 4.875-0.567 9.663-3.914 4.685-3.398 2.171-2.842 1.582-9.063-0.357-10.906 0.307-14.527-5.325-23.422-8.23-12.976-8.625-12.951-14.008-21.503-5.382-8.432-11.646-25.878-17.806-25.999-4.844-0.119-7.654 2.512-10.704 5.622-3.049 3.109-4.134 17.859-8.694 22.533z"/>
+   <path fill="#ffcf23" d="m61.821 286.275c-6.839 6.837-22.83 0.95-27.251 4.687-4.298 3.688 4.916 9.886 3.984 18.172-0.557 4.515-2.546 6.426-3.237 12.545-0.509 4.732 3.519 4.255 5.9 5.594 10.507 4.945 12.336 3.663 31.05 7.29 14.715 2.812 19.23 8.496 34.46 7.129 5.108-0.435 4.74-0.575 9.538-3.835 4.587-3.23 2.113-2.723 1.43-9.146-0.559-10.834 0.296-14.572-5.086-23.069-8.18-12.892-8.666-12.806-14.014-21.302-5.347-8.377-11.476-25.885-17.595-26.004-4.813-0.119-7.605 2.496-10.635 5.584-3.029 3.088-4.008 17.722-8.544 22.355z"/>
+   <path fill="#ffcf26" d="m62.115 286.366c-7.021 7.002-23.154 1.115-27.42 4.762-4.266 3.701 5.096 10.027 4.168 17.979-0.568 4.486-2.455 6.469-3.297 12.538-0.624 4.706 3.607 4.203 6.021 5.472 10.878 4.852 12.925 3.803 30.813 7.254 14.622 2.78 19.108 8.441 34.236 7.084 5.075-0.43 4.606-0.584 9.413-3.759 4.489-3.063 2.058-2.601 1.277-9.229-0.761-10.76 0.284-14.618-4.848-22.717-8.129-12.809-8.706-12.66-14.019-21.102-5.313-8.322-11.304-25.891-17.384-26.01-4.781-0.118-7.556 2.48-10.566 5.55-3.008 3.068-3.881 17.584-8.394 22.178z"/>
+   <path fill="#ffd028" d="m62.409 286.456c-7.204 7.166-23.479 1.281-27.588 4.838-4.235 3.715 5.275 10.168 4.351 17.787-0.58 4.455-2.364 6.51-3.357 12.53-0.738 4.679 3.697 4.149 6.142 5.347 11.249 4.763 13.515 3.946 30.577 7.221 14.529 2.748 18.986 8.386 34.012 7.037 5.043-0.424 4.474-0.594 9.289-3.68 4.392-2.897 2-2.481 1.125-9.314-0.963-10.686 0.273-14.664-4.608-22.364-8.079-12.726-8.746-12.517-14.024-20.901-5.277-8.269-11.133-25.896-17.173-26.015-4.75-0.116-7.506 2.464-10.497 5.513-2.992 3.047-3.759 17.447-8.249 22.001z"/>
+   <path fill="#ffd02b" d="m62.704 286.547c-7.388 7.33-23.805 1.445-27.757 4.912-4.204 3.729 5.455 10.311 4.533 17.594-0.593 4.427-2.272 6.553-3.417 12.523-0.854 4.651 3.786 4.098 6.262 5.225 11.619 4.671 14.104 4.087 30.341 7.185 14.438 2.72 18.864 8.33 33.787 6.991 5.01-0.418 4.341-0.604 9.166-3.604 4.292-2.729 1.942-2.359 0.972-9.396-1.163-10.613 0.263-14.709-4.369-22.012-8.03-12.641-8.787-12.371-14.03-20.7-5.243-8.214-10.962-25.903-16.962-26.021-4.719-0.117-7.457 2.447-10.428 5.477-2.972 3.029-3.632 17.313-8.098 21.826z"/>
+   <path fill="#ffd02d" d="m62.998 286.638c-7.57 7.493-24.13 1.61-27.925 4.987-4.174 3.742 5.635 10.451 4.716 17.4-0.604 4.398-2.182 6.596-3.478 12.518-0.969 4.623 3.875 4.045 6.382 5.101 11.991 4.579 14.694 4.228 30.105 7.149 14.345 2.688 18.743 8.275 33.563 6.944 4.977-0.411 4.207-0.61 9.042-3.524 4.193-2.562 1.884-2.239 0.819-9.481-1.366-10.538 0.251-14.754-4.133-21.659-7.979-12.557-8.825-12.224-14.034-20.498-5.208-8.16-10.791-25.91-16.751-26.027-4.688-0.114-7.407 2.433-10.358 5.441-2.951 3.01-3.505 17.174-7.948 21.649z"/>
+   <path fill="#ffd030" d="m63.292 286.729c-7.753 7.658-24.454 1.775-28.094 5.063-4.142 3.756 5.815 10.594 4.899 17.209-0.616 4.367-2.09 6.638-3.537 12.51-1.084 4.596 3.964 3.992 6.502 4.977 12.362 4.488 15.283 4.369 29.869 7.115 14.252 2.656 18.621 8.22 33.34 6.898 4.943-0.406 4.073-0.621 8.917-3.447 4.095-2.395 1.828-2.119 0.667-9.565-1.568-10.465 0.239-14.8-3.894-21.307-7.929-12.474-8.866-12.078-14.04-20.298-5.173-8.105-10.619-25.916-16.54-26.031-4.656-0.115-7.357 2.415-10.289 5.404-2.932 2.988-3.38 17.036-7.8 21.472z"/>
+   <path fill="#ffd133" d="m63.587 286.82c-7.937 7.822-24.78 1.94-28.263 5.138-4.111 3.77 5.995 10.734 5.081 17.016-0.627 4.339-1.998 6.68-3.597 12.504-1.199 4.568 4.054 3.939 6.623 4.854 12.732 4.396 15.873 4.51 29.633 7.08 14.16 2.625 18.499 8.164 33.116 6.852 4.909-0.4 3.939-0.629 8.793-3.369 3.997-2.227 1.77-1.999 0.514-9.648-1.771-10.393 0.228-14.846-3.654-20.955-7.88-12.39-8.907-11.934-14.046-20.098-5.139-8.051-10.448-25.922-16.329-26.037-4.625-0.113-7.309 2.398-10.221 5.368s-3.254 16.897-7.65 21.295z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m88.782 218.681c-0.936 2.088-1.728 20.017 2.952 27 4.68 6.911 3.312 10.872-1.872 5.616-5.4-5.112-8.928-12.816-9-18.145 0-3.096 2.376-15.84 3.313-17.208 1.007-1.44 5.327 1.153 4.607 2.737z"/>
+   <path fill="#030303" d="m88.692 219.032c-0.903 2.34-1.656 19.698 3.01 26.668 4.665 6.901 3.186 10.49-1.84 5.356-5.23-4.997-8.607-12.47-8.741-17.787-0.043-3.114 2.236-15.419 3.133-16.791 0.961-1.394 5.126 0.989 4.438 2.554z"/>
+   <path fill="#070707" d="m88.602 219.379c-0.871 2.593-1.584 19.383 3.067 26.338 4.65 6.891 3.06 10.109-1.808 5.098-5.062-4.882-8.287-12.125-8.481-17.432-0.087-3.131 2.095-14.998 2.952-16.373 0.915-1.345 4.926 0.828 4.27 2.369z"/>
+   <path fill="#0b0b0b" d="m88.512 219.729c-0.839 2.844-1.513 19.066 3.124 26.006 4.638 6.881 2.935 9.729-1.774 4.84-4.893-4.768-7.967-11.779-8.223-17.076-0.129-3.149 1.955-14.576 2.772-15.955 0.868-1.299 4.724 0.665 4.101 2.185z"/>
+   <path fill="#0f0f0f" d="m88.422 220.079c-0.806 3.096-1.439 18.748 3.183 25.674 4.623 6.869 2.809 9.347-1.742 4.58-4.724-4.651-7.646-11.434-7.963-16.719-0.173-3.168 1.814-14.154 2.592-15.537 0.819-1.252 4.52 0.504 3.93 2.002z"/>
+   <path fill="#131313" d="m88.332 220.426c-0.773 3.349-1.368 18.433 3.24 25.345 4.608 6.858 2.682 8.964-1.71 4.319-4.554-4.535-7.326-11.088-7.704-16.361-0.216-3.186 1.674-13.734 2.412-15.12 0.774-1.206 4.32 0.343 3.762 1.817z"/>
+   <path fill="#161616" d="m88.242 220.777c-0.741 3.601-1.296 18.115 3.298 25.013 4.594 6.848 2.556 8.582-1.678 4.061-4.385-4.421-7.006-10.742-7.444-16.006-0.26-3.203 1.533-13.313 2.231-14.702 0.728-1.16 4.118 0.18 3.593 1.634z"/>
+   <path fill="#1a1a1a" d="m88.152 221.125c-0.709 3.853-1.224 17.799 3.355 24.682 4.579 6.837 2.43 8.201-1.646 3.802-4.216-4.306-6.686-10.397-7.186-15.649-0.303-3.221 1.394-12.892 2.052-14.285 0.682-1.112 3.918 0.018 3.425 1.45z"/>
+   <path fill="#1e1e1e" d="m88.062 221.475c-0.677 4.104-1.152 17.482 3.413 24.35 4.564 6.826 2.304 7.82-1.613 3.543-4.046-4.191-6.365-10.051-6.927-15.293-0.345-3.24 1.253-12.47 1.872-13.867 0.634-1.066 3.716-0.144 3.255 1.267z"/>
+   <path fill="#222" d="m87.972 221.825c-0.645 4.355-1.08 17.164 3.47 24.018 4.551 6.816 2.179 7.439-1.58 3.285-3.877-4.076-6.044-9.707-6.667-14.938-0.389-3.258 1.112-12.049 1.691-13.449 0.587-1.019 3.514-0.306 3.086 1.084z"/>
+   <path fill="#262626" d="m87.883 222.172c-0.612 4.609-1.009 16.849 3.527 23.688 4.536 6.804 2.052 7.056-1.548 3.024-3.708-3.961-5.724-9.36-6.408-14.58-0.432-3.276 0.973-11.629 1.513-13.032 0.54-0.971 3.311-0.467 2.916 0.9z"/>
+   <path fill="#2a2a2a" d="m87.792 222.523c-0.579 4.86-0.936 16.531 3.586 23.356 4.521 6.793 1.926 6.675-1.516 2.765-3.539-3.845-5.403-9.015-6.148-14.224-0.476-3.293 0.831-11.207 1.332-12.614 0.493-0.925 3.11-0.63 2.746 0.717z"/>
+   <path fill="#2d2d2d" d="m87.702 222.872c-0.547 5.112-0.864 16.215 3.644 23.025 4.507 6.783 1.8 6.293-1.483 2.506-3.369-3.73-5.083-8.669-5.89-13.867-0.519-3.312 0.691-10.785 1.152-12.197 0.446-0.878 2.908-0.792 2.577 0.533z"/>
+   <path fill="#313131" d="m87.612 223.221c-0.515 5.363-0.792 15.898 3.701 22.693 4.492 6.772 1.674 5.912-1.451 2.248-3.2-3.615-4.763-8.324-5.63-13.512-0.563-3.33 0.551-10.363 0.972-11.779 0.399-0.831 2.707-0.953 2.408 0.35z"/>
+   <path fill="#353535" d="m87.522 223.57c-0.482 5.616-0.72 15.581 3.758 22.363 4.479 6.761 1.549 5.53-1.418 1.987-3.031-3.5-4.442-7.978-5.371-13.154-0.604-3.348 0.41-9.943 0.792-11.361 0.352-0.785 2.506-1.115 2.239 0.165z"/>
+   <path fill="#393939" d="m87.432 223.918c-0.45 5.869-0.648 15.265 3.815 22.033 4.464 6.75 1.422 5.147-1.386 1.728-2.862-3.384-4.122-7.632-5.112-12.798-0.647-3.366 0.271-9.522 0.612-10.944 0.307-0.737 2.305-1.278 2.071-0.019z"/>
+   <path fill="#3d3d3d" d="m87.343 224.269c-0.418 6.12-0.576 14.946 3.873 21.7 4.45 6.74 1.296 4.767-1.354 1.469-2.692-3.27-3.802-7.286-4.853-12.441-0.691-3.383 0.129-9.101 0.432-10.527 0.26-0.691 2.103-1.44 1.902-0.201z"/>
+   <path fill="#414141" d="m87.252 224.618c-0.385 6.373-0.504 14.631 3.932 21.369 4.436 6.729 1.17 4.385-1.321 1.211-2.523-3.154-3.481-6.941-4.594-12.086-0.734-3.402-0.011-8.68 0.252-10.109 0.212-0.644 1.901-1.602 1.731-0.385z"/>
+   <path fill="#444" d="m87.162 224.967c-0.353 6.623-0.432 14.314 3.989 21.037 4.421 6.719 1.044 4.004-1.289 0.951-2.354-3.039-3.161-6.595-4.334-11.729-0.778-3.42-0.151-8.258 0.071-9.691 0.166-0.597 1.7-1.763 1.563-0.568z"/>
+   <path fill="#484848" d="m87.072 225.316c-0.32 6.876-0.36 13.997 4.047 20.707 4.406 6.707 0.918 3.622-1.257 0.692-2.186-2.924-2.841-6.25-4.075-11.373-0.82-3.438-0.292-7.838-0.108-9.273 0.119-0.551 1.498-1.926 1.393-0.753z"/>
+   <path fill="#4c4c4c" d="m86.982 225.665c-0.288 7.129-0.288 13.68 4.104 20.377 4.393 6.695 0.792 3.24-1.224 0.432s-2.52-5.904-3.816-11.016c-0.863-3.457-0.432-7.416-0.287-8.856 0.071-0.505 1.295-2.089 1.223-0.937z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m88.782 218.681c4.32-9.433 6.696-19.584 12.888-29.448 6.12-9.792 3.672-13.608-0.863-8.64-4.536 4.968-9.504 15.48-9.504 15.48s-5.832 9.216-7.128 19.872c-0.217 1.8 3.887 4.248 4.607 2.736z"/>
+   <path fill="#020202" d="m88.968 218.071c4.279-9.5 6.615-19.246 12.586-28.802 5.901-9.488 3.608-13.279-0.764-8.472-4.403 4.847-9.302 15.236-9.368 15.381 0 0-5.637 8.993-6.877 19.239-0.209 1.771 3.72 4.145 4.423 2.654z"/>
+   <path fill="#050505" d="m89.152 217.459c4.239-9.566 6.535-18.908 12.284-28.155 5.683-9.183 3.547-12.95-0.663-8.303-4.27 4.725-9.099 14.991-9.231 15.282 0 0-5.442 8.766-6.627 18.605-0.201 1.741 3.554 4.042 4.237 2.571z"/>
+   <path fill="#070707" d="m89.338 216.849c4.199-9.634 6.454-18.572 11.981-27.51 5.465-8.878 3.484-12.621-0.563-8.135-4.137 4.605-8.896 14.748-9.096 15.184 0 0-5.247 8.542-6.376 17.972-0.192 1.713 3.387 3.937 4.054 2.489z"/>
+   <path fill="#0a0a0a" d="m89.522 216.239c4.159-9.701 6.375-18.234 11.68-26.865 5.247-8.573 3.422-12.292-0.461-7.966-4.005 4.483-8.693 14.503-8.96 15.085 0 0-5.053 8.317-6.126 17.337-0.186 1.684 3.219 3.837 3.867 2.409z"/>
+   <path fill="#0c0c0c" d="m89.708 215.627c4.118-9.769 6.294-17.897 11.376-26.218 5.029-8.268 3.36-11.962-0.359-7.797-3.871 4.361-8.49 14.259-8.823 14.985 0 0-4.858 8.093-5.876 16.706-0.179 1.653 3.051 3.731 3.682 2.324z"/>
+   <path fill="#0f0f0f" d="m89.893 215.017c4.077-9.836 6.213-17.56 11.073-25.573 4.812-7.963 3.298-11.633-0.259-7.629-3.738 4.241-8.288 14.015-8.688 14.887 0 0-4.663 7.868-5.625 16.072-0.169 1.624 2.886 3.628 3.499 2.243z"/>
+   <path fill="#111" d="m90.078 214.407c4.037-9.904 6.133-17.224 10.772-24.928 4.593-7.658 3.234-11.304-0.159-7.46-3.605 4.119-8.085 13.771-8.551 14.788 0 0-4.47 7.645-5.375 15.439-0.162 1.594 2.718 3.524 3.313 2.161z"/>
+   <path fill="#141414" d="m90.263 213.795c3.997-9.971 6.052-16.885 10.47-24.281 4.374-7.353 3.172-10.975-0.059-7.291-3.472 3.998-7.882 13.526-8.415 14.689 0 0-4.273 7.418-5.124 14.805-0.154 1.565 2.551 3.421 3.128 2.078z"/>
+   <path fill="#161616" d="m90.449 213.184c3.956-10.037 5.972-16.548 10.167-23.635 4.156-7.048 3.11-10.645 0.043-7.123-3.34 3.877-7.68 13.283-8.279 14.591 0 0-4.08 7.194-4.874 14.172-0.147 1.535 2.383 3.317 2.943 1.995z"/>
+   <path fill="#191919" d="m90.634 212.573c3.916-10.105 5.892-16.209 9.865-22.989 3.938-6.743 3.047-10.316 0.144-6.954-3.207 3.755-7.477 13.038-8.143 14.491 0 0-3.886 6.969-4.624 13.54-0.139 1.506 2.217 3.213 2.758 1.912z"/>
+   <path fill="#1c1c1c" d="m90.819 211.963c3.875-10.174 5.811-15.874 9.563-22.344 3.721-6.438 2.984-9.987 0.244-6.785-3.073 3.634-7.274 12.793-8.007 14.392 0 0-3.69 6.745-4.373 12.905-0.131 1.477 2.049 3.112 2.573 1.832z"/>
+   <path fill="#1e1e1e" d="m91.004 211.352c3.836-10.24 5.73-15.536 9.262-21.698 3.501-6.133 2.922-9.658 0.344-6.617-2.94 3.513-7.071 12.55-7.87 14.293 0 0-3.496 6.521-4.123 12.272-0.124 1.447 1.881 3.009 2.387 1.75z"/>
+   <path fill="#212121" d="m91.189 210.741c3.795-10.307 5.649-15.198 8.958-21.052 3.284-5.828 2.859-9.328 0.445-6.448-2.808 3.392-6.868 12.305-7.734 14.195 0 0-3.301 6.295-3.872 11.639-0.115 1.418 1.715 2.904 2.203 1.666z"/>
+   <path fill="#232323" d="m91.375 210.129c3.754-10.373 5.569-14.86 8.655-20.405 3.066-5.523 2.797-8.999 0.547-6.279-2.675 3.27-6.666 12.061-7.599 14.097 0 0-3.106 6.07-3.622 11.004-0.107 1.388 1.548 2.801 2.019 1.583z"/>
+   <path fill="#262626" d="m91.559 209.519c3.714-10.44 5.489-14.523 8.354-19.76 2.847-5.218 2.735-8.67 0.647-6.111-2.542 3.149-6.463 11.817-7.462 13.997 0 0-2.912 5.848-3.372 10.373-0.099 1.357 1.381 2.697 1.833 1.501z"/>
+   <path fill="#282828" d="m91.745 208.909c3.674-10.509 5.408-14.187 8.051-19.115 2.629-4.913 2.672-8.341 0.748-5.942-2.409 3.028-6.261 11.573-7.326 13.898 0 0-2.717 5.621-3.121 9.738-0.092 1.33 1.213 2.595 1.648 1.421z"/>
+   <path fill="#2b2b2b" d="m91.929 208.297c3.634-10.575 5.328-13.848 7.75-18.468 2.41-4.608 2.609-8.011 0.848-5.773-2.275 2.906-6.058 11.328-7.189 13.799 0 0-2.522 5.397-2.871 9.106-0.084 1.299 1.046 2.491 1.462 1.336z"/>
+   <path fill="#2d2d2d" d="m92.115 207.687c3.593-10.643 5.247-13.512 7.447-17.823 2.191-4.303 2.547-7.682 0.949-5.605-2.144 2.786-5.855 11.085-7.055 13.701 0 0-2.327 5.172-2.62 8.473-0.076 1.269 0.881 2.386 1.279 1.254z"/>
+   <path fill="#303030" d="m92.301 207.077c3.552-10.71 5.167-13.175 7.145-17.178 1.974-3.998 2.484-7.353 1.05-5.436-2.011 2.664-5.652 10.84-6.918 13.602 0 0-2.133 4.947-2.37 7.839-0.07 1.24 0.712 2.283 1.093 1.173z"/>
+   <path fill="#333" d="m92.485 206.465c3.513-10.778 5.087-12.837 6.843-16.531s2.422-7.024 1.15-5.268c-1.877 2.543-5.449 10.596-6.781 13.502 0 0-1.938 4.724-2.12 7.207-0.061 1.211 0.545 2.18 0.908 1.09z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m273.03 225.592c2.088-5.903 1.872-20.951-3.456-30.671-1.872-3.528-3.672-7.632-4.752-7.848-1.152-0.216-3.24 2.088-3.024 2.448 0.288 0.576 10.009 14.256 7.992 32.832-0.144 1.513 2.736 4.608 3.24 3.239z"/>
+   <path fill="#030303" d="m272.936 224.831c2.025-5.719 1.753-20.379-3.344-29.663-1.815-3.407-3.535-7.374-4.595-7.59-1.122-0.214-3.125 2.022-2.925 2.367 0.258 0.562 9.605 13.778 7.729 31.753-0.129 1.487 2.647 4.456 3.135 3.133z"/>
+   <path fill="#070707" d="m272.841 224.068c1.967-5.532 1.637-19.808-3.228-28.654-1.762-3.286-3.401-7.115-4.44-7.332-1.091-0.211-3.009 1.956-2.824 2.287 0.227 0.548 9.201 13.299 7.466 30.672-0.118 1.463 2.555 4.305 3.026 3.027z"/>
+   <path fill="#0b0b0b" d="m272.747 223.305c1.904-5.348 1.518-19.235-3.115-27.645-1.706-3.165-3.265-6.856-4.282-7.073-1.062-0.21-2.896 1.889-2.727 2.206 0.197 0.534 8.799 12.821 7.203 29.592-0.103 1.44 2.466 4.153 2.921 2.92z"/>
+   <path fill="#0f0f0f" d="m272.652 222.542c1.843-5.162 1.398-18.662-3.001-26.635-1.65-3.044-3.13-6.598-4.127-6.815-1.03-0.207-2.779 1.823-2.626 2.126 0.167 0.52 8.396 12.341 6.94 28.511-0.09 1.416 2.376 4.001 2.814 2.813z"/>
+   <path fill="#131313" d="m272.558 221.779c1.78-4.976 1.279-18.09-2.889-25.626-1.595-2.923-2.994-6.34-3.97-6.557-1-0.205-2.664 1.756-2.527 2.045 0.137 0.506 7.993 11.861 6.679 27.432-0.078 1.392 2.285 3.849 2.707 2.706z"/>
+   <path fill="#161616" d="m272.463 221.016c1.721-4.79 1.163-17.518-2.773-24.617-1.539-2.802-2.858-6.081-3.814-6.299-0.969-0.203-2.548 1.691-2.427 1.965 0.106 0.492 7.59 11.383 6.415 26.352-0.065 1.369 2.194 3.697 2.599 2.599z"/>
+   <path fill="#1a1a1a" d="m272.369 220.254c1.659-4.605 1.044-16.946-2.66-23.609-1.483-2.681-2.723-5.822-3.658-6.04-0.938-0.201-2.434 1.624-2.326 1.884 0.074 0.478 7.185 10.904 6.15 25.271-0.051 1.344 2.106 3.546 2.494 2.494z"/>
+   <path fill="#1e1e1e" d="m272.274 219.491c1.598-4.42 0.926-16.373-2.546-22.6-1.43-2.56-2.587-5.564-3.501-5.782-0.908-0.198-2.319 1.558-2.229 1.804 0.044 0.464 6.782 10.425 5.889 24.19-0.037 1.321 2.016 3.396 2.387 2.388z"/>
+   <path fill="#222" d="m272.18 218.728c1.535-4.233 0.807-15.802-2.434-21.59-1.373-2.439-2.452-5.306-3.345-5.524-0.877-0.197-2.203 1.491-2.128 1.723 0.014 0.45 6.379 9.947 5.625 23.111-0.023 1.297 1.927 3.242 2.282 2.28z"/>
+   <path fill="#262626" d="m272.085 217.965c1.476-4.049 0.69-15.229-2.318-20.582-1.317-2.317-2.316-5.046-3.188-5.265-0.847-0.194-2.088 1.425-2.029 1.642-0.016 0.436 5.977 9.468 5.362 22.032-0.011 1.272 1.835 3.089 2.173 2.173z"/>
+   <path fill="#2a2a2a" d="m271.991 217.202c1.413-3.861 0.571-14.656-2.206-19.572-1.262-2.196-2.18-4.788-3.032-5.007-0.815-0.191-1.973 1.36-1.929 1.562-0.047 0.422 5.573 8.988 5.099 20.951 0.003 1.247 1.746 2.939 2.068 2.066z"/>
+   <path fill="#2d2d2d" d="m271.896 216.439c1.353-3.677 0.453-14.084-2.091-18.563-1.207-2.076-2.045-4.529-2.876-4.749-0.786-0.19-1.858 1.293-1.83 1.481-0.077 0.408 5.17 8.51 4.836 19.87 0.017 1.226 1.656 2.789 1.961 1.961z"/>
+   <path fill="#313131" d="m271.802 215.676c1.29-3.491 0.334-13.512-1.979-17.553-1.151-1.956-1.909-4.272-2.72-4.493-0.755-0.187-1.742 1.227-1.73 1.401-0.106 0.394 4.768 8.031 4.573 18.791 0.031 1.202 1.567 2.637 1.856 1.854z"/>
+   <path fill="#353535" d="m271.707 214.915c1.23-3.307 0.217-12.94-1.864-16.545-1.096-1.834-1.773-4.014-2.563-4.234-0.725-0.185-1.627 1.16-1.631 1.32-0.138 0.38 4.364 7.552 4.311 17.71 0.042 1.176 1.475 2.485 1.747 1.749z"/>
+   <path fill="#393939" d="m271.613 214.151c1.168-3.119 0.098-12.367-1.751-15.535-1.04-1.714-1.638-3.755-2.407-3.976-0.693-0.183-1.512 1.094-1.531 1.24-0.168 0.366 3.962 7.074 4.049 16.63 0.055 1.153 1.384 2.332 1.64 1.641z"/>
+   <path fill="#3d3d3d" d="m271.518 213.388c1.106-2.935-0.021-11.796-1.638-14.527-0.983-1.592-1.502-3.496-2.25-3.716-0.664-0.181-1.396 1.028-1.432 1.159-0.198 0.352 3.558 6.594 3.785 15.549 0.07 1.13 1.296 2.183 1.535 1.535z"/>
+   <path fill="#414141" d="m271.424 212.625c1.047-2.75-0.139-11.223-1.522-13.518-0.93-1.471-1.367-3.238-2.094-3.459-0.635-0.178-1.282 0.962-1.333 1.079-0.229 0.338 3.153 6.114 3.521 14.47 0.083 1.106 1.205 2.03 1.428 1.428z"/>
+   <path fill="#444" d="m271.329 211.862c0.985-2.563-0.256-10.65-1.409-12.508-0.874-1.35-1.23-2.979-1.938-3.2-0.604-0.177-1.166 0.895-1.233 0.998-0.259 0.324 2.751 5.636 3.259 13.39 0.096 1.082 1.115 1.876 1.321 1.32z"/>
+   <path fill="#484848" d="m271.235 211.099c0.923-2.377-0.375-10.077-1.296-11.499-0.818-1.229-1.097-2.72-1.781-2.942-0.573-0.174-1.052 0.829-1.134 0.918-0.289 0.309 2.348 5.156 2.996 12.309 0.11 1.058 1.025 1.726 1.215 1.214z"/>
+   <path fill="#4c4c4c" d="m271.14 210.336c0.861-2.192-0.493-9.506-1.183-10.49-0.763-1.107-0.96-2.463-1.625-2.684-0.542-0.172-0.936 0.762-1.034 0.836-0.319 0.297 1.945 4.68 2.733 11.229 0.124 1.035 0.936 1.576 1.109 1.109z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m264.822 187.073c-10.224-13.968-23.472-18.504-22.104-14.112 0 0 10.152 5.76 19.08 16.56 1.728 2.088 4.608-0.288 3.024-2.448z"/>
+   <path fill="#030303" d="m264.372 186.687c-9.924-13.495-22.894-17.912-21.539-13.7 0.018 0.012 9.901 5.614 18.609 16.071 1.678 2.016 4.467-0.285 2.93-2.371z"/>
+   <path fill="#070707" d="m263.922 186.3c-9.624-13.022-22.316-17.319-20.975-13.287 0.036 0.023 9.652 5.467 18.139 15.582 1.628 1.943 4.325-0.283 2.836-2.295z"/>
+   <path fill="#0b0b0b" d="m263.472 185.913c-9.324-12.549-21.739-16.726-20.41-12.874 0.053 0.034 9.4 5.32 17.668 15.093 1.578 1.871 4.183-0.28 2.742-2.219z"/>
+   <path fill="#0f0f0f" d="m263.022 185.527c-9.024-12.077-21.162-16.134-19.847-12.462 0.071 0.045 9.151 5.174 17.198 14.604 1.529 1.798 4.043-0.278 2.649-2.142z"/>
+   <path fill="#131313" d="m262.571 185.14c-8.723-11.603-20.583-15.541-19.28-12.049 0.088 0.056 8.901 5.027 16.728 14.114 1.477 1.726 3.899-0.275 2.552-2.065z"/>
+   <path fill="#161616" d="m262.121 184.753c-8.423-11.13-20.006-14.948-18.716-11.636 0.106 0.067 8.651 4.88 16.257 13.625 1.428 1.654 3.759-0.272 2.459-1.989z"/>
+   <path fill="#1a1a1a" d="m261.671 184.367c-8.124-10.658-19.428-14.356-18.15-11.224 0.124 0.078 8.399 4.734 15.785 13.136 1.378 1.581 3.617-0.27 2.365-1.912z"/>
+   <path fill="#1e1e1e" d="m261.221 183.98c-7.824-10.185-18.851-13.763-17.588-10.811 0.143 0.089 8.151 4.587 15.315 12.647 1.33 1.508 3.477-0.267 2.273-1.836z"/>
+   <path fill="#222" d="m260.771 183.593c-7.524-9.711-18.273-13.17-17.022-10.398 0.159 0.1 7.9 4.44 14.844 12.158 1.279 1.436 3.335-0.265 2.178-1.76z"/>
+   <path fill="#262626" d="m260.321 183.206c-7.224-9.238-17.695-12.578-16.458-9.985 0.177 0.111 7.65 4.293 14.374 11.668 1.229 1.364 3.193-0.262 2.084-1.683z"/>
+   <path fill="#2a2a2a" d="m259.871 182.82c-6.924-8.766-17.118-11.986-15.893-9.573 0.193 0.122 7.398 4.147 13.902 11.179 1.18 1.291 3.053-0.259 1.991-1.606z"/>
+   <path fill="#2d2d2d" d="m259.42 182.433c-6.623-8.293-16.539-11.393-15.328-9.16 0.214 0.133 7.15 4 13.434 10.69 1.128 1.219 2.909-0.257 1.894-1.53z"/>
+   <path fill="#313131" d="m258.97 182.046c-6.323-7.819-15.963-10.8-14.764-8.747 0.23 0.144 6.899 3.853 12.962 10.201 1.08 1.146 2.769-0.254 1.802-1.454z"/>
+   <path fill="#353535" d="m258.52 181.66c-6.023-7.347-15.384-10.208-14.199-8.335 0.248 0.155 6.649 3.707 12.492 9.712 1.028 1.073 2.627-0.252 1.707-1.377z"/>
+   <path fill="#393939" d="m258.07 181.273c-5.723-6.874-14.807-9.615-13.634-7.922 0.265 0.166 6.398 3.56 12.021 9.222 0.978 1.002 2.485-0.249 1.613-1.3z"/>
+   <path fill="#3d3d3d" d="m257.62 180.886c-5.423-6.401-14.229-9.021-13.07-7.509 0.283 0.177 6.149 3.413 11.552 8.733 0.927 0.929 2.343-0.246 1.518-1.224z"/>
+   <path fill="#414141" d="m257.17 180.5c-5.124-5.928-13.65-8.43-12.505-7.097 0.301 0.188 5.898 3.267 11.079 8.244 0.879 0.856 2.203-0.244 1.426-1.147z"/>
+   <path fill="#444" d="m256.719 180.113c-4.823-5.455-13.073-7.837-11.94-6.684 0.319 0.199 5.649 3.12 10.609 7.755 0.829 0.784 2.061-0.241 1.331-1.071z"/>
+   <path fill="#484848" d="m256.269 179.726c-4.523-4.982-12.495-7.244-11.375-6.271 0.336 0.21 5.397 2.973 10.138 7.266 0.779 0.711 1.92-0.239 1.237-0.995z"/>
+   <path fill="#4c4c4c" d="m255.819 179.339c-4.223-4.509-11.918-6.652-10.812-5.859 0.354 0.222 5.148 2.827 9.668 6.777 0.73 0.639 1.779-0.236 1.144-0.918z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m273.03 225.592c0.144 6.265-5.76 22.248-7.992 21.673-2.52-0.576 0.504-5.257 2.809-13.177 0.936-3.312 1.655-11.447 1.943-11.735 0.936-0.936 3.24 1.728 3.24 3.239z"/>
+   <path fill="#050505" d="m272.846 226.116c0.103 6.082-5.638 21.594-7.797 21.018-2.422-0.567 0.548-5.146 2.814-12.928 0.899-3.178 1.595-10.947 1.887-11.25 0.914-0.927 3.147 1.527 3.096 3.16z"/>
+   <path fill="#0a0a0a" d="m272.662 226.637c0.063 5.902-5.514 20.939-7.601 20.363-2.323-0.558 0.592-5.035 2.82-12.681 0.861-3.041 1.534-10.446 1.83-10.761 0.89-0.917 3.054 1.327 2.951 3.079z"/>
+   <path fill="#0f0f0f" d="m272.478 227.159c0.021 5.721-5.392 20.284-7.405 19.711-2.224-0.55 0.635-4.927 2.827-12.434 0.824-2.907 1.473-9.945 1.773-10.273 0.866-0.911 2.959 1.125 2.805 2.996z"/>
+   <path fill="#141414" d="m272.294 227.68c-0.02 5.539-5.268 19.63-7.21 19.057-2.125-0.541 0.68-4.816 2.835-12.186 0.786-2.771 1.412-9.445 1.717-9.786 0.84-0.901 2.863 0.924 2.658 2.915z"/>
+   <path fill="#191919" d="m272.11 228.202c-0.063 5.359-5.146 18.977-7.014 18.403-2.027-0.532 0.722-4.706 2.841-11.938 0.748-2.637 1.351-8.944 1.659-9.299 0.818-0.893 2.77 0.722 2.514 2.834z"/>
+   <path fill="#1e1e1e" d="m271.926 228.723c-0.103 5.179-5.021 18.322-6.818 17.75-1.928-0.523 0.766-4.596 2.848-11.691 0.711-2.5 1.29-8.443 1.603-8.811 0.792-0.885 2.674 0.522 2.367 2.752z"/>
+   <path fill="#232323" d="m271.742 229.245c-0.144 4.998-4.9 17.668-6.623 17.096-1.83-0.514 0.811-4.485 2.854-11.442 0.673-2.366 1.229-7.944 1.545-8.325 0.771-0.876 2.583 0.32 2.224 2.671z"/>
+   <path fill="#282828" d="m271.558 229.766c-0.186 4.816-4.777 17.013-6.428 16.443-1.731-0.506 0.854-4.377 2.86-11.196 0.636-2.231 1.168-7.443 1.488-7.837 0.749-0.866 2.49 0.119 2.08 2.59z"/>
+   <path fill="#2d2d2d" d="m271.374 230.288c-0.226 4.637-4.653 16.359-6.231 15.789-1.632-0.496 0.896-4.266 2.866-10.947 0.6-2.098 1.107-6.943 1.433-7.351 0.722-0.859 2.393-0.081 1.932 2.509z"/>
+   <path fill="#333" d="m271.19 230.809c-0.268 4.456-4.531 15.705-6.036 15.136-1.534-0.489 0.94-4.155 2.873-10.7 0.561-1.961 1.046-6.443 1.375-6.863 0.7-0.848 2.3-0.282 1.788 2.427z"/>
+   <path fill="#383838" d="m271.006 231.331c-0.308 4.275-4.407 15.051-5.841 14.482-1.435-0.48 0.984-4.046 2.88-10.453 0.524-1.826 0.985-5.941 1.318-6.375 0.676-0.84 2.206-0.483 1.643 2.346z"/>
+   <path fill="#3d3d3d" d="m270.822 231.853c-0.35 4.093-4.285 14.396-5.645 13.828-1.338-0.472 1.027-3.937 2.886-10.206 0.485-1.691 0.924-5.441 1.261-5.887 0.653-0.832 2.113-0.684 1.498 2.265z"/>
+   <path fill="#424242" d="m270.638 232.374c-0.392 3.914-4.162 13.742-5.45 13.176-1.238-0.463 1.072-3.826 2.893-9.959 0.449-1.555 0.863-4.94 1.204-5.399 0.629-0.824 2.019-0.886 1.353 2.182z"/>
+   <path fill="#474747" d="m270.454 232.896c-0.432 3.731-4.039 13.087-5.254 12.521-1.14-0.453 1.115-3.715 2.9-9.711 0.411-1.42 0.802-4.439 1.146-4.912 0.606-0.815 1.925-1.086 1.208 2.102z"/>
+   <path fill="#4c4c4c" d="m270.27 233.417c-0.474 3.553-3.916 12.434-5.06 11.869-1.041-0.445 1.159-3.606 2.907-9.463 0.373-1.287 0.741-3.941 1.089-4.427 0.583-0.806 1.832-1.287 1.064 2.021z"/>
+   <path fill="#515151" d="m270.086 233.939c-0.514 3.37-3.793 11.778-4.862 11.214-0.942-0.436 1.201-3.496 2.913-9.216 0.336-1.151 0.68-3.438 1.032-3.938 0.558-0.797 1.736-1.489 0.917 1.94z"/>
+   <path fill="#565656" d="m269.902 234.461c-0.555 3.188-3.671 11.123-4.667 10.56-0.844-0.429 1.246-3.386 2.919-8.968 0.298-1.016 0.619-2.939 0.976-3.451 0.535-0.788 1.643-1.689 0.772 1.859z"/>
+   <path fill="#5b5b5b" d="m269.718 234.982c-0.597 3.009-3.548 10.47-4.472 9.907-0.745-0.42 1.29-3.275 2.926-8.721 0.262-0.881 0.559-2.438 0.919-2.963 0.511-0.781 1.549-1.89 0.627 1.777z"/>
+   <path fill="#606060" d="m269.534 235.504c-0.638 2.828-3.425 9.814-4.276 9.252-0.646-0.409 1.333-3.166 2.933-8.473 0.224-0.746 0.497-1.938 0.862-2.476 0.487-0.769 1.454-2.09 0.481 1.697z"/>
+   <path fill="#666" d="m269.35 236.025c-0.68 2.647-3.303 9.161-4.081 8.599-0.548-0.4 1.377-3.056 2.938-8.225 0.187-0.611 0.437-1.438 0.806-1.988 0.464-0.763 1.361-2.293 0.337 1.614z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m251.07 187.865c-1.537 1.622-2.903 9.991 0.938 12.893 3.844 2.818 10.59-2.391 10.59-5.379-0.086-6.746-9.991-9.222-11.528-7.514z"/>
+   <path fill="#010101" d="m251.207 188.006c-1.559 1.611-2.876 9.823 0.857 12.667 3.731 2.764 10.349-2.273 10.384-5.279-0.047-6.576-9.681-9.083-11.241-7.388z"/>
+   <path fill="#030303" d="m251.344 188.146c-1.582 1.601-2.85 9.653 0.774 12.438 3.62 2.709 10.109-2.154 10.178-5.177-0.007-6.404-9.37-8.943-10.952-7.261z"/>
+   <path fill="#050505" d="m251.481 188.287c-1.604 1.589-2.823 9.484 0.691 12.211 3.511 2.653 9.869-2.037 9.975-5.078 0.031-6.232-9.061-8.802-10.666-7.133z"/>
+   <path fill="#070707" d="m251.617 188.427c-1.626 1.579-2.795 9.316 0.611 11.984 3.397 2.6 9.629-1.918 9.768-4.976 0.071-6.062-8.751-8.664-10.379-7.008z"/>
+   <path fill="#090909" d="m251.754 188.567c-1.648 1.568-2.768 9.146 0.529 11.758 3.287 2.543 9.389-1.802 9.563-4.875 0.109-5.892-8.441-8.525-10.092-6.883z"/>
+   <path fill="#0b0b0b" d="m251.891 188.708c-1.671 1.557-2.741 8.978 0.445 11.529 3.177 2.489 9.15-1.683 9.358-4.774 0.15-5.72-8.13-8.385-9.803-6.755z"/>
+   <path fill="#0d0d0d" d="m252.028 188.848c-1.694 1.546-2.715 8.809 0.364 11.302 3.064 2.435 8.908-1.565 9.152-4.673 0.189-5.549-7.82-8.245-9.516-6.629z"/>
+   <path fill="#0f0f0f" d="m252.165 188.989c-1.716 1.535-2.688 8.64 0.282 11.074 2.953 2.38 8.669-1.447 8.948-4.572 0.226-5.378-7.512-8.106-9.23-6.502z"/>
+   <path fill="#111" d="m252.301 189.129c-1.737 1.524-2.659 8.471 0.2 10.847 2.844 2.325 8.431-1.33 8.743-4.471 0.266-5.207-7.201-7.966-8.943-6.376z"/>
+   <path fill="#131313" d="m252.438 189.269c-1.76 1.514-2.633 8.304 0.118 10.619 2.73 2.271 8.189-1.212 8.538-4.369 0.305-5.036-6.892-7.827-8.656-6.25z"/>
+   <path fill="#151515" d="m252.575 189.41c-1.783 1.503-2.606 8.133 0.036 10.391 2.62 2.216 7.949-1.094 8.332-4.268 0.344-4.865-6.581-7.687-8.368-6.123z"/>
+   <path fill="#161616" d="m252.712 189.55c-1.805 1.492-2.58 7.965-0.046 10.164 2.508 2.162 7.709-0.975 8.127-4.167 0.383-4.694-6.272-7.548-8.081-5.997z"/>
+   <path fill="#181818" d="m252.849 189.691c-1.828 1.481-2.554 7.796-0.129 9.937 2.397 2.105 7.47-0.857 7.922-4.066 0.423-4.524-5.961-7.409-7.793-5.871z"/>
+   <path fill="#1a1a1a" d="m252.985 189.831c-1.85 1.47-2.525 7.626-0.21 9.708 2.286 2.053 7.229-0.74 7.717-3.964 0.461-4.352-5.652-7.269-7.507-5.744z"/>
+   <path fill="#1c1c1c" d="m253.122 189.971c-1.872 1.46-2.499 7.459-0.292 9.482 2.175 1.996 6.989-0.623 7.511-3.865 0.501-4.18-5.341-7.128-7.219-5.617z"/>
+   <path fill="#1e1e1e" d="m253.259 190.112c-1.895 1.448-2.472 7.289-0.375 9.254 2.064 1.942 6.75-0.504 7.308-3.763 0.539-4.01-5.033-6.99-6.933-5.491z"/>
+   <path fill="#202020" d="m253.396 190.252c-1.917 1.438-2.445 7.122-0.457 9.027 1.953 1.888 6.51-0.386 7.102-3.662 0.578-3.839-4.722-6.85-6.645-5.365z"/>
+   <path fill="#222" d="m253.533 190.393c-1.939 1.426-2.418 6.951-0.539 8.799 1.841 1.832 6.271-0.268 6.896-3.561 0.618-3.668-4.412-6.711-6.357-5.238z"/>
+   <path fill="#242424" d="m253.669 190.533c-1.961 1.416-2.391 6.783-0.621 8.572 1.731 1.776 6.03-0.149 6.692-3.46 0.657-3.497-4.102-6.571-6.071-5.112z"/>
+   <path fill="#262626" d="m253.806 190.673c-1.984 1.405-2.364 6.615-0.703 8.344 1.619 1.724 5.79-0.032 6.485-3.358 0.697-3.326-3.791-6.432-5.782-4.986z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m250.71 256.698c1.513 1.512 2.809-2.232 4.32-3.457 1.512-1.224 3.96-3.888 8.856-3.888s4.535-0.144 4.319-2.017c-0.144-1.799-1.584-1.655-5.903-1.008-4.32 0.576-7.2 2.809-8.929 4.824-1.654 1.945-3.527 4.681-2.663 5.546z"/>
+   <path fill="#050505" d="m251.043 256.331c1.459 1.449 2.703-2.121 4.205-3.308 1.501-1.187 3.931-3.731 8.64-3.731 4.71-0.002 4.415-0.129 4.209-1.94-0.139-1.743-1.543-1.593-5.749-0.979-4.207 0.543-7.029 2.703-8.712 4.648-1.616 1.877-3.438 4.474-2.593 5.31z"/>
+   <path fill="#0a0a0a" d="m251.376 255.961c1.406 1.389 2.6-2.008 4.089-3.156 1.491-1.148 3.901-3.576 8.425-3.577 4.521-0.001 4.293-0.11 4.096-1.862-0.132-1.688-1.501-1.531-5.594-0.951-4.093 0.51-6.857 2.596-8.495 4.471-1.575 1.812-3.348 4.271-2.521 5.075z"/>
+   <path fill="#0f0f0f" d="m251.709 255.594c1.354 1.326 2.494-1.895 3.975-3.008 1.479-1.111 3.871-3.42 8.207-3.422s4.171-0.094 3.984-1.785c-0.126-1.631-1.46-1.467-5.438-0.924-3.979 0.479-6.687 2.492-8.28 4.297-1.533 1.747-3.257 4.066-2.448 4.842z"/>
+   <path fill="#141414" d="m252.042 255.226c1.302 1.265 2.39-1.783 3.858-2.856 1.47-1.076 3.842-3.266 7.991-3.268s4.05-0.077 3.873-1.709c-0.119-1.575-1.419-1.404-5.284-0.895-3.865 0.444-6.515 2.385-8.063 4.121-1.49 1.678-3.165 3.861-2.375 4.607z"/>
+   <path fill="#191919" d="m252.374 254.859c1.249 1.202 2.285-1.671 3.744-2.708 1.458-1.037 3.813-3.109 7.774-3.111 3.963-0.004 3.929-0.061 3.761-1.633-0.113-1.519-1.377-1.341-5.128-0.867-3.751 0.414-6.344 2.279-7.847 3.945-1.449 1.613-3.075 3.656-2.304 4.374z"/>
+   <path fill="#1e1e1e" d="m252.707 254.491c1.196 1.141 2.182-1.559 3.628-2.558 1.448-1 3.783-2.954 7.56-2.957 3.775-0.003 3.806-0.043 3.648-1.556-0.106-1.461-1.336-1.277-4.974-0.838-3.637 0.379-6.172 2.174-7.63 3.77-1.408 1.546-2.984 3.451-2.232 4.139z"/>
+   <path fill="#232323" d="m253.04 254.124c1.144 1.078 2.076-1.447 3.514-2.41 1.437-0.961 3.753-2.797 7.342-2.799 3.589-0.004 3.685-0.027 3.537-1.48-0.101-1.405-1.294-1.215-4.818-0.811-3.524 0.349-6.001 2.068-7.415 3.594-1.367 1.48-2.894 3.245-2.16 3.906z"/>
+   <path fill="#282828" d="m253.373 253.754c1.09 1.018 1.972-1.334 3.398-2.258 1.426-0.926 3.723-2.642 7.125-2.646 3.402-0.005 3.563-0.011 3.426-1.403-0.095-1.349-1.253-1.15-4.664-0.781-3.409 0.314-5.829 1.961-7.198 3.418-1.325 1.415-2.803 3.041-2.087 3.67z"/>
+   <path fill="#2d2d2d" d="m253.706 253.388c1.038 0.954 1.866-1.222 3.282-2.11 1.416-0.887 3.694-2.486 6.909-2.49 3.217-0.004 3.441 0.008 3.313-1.326-0.088-1.293-1.212-1.088-4.508-0.754-3.296 0.283-5.658 1.857-6.981 3.244-1.284 1.345-2.712 2.836-2.015 3.436z"/>
+   <path fill="#333" d="m254.039 253.02c0.985 0.893 1.762-1.109 3.167-1.96s3.664-2.33 6.693-2.335c3.029-0.006 3.32 0.023 3.202-1.249-0.082-1.237-1.171-1.024-4.354-0.726-3.182 0.25-5.485 1.75-6.765 3.066-1.243 1.282-2.622 2.634-1.943 3.204z"/>
+   <path fill="#383838" d="m254.372 252.652c0.933 0.831 1.657-0.998 3.051-1.81 1.396-0.813 3.636-2.174 6.478-2.18 2.843-0.006 3.199 0.039 3.09-1.172-0.076-1.181-1.129-0.963-4.198-0.697-3.068 0.217-5.314 1.644-6.55 2.891-1.202 1.214-2.531 2.427-1.871 2.968z"/>
+   <path fill="#3d3d3d" d="m254.704 252.284c0.88 0.771 1.553-0.885 2.938-1.66 1.383-0.775 3.604-2.019 6.26-2.024 2.656-0.007 3.078 0.058 2.979-1.095-0.069-1.125-1.088-0.899-4.044-0.67-2.954 0.185-5.144 1.539-6.333 2.715-1.16 1.148-2.441 2.222-1.8 2.734z"/>
+   <path fill="#424242" d="m255.037 251.917c0.827 0.707 1.448-0.773 2.821-1.51 1.373-0.738 3.576-1.863 6.044-1.871 2.47-0.007 2.956 0.074 2.867-1.018-0.063-1.068-1.046-0.836-3.889-0.641-2.841 0.151-4.973 1.433-6.116 2.539-1.119 1.083-2.35 2.018-1.727 2.501z"/>
+   <path fill="#474747" d="m255.37 251.549c0.774 0.645 1.344-0.661 2.706-1.362 1.362-0.7 3.545-1.706 5.828-1.713 2.283-0.009 2.834 0.09 2.754-0.942-0.057-1.012-1.005-0.773-3.733-0.613-2.727 0.119-4.801 1.328-5.899 2.365-1.078 1.013-2.26 1.81-1.656 2.265z"/>
+   <path fill="#4c4c4c" d="m255.703 251.181c0.721 0.584 1.239-0.55 2.59-1.212 1.353-0.663 3.517-1.551 5.612-1.559 2.096-0.009 2.713 0.107 2.643-0.865-0.051-0.955-0.964-0.709-3.577-0.584-2.613 0.086-4.631 1.222-5.686 2.188-1.035 0.949-2.168 1.607-1.582 2.032z"/>
+   <path fill="#515151" d="m256.036 250.813c0.669 0.521 1.134-0.436 2.476-1.063 1.341-0.625 3.485-1.395 5.395-1.402 1.91-0.01 2.591 0.124 2.531-0.789-0.044-0.898-0.922-0.646-3.423-0.557-2.499 0.055-4.458 1.117-5.469 2.014-0.994 0.882-2.077 1.402-1.51 1.797z"/>
+   <path fill="#565656" d="m256.369 250.446c0.616 0.459 1.029-0.324 2.36-0.912 1.33-0.589 3.456-1.24 5.178-1.248 1.723-0.01 2.47 0.141 2.42-0.713-0.039-0.842-0.881-0.582-3.268-0.527-2.387 0.021-4.287 1.01-5.252 1.836-0.953 0.816-1.987 1.199-1.438 1.564z"/>
+   <path fill="#5b5b5b" d="m256.701 250.079c0.564 0.397 0.926-0.213 2.245-0.764s3.427-1.084 4.963-1.093c1.536-0.011 2.348 0.157 2.307-0.636-0.031-0.785-0.839-0.52-3.112-0.5-2.271-0.01-4.116 0.906-5.035 1.662-0.913 0.751-1.898 0.993-1.368 1.331z"/>
+   <path fill="#606060" d="m257.034 249.709c0.511 0.336 0.821-0.1 2.13-0.612 1.309-0.515 3.397-0.929 4.746-0.938 1.351-0.01 2.227 0.176 2.196-0.558-0.026-0.729-0.799-0.457-2.958-0.472-2.158-0.043-3.945 0.799-4.82 1.486-0.87 0.682-1.805 0.788-1.294 1.094z"/>
+   <path fill="#666" d="m257.367 249.342c0.458 0.273 0.716 0.012 2.014-0.465 1.299-0.476 3.368-0.771 4.53-0.781 1.163-0.012 2.105 0.191 2.084-0.482-0.02-0.673-0.757-0.393-2.803-0.443-2.044-0.076-3.773 0.693-4.604 1.311-0.828 0.616-1.714 0.582-1.221 0.86z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m270.222 247.265c0 2.304 4.68 3.096 9.144 3.743 4.392 0.648 7.92 1.513 8.136 6.121 0.216 4.535-0.936 7.775 1.08 7.416 4.32-0.793 5.904-5.473 5.832-7.633 0-2.16-3.168-6.047-8.855-8.207-4.177-1.584-7.2-2.305-10.872-2.449-4.897-0.214-4.465 1.009-4.465 1.009z"/>
+   <path fill="#030303" d="m270.348 247.304c0.012 2.239 4.643 2.97 9.049 3.639 4.352 0.675 7.75 1.511 8.11 6.002 0.345 4.415-0.854 7.515 1.136 7.188 4.145-0.739 5.688-5.2 5.607-7.332-0.015-2.151-3.118-5.91-8.733-8.038-4.129-1.563-7.11-2.298-10.74-2.452-4.754-0.217-4.438 0.952-4.429 0.993z"/>
+   <path fill="#070707" d="m270.474 247.342c0.023 2.174 4.605 2.845 8.953 3.533 4.312 0.701 7.58 1.508 8.087 5.885 0.471 4.295-0.771 7.252 1.189 6.963 3.97-0.689 5.472-4.93 5.384-7.033-0.028-2.145-3.068-5.773-8.61-7.87-4.082-1.543-7.022-2.291-10.609-2.456-4.612-0.218-4.412 0.896-4.394 0.978z"/>
+   <path fill="#0b0b0b" d="m270.6 247.379c0.035 2.109 4.568 2.721 8.857 3.431 4.271 0.728 7.411 1.506 8.063 5.767 0.599 4.174-0.689 6.988 1.245 6.735 3.795-0.638 5.257-4.66 5.159-6.733-0.044-2.137-3.019-5.636-8.488-7.701-4.035-1.522-6.933-2.285-10.478-2.459-4.469-0.219-4.384 0.837-4.358 0.96z"/>
+   <path fill="#0f0f0f" d="m270.726 247.418c0.047 2.043 4.531 2.595 8.762 3.324 4.232 0.754 7.242 1.504 8.039 5.649 0.725 4.052-0.608 6.728 1.299 6.509 3.621-0.586 5.041-4.389 4.937-6.436-0.06-2.127-2.971-5.496-8.367-7.53-3.988-1.502-6.842-2.278-10.346-2.464-4.328-0.22-4.359 0.784-4.324 0.948z"/>
+   <path fill="#131313" d="m270.852 247.458c0.059 1.978 4.495 2.469 8.667 3.219 4.19 0.781 7.071 1.502 8.014 5.531 0.854 3.932-0.526 6.465 1.354 6.283 3.445-0.535 4.824-4.119 4.712-6.137-0.074-2.119-2.92-5.359-8.245-7.361-3.941-1.482-6.753-2.271-10.213-2.469-4.186-0.221-4.333 0.726-4.289 0.934z"/>
+   <path fill="#161616" d="m270.978 247.495c0.07 1.914 4.458 2.344 8.57 3.115 4.151 0.807 6.903 1.5 7.99 5.413 0.98 3.812-0.443 6.202 1.409 6.056 3.271-0.482 4.609-3.848 4.488-5.836-0.088-2.111-2.871-5.222-8.123-7.193-3.894-1.461-6.663-2.264-10.081-2.471-4.043-0.223-4.306 0.67-4.253 0.916z"/>
+   <path fill="#1a1a1a" d="m271.104 247.534c0.082 1.848 4.422 2.219 8.476 3.01 4.111 0.832 6.734 1.498 7.965 5.295 1.108 3.69-0.36 5.94 1.464 5.83 3.097-0.433 4.394-3.578 4.265-5.537-0.104-2.104-2.821-5.084-8-7.023-3.848-1.441-6.575-2.26-9.949-2.477-3.905-0.223-4.283 0.613-4.221 0.902z"/>
+   <path fill="#1e1e1e" d="m271.23 247.573c0.094 1.781 4.385 2.092 8.381 2.904 4.07 0.859 6.563 1.495 7.939 5.178 1.236 3.568-0.278 5.678 1.52 5.602 2.921-0.381 4.177-3.305 4.04-5.237-0.118-2.097-2.771-4.946-7.878-6.854-3.8-1.42-6.485-2.252-9.817-2.479-3.762-0.226-4.256 0.556-4.185 0.886z"/>
+   <path fill="#222" d="m271.356 247.61c0.105 1.717 4.348 1.969 8.285 2.801 4.029 0.885 6.395 1.493 7.916 5.059 1.362 3.449-0.197 5.416 1.573 5.377 2.746-0.329 3.962-3.036 3.816-4.939-0.133-2.087-2.722-4.808-7.756-6.684-3.753-1.4-6.396-2.247-9.686-2.484-3.618-0.227-4.227 0.499-4.148 0.87z"/>
+   <path fill="#262626" d="m271.482 247.648c0.118 1.651 4.311 1.843 8.189 2.694 3.99 0.914 6.226 1.492 7.892 4.943 1.491 3.328-0.115 5.152 1.629 5.149 2.571-0.278 3.746-2.765 3.592-4.64-0.146-2.08-2.672-4.672-7.634-6.516-3.705-1.38-6.306-2.24-9.553-2.488-3.478-0.225-4.203 0.446-4.115 0.858z"/>
+   <path fill="#2a2a2a" d="m271.608 247.687c0.129 1.587 4.273 1.716 8.094 2.59 3.95 0.938 6.056 1.489 7.867 4.825 1.618 3.206-0.033 4.891 1.684 4.922 2.396-0.227 3.53-2.494 3.368-4.34-0.162-2.072-2.623-4.534-7.512-6.348-3.658-1.358-6.216-2.232-9.421-2.492-3.336-0.226-4.177 0.39-4.08 0.843z"/>
+   <path fill="#2d2d2d" d="m271.734 247.725c0.141 1.521 4.237 1.591 7.999 2.484 3.909 0.967 5.886 1.488 7.842 4.707 1.746 3.086 0.05 4.629 1.739 4.697 2.221-0.176 3.313-2.225 3.144-4.041-0.177-2.064-2.572-4.396-7.389-6.178-3.612-1.339-6.128-2.227-9.29-2.497-3.194-0.227-4.151 0.334-4.045 0.828z"/>
+   <path fill="#313131" d="m271.86 247.763c0.153 1.456 4.2 1.466 7.903 2.381 3.869 0.991 5.717 1.485 7.817 4.589 1.873 2.965 0.132 4.365 1.794 4.469 2.046-0.123 3.099-1.953 2.92-3.742-0.191-2.055-2.523-4.258-7.267-6.008-3.565-1.318-6.038-2.22-9.158-2.5-3.051-0.229-4.124 0.276-4.009 0.811z"/>
+   <path fill="#353535" d="m271.986 247.801c0.165 1.392 4.163 1.341 7.808 2.275 3.829 1.018 5.547 1.483 7.794 4.473 2 2.843 0.213 4.103 1.848 4.242 1.873-0.074 2.883-1.683 2.696-3.443-0.206-2.047-2.474-4.12-7.145-5.838-3.517-1.299-5.948-2.215-9.026-2.506-2.91-0.229-4.099 0.221-3.975 0.797z"/>
+   <path fill="#393939" d="m272.112 247.84c0.176 1.326 4.126 1.215 7.712 2.17 3.789 1.045 5.378 1.482 7.771 4.354 2.127 2.723 0.295 3.842 1.901 4.016 1.698-0.021 2.667-1.412 2.474-3.144-0.222-2.038-2.426-3.981-7.023-5.669-3.47-1.277-5.859-2.208-8.894-2.509-2.769-0.231-4.074 0.164-3.941 0.782z"/>
+   <path fill="#3d3d3d" d="m272.238 247.877c0.188 1.262 4.089 1.09 7.617 2.066 3.749 1.071 5.208 1.479 7.745 4.236 2.255 2.602 0.377 3.578 1.957 3.789 1.522 0.029 2.451-1.141 2.249-2.844-0.236-2.033-2.375-3.846-6.901-5.5-3.423-1.258-5.769-2.203-8.762-2.514-2.626-0.231-4.046 0.109-3.905 0.767z"/>
+   <path fill="#414141" d="m272.364 247.917c0.2 1.195 4.052 0.965 7.522 1.961 3.708 1.098 5.037 1.477 7.72 4.119 2.383 2.479 0.46 3.315 2.012 3.562 1.348 0.081 2.236-0.87 2.025-2.545-0.251-2.022-2.325-3.707-6.778-5.331-3.377-1.237-5.681-2.195-8.631-2.518-2.485-0.233-4.02 0.05-3.87 0.752z"/>
+   <path fill="#444" d="m272.49 247.956c0.212 1.129 4.015 0.838 7.426 1.855 3.668 1.124 4.869 1.475 7.696 4 2.51 2.359 0.542 3.055 2.067 3.336 1.173 0.133 2.02-0.6 1.801-2.246-0.266-2.016-2.276-3.568-6.656-5.16-3.329-1.218-5.591-2.189-8.499-2.521-2.343-0.235-3.994-0.007-3.835 0.736z"/>
+   <path fill="#484848" d="m272.616 247.993c0.223 1.065 3.979 0.715 7.331 1.752 3.628 1.15 4.699 1.473 7.671 3.883 2.638 2.238 0.624 2.791 2.122 3.108 0.998 0.185 1.804-0.329 1.577-1.946-0.28-2.008-2.227-3.432-6.534-4.992-3.282-1.196-5.501-2.182-8.367-2.525-2.201-0.235-3.968-0.064-3.8 0.72z"/>
+   <path fill="#4c4c4c" d="m272.742 248.032c0.235 1 3.941 0.588 7.235 1.645 3.588 1.178 4.529 1.472 7.646 3.766 2.766 2.118 0.706 2.529 2.177 2.883 0.823 0.235 1.589-0.059 1.354-1.648-0.295-1.998-2.177-3.293-6.412-4.822-3.235-1.176-5.412-2.176-8.235-2.529-2.059-0.239-3.942-0.119-3.765 0.705z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#4c4c4c" d="m287.565 252.854c1.646 1 1.353 2.059 2.412 2.766 0.528 0.352 1.412 0.352 0.882-1-0.706-1.588-1.294-2.472-4.941-3.943-2.353-0.941-1.882 0.059 1.647 2.177z"/>
+   <path fill="#505050" d="m287.609 252.868c1.605 0.975 1.32 2.008 2.353 2.696 0.517 0.343 1.377 0.343 0.86-0.976-0.689-1.549-1.262-2.41-4.82-3.846-2.295-0.917-1.836 0.059 1.607 2.126z"/>
+   <path fill="#545454" d="m287.652 252.879c1.567 0.951 1.287 1.957 2.294 2.629 0.503 0.334 1.343 0.334 0.839-0.951-0.671-1.51-1.23-2.35-4.699-3.749-2.238-0.893-1.79 0.058 1.566 2.071z"/>
+   <path fill="#575757" d="m287.696 252.891c1.526 0.926 1.254 1.908 2.235 2.563 0.489 0.325 1.308 0.325 0.816-0.928-0.653-1.471-1.199-2.289-4.578-3.652-2.179-0.872-1.743 0.055 1.527 2.017z"/>
+   <path fill="#5b5b5b" d="m287.74 252.903c1.485 0.902 1.22 1.857 2.175 2.494 0.479 0.318 1.274 0.318 0.796-0.902-0.637-1.432-1.167-2.229-4.457-3.556-2.122-0.849-1.697 0.054 1.486 1.964z"/>
+   <path fill="#5f5f5f" d="m287.783 252.915c1.446 0.879 1.188 1.808 2.117 2.426 0.464 0.31 1.239 0.31 0.773-0.877-0.619-1.394-1.136-2.168-4.336-3.459-2.064-0.826-1.65 0.052 1.446 1.91z"/>
+   <path fill="#636363" d="m287.827 252.926c1.405 0.854 1.154 1.758 2.057 2.359 0.452 0.301 1.205 0.301 0.754-0.853-0.603-1.354-1.104-2.108-4.216-3.363-2.007-0.801-1.605 0.053 1.405 1.857z"/>
+   <path fill="#676767" d="m287.871 252.94c1.364 0.828 1.121 1.705 1.998 2.29 0.438 0.292 1.17 0.292 0.731-0.828-0.585-1.315-1.072-2.047-4.095-3.267-1.948-0.779-1.558 0.05 1.366 1.805z"/>
+   <path fill="#6b6b6b" d="m287.914 252.952c1.325 0.805 1.088 1.655 1.94 2.223 0.425 0.283 1.135 0.283 0.709-0.803-0.568-1.277-1.041-1.988-3.974-3.17-1.891-0.757-1.512 0.047 1.325 1.75z"/>
+   <path fill="#6e6e6e" d="m287.958 252.963c1.284 0.779 1.056 1.605 1.88 2.156 0.413 0.274 1.102 0.274 0.688-0.779-0.551-1.238-1.009-1.926-3.853-3.073-1.833-0.733-1.466 0.046 1.285 1.696z"/>
+   <path fill="#727272" d="m288.002 252.976c1.243 0.755 1.021 1.554 1.821 2.087 0.399 0.266 1.066 0.266 0.666-0.755-0.533-1.199-0.977-1.865-3.731-2.976-1.776-0.71-1.421 0.045 1.244 1.644z"/>
+   <path fill="#767676" d="m288.045 252.989c1.203 0.73 0.989 1.504 1.763 2.02 0.387 0.257 1.031 0.257 0.645-0.731-0.516-1.159-0.946-1.805-3.61-2.879-1.72-0.688-1.376 0.042 1.202 1.59z"/>
+   <path fill="#7a7a7a" d="m288.089 253c1.163 0.705 0.955 1.453 1.703 1.951 0.373 0.25 0.997 0.25 0.623-0.705-0.499-1.121-0.914-1.744-3.489-2.783-1.661-0.664-1.329 0.041 1.163 1.537z"/>
+   <path fill="#7e7e7e" d="m288.133 253.012c1.122 0.682 0.923 1.404 1.644 1.885 0.361 0.24 0.962 0.24 0.602-0.682-0.481-1.082-0.882-1.684-3.367-2.687-1.605-0.64-1.285 0.041 1.121 1.484z"/>
+   <path fill="#828282" d="m288.176 253.025c1.082 0.657 0.89 1.353 1.586 1.815 0.348 0.232 0.927 0.232 0.578-0.656-0.463-1.043-0.85-1.623-3.245-2.59-1.547-0.618-1.237 0.039 1.081 1.431z"/>
+   <path fill="#858585" d="m288.22 253.038c1.042 0.631 0.855 1.301 1.524 1.748 0.335 0.223 0.894 0.223 0.559-0.633-0.446-1.005-0.818-1.563-3.125-2.492-1.488-0.596-1.19 0.037 1.042 1.377z"/>
+   <path fill="#898989" d="m288.264 253.049c1.001 0.607 0.821 1.252 1.466 1.681 0.322 0.214 0.857 0.214 0.536-0.608-0.43-0.965-0.786-1.502-3.004-2.396-1.43-0.573-1.144 0.034 1.002 1.323z"/>
+   <path fill="#8d8d8d" d="m288.307 253.061c0.961 0.584 0.79 1.201 1.407 1.613 0.309 0.205 0.823 0.205 0.515-0.584-0.412-0.926-0.755-1.441-2.883-2.299-1.373-0.548-1.098 0.034 0.961 1.27z"/>
+   <path fill="#919191" d="m288.351 253.073c0.921 0.559 0.756 1.151 1.348 1.547 0.296 0.196 0.789 0.196 0.493-0.56-0.395-0.888-0.723-1.381-2.762-2.204-1.315-0.525-1.052 0.033 0.921 1.217z"/>
+   <path fill="#959595" d="m288.395 253.084c0.88 0.535 0.723 1.102 1.289 1.479 0.282 0.189 0.754 0.189 0.471-0.534-0.377-0.849-0.691-1.321-2.641-2.106-1.257-0.505-1.006 0.031 0.881 1.161z"/>
+   <path fill="#999" d="m288.438 253.097c0.84 0.51 0.689 1.05 1.229 1.409 0.271 0.181 0.721 0.181 0.45-0.51-0.36-0.81-0.66-1.26-2.52-2.01-1.199-0.48-0.959 0.031 0.841 1.111z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path d="m222.275 107.427c-0.738 0.902 0.574 8.365 5.412 13.285 4.839 4.838 7.791 4.838 9.759 2.706 3.771-4.018 0.738-7.791-1.558-10.415-2.297-2.624-5.248-1.722-7.955-4.346-2.706-2.624-4.592-2.46-5.658-1.23z"/>
+   <path fill="#050505" d="m222.345 107.494c-0.732 0.895 0.569 8.3 5.369 13.182 4.803 4.801 7.731 4.801 9.685 2.685 3.742-3.987 0.731-7.73-1.546-10.334-2.278-2.604-5.208-1.709-7.894-4.312-2.684-2.604-4.556-2.441-5.614-1.221z"/>
+   <path fill="#0a0a0a" d="m222.416 107.561c-0.727 0.888 0.565 8.235 5.328 13.079 4.763 4.763 7.67 4.763 9.607 2.664 3.713-3.956 0.727-7.67-1.534-10.253-2.26-2.584-5.166-1.696-7.831-4.279-2.664-2.583-4.521-2.422-5.57-1.211z"/>
+   <path fill="#0f0f0f" d="m222.486 107.628c-0.721 0.881 0.561 8.17 5.286 12.976 4.726 4.725 7.608 4.725 9.532 2.642 3.684-3.924 0.72-7.609-1.522-10.172-2.243-2.563-5.126-1.682-7.77-4.244-2.643-2.563-4.485-2.403-5.526-1.202z"/>
+   <path fill="#141414" d="m222.556 107.695c-0.716 0.874 0.557 8.105 5.243 12.872 4.689 4.688 7.55 4.688 9.456 2.622 3.655-3.893 0.716-7.549-1.51-10.091-2.224-2.543-5.085-1.669-7.707-4.211-2.621-2.543-4.449-2.384-5.482-1.192z"/>
+   <path fill="#191919" d="m222.627 107.762c-0.71 0.867 0.552 8.04 5.202 12.769 4.65 4.65 7.488 4.65 9.379 2.601 3.626-3.862 0.71-7.489-1.497-10.011s-5.044-1.655-7.646-4.177-4.414-2.364-5.438-1.182z"/>
+   <path fill="#1e1e1e" d="m222.697 107.829c-0.704 0.86 0.547 7.975 5.16 12.666 4.613 4.612 7.428 4.612 9.304 2.579 3.596-3.83 0.703-7.427-1.486-9.929-2.188-2.502-5.003-1.642-7.584-4.143-2.579-2.502-4.378-2.346-5.394-1.173z"/>
+   <path fill="#232323" d="m222.767 107.896c-0.697 0.853 0.543 7.91 5.117 12.562 4.576 4.575 7.367 4.575 9.229 2.559 3.567-3.8 0.698-7.367-1.473-9.848-2.171-2.482-4.963-1.629-7.522-4.11s-4.343-2.326-5.351-1.163z"/>
+   <path fill="#282828" d="m222.838 107.963c-0.691 0.846 0.538 7.845 5.076 12.459 4.537 4.537 7.307 4.537 9.152 2.538 3.537-3.769 0.691-7.307-1.461-9.768-2.154-2.461-4.922-1.615-7.461-4.076-2.538-2.461-4.307-2.307-5.306-1.153z"/>
+   <path fill="#2d2d2d" d="m222.908 108.03c-0.686 0.839 0.534 7.78 5.034 12.355 4.5 4.499 7.246 4.499 9.076 2.516 3.509-3.737 0.686-7.246-1.449-9.686-2.135-2.441-4.881-1.602-7.399-4.042-2.516-2.44-4.271-2.287-5.262-1.143z"/>
+   <path fill="#333" d="m222.978 108.096c-0.681 0.832 0.529 7.715 4.992 12.253 4.463 4.462 7.186 4.462 9.001 2.496 3.479-3.706 0.68-7.186-1.438-9.605-2.118-2.42-4.841-1.588-7.337-4.008s-4.235-2.27-5.218-1.136z"/>
+   <path fill="#383838" d="m223.048 108.163c-0.674 0.825 0.526 7.65 4.95 12.15 4.425 4.425 7.125 4.425 8.925 2.475 3.45-3.675 0.676-7.125-1.425-9.525-2.099-2.4-4.8-1.575-7.274-3.975-2.475-2.399-4.201-2.25-5.176-1.125z"/>
+   <path fill="#3d3d3d" d="m223.119 108.23c-0.669 0.818 0.521 7.585 4.908 12.047 4.387 4.387 7.063 4.387 8.849 2.453 3.42-3.643 0.669-7.064-1.413-9.443-2.082-2.38-4.759-1.562-7.214-3.941-2.453-2.38-4.164-2.231-5.13-1.116z"/>
+   <path fill="#424242" d="m223.189 108.297c-0.663 0.811 0.516 7.52 4.866 11.944 4.35 4.349 7.004 4.349 8.772 2.432 3.392-3.612 0.663-7.004-1.4-9.363-2.064-2.359-4.719-1.548-7.151-3.907-2.433-2.359-4.129-2.212-5.087-1.106z"/>
+   <path fill="#474747" d="m223.259 108.364c-0.656 0.804 0.513 7.455 4.824 11.84 4.313 4.312 6.944 4.312 8.697 2.412 3.362-3.582 0.658-6.944-1.388-9.282-2.046-2.339-4.679-1.535-7.09-3.874-2.411-2.338-4.093-2.192-5.043-1.096z"/>
+   <path fill="#4c4c4c" d="m223.33 108.431c-0.651 0.797 0.507 7.39 4.782 11.737 4.274 4.274 6.882 4.274 8.621 2.39 3.332-3.55 0.651-6.883-1.377-9.201s-4.636-1.521-7.028-3.839c-2.39-2.318-4.057-2.174-4.998-1.087z"/>
+   <path fill="#515151" d="m223.4 108.498c-0.646 0.79 0.503 7.325 4.74 11.634 4.236 4.236 6.821 4.236 8.545 2.369 3.304-3.519 0.646-6.822-1.364-9.12s-4.596-1.508-6.966-3.806c-2.369-2.298-4.022-2.154-4.955-1.077z"/>
+   <path fill="#565656" d="m223.47 108.565c-0.641 0.783 0.499 7.26 4.697 11.53 4.199 4.199 6.763 4.199 8.471 2.349 3.273-3.488 0.64-6.762-1.353-9.039-1.993-2.278-4.556-1.495-6.905-3.773-2.347-2.277-3.985-2.135-4.91-1.067z"/>
+   <path fill="#5b5b5b" d="m223.541 108.632c-0.635 0.776 0.493 7.195 4.656 11.427 4.161 4.161 6.701 4.161 8.393 2.327 3.245-3.456 0.636-6.701-1.34-8.958-1.975-2.257-4.514-1.48-6.843-3.738-2.327-2.257-3.95-2.116-4.866-1.058z"/>
+   <path fill="#606060" d="m223.611 108.699c-0.629 0.769 0.489 7.13 4.614 11.324 4.124 4.123 6.64 4.123 8.317 2.306 3.215-3.425 0.628-6.641-1.328-8.877-1.957-2.237-4.474-1.468-6.78-3.705-2.306-2.236-3.915-2.097-4.823-1.048z"/>
+   <path fill="#666" d="m223.681 108.765c-0.623 0.762 0.484 7.065 4.571 11.221 4.086 4.086 6.58 4.086 8.242 2.285 3.187-3.394 0.623-6.58-1.315-8.796-1.939-2.217-4.434-1.455-6.72-3.671-2.284-2.216-3.878-2.078-4.778-1.039z"/>
+  </g>
+  <g transform="translate(-12.4048,10.0005)">
+   <path fill="#fc0" d="m137.79 109.277c1.978 1.366 2.031 1.607 4.948 3.514 4.64 3.768 12.885 4.616 16.922 4.75 9.233 1.467 25.738-7.161 32.273-11.111 3.291-2.463 9.38-7.551 11.659-7.637 1.405 1.485-0.66 1.792-3.587 3.775-3.906 2.779-7.25 5.156-13.172 8.515-6.338 3.316-16.078 8.794-28.548 8.054-6.542-0.959-6.566-1.024-10.606-3.086-2.4-1.732-7.901-4.608-9.889-6.774z"/>
+   <linearGradient id="al" x1="129.342" gradientUnits="userSpaceOnUse" x2="195.598" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.305" y2="259.305">
+    <stop stop-color="#FAC700" offset="0"/>
+    <stop stop-color="#F7C400" offset=".415"/>
+    <stop stop-color="#F7C400" offset="1"/>
+   </linearGradient>
+   <path fill="url(#al)" d="m137.742 109.259c1.926 1.274 2.165 1.643 5.083 3.554 4.616 3.734 12.716 4.616 16.796 4.763 9.365 1.452 26.05-7.294 32.356-11.159 3.357-2.506 9.344-7.498 11.595-7.604 1.365 1.472-0.728 1.768-3.688 3.814-3.889 2.753-7.119 5.065-12.972 8.383-6.29 3.291-16.078 8.795-28.536 8.104-6.561-0.945-6.851-1.07-10.758-3.079-2.468-1.755-7.876-4.587-9.876-6.776z"/>
+   <linearGradient id="am" x1="129.293" gradientUnits="userSpaceOnUse" x2="195.554" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.311" y2="259.311">
+    <stop stop-color="#F6C200" offset="0"/>
+    <stop stop-color="#EFBC00" offset=".415"/>
+    <stop stop-color="#EFBC00" offset="1"/>
+   </linearGradient>
+   <path fill="url(#am)" d="m137.693 109.24c1.876 1.183 2.3 1.68 5.218 3.595 4.593 3.7 12.548 4.616 16.67 4.776 9.498 1.437 26.364-7.428 32.44-11.207 3.425-2.55 9.308-7.444 11.528-7.57 1.326 1.457-0.795 1.743-3.788 3.854-3.87 2.725-6.99 4.973-12.771 8.25-6.243 3.266-16.078 8.796-28.525 8.154-6.579-0.931-7.134-1.117-10.908-3.073-2.536-1.779-7.852-4.567-9.864-6.779z"/>
+   <linearGradient id="an" x1="129.245" gradientUnits="userSpaceOnUse" x2="195.51" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.317" y2="259.317">
+    <stop stop-color="#F1BD00" offset="0"/>
+    <stop stop-color="#E8B500" offset=".415"/>
+    <stop stop-color="#E8B500" offset="1"/>
+   </linearGradient>
+   <path fill="url(#an)" d="m137.645 109.222c1.825 1.091 2.434 1.715 5.352 3.635 4.569 3.665 12.38 4.615 16.544 4.789 9.631 1.422 26.677-7.562 32.524-11.255 3.491-2.594 9.271-7.392 11.463-7.538 1.287 1.442-0.861 1.718-3.889 3.893-3.853 2.699-6.86 4.882-12.57 8.119-6.195 3.241-16.078 8.797-28.513 8.203-6.6-0.916-7.418-1.163-11.061-3.066-2.603-1.801-7.826-4.546-9.85-6.78z"/>
+   <linearGradient id="ao" x1="129.196" gradientUnits="userSpaceOnUse" x2="195.465" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.322" y2="259.322">
+    <stop stop-color="#EDB800" offset="0"/>
+    <stop stop-color="#E0AD00" offset=".415"/>
+    <stop stop-color="#E0AD00" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ao)" d="m137.596 109.203c1.774 1 2.568 1.752 5.487 3.676 4.545 3.631 12.211 4.615 16.418 4.801 9.764 1.408 26.989-7.695 32.608-11.302 3.557-2.637 9.236-7.338 11.396-7.505 1.247 1.427-0.928 1.693-3.99 3.932-3.833 2.672-6.729 4.791-12.369 7.986-6.148 3.217-16.078 8.799-28.501 8.254-6.619-0.902-7.702-1.21-11.21-3.059-2.672-1.825-7.803-4.525-9.839-6.783z"/>
+   <linearGradient id="ap" x1="129.148" gradientUnits="userSpaceOnUse" x2="195.422" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.327" y2="259.327">
+    <stop stop-color="#E9B300" offset="0"/>
+    <stop stop-color="#D8A500" offset=".415"/>
+    <stop stop-color="#D8A500" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ap)" d="m137.548 109.184c1.724 0.909 2.703 1.788 5.622 3.717 4.522 3.597 12.043 4.615 16.292 4.814 9.896 1.393 27.303-7.829 32.692-11.35 3.624-2.681 9.2-7.286 11.331-7.472 1.208 1.412-0.995 1.668-4.092 3.972-3.814 2.644-6.6 4.698-12.168 7.853-6.101 3.192-16.077 8.8-28.489 8.303-6.638-0.887-7.986-1.256-11.361-3.052-2.741-1.848-7.779-4.504-9.827-6.785z"/>
+   <linearGradient id="aq" x1="129.099" gradientUnits="userSpaceOnUse" x2="195.379" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.332" y2="259.332">
+    <stop stop-color="#E4AE00" offset="0"/>
+    <stop stop-color="#D19E00" offset=".415"/>
+    <stop stop-color="#D19E00" offset="1"/>
+   </linearGradient>
+   <path fill="url(#aq)" d="m137.499 109.166c1.673 0.817 2.838 1.824 5.757 3.757 4.499 3.562 11.875 4.614 16.166 4.827 10.029 1.378 27.615-7.963 32.776-11.398 3.691-2.725 9.164-7.232 11.265-7.439 1.169 1.397-1.061 1.644-4.191 4.01-3.796 2.618-6.469 4.608-11.968 7.722-6.053 3.167-16.077 8.801-28.478 8.353-6.657-0.873-8.27-1.303-11.512-3.046-2.809-1.87-7.755-4.483-9.815-6.786z"/>
+   <linearGradient id="ar" x1="129.051" gradientUnits="userSpaceOnUse" x2="195.338" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.336" y2="259.336">
+    <stop stop-color="#E0A900" offset="0"/>
+    <stop stop-color="#C99600" offset=".415"/>
+    <stop stop-color="#C99600" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ar)" d="m137.451 109.147c1.622 0.726 2.972 1.86 5.892 3.798 4.475 3.528 11.705 4.614 16.04 4.84 10.161 1.362 27.929-8.097 32.859-11.447 3.757-2.767 9.128-7.178 11.2-7.405 1.13 1.382-1.128 1.619-4.294 4.049-3.777 2.592-6.339 4.517-11.767 7.589-6.005 3.143-16.077 8.803-28.466 8.404-6.676-0.859-8.553-1.35-11.663-3.039-2.876-1.894-7.729-4.462-9.801-6.789z"/>
+   <linearGradient id="w" x1="129.003" gradientUnits="userSpaceOnUse" x2="195.296" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.34" y2="259.34">
+    <stop stop-color="#DCA400" offset="0"/>
+    <stop stop-color="#C18E00" offset=".415"/>
+    <stop stop-color="#C18E00" offset="1"/>
+   </linearGradient>
+   <path fill="url(#w)" d="m137.403 109.129c1.571 0.634 3.105 1.896 6.026 3.838 4.45 3.494 11.536 4.614 15.913 4.852 10.295 1.348 28.241-8.23 32.943-11.494 3.824-2.811 9.092-7.125 11.134-7.373 1.092 1.367-1.194 1.594-4.394 4.088-3.759 2.565-6.209 4.425-11.566 7.457-5.957 3.118-16.077 8.804-28.454 8.453-6.694-0.844-8.837-1.396-11.813-3.032-2.945-1.916-7.706-4.44-9.789-6.789z"/>
+   <linearGradient id="x" x1="128.954" gradientUnits="userSpaceOnUse" x2="195.255" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.343" y2="259.343">
+    <stop stop-color="#D79F00" offset="0"/>
+    <stop stop-color="#BA8700" offset=".415"/>
+    <stop stop-color="#BA8700" offset="1"/>
+   </linearGradient>
+   <path fill="url(#x)" d="m137.354 109.11c1.521 0.543 3.241 1.932 6.161 3.879 4.428 3.459 11.368 4.613 15.788 4.865 10.427 1.333 28.554-8.364 33.026-11.542 3.892-2.855 9.057-7.073 11.068-7.339 1.052 1.353-1.261 1.569-4.495 4.127-3.74 2.538-6.078 4.334-11.365 7.325-5.91 3.093-16.077 8.805-28.441 8.503-6.716-0.83-9.121-1.443-11.966-3.026-3.012-1.939-7.68-4.42-9.776-6.792z"/>
+   <linearGradient id="y" x1="128.906" gradientUnits="userSpaceOnUse" x2="195.216" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.348" y2="259.348">
+    <stop stop-color="#D39B00" offset="0"/>
+    <stop stop-color="#B27F00" offset=".415"/>
+    <stop stop-color="#B27F00" offset="1"/>
+   </linearGradient>
+   <path fill="url(#y)" d="m137.306 109.091c1.47 0.451 3.375 1.969 6.296 3.919 4.403 3.426 11.2 4.614 15.662 4.879 10.559 1.318 28.865-8.498 33.109-11.59 3.958-2.899 9.021-7.02 11.003-7.306 1.013 1.337-1.328 1.544-4.596 4.167-3.722 2.511-5.949 4.242-11.165 7.192-5.862 3.068-16.077 8.807-28.43 8.553-6.734-0.816-9.405-1.489-12.116-3.019-3.08-1.963-7.656-4.4-9.763-6.795z"/>
+   <linearGradient id="z" x1="128.857" gradientUnits="userSpaceOnUse" x2="195.176" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.35" y2="259.35">
+    <stop stop-color="#CF9600" offset="0"/>
+    <stop stop-color="#a70" offset=".415"/>
+    <stop stop-color="#a70" offset="1"/>
+   </linearGradient>
+   <path fill="url(#z)" d="m137.257 109.073c1.421 0.359 3.511 2.005 6.432 3.959 4.38 3.392 11.032 4.614 15.536 4.892 10.691 1.303 29.179-8.631 33.193-11.638 4.024-2.942 8.984-6.967 10.938-7.274 0.973 1.323-1.396 1.521-4.697 4.206-3.703 2.484-5.818 4.151-10.964 7.06-5.814 3.043-16.077 8.808-28.418 8.603-6.753-0.802-9.689-1.535-12.268-3.012-3.149-1.986-7.632-4.378-9.752-6.796z"/>
+   <linearGradient id="aa" x1="128.809" gradientUnits="userSpaceOnUse" x2="195.137" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.354" y2="259.354">
+    <stop stop-color="#CA9100" offset="0"/>
+    <stop stop-color="#A37000" offset=".415"/>
+    <stop stop-color="#A37000" offset="1"/>
+   </linearGradient>
+   <path fill="url(#aa)" d="m137.209 109.054c1.368 0.268 3.645 2.041 6.565 4 4.356 3.357 10.864 4.613 15.41 4.904 10.824 1.289 29.493-8.764 33.277-11.685 4.092-2.986 8.948-6.914 10.871-7.241 0.935 1.308-1.461 1.496-4.797 4.245-3.685 2.457-5.688 4.06-10.763 6.928-5.768 3.018-16.077 8.809-28.407 8.653-6.771-0.788-9.972-1.582-12.418-3.006-3.216-2.008-7.607-4.357-9.738-6.798z"/>
+   <linearGradient id="ab" x1="128.76" gradientUnits="userSpaceOnUse" x2="195.099" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.356" y2="259.356">
+    <stop stop-color="#C68C00" offset="0"/>
+    <stop stop-color="#9B6800" offset=".415"/>
+    <stop stop-color="#9B6800" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ab)" d="m137.16 109.036c1.318 0.176 3.779 2.077 6.701 4.04 4.333 3.323 10.695 4.613 15.284 4.917 10.957 1.274 29.805-8.898 33.36-11.733 4.158-3.03 8.912-6.86 10.807-7.208 0.894 1.292-1.528 1.471-4.899 4.284-3.666 2.43-5.558 3.968-10.562 6.796-5.72 2.993-16.077 8.81-28.396 8.702-6.791-0.773-10.256-1.628-12.568-2.999-3.285-2.031-7.583-4.336-9.727-6.799z"/>
+   <linearGradient id="ac" x1="128.712" gradientUnits="userSpaceOnUse" x2="195.062" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.358" y2="259.358">
+    <stop stop-color="#C28700" offset="0"/>
+    <stop stop-color="#936000" offset=".415"/>
+    <stop stop-color="#936000" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ac)" d="m137.112 109.017c1.267 0.085 3.912 2.113 6.835 4.081 4.31 3.289 10.527 4.613 15.158 4.93 11.09 1.258 30.118-9.032 33.445-11.782 4.225-3.072 8.877-6.807 10.739-7.174 0.855 1.278-1.595 1.446-5 4.323-3.647 2.404-5.427 3.877-10.36 6.663-5.673 2.969-16.077 8.812-28.384 8.753-6.811-0.759-10.54-1.675-12.719-2.992-3.353-2.055-7.559-4.315-9.714-6.802z"/>
+   <linearGradient id="ad" x1="128.663" gradientUnits="userSpaceOnUse" x2="195.025" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.36" y2="259.36">
+    <stop stop-color="#BD8200" offset="0"/>
+    <stop stop-color="#8C5900" offset=".415"/>
+    <stop stop-color="#8C5900" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ad)" d="m137.063 108.998c1.217-0.006 4.047 2.15 6.97 4.122 4.286 3.254 10.359 4.612 15.032 4.943 11.223 1.243 30.431-9.166 33.53-11.83 4.289-3.116 8.84-6.753 10.673-7.141 0.815 1.263-1.661 1.421-5.101 4.362-3.63 2.377-5.298 3.785-10.161 6.531-5.624 2.944-16.075 8.813-28.37 8.802-6.83-0.744-10.824-1.721-12.87-2.985-3.422-2.077-7.535-4.294-9.703-6.804z"/>
+   <linearGradient id="ae" x1="128.615" gradientUnits="userSpaceOnUse" x2="194.989" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.362" y2="259.362">
+    <stop stop-color="#B97D00" offset="0"/>
+    <stop stop-color="#845100" offset=".415"/>
+    <stop stop-color="#845100" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ae)" d="m137.015 108.98c1.166-0.098 4.181 2.185 7.104 4.162 4.262 3.22 10.19 4.612 14.906 4.955 11.354 1.229 30.743-9.299 33.613-11.877 4.356-3.16 8.804-6.7 10.607-7.108 0.776 1.248-1.728 1.397-5.202 4.401-3.61 2.35-5.167 3.694-9.96 6.399-5.576 2.919-16.076 8.814-28.358 8.852-6.85-0.73-11.108-1.768-13.021-2.979-3.489-2.1-7.51-4.273-9.689-6.805z"/>
+   <linearGradient id="af" x1="128.567" gradientUnits="userSpaceOnUse" x2="194.954" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.364" y2="259.364">
+    <stop stop-color="#B57800" offset="0"/>
+    <stop stop-color="#7C4900" offset=".415"/>
+    <stop stop-color="#7C4900" offset="1"/>
+   </linearGradient>
+   <path fill="url(#af)" d="m136.967 108.961c1.115-0.189 4.315 2.222 7.239 4.203 4.239 3.186 10.021 4.612 14.78 4.968 11.488 1.214 31.057-9.433 33.697-11.925 4.424-3.203 8.768-6.647 10.542-7.075 0.736 1.233-1.795 1.372-5.303 4.44-3.593 2.323-5.038 3.603-9.759 6.266-5.529 2.895-16.077 8.816-28.348 8.903-6.868-0.716-11.392-1.815-13.172-2.972-3.557-2.124-7.485-4.252-9.676-6.808z"/>
+   <linearGradient id="ah" x1="128.518" gradientUnits="userSpaceOnUse" x2="194.918" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.366" y2="259.366">
+    <stop stop-color="#B07300" offset="0"/>
+    <stop stop-color="#754200" offset=".415"/>
+    <stop stop-color="#754200" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ah)" d="m136.918 108.943c1.064-0.281 4.45 2.257 7.374 4.243 4.216 3.151 9.854 4.611 14.654 4.981 11.621 1.199 31.37-9.567 33.781-11.973 4.49-3.247 8.731-6.594 10.476-7.042 0.698 1.218-1.861 1.347-5.403 4.479-3.573 2.296-4.906 3.511-9.558 6.134-5.48 2.87-16.076 8.817-28.336 8.952-6.887-0.701-11.675-1.861-13.323-2.965-3.626-2.146-7.462-4.231-9.665-6.809z"/>
+   <linearGradient id="ai" x1="128.47" gradientUnits="userSpaceOnUse" x2="194.886" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.367" y2="259.367">
+    <stop stop-color="#AC6E00" offset="0"/>
+    <stop stop-color="#6D3A00" offset=".415"/>
+    <stop stop-color="#6D3A00" offset="1"/>
+   </linearGradient>
+   <path fill="url(#ai)" d="m136.87 108.924c1.013-0.372 4.584 2.294 7.509 4.284 4.191 3.117 9.685 4.611 14.528 4.994 11.753 1.184 31.682-9.701 33.864-12.021 4.557-3.291 8.695-6.542 10.411-7.009 0.657 1.203-1.929 1.322-5.504 4.518-3.557 2.269-4.777 3.42-9.358 6.002-5.434 2.845-16.076 8.818-28.324 9.002-6.907-0.687-11.959-1.908-13.474-2.959-3.694-2.169-7.437-4.21-9.652-6.811z"/>
+   <linearGradient id="aj" x1="128.421" gradientUnits="userSpaceOnUse" x2="194.85" gradientTransform="matrix(1,0,0,-1,8.3999,368.3)" y1="259.369" y2="259.369">
+    <stop stop-color="#A86A00" offset="0"/>
+    <stop stop-color="#663200" offset=".415"/>
+    <stop stop-color="#663200" offset="1"/>
+   </linearGradient>
+   <path fill="url(#aj)" d="m136.821 108.905c0.963-0.464 4.719 2.33 7.644 4.324 4.168 3.083 9.517 4.611 14.402 5.007 11.886 1.169 31.995-9.834 33.948-12.069 4.624-3.334 8.66-6.487 10.345-6.976 0.619 1.188-1.995 1.298-5.604 4.558-3.537 2.242-4.647 3.328-9.157 5.869-5.386 2.82-16.076 8.82-28.313 9.052-6.926-0.673-12.243-1.954-13.625-2.952-3.762-2.192-7.413-4.189-9.64-6.813z"/>
+  </g>
+ </g>
+</svg>
diff --git a/tests/phpunit/includes/ArrayUtilsTest.php b/tests/phpunit/includes/ArrayUtilsTest.php
deleted file mode 100644 (file)
index 7bdb1ca..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-<?php
-/**
- * Test class for ArrayUtils class
- *
- * @group Database
- */
-
-class ArrayUtilsTest extends MediaWikiTestCase {
-       private $search;
-
-       /**
-        * @covers ArrayUtils::findLowerBound
-        * @dataProvider provideFindLowerBound
-        */
-       function testFindLowerBound(
-               $valueCallback, $valueCount, $comparisonCallback, $target, $expected
-       ) {
-               $this->assertSame(
-                       ArrayUtils::findLowerBound(
-                               $valueCallback, $valueCount, $comparisonCallback, $target
-                       ), $expected
-               );
-       }
-
-       function provideFindLowerBound() {
-               $self = $this;
-               $indexValueCallback = function ( $size ) use ( $self ) {
-                       return function ( $val ) use ( $self, $size ) {
-                               $self->assertTrue( $val >= 0 );
-                               $self->assertTrue( $val < $size );
-                               return $val;
-                       };
-               };
-               $comparisonCallback = function ( $a, $b ) {
-                       return $a - $b;
-               };
-
-               return array(
-                       array(
-                               $indexValueCallback( 0 ),
-                               0,
-                               $comparisonCallback,
-                               1,
-                               false,
-                       ),
-                       array(
-                               $indexValueCallback( 1 ),
-                               1,
-                               $comparisonCallback,
-                               -1,
-                               false,
-                       ),
-                       array(
-                               $indexValueCallback( 1 ),
-                               1,
-                               $comparisonCallback,
-                               0,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 1 ),
-                               1,
-                               $comparisonCallback,
-                               1,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               -1,
-                               false,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               0,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               0.5,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               1,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               1.5,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               1,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               1.5,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               2,
-                               2,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               3,
-                               2,
-                       ),
-               );
-       }
-
-       /**
-        * @covers ArrayUtils::arrayDiffAssocRecursive
-        * @dataProvider provideArrayDiffAssocRecursive
-        */
-       function testArrayDiffAssocRecursive( $expected ) {
-               $args = func_get_args();
-               array_shift( $args );
-               $this->assertEquals( call_user_func_array(
-                       'ArrayUtils::arrayDiffAssocRecursive', $args
-               ), $expected );
-       }
-
-       function provideArrayDiffAssocRecursive() {
-               return array(
-                       array(
-                               array(),
-                               array(),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array(),
-                               array(),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1 ),
-                               array(),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1 ),
-                               array(),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array( 1 ),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array( 1 ),
-                               array( 2 ),
-                       ),
-                       array(
-                               array( '' => 1 ),
-                               array( '' => 1 ),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array( '' => 1 ),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1 ),
-                               array( 2 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1 ),
-                               array( 2 ),
-                               array( 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1 ),
-                               array( 1, 2 ),
-                       ),
-                       array(
-                               array( 1 => 1 ),
-                               array( 1 => 1 ),
-                               array( 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1 => 1 ),
-                               array( 1 ),
-                               array( 1 => 1),
-                       ),
-                       array(
-                               array(),
-                               array( 1 => 1 ),
-                               array( 1, 1, 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( array() ),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array( array( array() ) ),
-                               array(),
-                       ),
-                       array(
-                               array( 1, array( 1 ) ),
-                               array( 1, array( 1 ) ),
-                               array(),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1, array( 1 ) ),
-                               array( 2, array( 1 ) ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array( 1 ) ),
-                               array( 2, array( 1 ) ),
-                               array( 1, array( 2 ) ),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1, array() ),
-                               array( 2 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array() ),
-                               array( 2 ),
-                               array( 1 ),
-                       ),
-                       array(
-                               array( 1, array( 1 => 2 ) ),
-                               array( 1, array( 1, 2 ) ),
-                               array( 2, array( 1 ) ),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1, array( 1, 2 ) ),
-                               array( 2, array( 1 ) ),
-                               array( 2, array( 1 => 2 ) ),
-                       ),
-                       array(
-                               array( 1 => array( 1, 2 ) ),
-                               array( 1, array( 1, 2 ) ),
-                               array( 1, array( 2 ) ),
-                       ),
-                       array(
-                               array( 1 => array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( 2 ) ),
-                       ),
-                       array(
-                               array( 1 => array( array( 2 ), 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 1 => 3 ) ) ),
-                       ),
-                       array(
-                               array( 1 => array( 1 => 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 1 => 3, 0 => 2 ) ) ),
-                       ),
-                       array(
-                               array( 1 => array( 1 => 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 1 => 3 ) ) ),
-                               array( 1 => array( array( 2 ) ) ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1 => array( 1 => 2, 0 => array( 1 => 3, 0 => 2 ) ), 0 => 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1 => array( 1 => 2 ) ),
-                               array( 1 => array( array( 1 => 3 ) ) ),
-                               array( 1 => array( array( 2 ) ) ),
-                               array( 1 ),
-                       ),
-               );
-       }
-}
diff --git a/tests/phpunit/includes/ArticleTablesTest.php b/tests/phpunit/includes/ArticleTablesTest.php
deleted file mode 100644 (file)
index 9f2b7a0..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class ArticleTablesTest extends MediaWikiLangTestCase {
-       /**
-        * Make sure that bug 14404 doesn't strike again. We don't want
-        * templatelinks based on the user language when {{int:}} is used, only the
-        * content language.
-        *
-        * @covers Title::getTemplateLinksFrom
-        * @covers Title::getLinksFrom
-        */
-       public function testTemplatelinksUsesContentLanguage() {
-               $title = Title::newFromText( 'Bug 14404' );
-               $page = WikiPage::factory( $title );
-               $user = new User();
-               $user->mRights = array( 'createpage', 'edit', 'purge' );
-               $this->setMwGlobals( 'wgLanguageCode', 'es' );
-               $this->setMwGlobals( 'wgContLang', Language::factory( 'es' ) );
-               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
-
-               $page->doEditContent(
-                       new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
-                       0,
-                       false,
-                       $user
-               );
-               $templates1 = $title->getTemplateLinksFrom();
-
-               $this->setMwGlobals( 'wgLang', Language::factory( 'de' ) );
-               $page = WikiPage::factory( $title ); // In order to force the re-rendering of the same wikitext
-
-               // We need an edit, a purge is not enough to regenerate the tables
-               $page->doEditContent(
-                       new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
-                       EDIT_UPDATE,
-                       false,
-                       $user
-               );
-               $templates2 = $title->getTemplateLinksFrom();
-
-               /**
-                * @var Title[] $templates1
-                * @var Title[] $templates2
-                */
-               $this->assertEquals( $templates1, $templates2 );
-               $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
-       }
-}
diff --git a/tests/phpunit/includes/ArticleTest.php b/tests/phpunit/includes/ArticleTest.php
deleted file mode 100644 (file)
index ae069ea..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-class ArticleTest extends MediaWikiTestCase {
-
-       /**
-        * @var Title
-        */
-       private $title;
-       /**
-        * @var Article
-        */
-       private $article;
-
-       /** creates a title object and its article object */
-       protected function setUp() {
-               parent::setUp();
-               $this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
-               $this->article = new Article( $this->title );
-       }
-
-       /** cleanup title object and its article object */
-       protected function tearDown() {
-               parent::tearDown();
-               $this->title = null;
-               $this->article = null;
-       }
-
-       /**
-        * @covers Article::__get
-        */
-       public function testImplementsGetMagic() {
-               $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
-       }
-
-       /**
-        * @depends testImplementsGetMagic
-        * @covers Article::__set
-        */
-       public function testImplementsSetMagic() {
-               $this->article->mLatest = 2;
-               $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
-       }
-
-       /**
-        * @depends testImplementsSetMagic
-        * @covers Article::__call
-        */
-       public function testImplementsCallMagic() {
-               $this->article->mLatest = 33;
-               $this->article->mDataLoaded = true;
-               $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
-       }
-
-       /**
-        * @covers Article::__get
-        * @covers Article::__set
-        */
-       public function testGetOrSetOnNewProperty() {
-               $this->article->ext_someNewProperty = 12;
-               $this->assertEquals( 12, $this->article->ext_someNewProperty,
-                       "Article get/set magic on new field" );
-
-               $this->article->ext_someNewProperty = -8;
-               $this->assertEquals( -8, $this->article->ext_someNewProperty,
-                       "Article get/set magic on update to new field" );
-       }
-
-       /**
-        * Checks for the existence of the backwards compatibility static functions
-        * (forwarders to WikiPage class)
-        *
-        * @covers Article::selectFields
-        * @covers Article::onArticleCreate
-        * @covers Article::onArticleDelete
-        * @covers Article::onArticleEdit
-        * @covers Article::getAutosummary
-        */
-       public function testStaticFunctions() {
-               $this->hideDeprecated( 'Article::selectFields' );
-               $this->hideDeprecated( 'Article::getAutosummary' );
-               $this->hideDeprecated( 'WikiPage::getAutosummary' );
-               $this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
-
-               $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "Article::onArticleDelete" ),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
-                       "Article static functions" );
-               $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
-                       "Article static functions" );
-       }
-}
diff --git a/tests/phpunit/includes/ExternalStoreTest.php b/tests/phpunit/includes/ExternalStoreTest.php
deleted file mode 100644 (file)
index 07c2957..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * External Store tests
- */
-
-class ExternalStoreTest extends MediaWikiTestCase {
-
-       /**
-        * @covers ExternalStore::fetchFromURL
-        */
-       public function testExternalFetchFromURL() {
-               $this->setMwGlobals( 'wgExternalStores', false );
-
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
-                       'Deny if wgExternalStores is not set to a non-empty array'
-               );
-
-               $this->setMwGlobals( 'wgExternalStores', array( 'FOO' ) );
-
-               $this->assertEquals(
-                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
-                       'Hello',
-                       'Allow FOO://cluster1/200'
-               );
-               $this->assertEquals(
-                       ExternalStore::fetchFromURL( 'FOO://cluster1/300/0' ),
-                       'Hello',
-                       'Allow FOO://cluster1/300/0'
-               );
-               # Assertions for r68900
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'ftp.example.org' ),
-                       'Deny domain ftp.example.org'
-               );
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( '/example.txt' ),
-                       'Deny path /example.txt'
-               );
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'http://' ),
-                       'Deny protocol http://'
-               );
-       }
-}
-
-class ExternalStoreFOO {
-
-       protected $data = array(
-               'cluster1' => array(
-                       '200' => 'Hello',
-                       '300' => array(
-                               'Hello', 'World',
-                       ),
-               ),
-       );
-
-       /**
-        * Fetch data from given URL
-        * @param string $url An url of the form FOO://cluster/id or FOO://cluster/id/itemid.
-        * @return mixed
-        */
-       function fetchFromURL( $url ) {
-               // Based on ExternalStoreDB
-               $path = explode( '/', $url );
-               $cluster = $path[2];
-               $id = $path[3];
-               if ( isset( $path[4] ) ) {
-                       $itemID = $path[4];
-               } else {
-                       $itemID = false;
-               }
-
-               if ( !isset( $this->data[$cluster][$id] ) ) {
-                       return null;
-               }
-
-               if ( $itemID !== false
-                       && is_array( $this->data[$cluster][$id] )
-                       && isset( $this->data[$cluster][$id][$itemID] )
-               ) {
-                       return $this->data[$cluster][$id][$itemID];
-               }
-
-               return $this->data[$cluster][$id];
-       }
-}
index 9dbfa45..1c3e853 100644 (file)
@@ -4,6 +4,20 @@
  * @group HtmlFormatter
  */
 class HtmlFormatterTest extends MediaWikiTestCase {
+
+       /**
+        * Use TidySupport to check whether we should use $wgTidyInternal.
+        *
+        * The Tidy extension in HHVM does not support error text return, so it is
+        * nominally usable, but does not pass tests which require error text from
+        * Tidy.
+        */
+       protected function setUp() {
+               parent::setUp();
+               $tidySupport = new TidySupport();
+               $this->setMwGlobals( 'wgTidyInternal', $tidySupport->isInternal() );
+       }
+
        /**
         * @dataProvider getHtmlData
         *
index a8829cd..992581b 100644 (file)
@@ -637,7 +637,7 @@ class HtmlTest extends MediaWikiTestCase {
                                . 'Depending on compatibility mode IE might use "button", instead.',
                );
 
-               # <select> specifc handling
+               # <select> specific handling
                $cases[] = array( '<select multiple></select>',
                        'select', array( 'size' => '4', 'multiple' => true ),
                );
diff --git a/tests/phpunit/includes/ImagePage404Test.php b/tests/phpunit/includes/ImagePage404Test.php
deleted file mode 100644 (file)
index 197a2b3..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * For doing Image Page tests that rely on 404 thumb handling
- */
-class ImagePage404Test extends MediaWikiMediaTestCase {
-
-       protected function getRepoOptions() {
-               return parent::getRepoOptions() + array( 'transformVia404' => true );
-       }
-
-       function setUp() {
-               $this->setMwGlobals( 'wgImageLimits', array(
-                       array( 320, 240 ),
-                       array( 640, 480 ),
-                       array( 800, 600 ),
-                       array( 1024, 768 ),
-                       array( 1280, 1024 )
-               ) );
-               parent::setUp();
-       }
-
-       function getImagePage( $filename ) {
-               $title = Title::makeTitleSafe( NS_FILE, $filename );
-               $file = $this->dataFile( $filename );
-               $iPage = new ImagePage( $title );
-               $iPage->setFile( $file );
-               return $iPage;
-       }
-
-       /**
-        * @dataProvider providerGetThumbSizes
-        * @param string $filename
-        * @param int $expectedNumberThumbs How many thumbnails to show
-        */
-       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
-               $iPage = $this->getImagePage( $filename );
-               $reflection = new ReflectionClass( $iPage );
-               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
-               $reflMethod->setAccessible( true );
-
-               $actual = $reflMethod->invoke( $iPage, 545, 700 );
-               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
-       }
-
-       function providerGetThumbSizes() {
-               return array(
-                       array( 'animated.gif', 6 ),
-                       array( 'Toll_Texas_1.svg', 6 ),
-                       array( '80x60-Greyscale.xcf', 6 ),
-                       array( 'jpeg-comment-binary.jpg', 6 ),
-               );
-       }
-}
diff --git a/tests/phpunit/includes/ImagePageTest.php b/tests/phpunit/includes/ImagePageTest.php
deleted file mode 100644 (file)
index 3c255b5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-class ImagePageTest extends MediaWikiMediaTestCase {
-
-       function setUp() {
-               $this->setMwGlobals( 'wgImageLimits', array(
-                       array( 320, 240 ),
-                       array( 640, 480 ),
-                       array( 800, 600 ),
-                       array( 1024, 768 ),
-                       array( 1280, 1024 )
-               ) );
-               parent::setUp();
-       }
-
-       function getImagePage( $filename ) {
-               $title = Title::makeTitleSafe( NS_FILE, $filename );
-               $file = $this->dataFile( $filename );
-               $iPage = new ImagePage( $title );
-               $iPage->setFile( $file );
-               return $iPage;
-       }
-
-       /**
-        * @dataProvider providerGetDisplayWidthHeight
-        * @param array $dim Array [maxWidth, maxHeight, width, height]
-        * @param array $expected Array [width, height] The width and height we expect to display at
-        */
-       function testGetDisplayWidthHeight( $dim, $expected ) {
-               $iPage = $this->getImagePage( 'animated.gif' );
-               $reflection = new ReflectionClass( $iPage );
-               $reflMethod = $reflection->getMethod( 'getDisplayWidthHeight' );
-               $reflMethod->setAccessible( true );
-
-               $actual = $reflMethod->invoke( $iPage, $dim[0], $dim[1], $dim[2], $dim[3] );
-               $this->assertEquals( $actual, $expected );
-       }
-
-       function providerGetDisplayWidthHeight() {
-               return array(
-                       array(
-                               array( 1024.0, 768.0, 600.0, 600.0 ),
-                               array( 600.0, 600.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 1600.0, 600.0 ),
-                               array( 1024.0, 384.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 1024.0, 768.0 ),
-                               array( 1024.0, 768.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 800.0, 1000.0 ),
-                               array( 614.0, 768.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 0, 1000 ),
-                               array( 0, 0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 2000, 0 ),
-                               array( 0, 0 )
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider providerGetThumbSizes
-        * @param string $filename
-        * @param int $expectedNumberThumbs How many thumbnails to show
-        */
-       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
-               $iPage = $this->getImagePage( $filename );
-               $reflection = new ReflectionClass( $iPage );
-               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
-               $reflMethod->setAccessible( true );
-
-               $actual = $reflMethod->invoke( $iPage, 545, 700 );
-               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
-       }
-
-       function providerGetThumbSizes() {
-               return array(
-                       array( 'animated.gif', 2 ),
-                       array( 'Toll_Texas_1.svg', 1 ),
-                       array( '80x60-Greyscale.xcf', 1 ),
-                       array( 'jpeg-comment-binary.jpg', 2 ),
-               );
-       }
-}
index 678c89b..ea753e8 100644 (file)
@@ -28,7 +28,8 @@ class ImportTest extends MediaWikiLangTestCase {
                $source = $this->getInputStreamSource( $xml );
 
                $redirect = null;
-               $callback = function ( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) use ( &$redirect ) {
+               $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
+                       $sRevCount, $pageInfo ) use ( &$redirect ) {
                        if ( array_key_exists( 'redirect', $pageInfo ) ) {
                                $redirect = $pageInfo['redirect'];
                        }
@@ -98,4 +99,59 @@ EOF
                );
        }
 
+       /**
+        * @covers WikiImporter::handleSiteInfo
+        * @dataProvider getSiteInfoXML
+        * @param string $xml
+        * @param array|null $namespaces
+        */
+       public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
+               $source = $this->getInputStreamSource( $xml );
+
+               $importNamespaces = null;
+               $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
+                       $importNamespaces = $siteinfo['_namespaces'];
+               };
+
+               $importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $importer->setSiteInfoCallback( $callback );
+               $importer->doImport();
+
+               $this->assertEquals( $importNamespaces, $namespaces );
+       }
+
+       public function getSiteInfoXML() {
+               return array(
+                       array(
+                               <<< EOF
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
+  <siteinfo>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal talk</namespace>
+    </namespaces>
+  </siteinfo>
+</mediawiki>
+EOF
+                       ,
+                               array(
+                                       '-2' => 'Media',
+                                       '-1' => 'Special',
+                                       '0' => '',
+                                       '1' => 'Talk',
+                                       '2' => 'User',
+                                       '3' => 'User talk',
+                                       '100' => 'Portal',
+                                       '101' => 'Portal talk',
+                               )
+                       ),
+               );
+       }
+
 }
diff --git a/tests/phpunit/includes/LanguageConverterTest.php b/tests/phpunit/includes/LanguageConverterTest.php
deleted file mode 100644 (file)
index d4ccca9..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-
-class LanguageConverterTest extends MediaWikiLangTestCase {
-       /** @var LanguageToTest */
-       protected $lang = null;
-       /** @var TestConverter */
-       protected $lc = null;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( array(
-                       'wgContLang' => Language::factory( 'tg' ),
-                       'wgLanguageCode' => 'tg',
-                       'wgDefaultLanguageVariant' => false,
-                       'wgMemc' => new EmptyBagOStuff,
-                       'wgRequest' => new FauxRequest( array() ),
-                       'wgUser' => new User,
-               ) );
-
-               $this->lang = new LanguageToTest();
-               $this->lc = new TestConverter(
-                       $this->lang, 'tg',
-                       array( 'tg', 'tg-latn' )
-               );
-       }
-
-       protected function tearDown() {
-               unset( $this->lc );
-               unset( $this->lang );
-
-               parent::tearDown();
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        */
-       public function testGetPreferredVariantDefaults() {
-               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getHeaderVariant
-        */
-       public function testGetPreferredVariantHeaders() {
-               global $wgRequest;
-               $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
-
-               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getHeaderVariant
-        */
-       public function testGetPreferredVariantHeaderWeight() {
-               global $wgRequest;
-               $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
-
-               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getHeaderVariant
-        */
-       public function testGetPreferredVariantHeaderWeight2() {
-               global $wgRequest;
-               $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
-
-               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getHeaderVariant
-        */
-       public function testGetPreferredVariantHeaderMulti() {
-               global $wgRequest;
-               $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
-
-               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        */
-       public function testGetPreferredVariantUserOption() {
-               global $wgUser;
-
-               $wgUser = new User;
-               $wgUser->load(); // from 'defaults'
-               $wgUser->mId = 1;
-               $wgUser->mDataLoaded = true;
-               $wgUser->mOptionsLoaded = true;
-               $wgUser->setOption( 'variant', 'tg-latn' );
-
-               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getUserVariant
-        */
-       public function testGetPreferredVariantUserOptionForForeignLanguage() {
-               global $wgContLang, $wgUser;
-
-               $wgContLang = Language::factory( 'en' );
-               $wgUser = new User;
-               $wgUser->load(); // from 'defaults'
-               $wgUser->mId = 1;
-               $wgUser->mDataLoaded = true;
-               $wgUser->mOptionsLoaded = true;
-               $wgUser->setOption( 'variant-tg', 'tg-latn' );
-
-               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getUserVariant
-        * @covers LanguageConverter::getURLVariant
-        */
-       public function testGetPreferredVariantHeaderUserVsUrl() {
-               global $wgContLang, $wgRequest, $wgUser;
-
-               $wgContLang = Language::factory( 'tg-latn' );
-               $wgRequest->setVal( 'variant', 'tg' );
-               $wgUser = User::newFromId( "admin" );
-               $wgUser->setId( 1 );
-               $wgUser->mFrom = 'defaults';
-               $wgUser->mOptionsLoaded = true;
-               // The user's data is ignored because the variant is set in the URL.
-               $wgUser->setOption( 'variant', 'tg-latn' );
-               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        */
-       public function testGetPreferredVariantDefaultLanguageVariant() {
-               global $wgDefaultLanguageVariant;
-
-               $wgDefaultLanguageVariant = 'tg-latn';
-               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
-       }
-
-       /**
-        * @covers LanguageConverter::getPreferredVariant
-        * @covers LanguageConverter::getURLVariant
-        */
-       public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
-               global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
-
-               $wgContLang = Language::factory( 'tg-latn' );
-               $wgDefaultLanguageVariant = 'tg';
-               $wgRequest->setVal( 'variant', null );
-               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
-       }
-}
-
-/**
- * Test converter (from Tajiki to latin orthography)
- */
-class TestConverter extends LanguageConverter {
-       private $table = array(
-               'б' => 'b',
-               'в' => 'v',
-               'г' => 'g',
-       );
-
-       function loadDefaultTables() {
-               $this->mTables = array(
-                       'tg-latn' => new ReplacementArray( $this->table ),
-                       'tg' => new ReplacementArray()
-               );
-       }
-}
-
-class LanguageToTest extends Language {
-       function __construct() {
-               parent::__construct();
-               $variants = array( 'tg', 'tg-latn' );
-               $this->mConverter = new TestConverter( $this, 'tg', $variants );
-       }
-}
index 7b84107..6341bf0 100644 (file)
@@ -149,9 +149,13 @@ class LinkerTest extends MediaWikiLangTestCase {
                                "pre /* autocomment */ post",
                        ),
                        array(
-                               '/* autocomment */ multiple? <a href="/wiki/Special:BlankPage#autocomment2" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment2: </span> </span>',
+                               '<a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment: </span> multiple? <a href="/wiki/Special:BlankPage#autocomment2" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment2: </span> </span></span>',
                                "/* autocomment */ multiple? /* autocomment2 */ ",
                        ),
+                       array(
+                               '<a href="/wiki/Special:BlankPage#autocomment_containing_.2F.2A" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment containing /*: </span> T70361</span>',
+                               "/* autocomment containing /* */ T70361"
+                       ),
                        array(
                                '<a href="#autocomment">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
                                "/* autocomment */",
@@ -189,4 +193,49 @@ class LinkerTest extends MediaWikiLangTestCase {
                        ),
                );
        }
+
+       /**
+        * @covers Linker::formatLinksInComment
+        * @dataProvider provideCasesForFormatLinksInComment
+        */
+       public function testFormatLinksInComment( $expected, $input, $wiki ) {
+
+               $conf = new SiteConfiguration();
+               $conf->settings = array(
+                       'wgServer' => array(
+                               'enwiki' => '//en.example.org'
+                       ),
+                       'wgArticlePath' => array(
+                               'enwiki' => '/w/$1',
+                       ),
+               );
+               $conf->suffixes = array( 'wiki' );
+               $this->setMwGlobals( array(
+                       'wgScript' => '/wiki/index.php',
+                       'wgArticlePath' => '/wiki/$1',
+                       'wgWellFormedXml' => true,
+                       'wgCapitalLinks' => true,
+                       'wgConf' => $conf,
+               ) );
+
+               $this->assertEquals(
+                       $expected,
+                       Linker::formatLinksInComment( $input, Title::newFromText( 'Special:BlankPage' ), false, $wiki )
+               );
+       }
+
+       public static function provideCasesForFormatLinksInComment() {
+               return array(
+                       array(
+                               'foo bar <a href="/wiki/Special:BlankPage" title="Special:BlankPage">Special:BlankPage</a>',
+                               'foo bar [[Special:BlankPage]]',
+                               null,
+                       ),
+                       array(
+                               'foo bar <a class="external" rel="nofollow" href="//en.example.org/w/Special:BlankPage">Special:BlankPage</a>',
+                               'foo bar [[Special:BlankPage]]',
+                               'enwiki',
+                       ),
+               );
+       }
 }
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
deleted file mode 100644 (file)
index 02f6b2a..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-<?php
-
-/**
- * @group Database
- * ^--- make sure temporary tables are used.
- */
-class LinksUpdateTest extends MediaWikiTestCase {
-
-       function __construct( $name = null, array $data = array(), $dataName = '' ) {
-               parent::__construct( $name, $data, $dataName );
-
-               $this->tablesUsed = array_merge( $this->tablesUsed,
-                       array(
-                               'interwiki',
-                               'page_props',
-                               'pagelinks',
-                               'categorylinks',
-                               'langlinks',
-                               'externallinks',
-                               'imagelinks',
-                               'templatelinks',
-                               'iwlinks'
-                       )
-               );
-       }
-
-       protected function setUp() {
-               parent::setUp();
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace(
-                       'interwiki',
-                       array( 'iw_prefix' ),
-                       array(
-                               'iw_prefix' => 'linksupdatetest',
-                               'iw_url' => 'http://testing.com/wiki/$1',
-                               'iw_api' => 'http://testing.com/w/api.php',
-                               'iw_local' => 0,
-                               'iw_trans' => 0,
-                               'iw_wikiid' => 'linksupdatetest',
-                       )
-               );
-       }
-
-       protected function makeTitleAndParserOutput( $name, $id ) {
-               $t = Title::newFromText( $name );
-               $t->mArticleID = $id; # XXX: this is fugly
-
-               $po = new ParserOutput();
-               $po->setTitleText( $t->getPrefixedText() );
-
-               return array( $t, $po );
-       }
-
-       /**
-        * @covers ParserOutput::addLink
-        */
-       public function testUpdate_pagelinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addLink( Title::newFromText( "Foo" ) );
-               $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
-               $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
-               $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
-
-               $update = $this->assertLinksUpdate(
-                       $t,
-                       $po,
-                       'pagelinks',
-                       'pl_namespace,
-                       pl_title',
-                       'pl_from = 111',
-                       array( array( NS_MAIN, 'Foo' ) )
-               );
-               $this->assertArrayEquals( array(
-                       Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
-               ), $update->getAddedLinks() );
-
-               $po = new ParserOutput();
-               $po->setTitleText( $t->getPrefixedText() );
-
-               $po->addLink( Title::newFromText( "Bar" ) );
-               $po->addLink( Title::newFromText( "Talk:Bar" ) );
-
-               $update = $this->assertLinksUpdate(
-                       $t,
-                       $po,
-                       'pagelinks',
-                       'pl_namespace,
-                       pl_title',
-                       'pl_from = 111',
-                       array(
-                               array( NS_MAIN, 'Bar' ),
-                               array( NS_TALK, 'Bar' ),
-                       )
-               );
-               $this->assertArrayEquals( array(
-                       Title::makeTitle( NS_MAIN, 'Bar' ),
-                       Title::makeTitle( NS_TALK, 'Bar' ),
-               ), $update->getAddedLinks() );
-               $this->assertArrayEquals( array(
-                       Title::makeTitle( NS_MAIN, 'Foo' ),
-               ), $update->getRemovedLinks() );
-       }
-
-       /**
-        * @covers ParserOutput::addExternalLink
-        */
-       public function testUpdate_externallinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addExternalLink( "http://testing.com/wiki/Foo" );
-
-               $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
-                       array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addCategory
-        */
-       public function testUpdate_categorylinks() {
-               /** @var ParserOutput $po */
-               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
-
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addCategory( "Foo", "FOO" );
-
-               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
-                       array( 'Foo', "FOO\nTESTING" ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addInterwikiLink
-        */
-       public function testUpdate_iwlinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
-               $po->addInterwikiLink( $target );
-
-               $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
-                       array( 'linksupdatetest', 'Foo' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addTemplate
-        */
-       public function testUpdate_templatelinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
-
-               $this->assertLinksUpdate(
-                       $t,
-                       $po,
-                       'templatelinks',
-                       'tl_namespace,
-                       tl_title',
-                       'tl_from = 111',
-                       array( array( NS_TEMPLATE, 'Foo' ) )
-               );
-       }
-
-       /**
-        * @covers ParserOutput::addImage
-        */
-       public function testUpdate_imagelinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addImage( "Foo.png" );
-
-               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
-                       array( 'Foo.png' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addLanguageLink
-        */
-       public function testUpdate_langlinks() {
-               $this->setMwGlobals( array(
-                       'wgCapitalLinks' => true,
-               ) );
-
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
-
-               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
-                       array( 'En', 'Foo' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::setProperty
-        */
-       public function testUpdate_page_props() {
-               global $wgPagePropsHaveSortkey;
-
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $fields = array( 'pp_propname', 'pp_value' );
-               $expected = array();
-
-               $po->setProperty( "bool", true );
-               $expected[] = array( "bool", true );
-
-               $po->setProperty( "float", 4.0 + 1.0 / 4.0 );
-               $expected[] = array( "float", 4.0 + 1.0 / 4.0 );
-
-               $po->setProperty( "int", -7 );
-               $expected[] = array( "int", -7 );
-
-               $po->setProperty( "string", "33 bar" );
-               $expected[] = array( "string", "33 bar" );
-
-               // compute expected sortkey values
-               if ( $wgPagePropsHaveSortkey ) {
-                       $fields[] = 'pp_sortkey';
-
-                       foreach ( $expected as &$row ) {
-                               $value = $row[1];
-
-                               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
-                                       $row[] = floatval( $value );
-                               } else {
-                                       $row[] = null;
-                               }
-                       }
-               }
-
-               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
-       }
-
-       public function testUpdate_page_props_without_sortkey() {
-               $this->setMwGlobals( 'wgPagePropsHaveSortkey', false );
-
-               $this->testUpdate_page_props();
-       }
-
-       // @todo test recursive, too!
-
-       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput,
-               $table, $fields, $condition, array $expectedRows
-       ) {
-               $update = new LinksUpdate( $title, $parserOutput );
-
-               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
-               $update->beginTransaction();
-               $update->doUpdate();
-               $update->commitTransaction();
-
-               $this->assertSelect( $table, $fields, $condition, $expectedRows );
-               return $update;
-       }
-}
diff --git a/tests/phpunit/includes/LocalFileTest.php b/tests/phpunit/includes/LocalFileTest.php
deleted file mode 100644 (file)
index 5c5052e..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-/**
- * These tests should work regardless of $wgCapitalLinks
- * @group Database
- * @todo Split tests into providers and test methods
- */
-
-class LocalFileTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( 'wgCapitalLinks', true );
-
-               $info = array(
-                       'name' => 'test',
-                       'directory' => '/testdir',
-                       'url' => '/testurl',
-                       'hashLevels' => 2,
-                       'transformVia404' => false,
-                       'backend' => new FSFileBackend( array(
-                               'name' => 'local-backend',
-                               'wikiId' => wfWikiId(),
-                               'containerPaths' => array(
-                                       'cont1' => "/testdir/local-backend/tempimages/cont1",
-                                       'cont2' => "/testdir/local-backend/tempimages/cont2"
-                               )
-                       ) )
-               );
-               $this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
-               $this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
-               $this->repo_lc = new LocalRepo( array( 'initialCapital' => false ) + $info );
-               $this->file_hl0 = $this->repo_hl0->newFile( 'test!' );
-               $this->file_hl2 = $this->repo_hl2->newFile( 'test!' );
-               $this->file_lc = $this->repo_lc->newFile( 'test!' );
-       }
-
-       /**
-        * @covers File::getHashPath
-        */
-       public function testGetHashPath() {
-               $this->assertEquals( '', $this->file_hl0->getHashPath() );
-               $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
-               $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
-       }
-
-       /**
-        * @covers File::getRel
-        */
-       public function testGetRel() {
-               $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
-               $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
-               $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
-       }
-
-       /**
-        * @covers File::getUrlRel
-        */
-       public function testGetUrlRel() {
-               $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
-               $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
-               $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
-       }
-
-       /**
-        * @covers File::getArchivePath
-        */
-       public function testGetArchivePath() {
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive',
-                       $this->file_hl0->getArchivePath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive/a/a2',
-                       $this->file_hl2->getArchivePath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive/!',
-                       $this->file_hl0->getArchivePath( '!' )
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive/a/a2/!',
-                       $this->file_hl2->getArchivePath( '!' )
-               );
-       }
-
-       /**
-        * @covers File::getThumbPath
-        */
-       public function testGetThumbPath() {
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/Test!',
-                       $this->file_hl0->getThumbPath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/a/a2/Test!',
-                       $this->file_hl2->getThumbPath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/Test!/x',
-                       $this->file_hl0->getThumbPath( 'x' )
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/a/a2/Test!/x',
-                       $this->file_hl2->getThumbPath( 'x' )
-               );
-       }
-
-       /**
-        * @covers File::getArchiveUrl
-        */
-       public function testGetArchiveUrl() {
-               $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
-               $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
-               $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
-               $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
-       }
-
-       /**
-        * @covers File::getThumbUrl
-        */
-       public function testGetThumbUrl() {
-               $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
-               $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
-               $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
-               $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
-       }
-
-       /**
-        * @covers File::getArchiveVirtualUrl
-        */
-       public function testGetArchiveVirtualUrl() {
-               $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
-               $this->assertEquals(
-                       'mwrepo://test/public/archive/a/a2',
-                       $this->file_hl2->getArchiveVirtualUrl()
-               );
-               $this->assertEquals(
-                       'mwrepo://test/public/archive/%21',
-                       $this->file_hl0->getArchiveVirtualUrl( '!' )
-               );
-               $this->assertEquals(
-                       'mwrepo://test/public/archive/a/a2/%21',
-                       $this->file_hl2->getArchiveVirtualUrl( '!' )
-               );
-       }
-
-       /**
-        * @covers File::getThumbVirtualUrl
-        */
-       public function testGetThumbVirtualUrl() {
-               $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
-               $this->assertEquals(
-                       'mwrepo://test/thumb/Test%21/%21',
-                       $this->file_hl0->getThumbVirtualUrl( '!' )
-               );
-               $this->assertEquals(
-                       'mwrepo://test/thumb/a/a2/Test%21/%21',
-                       $this->file_hl2->getThumbVirtualUrl( '!' )
-               );
-       }
-
-       /**
-        * @covers File::getUrl
-        */
-       public function testGetUrl() {
-               $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
-               $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
-       }
-
-       /**
-        * @covers ::wfLocalFile
-        */
-       public function testWfLocalFile() {
-               $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
-               $this->assertThat(
-                       $file,
-                       $this->isInstanceOf( 'LocalFile' ),
-                       'wfLocalFile() returns LocalFile for valid Titles'
-               );
-       }
-}
diff --git a/tests/phpunit/includes/MWFunctionTest.php b/tests/phpunit/includes/MWFunctionTest.php
deleted file mode 100644 (file)
index f4d1799..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * @covers MWFunction
- */
-class MWFunctionTest extends MediaWikiTestCase {
-       public function testNewObjFunction() {
-               $arg1 = 'Foo';
-               $arg2 = 'Bar';
-               $arg3 = array( 'Baz' );
-               $arg4 = new ExampleObject;
-
-               $args = array( $arg1, $arg2, $arg3, $arg4 );
-
-               $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
-               $this->hideDeprecated( 'MWFunction::newObj' );
-               $this->assertEquals(
-                       MWFunction::newObj( 'MWBlankClass', $args )->args,
-                       $newObject->args
-               );
-       }
-}
-
-class MWBlankClass {
-
-       public $args = array();
-
-       function __construct( $arg1, $arg2, $arg3, $arg4 ) {
-               $this->args = array( $arg1, $arg2, $arg3, $arg4 );
-       }
-}
-
-class ExampleObject {
-}
index 05c1a66..3656254 100644 (file)
@@ -81,6 +81,17 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                new MWTimestamp( "This is not a timestamp." );
        }
 
+       /**
+        * Test an out of range timestamp
+        * @dataProvider provideOutOfRangeTimestamps
+        * @expectedException TimestampException
+        * @covers MWTimestamp
+        */
+       public function testOutOfRangeTimestamps( $format, $input ) {
+               $timestamp = new MWTimestamp( $input );
+               $timestamp->getTimestamp( $format );
+       }
+
        /**
         * Test requesting an invalid output format.
         * @expectedException TimestampException
@@ -113,6 +124,18 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * Returns a list of out of range timestamps in the format:
+        * array( type, timestamp_of_type )
+        */
+       public static function provideOutOfRangeTimestamps() {
+               return array(
+                       // Various formats
+                       array( TS_MW, '-62167219201' ), // -0001-12-31T23:59:59Z
+                       array( TS_MW, '253402300800' ), // 10000-01-01T00:00:00Z
+               );
+       }
+
        /**
         * @dataProvider provideHumanTimestampTests
         * @covers MWTimestamp::getHumanTimestamp
index 89d1de7..4d63ea6 100644 (file)
@@ -177,13 +177,13 @@ mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"
 }</script>
 '
                        ),
-                       // Load module script with with ESI
+                       // Load module script with ESI
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS, true ),
                                '<script><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.foo&amp;only=scripts&amp;skin=fallback&amp;*" /></script>
 '
                        ),
-                       // Load module styles with with ESI
+                       // Load module styles with ESI
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_STYLES, true ),
                                '<style><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.foo&amp;only=styles&amp;skin=fallback&amp;*" /></style>
diff --git a/tests/phpunit/includes/PasswordTest.php b/tests/phpunit/includes/PasswordTest.php
deleted file mode 100644 (file)
index 5ad8aca..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * Testing framework for the Password infrastructure
- *
- * 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
- */
-
-class PasswordTest extends MediaWikiTestCase {
-       /**
-        * @covers InvalidPassword::equals
-        */
-       public function testInvalidUnequalInvalid() {
-               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
-               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
-
-               $this->assertFalse( $invalid1->equals( $invalid2 ) );
-       }
-
-       public function testInvalidPlaintext() {
-               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
-
-               $this->assertInstanceOf( 'InvalidPassword', $invalid );
-       }
-}
diff --git a/tests/phpunit/includes/RequestContextTest.php b/tests/phpunit/includes/RequestContextTest.php
deleted file mode 100644 (file)
index a9e5be2..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group RequestContext
- */
-class RequestContextTest extends MediaWikiTestCase {
-
-       /**
-        * Test the relationship between title and wikipage in RequestContext
-        * @covers RequestContext::getWikiPage
-        * @covers RequestContext::getTitle
-        */
-       public function testWikiPageTitle() {
-               $context = new RequestContext();
-
-               $curTitle = Title::newFromText( "A" );
-               $context->setTitle( $curTitle );
-               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
-                       "When a title is first set WikiPage should be created on-demand for that title." );
-
-               $curTitle = Title::newFromText( "B" );
-               $context->setWikiPage( WikiPage::factory( $curTitle ) );
-               $this->assertTrue( $curTitle->equals( $context->getTitle() ),
-                       "Title must be updated when a new WikiPage is provided." );
-
-               $curTitle = Title::newFromText( "C" );
-               $context->setTitle( $curTitle );
-               $this->assertTrue(
-                       $curTitle->equals( $context->getWikiPage()->getTitle() ),
-                       "When a title is updated the WikiPage should be purged "
-                               . "and recreated on-demand with the new title."
-               );
-       }
-
-       /**
-        * @covers RequestContext::importScopedSession
-        */
-       public function testImportScopedSession() {
-               $context = RequestContext::getMain();
-
-               $oInfo = $context->exportSession();
-               $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
-               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
-
-               $user = User::newFromName( 'UnitTestContextUser' );
-               $user->addToDatabase();
-
-               $sinfo = array(
-                       'sessionId' => 'd612ee607c87e749ef14da4983a702cd',
-                       'userId' => $user->getId(),
-                       'ip' => '192.0.2.0',
-                       'headers' => array(
-                               'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'
-                       )
-               );
-               // importScopedSession() sets these variables
-               $this->setMwGlobals( array(
-                       'wgUser' => new User,
-                       'wgRequest' => new FauxRequest,
-               ) );
-               $sc = RequestContext::importScopedSession( $sinfo ); // load new context
-
-               $info = $context->exportSession();
-               $this->assertEquals( $sinfo['ip'], $info['ip'], "Correct IP address." );
-               $this->assertEquals( $sinfo['headers'], $info['headers'], "Correct headers." );
-               $this->assertEquals( $sinfo['sessionId'], $info['sessionId'], "Correct session ID." );
-               $this->assertEquals( $sinfo['userId'], $info['userId'], "Correct user ID." );
-               $this->assertEquals(
-                       $sinfo['ip'],
-                       $context->getRequest()->getIP(),
-                       "Correct context IP address."
-               );
-               $this->assertEquals(
-                       $sinfo['headers'],
-                       $context->getRequest()->getAllHeaders(),
-                       "Correct context headers."
-               );
-               $this->assertEquals( $sinfo['sessionId'], session_id(), "Correct context session ID." );
-               $this->assertEquals( true, $context->getUser()->isLoggedIn(), "Correct context user." );
-               $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
-               $this->assertEquals(
-                       'UnitTestContextUser',
-                       $context->getUser()->getName(),
-                       "Correct context user name."
-               );
-
-               unset( $sc ); // restore previous context
-
-               $info = $context->exportSession();
-               $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct restored IP address." );
-               $this->assertEquals( $oInfo['headers'], $info['headers'], "Correct restored headers." );
-               $this->assertEquals( $oInfo['sessionId'], $info['sessionId'], "Correct restored session ID." );
-               $this->assertEquals( $oInfo['userId'], $info['userId'], "Correct restored user ID." );
-       }
-}
index f960f48..36ad3cc 100644 (file)
@@ -340,4 +340,25 @@ class SanitizerTest extends MediaWikiTestCase {
                        $message
                );
        }
+
+       /**
+        * @dataProvider provideEscapeHtmlAllowEntities
+        * @covers Sanitizer::escapeHtmlAllowEntities
+        */
+       public function testEscapeHtmlAllowEntities( $expected, $html ) {
+               $this->assertEquals(
+                       $expected,
+                       Sanitizer::escapeHtmlAllowEntities( $html )
+               );
+       }
+
+       public static function provideEscapeHtmlAllowEntities() {
+               return array(
+                       array( 'foo', 'foo' ),
+                       array( 'a¡b', 'a&#161;b' ),
+                       array( 'foo&#039;bar', "foo'bar" ),
+                       array( '&lt;script&gt;foo&lt;/script&gt;', '<script>foo</script>' ),
+               );
+       }
+
 }
diff --git a/tests/phpunit/includes/SpecialPageTest.php b/tests/phpunit/includes/SpecialPageTest.php
deleted file mode 100644 (file)
index 245cdff..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * @covers SpecialPage
- *
- * @group Database
- *
- * @licence GNU GPL v2+
- * @author Katie Filbert < aude.wiki@gmail.com >
- */
-class SpecialPageTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( array(
-                       'wgScript' => '/index.php',
-                       'wgContLang' => Language::factory( 'en' )
-               ) );
-       }
-
-       /**
-        * @dataProvider getTitleForProvider
-        */
-       public function testGetTitleFor( $expectedName, $name ) {
-               $title = SpecialPage::getTitleFor( $name );
-               $expected = Title::makeTitle( NS_SPECIAL, $expectedName );
-               $this->assertEquals( $expected, $title );
-       }
-
-       public function getTitleForProvider() {
-               return array(
-                       array( 'UserLogin', 'Userlogin' )
-               );
-       }
-
-       /**
-        * @expectedException PHPUnit_Framework_Error_Notice
-        */
-       public function testInvalidGetTitleFor() {
-               $title = SpecialPage::getTitleFor( 'cat' );
-               $expected = Title::makeTitle( NS_SPECIAL, 'Cat' );
-               $this->assertEquals( $expected, $title );
-       }
-
-       /**
-        * @expectedException PHPUnit_Framework_Error_Notice
-        * @dataProvider getTitleForWithWarningProvider
-        */
-       public function testGetTitleForWithWarning( $expected, $name ) {
-               $title = SpecialPage::getTitleFor( $name );
-               $this->assertEquals( $expected, $title );
-       }
-
-       public function getTitleForWithWarningProvider() {
-               return array(
-                       array( Title::makeTitle( NS_SPECIAL, 'UserLogin' ), 'UserLogin' )
-               );
-       }
-
-       /**
-        * @dataProvider requireLoginAnonProvider
-        */
-       public function testRequireLoginAnon( $expected, $reason, $title ) {
-               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
-
-               $user = User::newFromId( 0 );
-               $specialPage->getContext()->setUser( $user );
-               $specialPage->getContext()->setLanguage( Language::factory( 'en' ) );
-
-               $this->setExpectedException( 'UserNotLoggedIn', $expected );
-
-               // $specialPage->requireLogin( [ $reason [, $title ] ] )
-               call_user_func_array(
-                       array( $specialPage, 'requireLogin' ),
-                       array_filter( array( $reason, $title ) )
-               );
-       }
-
-       public function requireLoginAnonProvider() {
-               $lang = 'en';
-
-               $expected1 = wfMessage( 'exception-nologin-text' )->inLanguage( $lang )->text();
-               $expected2 = wfMessage( 'about' )->inLanguage( $lang )->text();
-
-               return array(
-                       array( $expected1, null, null ),
-                       array( $expected2, 'about', null ),
-                       array( $expected2, 'about', 'about' ),
-               );
-       }
-
-       public function testRequireLoginNotAnon() {
-               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
-
-               $user = User::newFromName( "UTSysop" );
-               $specialPage->getContext()->setUser( $user );
-
-               $specialPage->requireLogin();
-
-               // no exception thrown, logged in use can access special page
-               $this->assertTrue( true );
-       }
-
-}
index 5904fac..bcdb45a 100644 (file)
@@ -7,7 +7,7 @@
  * @note We don't make assumptions about the main namespace.
  *       But we do expect the Help namespace to contain Wikitext.
  */
-class TitleMethodsTest extends MediaWikiTestCase {
+class TitleMethodsTest extends MediaWikiLangTestCase {
 
        protected function setUp() {
                global $wgContLang;
@@ -297,4 +297,30 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isWikitextPage() );
        }
+
+       public static function provideGetOtherPage() {
+               return array(
+                       array( 'Main Page', 'Talk:Main Page' ),
+                       array( 'Talk:Main Page', 'Main Page' ),
+                       array( 'Help:Main Page', 'Help talk:Main Page' ),
+                       array( 'Help talk:Main Page', 'Help:Main Page' ),
+                       array( 'Special:FooBar', null ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetOtherpage
+        * @covers Title::getOtherPage
+        *
+        * @param string $text
+        * @param string|null $expected
+        */
+       public function testGetOtherPage( $text, $expected ) {
+               if ( $expected === null ) {
+                       $this->setExpectedException( 'MWException' );
+               }
+
+               $title = Title::newFromText( $text );
+               $this->assertEquals( $expected, $title->getOtherPage()->getPrefixedText() );
+       }
 }
index f9ef317..c3cb193 100644 (file)
@@ -342,7 +342,7 @@ class UserTest extends MediaWikiTestCase {
        public static function provideGetCanonicalName() {
                return array(
                        array( ' trailing space ', array( 'creatable' => 'Trailing space' ), 'Trailing spaces' ),
-                       // @todo FIXME: Maybe the createable name should be 'Talk:Username' or false to reject?
+                       // @todo FIXME: Maybe the creatable name should be 'Talk:Username' or false to reject?
                        array( 'Talk:Username', array( 'creatable' => 'Username', 'usable' => 'Username',
                                'valid' => 'Username', 'false' => 'Talk:Username' ), 'Namespace prefix' ),
                        array( ' name with # hash', array( 'creatable' => false, 'usable' => false ), 'With hash' ),
@@ -355,4 +355,34 @@ class UserTest extends MediaWikiTestCase {
                                'false' => 'With / slash' ), 'With slash' ),
                );
        }
+
+       /**
+        * @covers User::equals
+        */
+       public function testEquals() {
+               $first = User::newFromName( 'EqualUser' );
+               $second = User::newFromName( 'EqualUser' );
+
+               $this->assertTrue( $first->equals( $first ) );
+               $this->assertTrue( $first->equals( $second ) );
+               $this->assertTrue( $second->equals( $first ) );
+
+               $third = User::newFromName( '0' );
+               $fourth = User::newFromName( '000' );
+
+               $this->assertFalse( $third->equals( $fourth ) );
+               $this->assertFalse( $fourth->equals( $third ) );
+
+               // Test users loaded from db with id
+               $user = User::newFromName( 'EqualUnitTestUser' );
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               $id = $user->getId();
+
+               $fifth = User::newFromId( $id );
+               $sixth = User::newFromName( 'EqualUnitTestUser' );
+               $this->assertTrue( $fifth->equals( $sixth ) );
+       }
 }
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
deleted file mode 100644 (file)
index c011e9a..0000000
+++ /dev/null
@@ -1,1301 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- * @group medium
- **/
-class WikiPageTest extends MediaWikiLangTestCase {
-
-       protected $pages_to_delete;
-
-       function __construct( $name = null, array $data = array(), $dataName = '' ) {
-               parent::__construct( $name, $data, $dataName );
-
-               $this->tablesUsed = array_merge(
-                       $this->tablesUsed,
-                       array( 'page',
-                               'revision',
-                               'text',
-
-                               'recentchanges',
-                               'logging',
-
-                               'page_props',
-                               'pagelinks',
-                               'categorylinks',
-                               'langlinks',
-                               'externallinks',
-                               'imagelinks',
-                               'templatelinks',
-                               'iwlinks' ) );
-       }
-
-       protected function setUp() {
-               parent::setUp();
-               $this->pages_to_delete = array();
-
-               LinkCache::singleton()->clear(); # avoid cached redirect status, etc
-       }
-
-       protected function tearDown() {
-               foreach ( $this->pages_to_delete as $p ) {
-                       /* @var $p WikiPage */
-
-                       try {
-                               if ( $p->exists() ) {
-                                       $p->doDeleteArticle( "testing done." );
-                               }
-                       } catch ( MWException $ex ) {
-                               // fail silently
-                       }
-               }
-               parent::tearDown();
-       }
-
-       /**
-        * @param Title|string $title
-        * @param string|null $model
-        * @return WikiPage
-        */
-       protected function newPage( $title, $model = null ) {
-               if ( is_string( $title ) ) {
-                       $ns = $this->getDefaultWikitextNS();
-                       $title = Title::newFromText( $title, $ns );
-               }
-
-               $p = new WikiPage( $title );
-
-               $this->pages_to_delete[] = $p;
-
-               return $p;
-       }
-
-       /**
-        * @param string|Title|WikiPage $page
-        * @param string $text
-        * @param int $model
-        *
-        * @return WikiPage
-        */
-       protected function createPage( $page, $text, $model = null ) {
-               if ( is_string( $page ) || $page instanceof Title ) {
-                       $page = $this->newPage( $page, $model );
-               }
-
-               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
-               $page->doEditContent( $content, "testing", EDIT_NEW );
-
-               return $page;
-       }
-
-       /**
-        * @covers WikiPage::doEditContent
-        */
-       public function testDoEditContent() {
-               $page = $this->newPage( "WikiPageTest_testDoEditContent" );
-               $title = $page->getTitle();
-
-               $content = ContentHandler::makeContent(
-                       "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
-                       $title,
-                       CONTENT_MODEL_WIKITEXT
-               );
-
-               $page->doEditContent( $content, "[[testing]] 1" );
-
-               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
-               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
-               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
-               $id = $page->getId();
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getContent();
-               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
-
-               # ------------------------
-               $content = ContentHandler::makeContent(
-                       "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                               . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
-                       $title,
-                       CONTENT_MODEL_WIKITEXT
-               );
-
-               $page->doEditContent( $content, "testing 2" );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getContent();
-               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::doEdit
-        */
-       public function testDoEdit() {
-               $this->hideDeprecated( "WikiPage::doEdit" );
-               $this->hideDeprecated( "WikiPage::getText" );
-               $this->hideDeprecated( "Revision::getText" );
-
-               //NOTE: assume help namespace will default to wikitext
-               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
-
-               $page = $this->newPage( $title );
-
-               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                       . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
-
-               $page->doEdit( $text, "[[testing]] 1" );
-
-               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
-               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
-               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
-               $id = $page->getId();
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                       . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
-
-               $page->doEdit( $text, "testing 2" );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::doQuickEdit
-        */
-       public function testDoQuickEdit() {
-               global $wgUser;
-
-               $this->hideDeprecated( "WikiPage::doQuickEdit" );
-
-               //NOTE: assume help namespace will default to wikitext
-               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
-
-               $text = "quick text";
-               $page->doQuickEdit( $text, $wgUser, "testing q" );
-
-               # ---------------------
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $text, $page->getText() );
-       }
-
-       /**
-        * @covers WikiPage::doQuickEditContent
-        */
-       public function testDoQuickEditContent() {
-               global $wgUser;
-
-               $page = $this->createPage(
-                       "WikiPageTest_testDoQuickEditContent",
-                       "original text",
-                       CONTENT_MODEL_WIKITEXT
-               );
-
-               $content = ContentHandler::makeContent(
-                       "quick text",
-                       $page->getTitle(),
-                       CONTENT_MODEL_WIKITEXT
-               );
-               $page->doQuickEditContent( $content, $wgUser, "testing q" );
-
-               # ---------------------
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertTrue( $content->equals( $page->getContent() ) );
-       }
-
-       /**
-        * @covers WikiPage::doDeleteArticle
-        */
-       public function testDoDeleteArticle() {
-               $page = $this->createPage(
-                       "WikiPageTest_testDoDeleteArticle",
-                       "[[original text]] foo",
-                       CONTENT_MODEL_WIKITEXT
-               );
-               $id = $page->getId();
-
-               $page->doDeleteArticle( "testing deletion" );
-
-               $this->assertFalse(
-                       $page->getTitle()->getArticleID() > 0,
-                       "Title object should now have page id 0"
-               );
-               $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
-               $this->assertFalse(
-                       $page->exists(),
-                       "WikiPage::exists should return false after page was deleted"
-               );
-               $this->assertNull(
-                       $page->getContent(),
-                       "WikiPage::getContent should return null after page was deleted"
-               );
-               $this->assertFalse(
-                       $page->getText(),
-                       "WikiPage::getText should return false after page was deleted"
-               );
-
-               $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
-               $this->assertFalse(
-                       $t->exists(),
-                       "Title::exists should return false after page was deleted"
-               );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::doDeleteUpdates
-        */
-       public function testDoDeleteUpdates() {
-               $page = $this->createPage(
-                       "WikiPageTest_testDoDeleteArticle",
-                       "[[original text]] foo",
-                       CONTENT_MODEL_WIKITEXT
-               );
-               $id = $page->getId();
-
-               $page->doDeleteUpdates( $id );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::getRevision
-        */
-       public function testGetRevision() {
-               $page = $this->newPage( "WikiPageTest_testGetRevision" );
-
-               $rev = $page->getRevision();
-               $this->assertNull( $rev );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $rev = $page->getRevision();
-
-               $this->assertEquals( $page->getLatest(), $rev->getId() );
-               $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
-       }
-
-       /**
-        * @covers WikiPage::getContent
-        */
-       public function testGetContent() {
-               $page = $this->newPage( "WikiPageTest_testGetContent" );
-
-               $content = $page->getContent();
-               $this->assertNull( $content );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $content = $page->getContent();
-               $this->assertEquals( "some text", $content->getNativeData() );
-       }
-
-       /**
-        * @covers WikiPage::getText
-        */
-       public function testGetText() {
-               $this->hideDeprecated( "WikiPage::getText" );
-
-               $page = $this->newPage( "WikiPageTest_testGetText" );
-
-               $text = $page->getText();
-               $this->assertFalse( $text );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $text = $page->getText();
-               $this->assertEquals( "some text", $text );
-       }
-
-       /**
-        * @covers WikiPage::getRawText
-        */
-       public function testGetRawText() {
-               $this->hideDeprecated( "WikiPage::getRawText" );
-
-               $page = $this->newPage( "WikiPageTest_testGetRawText" );
-
-               $text = $page->getRawText();
-               $this->assertFalse( $text );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $text = $page->getRawText();
-               $this->assertEquals( "some text", $text );
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               global $wgContentHandlerUseDB;
-
-               if ( !$wgContentHandlerUseDB ) {
-                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
-               }
-
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentModel",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               global $wgContentHandlerUseDB;
-
-               if ( !$wgContentHandlerUseDB ) {
-                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
-               }
-
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentHandler",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
-       }
-
-       /**
-        * @covers WikiPage::exists
-        */
-       public function testExists() {
-               $page = $this->newPage( "WikiPageTest_testExists" );
-               $this->assertFalse( $page->exists() );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-               $this->assertTrue( $page->exists() );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertTrue( $page->exists() );
-
-               # -----------------
-               $page->doDeleteArticle( "done testing" );
-               $this->assertFalse( $page->exists() );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertFalse( $page->exists() );
-       }
-
-       public static function provideHasViewableContent() {
-               return array(
-                       array( 'WikiPageTest_testHasViewableContent', false, true ),
-                       array( 'Special:WikiPageTest_testHasViewableContent', false ),
-                       array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
-                       array( 'Special:Userlogin', true ),
-                       array( 'MediaWiki:help', true ),
-               );
-       }
-
-       /**
-        * @dataProvider provideHasViewableContent
-        * @covers WikiPage::hasViewableContent
-        */
-       public function testHasViewableContent( $title, $viewable, $create = false ) {
-               $page = $this->newPage( $title );
-               $this->assertEquals( $viewable, $page->hasViewableContent() );
-
-               if ( $create ) {
-                       $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-                       $this->assertTrue( $page->hasViewableContent() );
-
-                       $page = new WikiPage( $page->getTitle() );
-                       $this->assertTrue( $page->hasViewableContent() );
-               }
-       }
-
-       public static function provideGetRedirectTarget() {
-               return array(
-                       array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
-                       array(
-                               'WikiPageTest_testGetRedirectTarget_2',
-                               CONTENT_MODEL_WIKITEXT,
-                               "#REDIRECT [[hello world]]",
-                               "Hello world"
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideGetRedirectTarget
-        * @covers WikiPage::getRedirectTarget
-        */
-       public function testGetRedirectTarget( $title, $model, $text, $target ) {
-               $this->setMwGlobals( array(
-                       'wgCapitalLinks' => true,
-               ) );
-
-               $page = $this->createPage( $title, $text, $model );
-
-               # sanity check, because this test seems to fail for no reason for some people.
-               $c = $page->getContent();
-               $this->assertEquals( 'WikitextContent', get_class( $c ) );
-
-               # now, test the actual redirect
-               $t = $page->getRedirectTarget();
-               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
-       }
-
-       /**
-        * @dataProvider provideGetRedirectTarget
-        * @covers WikiPage::isRedirect
-        */
-       public function testIsRedirect( $title, $model, $text, $target ) {
-               $page = $this->createPage( $title, $text, $model );
-               $this->assertEquals( !is_null( $target ), $page->isRedirect() );
-       }
-
-       public static function provideIsCountable() {
-               return array(
-
-                       // any
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '',
-                               'any',
-                               true
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'any',
-                               true
-                       ),
-
-                       // comma
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'comma',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo, bar',
-                               'comma',
-                               true
-                       ),
-
-                       // link
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'link',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo [[bar]]',
-                               'link',
-                               true
-                       ),
-
-                       // redirects
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '#REDIRECT [[bar]]',
-                               'any',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '#REDIRECT [[bar]]',
-                               'comma',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '#REDIRECT [[bar]]',
-                               'link',
-                               false
-                       ),
-
-                       // not a content namespace
-                       array( 'Talk:WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'any',
-                               false
-                       ),
-                       array( 'Talk:WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo, bar',
-                               'comma',
-                               false
-                       ),
-                       array( 'Talk:WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo [[bar]]',
-                               'link',
-                               false
-                       ),
-
-                       // not a content namespace, different model
-                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                               null,
-                               'Foo',
-                               'any',
-                               false
-                       ),
-                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                               null,
-                               'Foo, bar',
-                               'comma',
-                               false
-                       ),
-                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                               null,
-                               'Foo [[bar]]',
-                               'link',
-                               false
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideIsCountable
-        * @covers WikiPage::isCountable
-        */
-       public function testIsCountable( $title, $model, $text, $mode, $expected ) {
-               global $wgContentHandlerUseDB;
-
-               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
-
-               $title = Title::newFromText( $title );
-
-               if ( !$wgContentHandlerUseDB
-                       && $model
-                       && ContentHandler::getDefaultModelFor( $title ) != $model
-               ) {
-                       $this->markTestSkipped( "Can not use non-default content model $model for "
-                               . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
-               }
-
-               $page = $this->createPage( $title, $text, $model );
-
-               $editInfo = $page->prepareContentForEdit( $page->getContent() );
-
-               $v = $page->isCountable();
-               $w = $page->isCountable( $editInfo );
-
-               $this->assertEquals(
-                       $expected,
-                       $v,
-                       "isCountable( null ) returned unexpected value " . var_export( $v, true )
-                               . " instead of " . var_export( $expected, true )
-                       . " in mode `$mode` for text \"$text\""
-               );
-
-               $this->assertEquals(
-                       $expected,
-                       $w,
-                       "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
-                               . " instead of " . var_export( $expected, true )
-                       . " in mode `$mode` for text \"$text\""
-               );
-       }
-
-       public static function provideGetParserOutput() {
-               return array(
-                       array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
-                       // @todo more...?
-               );
-       }
-
-       /**
-        * @dataProvider provideGetParserOutput
-        * @covers WikiPage::getParserOutput
-        */
-       public function testGetParserOutput( $model, $text, $expectedHtml ) {
-               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
-
-               $opt = $page->makeParserOptions( 'canonical' );
-               $po = $page->getParserOutput( $opt );
-               $text = $po->getText();
-
-               $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
-               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
-
-               $this->assertEquals( $expectedHtml, $text );
-
-               return $po;
-       }
-
-       /**
-        * @covers WikiPage::getParserOutput
-        */
-       public function testGetParserOutput_nonexisting() {
-               static $count = 0;
-               $count++;
-
-               $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
-
-               $opt = new ParserOptions();
-               $po = $page->getParserOutput( $opt );
-
-               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
-       }
-
-       /**
-        * @covers WikiPage::getParserOutput
-        */
-       public function testGetParserOutput_badrev() {
-               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
-
-               $opt = new ParserOptions();
-               $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
-
-               // @todo would be neat to also test deleted revision
-
-               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
-       }
-
-       public static $sections =
-
-               "Intro
-
-== stuff ==
-hello world
-
-== test ==
-just a test
-
-== foo ==
-more stuff
-";
-
-       public function dataReplaceSection() {
-               //NOTE: assume the Help namespace to contain wikitext
-               return array(
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "0",
-                               "No more",
-                               null,
-                               trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "",
-                               "No more",
-                               null,
-                               "No more"
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "2",
-                               "== TEST ==\nmore fun",
-                               null,
-                               trim( preg_replace( '/^== test ==.*== foo ==/sm',
-                                       "== TEST ==\nmore fun\n\n== foo ==",
-                                       WikiPageTest::$sections ) )
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "8",
-                               "No more",
-                               null,
-                               trim( WikiPageTest::$sections )
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "new",
-                               "No more",
-                               "New",
-                               trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider dataReplaceSection
-        * @covers WikiPage::replaceSection
-        */
-       public function testReplaceSection( $title, $model, $text, $section, $with,
-               $sectionTitle, $expected
-       ) {
-               $this->hideDeprecated( "WikiPage::replaceSection" );
-
-               $page = $this->createPage( $title, $text, $model );
-               $text = $page->replaceSection( $section, $with, $sectionTitle );
-               $text = trim( $text );
-
-               $this->assertEquals( $expected, $text );
-       }
-
-       /**
-        * @dataProvider dataReplaceSection
-        * @covers WikiPage::replaceSectionContent
-        */
-       public function testReplaceSectionContent( $title, $model, $text, $section,
-               $with, $sectionTitle, $expected
-       ) {
-               $page = $this->createPage( $title, $text, $model );
-
-               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
-               $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
-
-               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
-       }
-
-       /**
-        * @dataProvider dataReplaceSection
-        * @covers WikiPage::replaceSectionAtRev
-        */
-       public function testReplaceSectionAtRev( $title, $model, $text, $section,
-               $with, $sectionTitle, $expected
-       ) {
-               $page = $this->createPage( $title, $text, $model );
-               $baseRevId = $page->getLatest();
-
-               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
-               $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
-
-               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
-       }
-
-       /* @todo FIXME: fix this!
-       public function testGetUndoText() {
-       $this->checkHasDiff3();
-
-       $text = "one";
-       $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
-       $rev1 = $page->getRevision();
-
-       $text .= "\n\ntwo";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section two"
-       );
-       $rev2 = $page->getRevision();
-
-       $text .= "\n\nthree";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section three"
-       );
-       $rev3 = $page->getRevision();
-
-       $text .= "\n\nfour";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section four"
-       );
-       $rev4 = $page->getRevision();
-
-       $text .= "\n\nfive";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section five"
-       );
-       $rev5 = $page->getRevision();
-
-       $text .= "\n\nsix";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section six"
-       );
-       $rev6 = $page->getRevision();
-
-       $undo6 = $page->getUndoText( $rev6 );
-       if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
-       $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
-
-       $undo3 = $page->getUndoText( $rev4, $rev2 );
-       if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
-       $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
-
-       $undo2 = $page->getUndoText( $rev2 );
-       if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
-       $this->assertEquals( "one\n\nfive", $undo2 );
-       }
-        */
-
-       /**
-        * @todo FIXME: this is a better rollback test than the one below, but it
-        * keeps failing in jenkins for some reason.
-        */
-       public function broken_testDoRollback() {
-               $admin = new User();
-               $admin->setName( "Admin" );
-
-               $text = "one";
-               $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
-                       "section one", EDIT_NEW, false, $admin );
-
-               $user1 = new User();
-               $user1->setName( "127.0.1.11" );
-               $text .= "\n\ntwo";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
-                       "adding section two", 0, false, $user1 );
-
-               $user2 = new User();
-               $user2->setName( "127.0.2.13" );
-               $text .= "\n\nthree";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
-                       "adding section three", 0, false, $user2 );
-
-               # we are having issues with doRollback spuriously failing. Apparently
-               # the last revision somehow goes missing or not committed under some
-               # circumstances. So, make sure the last revision has the right user name.
-               $dbr = wfGetDB( DB_SLAVE );
-               $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
-
-               $page = new WikiPage( $page->getTitle() );
-               $rev3 = $page->getRevision();
-               $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
-
-               $rev2 = $rev3->getPrevious();
-               $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
-
-               $rev1 = $rev2->getPrevious();
-               $this->assertEquals( 'Admin', $rev1->getUserText() );
-
-               # now, try the actual rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user2->getName(),
-                       "testing revert",
-                       $token,
-                       false,
-                       $details,
-                       $admin
-               );
-
-               if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
-                               . ";\n" . print_r( $details, true ) );
-               }
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
-                       "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
-       }
-
-       /**
-        * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
-        * @covers WikiPage::doRollback
-        */
-       public function testDoRollback() {
-               $admin = new User();
-               $admin->setName( "Admin" );
-
-               $text = "one";
-               $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one",
-                       EDIT_NEW,
-                       false,
-                       $admin
-               );
-               $rev1 = $page->getRevision();
-
-               $user1 = new User();
-               $user1->setName( "127.0.1.11" );
-               $text .= "\n\ntwo";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two",
-                       0,
-                       false,
-                       $user1
-               );
-
-               # now, try the rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user1->getName(),
-                       "testing revert",
-                       $token,
-                       false,
-                       $details,
-                       $admin
-               );
-
-               if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
-                               . ";\n" . print_r( $details, true ) );
-               }
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
-                       "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one", $page->getContent()->getNativeData() );
-       }
-
-       /**
-        * @covers WikiPage::doRollback
-        */
-       public function testDoRollbackFailureSameContent() {
-               $admin = new User();
-               $admin->setName( "Admin" );
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-
-               $text = "one";
-               $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one",
-                       EDIT_NEW,
-                       false,
-                       $admin
-               );
-               $rev1 = $page->getRevision();
-
-               $user1 = new User();
-               $user1->setName( "127.0.1.11" );
-               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $text .= "\n\ntwo";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two",
-                       0,
-                       false,
-                       $user1
-               );
-
-               # now, do a the rollback from the same user was doing the edit before
-               $resultDetails = array();
-               $token = $user1->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user1->getName(),
-                       "testing revert same user",
-                       $token,
-                       false,
-                       $resultDetails,
-                       $admin
-               );
-
-               $this->assertEquals( array(), $errors, "Rollback failed same user" );
-
-               # now, try the rollback
-               $resultDetails = array();
-               $token = $admin->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user1->getName(),
-                       "testing revert",
-                       $token,
-                       false,
-                       $resultDetails,
-                       $admin
-               );
-
-               $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
-                       '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
-                       "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one", $page->getContent()->getNativeData() );
-       }
-
-       public static function provideGetAutosummary() {
-               return array(
-                       array(
-                               'Hello there, world!',
-                               '#REDIRECT [[Foo]]',
-                               0,
-                               '/^Redirected page .*Foo/'
-                       ),
-
-                       array(
-                               null,
-                               'Hello world!',
-                               EDIT_NEW,
-                               '/^Created page .*Hello/'
-                       ),
-
-                       array(
-                               'Hello there, world!',
-                               '',
-                               0,
-                               '/^Blanked/'
-                       ),
-
-                       array(
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
-                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
-                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
-                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
-                               'Hello world!',
-                               0,
-                               '/^Replaced .*Hello/'
-                       ),
-
-                       array(
-                               'foo',
-                               'bar',
-                               0,
-                               '/^$/'
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideGetAutoSummary
-        * @covers WikiPage::getAutosummary
-        */
-       public function testGetAutosummary( $old, $new, $flags, $expected ) {
-               $this->hideDeprecated( "WikiPage::getAutosummary" );
-
-               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
-
-               $summary = $page->getAutosummary( $old, $new, $flags );
-
-               $this->assertTrue( (bool)preg_match( $expected, $summary ),
-                       "Autosummary didn't match expected pattern $expected: $summary" );
-       }
-
-       public static function provideGetAutoDeleteReason() {
-               return array(
-                       array(
-                               array(),
-                               false,
-                               false
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", null ),
-                               ),
-                               "/first edit.*only contributor/",
-                               false
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", null ),
-                                       array( "second edit", null ),
-                               ),
-                               "/second edit.*only contributor/",
-                               true
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", "127.0.2.22" ),
-                                       array( "second edit", "127.0.3.33" ),
-                               ),
-                               "/second edit/",
-                               true
-                       ),
-
-                       array(
-                               array(
-                                       array(
-                                               "first edit: "
-                                                       . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
-                                                       . " nonumy eirmod tempor invidunt ut labore et dolore magna "
-                                                       . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
-                                                       . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
-                                                       . "no sea  takimata sanctus est Lorem ipsum dolor sit amet.'",
-                                               null
-                                       ),
-                               ),
-                               '/first edit:.*\.\.\."/',
-                               false
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", "127.0.2.22" ),
-                                       array( "", "127.0.3.33" ),
-                               ),
-                               "/before blanking.*first edit/",
-                               true
-                       ),
-
-               );
-       }
-
-       /**
-        * @dataProvider provideGetAutoDeleteReason
-        * @covers WikiPage::getAutoDeleteReason
-        */
-       public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
-               global $wgUser;
-
-               //NOTE: assume Help namespace to contain wikitext
-               $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
-
-               $c = 1;
-
-               foreach ( $edits as $edit ) {
-                       $user = new User();
-
-                       if ( !empty( $edit[1] ) ) {
-                               $user->setName( $edit[1] );
-                       } else {
-                               $user = $wgUser;
-                       }
-
-                       $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
-
-                       $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
-
-                       $c += 1;
-               }
-
-               $reason = $page->getAutoDeleteReason( $hasHistory );
-
-               if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) {
-                       $this->assertEquals( $expectedResult, $reason );
-               } else {
-                       $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
-                               "Autosummary didn't match expected pattern $expectedResult: $reason" );
-               }
-
-               $this->assertEquals( $expectedHistory, $hasHistory,
-                       "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
-
-               $page->doDeleteArticle( "done" );
-       }
-
-       public static function providePreSaveTransform() {
-               return array(
-                       array( 'hello this is ~~~',
-                               "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
-                       ),
-                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
-                               'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider providePreSaveTransform
-        * @covers WikiPage::preSaveTransform
-        */
-       public function testPreSaveTransform( $text, $expected ) {
-               $this->hideDeprecated( 'WikiPage::preSaveTransform' );
-               $user = new User();
-               $user->setName( "127.0.0.1" );
-
-               //NOTE: assume Help namespace to contain wikitext
-               $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
-               $text = $page->preSaveTransform( $text, $user );
-
-               $this->assertEquals( $expected, $text );
-       }
-
-       /**
-        * @covers WikiPage::factory
-        */
-       public function testWikiPageFactory() {
-               $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
-
-               $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
-
-               $title = Title::makeTitle( NS_MAIN, 'SomePage' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiPage', get_class( $page ) );
-       }
-}
diff --git a/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php
deleted file mode 100644 (file)
index 3db7628..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- */
-class WikiPageTestContentHandlerUseDB extends WikiPageTest {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $page_table = $dbw->tableName( 'page' );
-               $revision_table = $dbw->tableName( 'revision' );
-               $archive_table = $dbw->tableName( 'archive' );
-
-               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
-                       $dbw->query( "alter table $page_table drop column page_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
-               }
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentModel",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentHandler",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
-       }
-}
index 9f154bb..0e03add 100644 (file)
@@ -166,7 +166,7 @@ class XmlSelectTest extends MediaWikiTestCase {
                        'razor'
                );
 
-               # inexistant keys should give us 'null'
+               # inexistent keys should give us 'null'
                $this->assertEquals(
                        $this->select->getAttribute( 'I DO NOT EXIT' ),
                        null
diff --git a/tests/phpunit/includes/XmlTypeCheckTest.php b/tests/phpunit/includes/XmlTypeCheckTest.php
deleted file mode 100644 (file)
index 8d6f1ed..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * PHPUnit tests for XMLTypeCheck.
- * @author physikerwelt
- * @group Xml
- * @covers XMLTypeCheck
- */
-class XmlTypeCheckTest extends MediaWikiTestCase {
-       const WELL_FORMED_XML = "<root><child /></root>";
-       const MAL_FORMED_XML = "<root><child /></error>";
-
-       /**
-        * @covers XMLTypeCheck::newFromString
-        * @covers XMLTypeCheck::getRootElement
-        */
-       public function testWellFormedXML() {
-               $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
-               $this->assertTrue( $testXML->wellFormed );
-               $this->assertEquals( 'root', $testXML->getRootElement() );
-       }
-
-       /**
-        * @covers XMLTypeCheck::newFromString
-        */
-       public function testMalFormedXML() {
-               $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
-               $this->assertFalse( $testXML->wellFormed );
-       }
-
-}
index 51d03ed..e91edcb 100644 (file)
@@ -65,7 +65,10 @@ class ApiMainTest extends ApiTestCase {
         * Test if all classes in the main module manager exists
         */
        public function testClassNamesInModuleManager() {
-               global $wgAutoloadLocalClasses;
+               global $wgAutoloadLocalClasses, $wgAutoloadClasses;
+
+               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
+               $classes = $wgAutoloadLocalClasses + $wgAutoloadClasses;
 
                $api = new ApiMain(
                        new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ) )
@@ -74,7 +77,7 @@ class ApiMainTest extends ApiTestCase {
                foreach( $modules as $name => $class ) {
                        $this->assertArrayHasKey(
                                $class,
-                               $wgAutoloadLocalClasses,
+                               $classes,
                                'Class ' . $class . ' for api module ' . $name . ' not in autoloader (with exact case)'
                        );
                }
index 9a552fa..8c27b10 100644 (file)
@@ -46,6 +46,17 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                $this->apiContext = new ApiTestContext();
        }
 
+       protected function tearDown() {
+               // Avoid leaking session over tests
+               if ( session_id() != '' ) {
+                       global $wgUser;
+                       $wgUser->logout();
+                       session_destroy();
+               }
+
+               parent::tearDown();
+       }
+
        /**
         * Edits or creates a page/revision
         * @param string $pageName Page title
diff --git a/tests/phpunit/includes/api/format/ApiFormatDbgTest.php b/tests/phpunit/includes/api/format/ApiFormatDbgTest.php
new file mode 100644 (file)
index 0000000..1e4ea53
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @group API
+ * @covers ApiFormatDbg
+ */
+class ApiFormatDbgTest extends ApiFormatTestBase {
+
+       protected $printerName = 'dbg';
+
+       public static function provideGeneralEncoding() {
+               $warning = "\n  'warnings' => \n  array (\n    'dbg' => \n    array (\n" .
+                       "      '*' => 'format=dbg has been deprecated. Please use format=json instead.',\n" .
+                       "    ),\n  ),";
+
+               return array(
+                       // Basic types
+                       array( array( null ), "array ({$warning}\n  0 => NULL,\n)" ),
+                       array( array( true ), "array ({$warning}\n  0 => true,\n)" ),
+                       array( array( false ), "array ({$warning}\n  0 => false,\n)" ),
+                       array( array( 42 ), "array ({$warning}\n  0 => 42,\n)" ),
+                       array( array( 42.5 ), "array ({$warning}\n  0 => 42.5,\n)" ),
+                       array( array( 1e42 ), "array ({$warning}\n  0 => 1.0E+42,\n)" ),
+                       array( array( 'foo' ), "array ({$warning}\n  0 => 'foo',\n)" ),
+                       array( array( 'fóo' ), "array ({$warning}\n  0 => 'fóo',\n)" ),
+
+                       // Arrays and objects
+                       array( array( array() ), "array ({$warning}\n  0 => \n  array (\n  ),\n)" ),
+                       array( array( array( 1 ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
+                       array( array( array( 'x' => 1 ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
+                       array( array( array( 2 => 1 ) ), "array ({$warning}\n  0 => \n  array (\n    2 => 1,\n  ),\n)" ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), "array ({$warning}\n  '*' => 'foo',\n)" ),
+               );
+       }
+
+}
diff --git a/tests/phpunit/includes/api/format/ApiFormatDumpTest.php b/tests/phpunit/includes/api/format/ApiFormatDumpTest.php
new file mode 100644 (file)
index 0000000..2800d2d
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @group API
+ * @covers ApiFormatDump
+ */
+class ApiFormatDumpTest extends ApiFormatTestBase {
+
+       protected $printerName = 'dump';
+
+       public static function provideGeneralEncoding() {
+               // Sigh. Docs claim it's a boolean, but can have values 0, 1, or 2.
+               // Fortunately wfIniGetBool does the right thing.
+               if ( wfIniGetBool( 'xdebug.overload_var_dump' ) ) {
+                       return array(
+                               array( array(), 'Cannot test ApiFormatDump when xDebug overloads var_dump', array( 'SKIP' => true ) ),
+                       );
+               }
+
+               $warning = "\n  [\"warnings\"]=>\n  array(1) {\n    [\"dump\"]=>\n    array(1) {\n      [\"*\"]=>\n" .
+                       "      string(64) \"format=dump has been deprecated. Please use format=json instead.\"\n" .
+                       "    }\n  }";
+
+               return array(
+                       // Basic types
+                       array( array( null ), "array(2) {{$warning}\n  [0]=>\n  NULL\n}\n" ),
+                       array( array( true ), "array(2) {{$warning}\n  [0]=>\n  bool(true)\n}\n" ),
+                       array( array( false ), "array(2) {{$warning}\n  [0]=>\n  bool(false)\n}\n" ),
+                       array( array( 42 ), "array(2) {{$warning}\n  [0]=>\n  int(42)\n}\n" ),
+                       array( array( 42.5 ), "array(2) {{$warning}\n  [0]=>\n  float(42.5)\n}\n" ),
+                       array( array( 1e42 ), "array(2) {{$warning}\n  [0]=>\n  float(1.0E+42)\n}\n" ),
+                       array( array( 'foo' ), "array(2) {{$warning}\n  [0]=>\n  string(3) \"foo\"\n}\n" ),
+                       array( array( 'fóo' ), "array(2) {{$warning}\n  [0]=>\n  string(4) \"fóo\"\n}\n" ),
+
+                       // Arrays
+                       array( array( array() ), "array(2) {{$warning}\n  [0]=>\n  array(0) {\n  }\n}\n" ),
+                       array( array( array( 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( array( 'x' => 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( array( 2 => 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [2]=>\n    int(1)\n  }\n}\n" ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), "array(2) {{$warning}\n  [\"*\"]=>\n  string(3) \"foo\"\n}\n" ),
+               );
+       }
+
+}
index fc1f902..bdf3f13 100644 (file)
@@ -2,21 +2,41 @@
 
 /**
  * @group API
- * @group Database
- * @group medium
  * @covers ApiFormatJson
  */
 class ApiFormatJsonTest extends ApiFormatTestBase {
 
-       public function testValidSyntax( ) {
-               $data = $this->apiRequest( 'json', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+       protected $printerName = 'json';
 
-               $this->assertInternalType( 'array', json_decode( $data, true ) );
-               $this->assertGreaterThan( 0, count( (array)$data ) );
-       }
+       public static function provideGeneralEncoding() {
+               return array(
+                       // Basic types
+                       array( array( null ), '[null]' ),
+                       array( array( true ), '[true]' ),
+                       array( array( false ), '[false]' ),
+                       array( array( 42 ), '[42]' ),
+                       array( array( 42.5 ), '[42.5]' ),
+                       array( array( 1e42 ), '[1.0e+42]' ),
+                       array( array( 'foo' ), '["foo"]' ),
+                       array( array( 'fóo' ), '["f\u00f3o"]' ),
+                       array( array( 'fóo' ), '["fóo"]', array( 'utf8' => 1 ) ),
+
+                       // Arrays and objects
+                       array( array( array() ), '[[]]' ),
+                       array( array( array( 1 ) ), '[[1]]' ),
+                       array( array( array( 'x' => 1 ) ), '[{"x":1}]' ),
+                       array( array( array( 2 => 1 ) ), '[{"2":1}]' ),
+                       array( array( (object)array() ), '[{}]' ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), '{"*":"foo"}' ),
 
-       public function testJsonpInjection( ) {
-               $data = $this->apiRequest( 'json', array( 'action' => 'query', 'meta' => 'siteinfo', 'callback' => 'myCallback' ) );
-               $this->assertEquals( '/**/myCallback(', substr( $data, 0, 15 ) );
+                       // Callbacks
+                       array( array( 1 ), '/**/myCallback([1])', array( 'callback' => 'myCallback' ) ),
+
+                       // Cross-domain mangling
+                       array( array( '< Cross-Domain-Policy >' ), '["\u003C Cross-Domain-Policy \u003E"]' ),
+               );
        }
+
 }
index cabd750..1487ad0 100644 (file)
@@ -2,15 +2,33 @@
 
 /**
  * @group API
- * @group Database
- * @group medium
  * @covers ApiFormatNone
  */
 class ApiFormatNoneTest extends ApiFormatTestBase {
 
-       public function testValidSyntax( ) {
-               $data = $this->apiRequest( 'none', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+       protected $printerName = 'none';
 
-               $this->assertEquals( '', $data ); // No output!
+       public static function provideGeneralEncoding() {
+               return array(
+                       // Basic types
+                       array( array( null ), '' ),
+                       array( array( true ), '' ),
+                       array( array( false ), '' ),
+                       array( array( 42 ), '' ),
+                       array( array( 42.5 ), '' ),
+                       array( array( 1e42 ), '' ),
+                       array( array( 'foo' ), '' ),
+                       array( array( 'fóo' ), '' ),
+
+                       // Arrays and objects
+                       array( array( array() ), '' ),
+                       array( array( array( 1 ) ), '' ),
+                       array( array( array( 'x' => 1 ) ), '' ),
+                       array( array( array( 2 => 1 ) ), '' ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), '' ),
+               );
        }
+
 }
index 54f447a..469346c 100644 (file)
@@ -2,16 +2,76 @@
 
 /**
  * @group API
- * @group Database
- * @group medium
  * @covers ApiFormatPhp
  */
 class ApiFormatPhpTest extends ApiFormatTestBase {
 
-       public function testValidSyntax( ) {
-               $data = $this->apiRequest( 'php', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+       protected $printerName = 'php';
 
-               $this->assertInternalType( 'array', unserialize( $data ) );
-               $this->assertGreaterThan( 0, count( (array)$data ) );
+       public static function provideGeneralEncoding() {
+               return array(
+                       // Basic types
+                       array( array( null ), 'a:1:{i:0;N;}' ),
+                       array( array( true ), 'a:1:{i:0;b:1;}' ),
+                       array( array( false ), 'a:1:{i:0;b:0;}' ),
+                       array( array( 42 ), 'a:1:{i:0;i:42;}' ),
+                       array( array( 42.5 ), 'a:1:{i:0;d:42.5;}' ),
+                       array( array( 1e42 ), 'a:1:{i:0;d:1.0E+42;}' ),
+                       array( array( 'foo' ), 'a:1:{i:0;s:3:"foo";}' ),
+                       array( array( 'fóo' ), 'a:1:{i:0;s:4:"fóo";}' ),
+
+                       // Arrays and objects
+                       array( array( array() ), 'a:1:{i:0;a:0:{}}' ),
+                       array( array( array( 1 ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                       array( array( array( 'x' => 1 ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                       array( array( array( 2 => 1 ) ), 'a:1:{i:0;a:1:{i:2;i:1;}}' ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), 'a:1:{s:1:"*";s:3:"foo";}' ),
+               );
+       }
+
+       public function testCrossDomainMangling() {
+               $config = new HashConfig( array( 'MangleFlashPolicy' => false ) );
+               $context = new RequestContext;
+               $context->setConfig( new MultiConfig( array(
+                       $config,
+                       $context->getConfig(),
+               ) ) );
+               $main = new ApiMain( $context );
+               $main->getResult()->addValue( null, null, '< Cross-Domain-Policy >' );
+
+               if ( !function_exists( 'wfOutputHandler' ) ) {
+                       function wfOutputHandler( $s ) {
+                               return $s;
+                       }
+               }
+
+               $printer = $main->createPrinterByName( 'php' );
+               ob_start( 'wfOutputHandler' );
+               $printer->initPrinter();
+               $printer->execute();
+               $printer->closePrinter();
+               $ret = ob_get_clean();
+               $this->assertSame( 'a:1:{i:0;s:23:"< Cross-Domain-Policy >";}', $ret );
+
+               $config->set( 'MangleFlashPolicy', true );
+               $printer = $main->createPrinterByName( 'php' );
+               ob_start( 'wfOutputHandler' );
+               try {
+                       $printer->initPrinter();
+                       $printer->execute();
+                       $printer->closePrinter();
+                       ob_end_clean();
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UsageException $ex ) {
+                       ob_end_clean();
+                       $this->assertSame(
+                               'This response cannot be represented using format=php. See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
        }
+
 }
index af77570..67949ab 100644 (file)
@@ -1,29 +1,63 @@
 <?php
 
-abstract class ApiFormatTestBase extends ApiTestCase {
+abstract class ApiFormatTestBase extends MediaWikiTestCase {
 
        /**
-        * @param string $format
-        * @param array $params
-        * @param array $data
-        *
-        * @return string
+        * Name of the formatter being tested
+        * @var string
         */
-       protected function apiRequest( $format, $params, $data = null ) {
-               $data = parent::doApiRequest( $params, $data, true );
+       protected $printerName;
 
-               /** @var ApiMain $module */
-               $module = $data[3];
+       /**
+        * Return general data to be encoded for testing
+        * @return array See self::testGeneralEncoding
+        * @throws Exception
+        */
+       public static function provideGeneralEncoding() {
+               throw new Exception( 'Subclass must implement ' . __METHOD__ );
+       }
 
-               $printer = $module->createPrinterByName( $format );
+       /**
+        * Get the formatter output for the given input data
+        * @param array $params Query parameters
+        * @param array $data Data to encode
+        * @param string $class Printer class to use instead of the normal one
+        * @return string
+        * @throws Exception
+        */
+       protected function encodeData( array $params, array $data, $class = null ) {
+               $context = new RequestContext;
+               $context->setRequest( new FauxRequest( $params, true ) );
+               $main = new ApiMain( $context );
+               if ( $class !== null ) {
+                       $main->getModuleManager()->addModule( $this->printerName, 'format', $class );
+               }
+               $result = $main->getResult();
+               foreach ( $data as $k => $v ) {
+                       $result->addValue( null, $k, $v );
+               }
 
-               ob_start();
-               $printer->initPrinter( false );
+               $printer = $main->createPrinterByName( $this->printerName );
+               $printer->initPrinter();
                $printer->execute();
-               $printer->closePrinter();
-               $out = ob_get_clean();
+               ob_start();
+               try {
+                       $printer->closePrinter();
+                       return ob_get_clean();
+               } catch ( Exception $ex ) {
+                       ob_end_clean();
+                       throw $ex;
+               }
+       }
 
-               return $out;
+       /**
+        * @dataProvider provideGeneralEncoding
+        */
+       public function testGeneralEncoding( array $data, $expect, array $params = array() ) {
+               if ( isset( $params['SKIP'] ) ) {
+                       $this->markTestSkipped( $expect );
+               }
+               $this->assertSame( $expect, $this->encodeData( $params, $data ) );
        }
 
 }
diff --git a/tests/phpunit/includes/api/format/ApiFormatTxtTest.php b/tests/phpunit/includes/api/format/ApiFormatTxtTest.php
new file mode 100644 (file)
index 0000000..06e9204
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @group API
+ * @covers ApiFormatTxt
+ */
+class ApiFormatTxtTest extends ApiFormatTestBase {
+
+       protected $printerName = 'txt';
+
+       public static function provideGeneralEncoding() {
+               $warning = "\n    [warnings] => Array\n        (\n            [txt] => Array\n                (\n" .
+                       "                    [*] => format=txt has been deprecated. Please use format=json instead.\n" .
+                       "                )\n\n        )\n";
+
+               return array(
+                       // Basic types
+                       array( array( null ), "Array\n({$warning}\n    [0] => \n)\n" ),
+                       array( array( true ), "Array\n({$warning}\n    [0] => 1\n)\n" ),
+                       array( array( false ), "Array\n({$warning}\n    [0] => \n)\n" ),
+                       array( array( 42 ), "Array\n({$warning}\n    [0] => 42\n)\n" ),
+                       array( array( 42.5 ), "Array\n({$warning}\n    [0] => 42.5\n)\n" ),
+                       array( array( 1e42 ), "Array\n({$warning}\n    [0] => 1.0E+42\n)\n" ),
+                       array( array( 'foo' ), "Array\n({$warning}\n    [0] => foo\n)\n" ),
+                       array( array( 'fóo' ), "Array\n({$warning}\n    [0] => fóo\n)\n" ),
+
+                       // Arrays and objects
+                       array( array( array() ), "Array\n({$warning}\n    [0] => Array\n        (\n        )\n\n)\n" ),
+                       array( array( array( 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
+                       array( array( array( 'x' => 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
+                       array( array( array( 2 => 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [2] => 1\n        )\n\n)\n" ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), "Array\n({$warning}\n    [*] => foo\n)\n" ),
+               );
+       }
+
+}
index 5170856..81676e0 100644 (file)
@@ -2,20 +2,62 @@
 
 /**
  * @group API
- * @group Database
- * @group medium
  * @covers ApiFormatWddx
  */
 class ApiFormatWddxTest extends ApiFormatTestBase {
 
-       public function testValidSyntax( ) {
-               if ( !function_exists( 'wddx_deserialize' ) ) {
-                       $this->markTestSkipped( "Function 'wddx_deserialize' not exist, skipping." );
+       protected $printerName = 'wddx';
+
+       public static function provideGeneralEncoding() {
+               if ( ApiFormatWddx::useSlowPrinter() ) {
+                       return array(
+                               array( array(), 'Fast Wddx printer is unavailable', array( 'SKIP' => true ) )
+                       );
                }
+               return self::provideEncoding();
+       }
+
+       public static function provideEncoding() {
+               $p = '<wddxPacket version=\'1.0\'><header/><data><struct><var name=\'warnings\'><struct><var name=\'wddx\'><struct><var name=\'*\'><string>format=wddx has been deprecated. Please use format=json instead.</string></var></struct></var></struct></var>';
+               $s = '</struct></data></wddxPacket>';
+
+               return array(
+                       // Basic types
+                       array( array( null ), "{$p}<var name='0'><null/></var>{$s}" ),
+                       array( array( true ), "{$p}<var name='0'><boolean value='true'/></var>{$s}" ),
+                       array( array( false ), "{$p}<var name='0'><boolean value='false'/></var>{$s}" ),
+                       array( array( 42 ), "{$p}<var name='0'><number>42</number></var>{$s}" ),
+                       array( array( 42.5 ), "{$p}<var name='0'><number>42.5</number></var>{$s}" ),
+                       array( array( 1e42 ), "{$p}<var name='0'><number>1.0E+42</number></var>{$s}" ),
+                       array( array( 'foo' ), "{$p}<var name='0'><string>foo</string></var>{$s}" ),
+                       array( array( 'fóo' ), "{$p}<var name='0'><string>fóo</string></var>{$s}" ),
+
+                       // Arrays and objects
+                       array( array( array() ), "{$p}<var name='0'><array length='0'></array></var>{$s}" ),
+                       array( array( array( 1 ) ), "{$p}<var name='0'><array length='1'><number>1</number></array></var>{$s}" ),
+                       array( array( array( 'x' => 1 ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
+                       array( array( array( 2 => 1 ) ), "{$p}<var name='0'><struct><var name='2'><number>1</number></var></struct></var>{$s}" ),
 
-               $data = $this->apiRequest( 'wddx', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+                       // Content
+                       array( array( '*' => 'foo' ), "{$p}<var name='*'><string>foo</string></var>{$s}" ),
+               );
+       }
+
+       /**
+        * @dataProvider provideEncoding
+        */
+       public function testSlowEncoding( array $data, $expect, array $params = array() ) {
+               // Adjust expectation for differences between fast and slow printers.
+               $expect = str_replace( '\'', '"', $expect );
+               $expect = str_replace( '/>', ' />', $expect );
+               $expect = '<?xml version="1.0"?>' . $expect;
+
+               $this->assertSame( $expect, $this->encodeData( $params, $data, 'ApiFormatWddxTest_SlowWddx' ) );
+       }
+}
 
-               $this->assertInternalType( 'array', wddx_deserialize( $data ) );
-               $this->assertGreaterThan( 0, count( (array)$data ) );
+class ApiFormatWddxTest_SlowWddx extends ApiFormatWddx {
+       public static function useSlowPrinter() {
+               return true;
        }
 }
diff --git a/tests/phpunit/includes/api/format/ApiFormatXmlTest.php b/tests/phpunit/includes/api/format/ApiFormatXmlTest.php
new file mode 100644 (file)
index 0000000..afb47e7
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @covers ApiFormatXml
+ */
+class ApiFormatXmlTest extends ApiFormatTestBase {
+
+       protected $printerName = 'xml';
+
+       protected function setUp() {
+               parent::setUp();
+               $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' ) );
+               $page->doEditContent( new WikitextContent(
+                       '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" />'
+               ), 'Summary' );
+               $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest' ) );
+               $page->doEditContent( new WikitextContent( 'Bogus' ), 'Summary' );
+               $page = WikiPage::factory( Title::newFromText( 'ApiFormatXmlTest' ) );
+               $page->doEditContent( new WikitextContent( 'Bogus' ), 'Summary' );
+       }
+
+       public static function provideGeneralEncoding() {
+               $tests = array(
+                       // Basic types
+                       array( array( null ), '<?xml version="1.0"?><api><x /></api>' ),
+                       array( array( true, 'a' => true ), '<?xml version="1.0"?><api a=""><x>1</x></api>' ),
+                       array( array( false, 'a' => false ), '<?xml version="1.0"?><api><x></x></api>' ),
+                       array( array( 42, 'a' => 42 ), '<?xml version="1.0"?><api a="42"><x>42</x></api>' ),
+                       array( array( 42.5, 'a' => 42.5 ), '<?xml version="1.0"?><api a="42.5"><x>42.5</x></api>' ),
+                       array( array( 1e42, 'a' => 1e42 ), '<?xml version="1.0"?><api a="1.0E+42"><x>1.0E+42</x></api>' ),
+                       array( array( 'foo', 'a' => 'foo' ), '<?xml version="1.0"?><api a="foo"><x>foo</x></api>' ),
+                       array( array( 'fóo', 'a' => 'fóo' ), '<?xml version="1.0"?><api a="fóo"><x>fóo</x></api>' ),
+
+                       // Arrays and objects
+                       array( array( array() ), '<?xml version="1.0"?><api><x /></api>' ),
+                       array( array( array( 'x' => 1 ) ), '<?xml version="1.0"?><api><x x="1" /></api>' ),
+                       array( array( array( 2 => 1, '_element' => 'x' ) ), '<?xml version="1.0"?><api><x><x>1</x></x></api>' ),
+
+                       // Content
+                       array( array( '*' => 'foo' ), '<?xml version="1.0"?><api xml:space="preserve">foo</api>' ),
+
+                       // Subelements
+                       array( array( 'a' => 1, 's' => 1, '_subelements' => array( 's' ) ),
+                               '<?xml version="1.0"?><api a="1"><s xml:space="preserve">1</s></api>' ),
+
+                       // includenamespace param
+                       array( array( 'x' => 'foo' ), '<?xml version="1.0"?><api x="foo" xmlns="http://www.mediawiki.org/xml/api/" />',
+                               array( 'includexmlnamespace' => 1 ) ),
+
+                       // xslt param
+                       array( array(), '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Invalid or non-existent stylesheet specified</xml></warnings></api>',
+                               array( 'xslt' => 'DoesNotExist' ) ),
+                       array( array(), '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should be in the MediaWiki namespace.</xml></warnings></api>',
+                               array( 'xslt' => 'ApiFormatXmlTest' ) ),
+                       array( array(), '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should have .xsl extension.</xml></warnings></api>',
+                               array( 'xslt' => 'MediaWiki:ApiFormatXmlTest' ) ),
+                       array( array(),
+                               '<?xml version="1.0"?><?xml-stylesheet href="' .
+                                       htmlspecialchars( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' )->getLocalURL( 'action=raw' ) ) .
+                                       '" type="text/xsl" ?><api />',
+                               array( 'xslt' => 'MediaWiki:ApiFormatXmlTest.xsl' ) ),
+               );
+
+               // Add in the needed "_element" for all indexed arrays
+               $ret = array();
+               foreach ( $tests as $v ) {
+                       $v[0] += array( '_element' => 'x' );
+                       $ret[] = $v;
+               }
+               return $ret;
+       }
+
+       /**
+        * @dataProvider provideXmlFail
+        */
+       public function testXmlFail( array $data, $expect, array $params = array() ) {
+               try {
+                       echo $this->encodeData( $params, $data ) . "\n";
+                       $this->fail( "Expected exception not thrown" );
+               } catch ( MWException $ex ) {
+                       $this->assertSame( $expect, $ex->getMessage(), 'Expected exception' );
+               }
+       }
+
+       public static function provideXmlFail() {
+               return array(
+                       // Array without _element
+                       array( array( 1 ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName().' ),
+                       // Content and subelement
+                       array( array( 1, 's' => array(), '*' => 2, '_element' => 'x' ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
+                       array( array( 1, 's' => 1, '*' => 2, '_element' => 'x', '_subelements' => array( 's' ) ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
+                       // These should fail but don't because of a long-standing bug (see T57371#639713)
+                       //array( array( 1, '*' => 2, '_element' => 'x' ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
+                       //array( array( 's' => array(), '*' => 2 ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
+                       //array( array( 's' => 1, '*' => 2, '_subelements' => array( 's' ) ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
+               );
+       }
+
+}
index 3ab1334..5f061b5 100644 (file)
@@ -121,7 +121,10 @@ class ApiQueryTest extends ApiTestCase {
         * Test if all classes in the query module manager exists
         */
        public function testClassNamesInModuleManager() {
-               global $wgAutoloadLocalClasses;
+               global $wgAutoloadLocalClasses, $wgAutoloadClasses;
+
+               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
+               $classes = $wgAutoloadLocalClasses + $wgAutoloadClasses;
 
                $api = new ApiMain(
                        new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ) )
@@ -131,7 +134,7 @@ class ApiQueryTest extends ApiTestCase {
                foreach( $modules as $name => $class ) {
                        $this->assertArrayHasKey(
                                $class,
-                               $wgAutoloadLocalClasses,
+                               $classes,
                                'Class ' . $class . ' for api module ' . $name . ' not in autoloader (with exact case)'
                        );
                }
index d4151a5..cccfe7b 100644 (file)
@@ -6,48 +6,85 @@
  */
 class JsonContentTest extends MediaWikiLangTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgWellFormedXml', true );
+       }
+
        public static function provideValidConstruction() {
                return array(
-                       array( 'foo', CONTENT_MODEL_JSON, false, null ),
-                       array( FormatJson::encode( array() ), CONTENT_MODEL_JSON, true, array() ),
-                       array( FormatJson::encode( array( 'foo' ) ), CONTENT_MODEL_JSON, true, array( 'foo' ) ),
+                       array( 'foo', false, null ),
+                       array( '[]', true, array() ),
+                       array( '{}', true, (object)array() ),
+                       array( '""', true, '' ),
+                       array( '"0"', true, '0' ),
+                       array( '"bar"', true, 'bar' ),
+                       array( '0', true, '0' ),
+                       array( '{ "0": "bar" }', true, (object)array( 'bar' ) ),
                );
        }
 
        /**
         * @dataProvider provideValidConstruction
         */
-       public function testValidConstruct( $text, $modelId, $isValid, $expected ) {
-               $obj = new JsonContent( $text, $modelId );
+       public function testIsValid( $text, $isValid, $expected ) {
+               $obj = new JsonContent( $text, CONTENT_MODEL_JSON );
                $this->assertEquals( $isValid, $obj->isValid() );
-               $this->assertEquals( $expected, $obj->getJsonData() );
+               $this->assertEquals( $expected, $obj->getData()->getValue() );
        }
 
        public static function provideDataToEncode() {
                return array(
-                       array( array() ),
-                       array( array( 'foo' ) ),
-                       array( array( 'foo', 'bar' ) ),
-                       array( array( 'baz' => 'foo', 'bar' ) ),
-                       array( array( 'baz' => 1000, 'bar' ) ),
+                       array(
+                               // Round-trip empty array
+                               '[]',
+                               '[]',
+                       ),
+                       array(
+                               // Round-trip empty object
+                               '{}',
+                               '{}',
+                       ),
+                       array(
+                               // Round-trip empty array/object (nested)
+                               '{ "foo": {}, "bar": [] }',
+                               "{\n    \"foo\": {},\n    \"bar\": []\n}",
+                       ),
+                       array(
+                               '{ "foo": "bar" }',
+                               "{\n    \"foo\": \"bar\"\n}",
+                       ),
+                       array(
+                               '{ "foo": 1000 }',
+                               "{\n    \"foo\": 1000\n}",
+                       ),
+                       array(
+                               '{ "foo": 1000, "0": "bar" }',
+                               "{\n    \"foo\": 1000,\n    \"0\": \"bar\"\n}",
+                       ),
                );
        }
 
        /**
         * @dataProvider provideDataToEncode
         */
-       public function testBeautifyUsesFormatJson( $data ) {
-               $obj = new JsonContent( FormatJson::encode( $data ) );
-               $this->assertEquals( FormatJson::encode( $data, true ), $obj->beautifyJSON() );
+       public function testBeautifyJson( $input, $beautified ) {
+               $obj = new JsonContent( $input );
+               $this->assertEquals( $beautified, $obj->beautifyJSON() );
        }
 
        /**
         * @dataProvider provideDataToEncode
         */
-       public function testPreSaveTransform( $data ) {
-               $obj = new JsonContent( FormatJson::encode( $data ) );
-               $newObj = $obj->preSaveTransform( $this->getMockTitle(), $this->getMockUser(), $this->getMockParserOptions() );
-               $this->assertTrue( $newObj->equals( new JsonContent( FormatJson::encode( $data, true ) ) ) );
+       public function testPreSaveTransform( $input, $transformed ) {
+               $obj = new JsonContent( $input );
+               $newObj = $obj->preSaveTransform(
+                       $this->getMockTitle(),
+                       $this->getMockUser(),
+                       $this->getMockParserOptions()
+               );
+               $this->assertTrue( $newObj->equals( new JsonContent( $transformed ) ) );
        }
 
        private function getMockTitle() {
@@ -71,33 +108,40 @@ class JsonContentTest extends MediaWikiLangTestCase {
                return array(
                        array(
                                array(),
-                               '<table class="mw-json"><tbody></tbody></table>'
+                               '<table class="mw-json"><tbody><tr><td>' .
+                               '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty array</td></tr>'
+                               . '</tbody></table></td></tr></tbody></table>'
+                       ),
+                       array(
+                               (object)array(),
+                               '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty object</td></tr>' .
+                               '</tbody></table>'
                        ),
                        array(
-                               array( 'foo' ),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr></tbody></table>'
+                               (object)array( 'foo' ),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"foo"</td></tr>' .
+                               '</tbody></table>'
                        ),
                        array(
-                               array( 'foo', 'bar' ),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr>' .
-                               "\n" .
-                               '<tr><th>1</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
+                               (object)array( 'foo', 'bar' ),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"foo"</td></tr>' .
+                               '<tr><th>1</th><td class="value">"bar"</td></tr></tbody></table>'
                        ),
                        array(
-                               array( 'baz' => 'foo', 'bar' ),
-                               '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">&quot;foo&quot;</td></tr>' .
-                               "\n" .
-                               '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
+                               (object)array( 'baz' => 'foo', 'bar' ),
+                               '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">"foo"</td></tr>' .
+                               '<tr><th>0</th><td class="value">"bar"</td></tr></tbody></table>'
                        ),
                        array(
-                               array( 'baz' => 1000, 'bar' ),
+                               (object)array( 'baz' => 1000, 'bar' ),
                                '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">1000</td></tr>' .
-                               "\n" .
-                               '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
+                               '<tr><th>0</th><td class="value">"bar"</td></tr></tbody></table>'
                        ),
                        array(
-                               array( '<script>alert("evil!")</script>'),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;&lt;script&gt;alert(&quot;evil!&quot;)&lt;/script&gt;&quot;</td></tr></tbody></table>',
+                               (object)array( '<script>alert("evil!")</script>'),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"' .
+                               '&lt;script>alert("evil!")&lt;/script>"' .
+                               '</td></tr></tbody></table>',
                        ),
                );
        }
diff --git a/tests/phpunit/includes/context/RequestContextTest.php b/tests/phpunit/includes/context/RequestContextTest.php
new file mode 100644 (file)
index 0000000..a9e5be2
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @group Database
+ * @group RequestContext
+ */
+class RequestContextTest extends MediaWikiTestCase {
+
+       /**
+        * Test the relationship between title and wikipage in RequestContext
+        * @covers RequestContext::getWikiPage
+        * @covers RequestContext::getTitle
+        */
+       public function testWikiPageTitle() {
+               $context = new RequestContext();
+
+               $curTitle = Title::newFromText( "A" );
+               $context->setTitle( $curTitle );
+               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is first set WikiPage should be created on-demand for that title." );
+
+               $curTitle = Title::newFromText( "B" );
+               $context->setWikiPage( WikiPage::factory( $curTitle ) );
+               $this->assertTrue( $curTitle->equals( $context->getTitle() ),
+                       "Title must be updated when a new WikiPage is provided." );
+
+               $curTitle = Title::newFromText( "C" );
+               $context->setTitle( $curTitle );
+               $this->assertTrue(
+                       $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is updated the WikiPage should be purged "
+                               . "and recreated on-demand with the new title."
+               );
+       }
+
+       /**
+        * @covers RequestContext::importScopedSession
+        */
+       public function testImportScopedSession() {
+               $context = RequestContext::getMain();
+
+               $oInfo = $context->exportSession();
+               $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
+               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
+
+               $user = User::newFromName( 'UnitTestContextUser' );
+               $user->addToDatabase();
+
+               $sinfo = array(
+                       'sessionId' => 'd612ee607c87e749ef14da4983a702cd',
+                       'userId' => $user->getId(),
+                       'ip' => '192.0.2.0',
+                       'headers' => array(
+                               'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'
+                       )
+               );
+               // importScopedSession() sets these variables
+               $this->setMwGlobals( array(
+                       'wgUser' => new User,
+                       'wgRequest' => new FauxRequest,
+               ) );
+               $sc = RequestContext::importScopedSession( $sinfo ); // load new context
+
+               $info = $context->exportSession();
+               $this->assertEquals( $sinfo['ip'], $info['ip'], "Correct IP address." );
+               $this->assertEquals( $sinfo['headers'], $info['headers'], "Correct headers." );
+               $this->assertEquals( $sinfo['sessionId'], $info['sessionId'], "Correct session ID." );
+               $this->assertEquals( $sinfo['userId'], $info['userId'], "Correct user ID." );
+               $this->assertEquals(
+                       $sinfo['ip'],
+                       $context->getRequest()->getIP(),
+                       "Correct context IP address."
+               );
+               $this->assertEquals(
+                       $sinfo['headers'],
+                       $context->getRequest()->getAllHeaders(),
+                       "Correct context headers."
+               );
+               $this->assertEquals( $sinfo['sessionId'], session_id(), "Correct context session ID." );
+               $this->assertEquals( true, $context->getUser()->isLoggedIn(), "Correct context user." );
+               $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
+               $this->assertEquals(
+                       'UnitTestContextUser',
+                       $context->getUser()->getName(),
+                       "Correct context user name."
+               );
+
+               unset( $sc ); // restore previous context
+
+               $info = $context->exportSession();
+               $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct restored IP address." );
+               $this->assertEquals( $oInfo['headers'], $info['headers'], "Correct restored headers." );
+               $this->assertEquals( $oInfo['sessionId'], $info['sessionId'], "Correct restored session ID." );
+               $this->assertEquals( $oInfo['userId'], $info['userId'], "Correct restored user ID." );
+       }
+}
index 5c2d4b7..b13751f 100644 (file)
@@ -722,4 +722,84 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                        $this->database->dropTable( 'non_existing', __METHOD__ )
                );
        }
+
+       /**
+        * @dataProvider provideMakeList
+        * @covers DatabaseBase::makeList
+        */
+       public function testMakeList( $list, $mode, $sqlText ) {
+               $this->assertEquals( trim( $this->database->makeList(
+                       $list, $mode
+               ) ), $sqlText );
+       }
+
+       public static function provideMakeList() {
+               return array(
+                       array(
+                               array( 'value', 'value2' ),
+                               LIST_COMMA,
+                               "'value','value2'"
+                       ),
+                       array(
+                               array( 'field', 'field2' ),
+                               LIST_NAMES,
+                               "field,field2"
+                       ),
+                       array(
+                               array( 'field' => 'value', 'field2' => 'value2' ),
+                               LIST_AND,
+                               "field = 'value' AND field2 = 'value2'"
+                       ),
+                       array(
+                               array( 'field' => null, "field2 != 'value2'" ),
+                               LIST_AND,
+                               "field IS NULL AND (field2 != 'value2')"
+                       ),
+                       array(
+                               array( 'field' => array( 'value', null, 'value2' ), 'field2' => 'value2' ),
+                               LIST_AND,
+                               "(field IN ('value','value2')  OR field IS NULL) AND field2 = 'value2'"
+                       ),
+                       array(
+                               array( 'field' => array( null ), 'field2' => null ),
+                               LIST_AND,
+                               "field IS NULL AND field2 IS NULL"
+                       ),
+                       array(
+                               array( 'field' => 'value', 'field2' => 'value2' ),
+                               LIST_OR,
+                               "field = 'value' OR field2 = 'value2'"
+                       ),
+                       array(
+                               array( 'field' => 'value', 'field2' => null ),
+                               LIST_OR,
+                               "field = 'value' OR field2 IS NULL"
+                       ),
+                       array(
+                               array( 'field' => array( 'value', 'value2' ), 'field2' => array( 'value' ) ),
+                               LIST_OR,
+                               "field IN ('value','value2')  OR field2 = 'value'"
+                       ),
+                       array(
+                               array( 'field' => array( null, 'value', null, 'value2' ), "field2 != 'value2'" ),
+                               LIST_OR,
+                               "(field IN ('value','value2')  OR field IS NULL) OR (field2 != 'value2')"
+                       ),
+                       array(
+                               array( 'field' => 'value', 'field2' => 'value2' ),
+                               LIST_SET,
+                               "field = 'value',field2 = 'value2'"
+                       ),
+                       array(
+                               array( 'field' => 'value', 'field2' => null ),
+                               LIST_SET,
+                               "field = 'value',field2 = NULL"
+                       ),
+                       array(
+                               array( 'field' => 'value', "field2 != 'value2'" ),
+                               LIST_SET,
+                               "field = 'value',field2 != 'value2'"
+                       ),
+               );
+       }
 }
index 22d3270..66e9be4 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+use Psr\Log\LogLevel;
 
 class MWLoggerLegacyLoggerTest extends MediaWikiTestCase {
 
@@ -66,4 +67,52 @@ class MWLoggerLegacyLoggerTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers MWLoggerLegacyLogger::shouldEmit
+        * @dataProvider provideShouldEmit
+        */
+       public function testShouldEmit( $level, $config, $expected ) {
+               $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) );
+               $this->assertEquals(
+                       $expected,
+                       MWLoggerLegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() )
+               );
+       }
+
+       public static function provideShouldEmit() {
+               $dest = array( 'destination' => 'foobar' );
+               $tests = array(
+                       array(
+                               LogLevel::DEBUG,
+                               $dest,
+                               true
+                       ),
+                       array(
+                               LogLevel::WARNING,
+                               $dest + array( 'level' => LogLevel::INFO ),
+                               true,
+                       ),
+                       array(
+                               LogLevel::INFO,
+                               $dest + array( 'level' => LogLevel::CRITICAL ),
+                               false,
+                       ),
+               );
+
+               if ( class_exists( '\Monolog\Logger' ) ) {
+                       $tests[] = array(
+                               \Monolog\Logger::INFO,
+                               $dest + array( 'level' => LogLevel::INFO ),
+                               true,
+                       );
+                       $tests[] = array(
+                               \Monolog\Logger::WARNING,
+                               $dest + array( 'level' => LogLevel::EMERGENCY ),
+                               false,
+                       );
+               }
+
+               return $tests;
+       }
+
 }
diff --git a/tests/phpunit/includes/deferred/LinksUpdateTest.php b/tests/phpunit/includes/deferred/LinksUpdateTest.php
new file mode 100644 (file)
index 0000000..02f6b2a
--- /dev/null
@@ -0,0 +1,266 @@
+<?php
+
+/**
+ * @group Database
+ * ^--- make sure temporary tables are used.
+ */
+class LinksUpdateTest extends MediaWikiTestCase {
+
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge( $this->tablesUsed,
+                       array(
+                               'interwiki',
+                               'page_props',
+                               'pagelinks',
+                               'categorylinks',
+                               'langlinks',
+                               'externallinks',
+                               'imagelinks',
+                               'templatelinks',
+                               'iwlinks'
+                       )
+               );
+       }
+
+       protected function setUp() {
+               parent::setUp();
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace(
+                       'interwiki',
+                       array( 'iw_prefix' ),
+                       array(
+                               'iw_prefix' => 'linksupdatetest',
+                               'iw_url' => 'http://testing.com/wiki/$1',
+                               'iw_api' => 'http://testing.com/w/api.php',
+                               'iw_local' => 0,
+                               'iw_trans' => 0,
+                               'iw_wikiid' => 'linksupdatetest',
+                       )
+               );
+       }
+
+       protected function makeTitleAndParserOutput( $name, $id ) {
+               $t = Title::newFromText( $name );
+               $t->mArticleID = $id; # XXX: this is fugly
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               return array( $t, $po );
+       }
+
+       /**
+        * @covers ParserOutput::addLink
+        */
+       public function testUpdate_pagelinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLink( Title::newFromText( "Foo" ) );
+               $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
+               $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
+               $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
+
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array( array( NS_MAIN, 'Foo' ) )
+               );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
+               ), $update->getAddedLinks() );
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               $po->addLink( Title::newFromText( "Bar" ) );
+               $po->addLink( Title::newFromText( "Talk:Bar" ) );
+
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array(
+                               array( NS_MAIN, 'Bar' ),
+                               array( NS_TALK, 'Bar' ),
+                       )
+               );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Bar' ),
+                       Title::makeTitle( NS_TALK, 'Bar' ),
+               ), $update->getAddedLinks() );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Foo' ),
+               ), $update->getRemovedLinks() );
+       }
+
+       /**
+        * @covers ParserOutput::addExternalLink
+        */
+       public function testUpdate_externallinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addExternalLink( "http://testing.com/wiki/Foo" );
+
+               $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
+                       array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addCategory
+        */
+       public function testUpdate_categorylinks() {
+               /** @var ParserOutput $po */
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addCategory( "Foo", "FOO" );
+
+               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
+                       array( 'Foo', "FOO\nTESTING" ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addInterwikiLink
+        */
+       public function testUpdate_iwlinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
+               $po->addInterwikiLink( $target );
+
+               $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
+                       array( 'linksupdatetest', 'Foo' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addTemplate
+        */
+       public function testUpdate_templatelinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
+
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'templatelinks',
+                       'tl_namespace,
+                       tl_title',
+                       'tl_from = 111',
+                       array( array( NS_TEMPLATE, 'Foo' ) )
+               );
+       }
+
+       /**
+        * @covers ParserOutput::addImage
+        */
+       public function testUpdate_imagelinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addImage( "Foo.png" );
+
+               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
+                       array( 'Foo.png' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addLanguageLink
+        */
+       public function testUpdate_langlinks() {
+               $this->setMwGlobals( array(
+                       'wgCapitalLinks' => true,
+               ) );
+
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
+
+               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
+                       array( 'En', 'Foo' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::setProperty
+        */
+       public function testUpdate_page_props() {
+               global $wgPagePropsHaveSortkey;
+
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $fields = array( 'pp_propname', 'pp_value' );
+               $expected = array();
+
+               $po->setProperty( "bool", true );
+               $expected[] = array( "bool", true );
+
+               $po->setProperty( "float", 4.0 + 1.0 / 4.0 );
+               $expected[] = array( "float", 4.0 + 1.0 / 4.0 );
+
+               $po->setProperty( "int", -7 );
+               $expected[] = array( "int", -7 );
+
+               $po->setProperty( "string", "33 bar" );
+               $expected[] = array( "string", "33 bar" );
+
+               // compute expected sortkey values
+               if ( $wgPagePropsHaveSortkey ) {
+                       $fields[] = 'pp_sortkey';
+
+                       foreach ( $expected as &$row ) {
+                               $value = $row[1];
+
+                               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
+                                       $row[] = floatval( $value );
+                               } else {
+                                       $row[] = null;
+                               }
+                       }
+               }
+
+               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
+       }
+
+       public function testUpdate_page_props_without_sortkey() {
+               $this->setMwGlobals( 'wgPagePropsHaveSortkey', false );
+
+               $this->testUpdate_page_props();
+       }
+
+       // @todo test recursive, too!
+
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput,
+               $table, $fields, $condition, array $expectedRows
+       ) {
+               $update = new LinksUpdate( $title, $parserOutput );
+
+               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
+               $update->beginTransaction();
+               $update->doUpdate();
+               $update->commitTransaction();
+
+               $this->assertSelect( $table, $fields, $condition, $expectedRows );
+               return $update;
+       }
+}
diff --git a/tests/phpunit/includes/deferred/SearchUpdateTest.php b/tests/phpunit/includes/deferred/SearchUpdateTest.php
new file mode 100644 (file)
index 0000000..b70880e
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+class MockSearch extends SearchEngine {
+       public static $id;
+       public static $title;
+       public static $text;
+
+       public function __construct( $db ) {
+       }
+
+       public function update( $id, $title, $text ) {
+               self::$id = $id;
+               self::$title = $title;
+               self::$text = $text;
+       }
+}
+
+/**
+ * @group Search
+ * @group Database
+ */
+class SearchUpdateTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
+       }
+
+       public function updateText( $text ) {
+               return trim( SearchUpdate::updateText( $text ) );
+       }
+
+       /**
+        * @covers SearchUpdate::updateText
+        */
+       public function testUpdateText() {
+               $this->assertEquals(
+                       'test',
+                       $this->updateText( '<div>TeSt</div>' ),
+                       'HTML stripped, text lowercased'
+               );
+
+               $this->assertEquals(
+                       'foo bar boz quux',
+                       $this->updateText( <<<EOT
+<table style="color:red; font-size:100px">
+       <tr class="scary"><td><div>foo</div></td><tr>bar</td></tr>
+       <tr><td>boz</td><tr>quux</td></tr>
+</table>
+EOT
+                       ), 'Stripping HTML tables' );
+
+               $this->assertEquals(
+                       'a b',
+                       $this->updateText( 'a > b' ),
+                       'Handle unclosed tags'
+               );
+
+               $text = str_pad( "foo <barbarbar \n", 10000, 'x' );
+
+               $this->assertNotEquals(
+                       '',
+                       $this->updateText( $text ),
+                       'Bug 18609'
+               );
+       }
+
+       /**
+        * @covers SearchUpdate::updateText
+        * Test bug 32712
+        * Test if unicode quotes in article links make its search index empty
+        */
+       public function testUnicodeLinkSearchIndexError() {
+               $text = "text „http://example.com“ text";
+               $result = $this->updateText( $text );
+               $processed = preg_replace( '/Q/u', 'Q', $result );
+               $this->assertTrue(
+                       $processed != '',
+                       'Link surrounded by unicode quotes should not fail UTF-8 validation'
+               );
+       }
+}
index dc5dc6a..d73f17d 100644 (file)
@@ -15,7 +15,7 @@ class MWExceptionHandlerTest extends MediaWikiTestCase {
                $refvar = 'value';
                try {
                        $array = array( 'a', 'b' );
-                       $object = new StdClass();
+                       $object = new stdClass();
                        self::helperThrowAnException( $array, $object, $refvar );
                } catch ( Exception $e ) {
                }
diff --git a/tests/phpunit/includes/externalstore/ExternalStoreTest.php b/tests/phpunit/includes/externalstore/ExternalStoreTest.php
new file mode 100644 (file)
index 0000000..07c2957
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * External Store tests
+ */
+
+class ExternalStoreTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ExternalStore::fetchFromURL
+        */
+       public function testExternalFetchFromURL() {
+               $this->setMwGlobals( 'wgExternalStores', false );
+
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
+                       'Deny if wgExternalStores is not set to a non-empty array'
+               );
+
+               $this->setMwGlobals( 'wgExternalStores', array( 'FOO' ) );
+
+               $this->assertEquals(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
+                       'Hello',
+                       'Allow FOO://cluster1/200'
+               );
+               $this->assertEquals(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/300/0' ),
+                       'Hello',
+                       'Allow FOO://cluster1/300/0'
+               );
+               # Assertions for r68900
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'ftp.example.org' ),
+                       'Deny domain ftp.example.org'
+               );
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( '/example.txt' ),
+                       'Deny path /example.txt'
+               );
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'http://' ),
+                       'Deny protocol http://'
+               );
+       }
+}
+
+class ExternalStoreFOO {
+
+       protected $data = array(
+               'cluster1' => array(
+                       '200' => 'Hello',
+                       '300' => array(
+                               'Hello', 'World',
+                       ),
+               ),
+       );
+
+       /**
+        * Fetch data from given URL
+        * @param string $url An url of the form FOO://cluster/id or FOO://cluster/id/itemid.
+        * @return mixed
+        */
+       function fetchFromURL( $url ) {
+               // Based on ExternalStoreDB
+               $path = explode( '/', $url );
+               $cluster = $path[2];
+               $id = $path[3];
+               if ( isset( $path[4] ) ) {
+                       $itemID = $path[4];
+               } else {
+                       $itemID = false;
+               }
+
+               if ( !isset( $this->data[$cluster][$id] ) ) {
+                       return null;
+               }
+
+               if ( $itemID !== false
+                       && is_array( $this->data[$cluster][$id] )
+                       && isset( $this->data[$cluster][$id][$itemID] )
+               ) {
+                       return $this->data[$cluster][$id][$itemID];
+               }
+
+               return $this->data[$cluster][$id];
+       }
+}
diff --git a/tests/phpunit/includes/filerepo/file/LocalFileTest.php b/tests/phpunit/includes/filerepo/file/LocalFileTest.php
new file mode 100644 (file)
index 0000000..5c5052e
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+
+/**
+ * These tests should work regardless of $wgCapitalLinks
+ * @group Database
+ * @todo Split tests into providers and test methods
+ */
+
+class LocalFileTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgCapitalLinks', true );
+
+               $info = array(
+                       'name' => 'test',
+                       'directory' => '/testdir',
+                       'url' => '/testurl',
+                       'hashLevels' => 2,
+                       'transformVia404' => false,
+                       'backend' => new FSFileBackend( array(
+                               'name' => 'local-backend',
+                               'wikiId' => wfWikiId(),
+                               'containerPaths' => array(
+                                       'cont1' => "/testdir/local-backend/tempimages/cont1",
+                                       'cont2' => "/testdir/local-backend/tempimages/cont2"
+                               )
+                       ) )
+               );
+               $this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
+               $this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
+               $this->repo_lc = new LocalRepo( array( 'initialCapital' => false ) + $info );
+               $this->file_hl0 = $this->repo_hl0->newFile( 'test!' );
+               $this->file_hl2 = $this->repo_hl2->newFile( 'test!' );
+               $this->file_lc = $this->repo_lc->newFile( 'test!' );
+       }
+
+       /**
+        * @covers File::getHashPath
+        */
+       public function testGetHashPath() {
+               $this->assertEquals( '', $this->file_hl0->getHashPath() );
+               $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
+               $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
+       }
+
+       /**
+        * @covers File::getRel
+        */
+       public function testGetRel() {
+               $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
+               $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
+               $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
+       }
+
+       /**
+        * @covers File::getUrlRel
+        */
+       public function testGetUrlRel() {
+               $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
+               $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
+               $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
+       }
+
+       /**
+        * @covers File::getArchivePath
+        */
+       public function testGetArchivePath() {
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive',
+                       $this->file_hl0->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2',
+                       $this->file_hl2->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/!',
+                       $this->file_hl0->getArchivePath( '!' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2/!',
+                       $this->file_hl2->getArchivePath( '!' )
+               );
+       }
+
+       /**
+        * @covers File::getThumbPath
+        */
+       public function testGetThumbPath() {
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!',
+                       $this->file_hl0->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!',
+                       $this->file_hl2->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!/x',
+                       $this->file_hl0->getThumbPath( 'x' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!/x',
+                       $this->file_hl2->getThumbPath( 'x' )
+               );
+       }
+
+       /**
+        * @covers File::getArchiveUrl
+        */
+       public function testGetArchiveUrl() {
+               $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
+               $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
+               $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
+               $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
+       }
+
+       /**
+        * @covers File::getThumbUrl
+        */
+       public function testGetThumbUrl() {
+               $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
+               $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
+               $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
+               $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
+       }
+
+       /**
+        * @covers File::getArchiveVirtualUrl
+        */
+       public function testGetArchiveVirtualUrl() {
+               $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2',
+                       $this->file_hl2->getArchiveVirtualUrl()
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/%21',
+                       $this->file_hl0->getArchiveVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2/%21',
+                       $this->file_hl2->getArchiveVirtualUrl( '!' )
+               );
+       }
+
+       /**
+        * @covers File::getThumbVirtualUrl
+        */
+       public function testGetThumbVirtualUrl() {
+               $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
+               $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/Test%21/%21',
+                       $this->file_hl0->getThumbVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/a/a2/Test%21/%21',
+                       $this->file_hl2->getThumbVirtualUrl( '!' )
+               );
+       }
+
+       /**
+        * @covers File::getUrl
+        */
+       public function testGetUrl() {
+               $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
+               $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
+       }
+
+       /**
+        * @covers ::wfLocalFile
+        */
+       public function testWfLocalFile() {
+               $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
+               $this->assertThat(
+                       $file,
+                       $this->isInstanceOf( 'LocalFile' ),
+                       'wfLocalFile() returns LocalFile for valid Titles'
+               );
+       }
+}
diff --git a/tests/phpunit/includes/libs/ArrayUtilsTest.php b/tests/phpunit/includes/libs/ArrayUtilsTest.php
new file mode 100644 (file)
index 0000000..b5ea7b7
--- /dev/null
@@ -0,0 +1,311 @@
+<?php
+/**
+ * Test class for ArrayUtils class
+ *
+ * @group Database
+ */
+
+class ArrayUtilsTest extends PHPUnit_Framework_TestCase {
+       private $search;
+
+       /**
+        * @covers ArrayUtils::findLowerBound
+        * @dataProvider provideFindLowerBound
+        */
+       function testFindLowerBound(
+               $valueCallback, $valueCount, $comparisonCallback, $target, $expected
+       ) {
+               $this->assertSame(
+                       ArrayUtils::findLowerBound(
+                               $valueCallback, $valueCount, $comparisonCallback, $target
+                       ), $expected
+               );
+       }
+
+       function provideFindLowerBound() {
+               $self = $this;
+               $indexValueCallback = function ( $size ) use ( $self ) {
+                       return function ( $val ) use ( $self, $size ) {
+                               $self->assertTrue( $val >= 0 );
+                               $self->assertTrue( $val < $size );
+                               return $val;
+                       };
+               };
+               $comparisonCallback = function ( $a, $b ) {
+                       return $a - $b;
+               };
+
+               return array(
+                       array(
+                               $indexValueCallback( 0 ),
+                               0,
+                               $comparisonCallback,
+                               1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               -1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               0,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               1,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               -1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               0,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               0.5,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               1,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               1.5,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               1,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               1.5,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               2,
+                               2,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               3,
+                               2,
+                       ),
+               );
+       }
+
+       /**
+        * @covers ArrayUtils::arrayDiffAssocRecursive
+        * @dataProvider provideArrayDiffAssocRecursive
+        */
+       function testArrayDiffAssocRecursive( $expected ) {
+               $args = func_get_args();
+               array_shift( $args );
+               $this->assertEquals( call_user_func_array(
+                       'ArrayUtils::arrayDiffAssocRecursive', $args
+               ), $expected );
+       }
+
+       function provideArrayDiffAssocRecursive() {
+               return array(
+                       array(
+                               array(),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( 1 ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array( '' => 1 ),
+                               array( '' => 1 ),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( '' => 1 ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 ),
+                               array( 2 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 ),
+                               array( 1, 2 ),
+                       ),
+                       array(
+                               array( 1 => 1 ),
+                               array( 1 => 1 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 => 1 ),
+                               array( 1 ),
+                               array( 1 => 1),
+                       ),
+                       array(
+                               array(),
+                               array( 1 => 1 ),
+                               array( 1, 1, 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( array() ),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array( array( array() ) ),
+                               array(),
+                       ),
+                       array(
+                               array( 1, array( 1 ) ),
+                               array( 1, array( 1 ) ),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array( 1 ) ),
+                               array( 2, array( 1 ) ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( 1 ) ),
+                               array( 2, array( 1 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array() ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array() ),
+                               array( 2 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array( 1, array( 1 => 2 ) ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 2, array( 1 ) ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 2, array( 1 ) ),
+                               array( 2, array( 1 => 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1, 2 ) ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( array( 2 ), 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3 ) ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3, 0 => 2 ) ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3 ) ) ),
+                               array( 1 => array( array( 2 ) ) ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1 => array( 1 => 2, 0 => array( 1 => 3, 0 => 2 ) ), 0 => 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1 => array( array( 1 => 3 ) ) ),
+                               array( 1 => array( array( 2 ) ) ),
+                               array( 1 ),
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/libs/DeferredStringifierTest.php b/tests/phpunit/includes/libs/DeferredStringifierTest.php
new file mode 100644 (file)
index 0000000..9aaf113
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers DeferredStringifier
+        * @dataProvider provideToString
+        */
+       public function testToString( $params, $expected ) {
+               $class = new ReflectionClass( 'DeferredStringifier' );
+               $ds = $class->newInstanceArgs( $params );
+               $this->assertEquals( $expected, (string)$ds );
+       }
+
+       public static function provideToString() {
+               return array(
+                       // No args
+                       array( array( function() {
+                               return 'foo';
+                       } ), 'foo' ),
+                       // Has args
+                       array( array( function( $i ) {
+                               return $i;
+                       }, 'bar' ), 'bar' ),
+               );
+       }
+
+       /**
+        * Verify that the callback is not called if
+        * it is never converted to a string
+        */
+       public function testCallbackNotCalled() {
+               $ds = new DeferredStringifier( function() {
+                       throw new Exception( 'This should not be reached!' );
+               } );
+               // No exception was thrown
+               $this->assertTrue( true );
+       }
+}
index 4911f73..fd9f80d 100644 (file)
@@ -27,7 +27,7 @@
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-abstract class GenericArrayObjectTest extends MediaWikiTestCase {
+abstract class GenericArrayObjectTest extends PHPUnit_Framework_TestCase {
 
        /**
         * Returns objects that can serve as elements in the concrete
index 68dfea1..b51eb3f 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group HashRing
  */
-class HashRingTest extends MediaWikiTestCase {
+class HashRingTest extends PHPUnit_Framework_TestCase {
        /**
         * @covers HashRing
         */
index b707123..e96953e 100644 (file)
@@ -5,7 +5,7 @@
  * @todo tests below for findIE6Extension should be split into...
  *    ...a dataprovider and test method.
  */
-class IEUrlExtensionTest extends MediaWikiTestCase {
+class IEUrlExtensionTest extends PHPUnit_Framework_TestCase {
        /**
         * @covers IEUrlExtension::findIE6Extension
         */
index d4e5214..5bbacef 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group IPSet
  */
-class IPSetTest extends MediaWikiTestCase {
+class IPSetTest extends PHPUnit_Framework_TestCase {
        /**
         * Provides test cases for IPSetTest::testIPSet
         *
index c8795b2..149a28c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class JavaScriptMinifierTest extends MediaWikiTestCase {
+class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
 
        public static function provideCases() {
                return array(
@@ -164,7 +164,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                );
        }
 
-       public static function provideBug32548() {
+       public static function provideExponentLineBreaking() {
                return array(
                        array(
                                // This one gets interpreted all together by the prior code;
@@ -183,14 +183,13 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provideBug32548
+        * @dataProvider provideExponentLineBreaking
         * @covers JavaScriptMinifier::minify
-        * @todo give this test a real name explaining what is being tested here
         */
-       public function testBug32548Exponent( $num ) {
+       public function testExponentLineBreaking( $num ) {
                // Long line breaking was being incorrectly done between the base and
                // exponent part of a number, causing a syntax error. The line should
-               // instead break at the start of the number.
+               // instead break at the start of the number. (T34548)
                $prefix = 'var longVarName' . str_repeat( '_', 973 ) . '=';
                $suffix = ',shortVarName=0;';
 
index f80f78d..ec14583 100644 (file)
@@ -3,7 +3,7 @@
  * PHP Unit tests for MWMessagePack
  * @covers MWMessagePack
  */
-class MWMessagePackTest extends MediaWikiTestCase {
+class MWMessagePackTest extends PHPUnit_Framework_TestCase {
 
        /**
         * Provides test cases for MWMessagePackTest::testMessagePack
index 1a8a1e5..de4ac4b 100644 (file)
@@ -9,7 +9,7 @@
  *
  * @group Cache
  */
-class ProcessCacheLRUTest extends MediaWikiTestCase {
+class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
 
        /**
         * Helper to verify emptiness of a cache object.
index dc5db82..edfaf16 100644 (file)
@@ -3,7 +3,7 @@
  * PHP Unit tests for RunningStat class.
  * @covers RunningStat
  */
-class RunningStatTest extends MediaWikiTestCase {
+class RunningStatTest extends PHPUnit_Framework_TestCase {
 
        public $points = array(
                49.7168, 74.3804,  7.0115, 96.5769, 34.9458,
diff --git a/tests/phpunit/includes/libs/XmlTypeCheckTest.php b/tests/phpunit/includes/libs/XmlTypeCheckTest.php
new file mode 100644 (file)
index 0000000..e7b3e77
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/**
+ * PHPUnit tests for XMLTypeCheck.
+ * @author physikerwelt
+ * @group Xml
+ * @covers XMLTypeCheck
+ */
+class XmlTypeCheckTest extends PHPUnit_Framework_TestCase {
+       const WELL_FORMED_XML = "<root><child /></root>";
+       const MAL_FORMED_XML = "<root><child /></error>";
+
+       /**
+        * @covers XMLTypeCheck::newFromString
+        * @covers XMLTypeCheck::getRootElement
+        */
+       public function testWellFormedXML() {
+               $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
+               $this->assertTrue( $testXML->wellFormed );
+               $this->assertEquals( 'root', $testXML->getRootElement() );
+       }
+
+       /**
+        * @covers XMLTypeCheck::newFromString
+        */
+       public function testMalFormedXML() {
+               $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
+               $this->assertFalse( $testXML->wellFormed );
+       }
+
+}
diff --git a/tests/phpunit/includes/libs/composer/ComposerJsonTest.php b/tests/phpunit/includes/libs/composer/ComposerJsonTest.php
new file mode 100644 (file)
index 0000000..0c58b65
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+class ComposerJsonTest extends MediaWikiTestCase {
+
+       private $json, $json2;
+
+       public function setUp() {
+               parent::setUp();
+               global $IP;
+               $this->json = "$IP/tests/phpunit/data/composer/composer.json";
+               $this->json2 = "$IP/tests/phpunit/data/composer/new-composer.json";
+       }
+
+       public static function provideGetHash() {
+               return array(
+                       array( 'json', 'cc6e7fc565b246cb30b0cac103a2b31e' ),
+                       array( 'json2', '19921dd1fc457f1b00561da932432001' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetHash
+        * @covers ComposerJson::getHash
+        */
+       public function testIsHashUpToDate( $file, $expected ) {
+               $json = new ComposerJson( $this->$file );
+               $this->assertEquals( $expected, $json->getHash() );
+       }
+
+       /**
+        * @covers ComposerJson::getRequiredDependencies
+        */
+       public function testGetRequiredDependencies() {
+               $json = new ComposerJson( $this->json );
+               $this->assertArrayEquals( array(
+                       'cdb/cdb' => '1.0.0',
+                       'cssjanus/cssjanus' => '1.1.1',
+                       'leafo/lessphp' => '0.5.0',
+                       'psr/log' => '1.0.0',
+               ), $json->getRequiredDependencies(), false, true );
+       }
+
+       public static function provideNormalizeVersion() {
+               return array(
+                       array( 'v1.0.0', '1.0.0' ),
+                       array( '0.0.5', '0.0.5' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideNormalizeVersion
+        * @covers ComposerJson::normalizeVersion
+        */
+       public function testNormalizeVersion( $input, $expected ) {
+               $this->assertEquals( $expected, ComposerJson::normalizeVersion( $input ) );
+       }
+}
diff --git a/tests/phpunit/includes/libs/composer/ComposerLockTest.php b/tests/phpunit/includes/libs/composer/ComposerLockTest.php
new file mode 100644 (file)
index 0000000..b5fd5f6
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+class ComposerLockTest extends MediaWikiTestCase {
+
+       private $lock;
+
+       public function setUp() {
+               parent::setUp();
+               global $IP;
+               $this->lock = "$IP/tests/phpunit/data/composer/composer.lock";
+       }
+
+       /**
+        * @covers ComposerLock::getHash
+        */
+       public function testGetHash() {
+               $lock = new ComposerLock( $this->lock );
+               $this->assertEquals( 'a3bb80b0ac4c4a31e52574d48c032923', $lock->getHash() );
+       }
+
+       /**
+        * @covers ComposerLock::getInstalledDependencies
+        */
+       public function testGetInstalledDependencies() {
+               $lock = new ComposerLock( $this->lock );
+               $this->assertArrayEquals( array(
+                       'wikimedia/cdb' => array(
+                               'version' => '1.0.1',
+                               'type' => 'library',
+                       ),
+                       'cssjanus/cssjanus' => array(
+                               'version' => '1.1.1',
+                               'type' => 'library',
+                       ),
+                       'leafo/lessphp' => array(
+                               'version' => '0.5.0',
+                               'type' => 'library',
+                       ),
+                       'psr/log' => array(
+                               'version' => '1.0.0',
+                               'type' => 'library',
+                       ),
+                       'oojs/oojs-ui' => array(
+                               'version' => '0.6.0',
+                               'type' => 'library',
+                       ),
+                       'composer/installers' => array(
+                               'version' => '1.0.19',
+                               'type' => 'composer-installer',
+                       ),
+                       'mediawiki/translate' => array(
+                               'version' => '2014.12',
+                               'type' => 'mediawiki-extension',
+                       ),
+                       'mediawiki/universal-language-selector' => array(
+                               'version' => '2014.12',
+                               'type' => 'mediawiki-extension',
+                       ),
+               ), $lock->getInstalledDependencies(), false, true );
+       }
+
+}
index 1972c96..e4415ec 100644 (file)
@@ -113,7 +113,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $file = new FakeDimensionFile( array( 4000, 4000 ) );
                $handler = new BitmapHandler;
                $params = array( 'width' => '3700' ); // Still bigger than max size.
-               $this->assertEquals( 'TransformParameterError',
+               $this->assertEquals( 'TransformTooBigImageAreaError',
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
 
@@ -125,7 +125,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $file->mustRender = true;
                $handler = new BitmapHandler;
                $params = array( 'width' => '5000' ); // Still bigger than max size.
-               $this->assertEquals( 'TransformParameterError',
+               $this->assertEquals( 'TransformTooBigImageAreaError',
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
 
index d8cfcc4..5fa609a 100644 (file)
@@ -7,50 +7,48 @@ class MediaHandlerTest extends MediaWikiTestCase {
 
        /**
         * @covers MediaHandler::fitBoxWidth
-        * @todo split into a dataprovider and test method
+        *
+        * @dataProvider provideTestFitBoxWidth
         */
-       public function testFitBoxWidth() {
-               $vals = array(
-                       array(
-                               'width' => 50,
-                               'height' => 50,
-                               'tests' => array(
+       public function testFitBoxWidth( $width, $height, $max, $expected ) {
+               $y = round( $expected * $height / $width );
+               $result = MediaHandler::fitBoxWidth( $width, $height, $max );
+               $y2 = round( $result * $height / $width );
+               $this->assertEquals( $expected,
+                       $result,
+                       "($width, $height, $max) wanted: {$expected}x$y, got: {z$result}x$y2" );
+       }
+
+       public function provideTestFitBoxWidth() {
+               return array_merge(
+                       $this->provideTestFitBoxWidthSingle( 50, 50, array(
                                        50 => 50,
                                        17 => 17,
-                                       18 => 18 ) ),
-                       array(
-                               'width' => 366,
-                               'height' => 300,
-                               'tests' => array(
+                                       18 => 18 )
+                       ),
+                       $this->provideTestFitBoxWidthSingle( 366, 300, array(
                                        50 => 61,
                                        17 => 21,
-                                       18 => 22 ) ),
-                       array(
-                               'width' => 300,
-                               'height' => 366,
-                               'tests' => array(
+                                       18 => 22 )
+                       ),
+                       $this->provideTestFitBoxWidthSingle( 300, 366, array(
                                        50 => 41,
                                        17 => 14,
-                                       18 => 15 ) ),
-                       array(
-                               'width' => 100,
-                               'height' => 400,
-                               'tests' => array(
+                                       18 => 15 )
+                       ),
+                       $this->provideTestFitBoxWidthSingle( 100, 400, array(
                                        50 => 12,
                                        17 => 4,
-                                       18 => 4 ) ) );
-               foreach ( $vals as $row ) {
-                       $tests = $row['tests'];
-                       $height = $row['height'];
-                       $width = $row['width'];
-                       foreach ( $tests as $max => $expected ) {
-                               $y = round( $expected * $height / $width );
-                               $result = MediaHandler::fitBoxWidth( $width, $height, $max );
-                               $y2 = round( $result * $height / $width );
-                               $this->assertEquals( $expected,
-                                       $result,
-                                       "($width, $height, $max) wanted: {$expected}x$y, got: {$result}x$y2" );
-                       }
+                                       18 => 4 )
+                       )
+               );
+       }
+
+       private function provideTestFitBoxWidthSingle( $width, $height, $tests ) {
+               $result = array();
+               foreach ( $tests as $max => $expected ) {
+                       $result[] = array( $width, $height, $max, $expected );
                }
+               return $result;
        }
 }
index f4b469b..af83767 100644 (file)
  *
  * @todo covers tags, will be UtfNormal::cleanUp once the below is resolved
  * @todo split me into test methods and providers per the below comment
+ * @todo Document individual tests
  *
  * We ignore code coverage for this test suite until they are rewritten
  * to use data providers (bug 46561).
  * @codeCoverageIgnore
  */
 class CleanUpTest extends MediaWikiTestCase {
-       /** @todo document */
        public function testAscii() {
                $text = 'This is plain ASCII text.';
                $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
        }
 
-       /** @todo document */
        public function testNull() {
                $text = "a \x00 null";
                $expect = "a \xef\xbf\xbd null";
@@ -54,13 +53,11 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testLatin() {
                $text = "L'\xc3\xa9cole";
                $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
        }
 
-       /** @todo document */
        public function testLatinNormal() {
                $text = "L'e\xcc\x81cole";
                $expect = "L'\xc3\xa9cole";
@@ -69,7 +66,6 @@ class CleanUpTest extends MediaWikiTestCase {
 
        /**
         * This test is *very* expensive!
-        * @todo document
         */
        function XtestAllChars() {
                $rep = UTF8_REPLACEMENT;
@@ -109,7 +105,6 @@ class CleanUpTest extends MediaWikiTestCase {
                }
        }
 
-       /** @todo document */
        public static function provideAllBytes() {
                return array(
                        array( '', '' ),
@@ -121,7 +116,6 @@ class CleanUpTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideAllBytes
-        * @todo document
         */
        function testBytes( $head, $tail ) {
                for ( $i = 0x0; $i < 256; $i++ ) {
@@ -156,7 +150,6 @@ class CleanUpTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideAllBytes
-        * @todo document
         */
        function testDoubleBytes( $head, $tail ) {
                for ( $first = 0xc0; $first < 0x100; $first += 2 ) {
@@ -202,7 +195,6 @@ class CleanUpTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideAllBytes
-        * @todo document
         */
        function testTripleBytes( $head, $tail ) {
                for ( $first = 0xc0; $first < 0x100; $first += 2 ) {
@@ -275,7 +267,6 @@ class CleanUpTest extends MediaWikiTestCase {
                }
        }
 
-       /** @todo document */
        public function testChunkRegression() {
                # Check for regression against a chunking bug
                $text = "\x46\x55\xb8" .
@@ -298,7 +289,6 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testInterposeRegression() {
                $text = "\x4e\x30" .
                        "\xb1" . # bad tail
@@ -333,7 +323,6 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testOverlongRegression() {
                $text = "\x67" .
                        "\x1a" . # forbidden ascii
@@ -358,7 +347,6 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testSurrogateRegression() {
                $text = "\xed\xb4\x96" . # surrogate 0xDD16
                        "\x83" . # bad tail
@@ -373,7 +361,6 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testBomRegression() {
                $text = "\xef\xbf\xbe" . # U+FFFE, illegal char
                        "\xb2" . # bad tail
@@ -388,7 +375,6 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testForbiddenRegression() {
                $text = "\xef\xbf\xbf"; # U+FFFF, illegal char
                $expect = "\xef\xbf\xbd";
@@ -397,7 +383,6 @@ class CleanUpTest extends MediaWikiTestCase {
                        bin2hex( UtfNormal::cleanUp( $text ) ) );
        }
 
-       /** @todo document */
        public function testHangulRegression() {
                $text = "\xed\x9c\xaf" . # Hangul char
                        "\xe1\x87\x81"; # followed by another final jamo
diff --git a/tests/phpunit/includes/page/ArticleTablesTest.php b/tests/phpunit/includes/page/ArticleTablesTest.php
new file mode 100644 (file)
index 0000000..9f2b7a0
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @group Database
+ */
+class ArticleTablesTest extends MediaWikiLangTestCase {
+       /**
+        * Make sure that bug 14404 doesn't strike again. We don't want
+        * templatelinks based on the user language when {{int:}} is used, only the
+        * content language.
+        *
+        * @covers Title::getTemplateLinksFrom
+        * @covers Title::getLinksFrom
+        */
+       public function testTemplatelinksUsesContentLanguage() {
+               $title = Title::newFromText( 'Bug 14404' );
+               $page = WikiPage::factory( $title );
+               $user = new User();
+               $user->mRights = array( 'createpage', 'edit', 'purge' );
+               $this->setMwGlobals( 'wgLanguageCode', 'es' );
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'es' ) );
+               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
+
+               $page->doEditContent(
+                       new WikitextContent( '{{:{{int:history}}}}' ),
+                       'Test code for bug 14404',
+                       0,
+                       false,
+                       $user
+               );
+               $templates1 = $title->getTemplateLinksFrom();
+
+               $this->setMwGlobals( 'wgLang', Language::factory( 'de' ) );
+               $page = WikiPage::factory( $title ); // In order to force the re-rendering of the same wikitext
+
+               // We need an edit, a purge is not enough to regenerate the tables
+               $page->doEditContent(
+                       new WikitextContent( '{{:{{int:history}}}}' ),
+                       'Test code for bug 14404',
+                       EDIT_UPDATE,
+                       false,
+                       $user
+               );
+               $templates2 = $title->getTemplateLinksFrom();
+
+               /**
+                * @var Title[] $templates1
+                * @var Title[] $templates2
+                */
+               $this->assertEquals( $templates1, $templates2 );
+               $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
+       }
+}
diff --git a/tests/phpunit/includes/page/ArticleTest.php b/tests/phpunit/includes/page/ArticleTest.php
new file mode 100644 (file)
index 0000000..ae069ea
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+
+class ArticleTest extends MediaWikiTestCase {
+
+       /**
+        * @var Title
+        */
+       private $title;
+       /**
+        * @var Article
+        */
+       private $article;
+
+       /** creates a title object and its article object */
+       protected function setUp() {
+               parent::setUp();
+               $this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
+               $this->article = new Article( $this->title );
+       }
+
+       /** cleanup title object and its article object */
+       protected function tearDown() {
+               parent::tearDown();
+               $this->title = null;
+               $this->article = null;
+       }
+
+       /**
+        * @covers Article::__get
+        */
+       public function testImplementsGetMagic() {
+               $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
+       }
+
+       /**
+        * @depends testImplementsGetMagic
+        * @covers Article::__set
+        */
+       public function testImplementsSetMagic() {
+               $this->article->mLatest = 2;
+               $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
+       }
+
+       /**
+        * @depends testImplementsSetMagic
+        * @covers Article::__call
+        */
+       public function testImplementsCallMagic() {
+               $this->article->mLatest = 33;
+               $this->article->mDataLoaded = true;
+               $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
+       }
+
+       /**
+        * @covers Article::__get
+        * @covers Article::__set
+        */
+       public function testGetOrSetOnNewProperty() {
+               $this->article->ext_someNewProperty = 12;
+               $this->assertEquals( 12, $this->article->ext_someNewProperty,
+                       "Article get/set magic on new field" );
+
+               $this->article->ext_someNewProperty = -8;
+               $this->assertEquals( -8, $this->article->ext_someNewProperty,
+                       "Article get/set magic on update to new field" );
+       }
+
+       /**
+        * Checks for the existence of the backwards compatibility static functions
+        * (forwarders to WikiPage class)
+        *
+        * @covers Article::selectFields
+        * @covers Article::onArticleCreate
+        * @covers Article::onArticleDelete
+        * @covers Article::onArticleEdit
+        * @covers Article::getAutosummary
+        */
+       public function testStaticFunctions() {
+               $this->hideDeprecated( 'Article::selectFields' );
+               $this->hideDeprecated( 'Article::getAutosummary' );
+               $this->hideDeprecated( 'WikiPage::getAutosummary' );
+               $this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
+
+               $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
+                       "Article static functions" );
+               $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
+                       "Article static functions" );
+               $this->assertEquals( true, is_callable( "Article::onArticleDelete" ),
+                       "Article static functions" );
+               $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
+                       "Article static functions" );
+               $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
+                       "Article static functions" );
+       }
+}
diff --git a/tests/phpunit/includes/page/ImagePage404Test.php b/tests/phpunit/includes/page/ImagePage404Test.php
new file mode 100644 (file)
index 0000000..197a2b3
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * For doing Image Page tests that rely on 404 thumb handling
+ */
+class ImagePage404Test extends MediaWikiMediaTestCase {
+
+       protected function getRepoOptions() {
+               return parent::getRepoOptions() + array( 'transformVia404' => true );
+       }
+
+       function setUp() {
+               $this->setMwGlobals( 'wgImageLimits', array(
+                       array( 320, 240 ),
+                       array( 640, 480 ),
+                       array( 800, 600 ),
+                       array( 1024, 768 ),
+                       array( 1280, 1024 )
+               ) );
+               parent::setUp();
+       }
+
+       function getImagePage( $filename ) {
+               $title = Title::makeTitleSafe( NS_FILE, $filename );
+               $file = $this->dataFile( $filename );
+               $iPage = new ImagePage( $title );
+               $iPage->setFile( $file );
+               return $iPage;
+       }
+
+       /**
+        * @dataProvider providerGetThumbSizes
+        * @param string $filename
+        * @param int $expectedNumberThumbs How many thumbnails to show
+        */
+       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
+               $iPage = $this->getImagePage( $filename );
+               $reflection = new ReflectionClass( $iPage );
+               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
+               $reflMethod->setAccessible( true );
+
+               $actual = $reflMethod->invoke( $iPage, 545, 700 );
+               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
+       }
+
+       function providerGetThumbSizes() {
+               return array(
+                       array( 'animated.gif', 6 ),
+                       array( 'Toll_Texas_1.svg', 6 ),
+                       array( '80x60-Greyscale.xcf', 6 ),
+                       array( 'jpeg-comment-binary.jpg', 6 ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/page/ImagePageTest.php b/tests/phpunit/includes/page/ImagePageTest.php
new file mode 100644 (file)
index 0000000..3c255b5
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+class ImagePageTest extends MediaWikiMediaTestCase {
+
+       function setUp() {
+               $this->setMwGlobals( 'wgImageLimits', array(
+                       array( 320, 240 ),
+                       array( 640, 480 ),
+                       array( 800, 600 ),
+                       array( 1024, 768 ),
+                       array( 1280, 1024 )
+               ) );
+               parent::setUp();
+       }
+
+       function getImagePage( $filename ) {
+               $title = Title::makeTitleSafe( NS_FILE, $filename );
+               $file = $this->dataFile( $filename );
+               $iPage = new ImagePage( $title );
+               $iPage->setFile( $file );
+               return $iPage;
+       }
+
+       /**
+        * @dataProvider providerGetDisplayWidthHeight
+        * @param array $dim Array [maxWidth, maxHeight, width, height]
+        * @param array $expected Array [width, height] The width and height we expect to display at
+        */
+       function testGetDisplayWidthHeight( $dim, $expected ) {
+               $iPage = $this->getImagePage( 'animated.gif' );
+               $reflection = new ReflectionClass( $iPage );
+               $reflMethod = $reflection->getMethod( 'getDisplayWidthHeight' );
+               $reflMethod->setAccessible( true );
+
+               $actual = $reflMethod->invoke( $iPage, $dim[0], $dim[1], $dim[2], $dim[3] );
+               $this->assertEquals( $actual, $expected );
+       }
+
+       function providerGetDisplayWidthHeight() {
+               return array(
+                       array(
+                               array( 1024.0, 768.0, 600.0, 600.0 ),
+                               array( 600.0, 600.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 1600.0, 600.0 ),
+                               array( 1024.0, 384.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 1024.0, 768.0 ),
+                               array( 1024.0, 768.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 800.0, 1000.0 ),
+                               array( 614.0, 768.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 0, 1000 ),
+                               array( 0, 0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 2000, 0 ),
+                               array( 0, 0 )
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider providerGetThumbSizes
+        * @param string $filename
+        * @param int $expectedNumberThumbs How many thumbnails to show
+        */
+       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
+               $iPage = $this->getImagePage( $filename );
+               $reflection = new ReflectionClass( $iPage );
+               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
+               $reflMethod->setAccessible( true );
+
+               $actual = $reflMethod->invoke( $iPage, 545, 700 );
+               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
+       }
+
+       function providerGetThumbSizes() {
+               return array(
+                       array( 'animated.gif', 2 ),
+                       array( 'Toll_Texas_1.svg', 1 ),
+                       array( '80x60-Greyscale.xcf', 1 ),
+                       array( 'jpeg-comment-binary.jpg', 2 ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/page/WikiPageTest.php b/tests/phpunit/includes/page/WikiPageTest.php
new file mode 100644 (file)
index 0000000..c011e9a
--- /dev/null
@@ -0,0 +1,1301 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ * @group medium
+ **/
+class WikiPageTest extends MediaWikiLangTestCase {
+
+       protected $pages_to_delete;
+
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge(
+                       $this->tablesUsed,
+                       array( 'page',
+                               'revision',
+                               'text',
+
+                               'recentchanges',
+                               'logging',
+
+                               'page_props',
+                               'pagelinks',
+                               'categorylinks',
+                               'langlinks',
+                               'externallinks',
+                               'imagelinks',
+                               'templatelinks',
+                               'iwlinks' ) );
+       }
+
+       protected function setUp() {
+               parent::setUp();
+               $this->pages_to_delete = array();
+
+               LinkCache::singleton()->clear(); # avoid cached redirect status, etc
+       }
+
+       protected function tearDown() {
+               foreach ( $this->pages_to_delete as $p ) {
+                       /* @var $p WikiPage */
+
+                       try {
+                               if ( $p->exists() ) {
+                                       $p->doDeleteArticle( "testing done." );
+                               }
+                       } catch ( MWException $ex ) {
+                               // fail silently
+                       }
+               }
+               parent::tearDown();
+       }
+
+       /**
+        * @param Title|string $title
+        * @param string|null $model
+        * @return WikiPage
+        */
+       protected function newPage( $title, $model = null ) {
+               if ( is_string( $title ) ) {
+                       $ns = $this->getDefaultWikitextNS();
+                       $title = Title::newFromText( $title, $ns );
+               }
+
+               $p = new WikiPage( $title );
+
+               $this->pages_to_delete[] = $p;
+
+               return $p;
+       }
+
+       /**
+        * @param string|Title|WikiPage $page
+        * @param string $text
+        * @param int $model
+        *
+        * @return WikiPage
+        */
+       protected function createPage( $page, $text, $model = null ) {
+               if ( is_string( $page ) || $page instanceof Title ) {
+                       $page = $this->newPage( $page, $model );
+               }
+
+               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
+               $page->doEditContent( $content, "testing", EDIT_NEW );
+
+               return $page;
+       }
+
+       /**
+        * @covers WikiPage::doEditContent
+        */
+       public function testDoEditContent() {
+               $page = $this->newPage( "WikiPageTest_testDoEditContent" );
+               $title = $page->getTitle();
+
+               $content = ContentHandler::makeContent(
+                       "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
+
+               $page->doEditContent( $content, "[[testing]] 1" );
+
+               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
+               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getContent();
+               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
+
+               # ------------------------
+               $content = ContentHandler::makeContent(
+                       "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                               . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
+
+               $page->doEditContent( $content, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getContent();
+               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::doEdit
+        */
+       public function testDoEdit() {
+               $this->hideDeprecated( "WikiPage::doEdit" );
+               $this->hideDeprecated( "WikiPage::getText" );
+               $this->hideDeprecated( "Revision::getText" );
+
+               //NOTE: assume help namespace will default to wikitext
+               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
+
+               $page = $this->newPage( $title );
+
+               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                       . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
+
+               $page->doEdit( $text, "[[testing]] 1" );
+
+               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
+               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                       . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
+
+               $page->doEdit( $text, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::doQuickEdit
+        */
+       public function testDoQuickEdit() {
+               global $wgUser;
+
+               $this->hideDeprecated( "WikiPage::doQuickEdit" );
+
+               //NOTE: assume help namespace will default to wikitext
+               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
+
+               $text = "quick text";
+               $page->doQuickEdit( $text, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $text, $page->getText() );
+       }
+
+       /**
+        * @covers WikiPage::doQuickEditContent
+        */
+       public function testDoQuickEditContent() {
+               global $wgUser;
+
+               $page = $this->createPage(
+                       "WikiPageTest_testDoQuickEditContent",
+                       "original text",
+                       CONTENT_MODEL_WIKITEXT
+               );
+
+               $content = ContentHandler::makeContent(
+                       "quick text",
+                       $page->getTitle(),
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $page->doQuickEditContent( $content, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $content->equals( $page->getContent() ) );
+       }
+
+       /**
+        * @covers WikiPage::doDeleteArticle
+        */
+       public function testDoDeleteArticle() {
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $page->doDeleteArticle( "testing deletion" );
+
+               $this->assertFalse(
+                       $page->getTitle()->getArticleID() > 0,
+                       "Title object should now have page id 0"
+               );
+               $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
+               $this->assertFalse(
+                       $page->exists(),
+                       "WikiPage::exists should return false after page was deleted"
+               );
+               $this->assertNull(
+                       $page->getContent(),
+                       "WikiPage::getContent should return null after page was deleted"
+               );
+               $this->assertFalse(
+                       $page->getText(),
+                       "WikiPage::getText should return false after page was deleted"
+               );
+
+               $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
+               $this->assertFalse(
+                       $t->exists(),
+                       "Title::exists should return false after page was deleted"
+               );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::doDeleteUpdates
+        */
+       public function testDoDeleteUpdates() {
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $page->doDeleteUpdates( $id );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::getRevision
+        */
+       public function testGetRevision() {
+               $page = $this->newPage( "WikiPageTest_testGetRevision" );
+
+               $rev = $page->getRevision();
+               $this->assertNull( $rev );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $rev = $page->getRevision();
+
+               $this->assertEquals( $page->getLatest(), $rev->getId() );
+               $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
+       }
+
+       /**
+        * @covers WikiPage::getContent
+        */
+       public function testGetContent() {
+               $page = $this->newPage( "WikiPageTest_testGetContent" );
+
+               $content = $page->getContent();
+               $this->assertNull( $content );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $content = $page->getContent();
+               $this->assertEquals( "some text", $content->getNativeData() );
+       }
+
+       /**
+        * @covers WikiPage::getText
+        */
+       public function testGetText() {
+               $this->hideDeprecated( "WikiPage::getText" );
+
+               $page = $this->newPage( "WikiPageTest_testGetText" );
+
+               $text = $page->getText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $text = $page->getText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       /**
+        * @covers WikiPage::getRawText
+        */
+       public function testGetRawText() {
+               $this->hideDeprecated( "WikiPage::getRawText" );
+
+               $page = $this->newPage( "WikiPageTest_testGetRawText" );
+
+               $text = $page->getRawText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $text = $page->getRawText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       /**
+        * @covers WikiPage::getContentModel
+        */
+       public function testGetContentModel() {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
+       }
+
+       /**
+        * @covers WikiPage::getContentHandler
+        */
+       public function testGetContentHandler() {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
+       }
+
+       /**
+        * @covers WikiPage::exists
+        */
+       public function testExists() {
+               $page = $this->newPage( "WikiPageTest_testExists" );
+               $this->assertFalse( $page->exists() );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+               $this->assertTrue( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $page->exists() );
+
+               # -----------------
+               $page->doDeleteArticle( "done testing" );
+               $this->assertFalse( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertFalse( $page->exists() );
+       }
+
+       public static function provideHasViewableContent() {
+               return array(
+                       array( 'WikiPageTest_testHasViewableContent', false, true ),
+                       array( 'Special:WikiPageTest_testHasViewableContent', false ),
+                       array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
+                       array( 'Special:Userlogin', true ),
+                       array( 'MediaWiki:help', true ),
+               );
+       }
+
+       /**
+        * @dataProvider provideHasViewableContent
+        * @covers WikiPage::hasViewableContent
+        */
+       public function testHasViewableContent( $title, $viewable, $create = false ) {
+               $page = $this->newPage( $title );
+               $this->assertEquals( $viewable, $page->hasViewableContent() );
+
+               if ( $create ) {
+                       $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+                       $this->assertTrue( $page->hasViewableContent() );
+
+                       $page = new WikiPage( $page->getTitle() );
+                       $this->assertTrue( $page->hasViewableContent() );
+               }
+       }
+
+       public static function provideGetRedirectTarget() {
+               return array(
+                       array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
+                       array(
+                               'WikiPageTest_testGetRedirectTarget_2',
+                               CONTENT_MODEL_WIKITEXT,
+                               "#REDIRECT [[hello world]]",
+                               "Hello world"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetRedirectTarget
+        * @covers WikiPage::getRedirectTarget
+        */
+       public function testGetRedirectTarget( $title, $model, $text, $target ) {
+               $this->setMwGlobals( array(
+                       'wgCapitalLinks' => true,
+               ) );
+
+               $page = $this->createPage( $title, $text, $model );
+
+               # sanity check, because this test seems to fail for no reason for some people.
+               $c = $page->getContent();
+               $this->assertEquals( 'WikitextContent', get_class( $c ) );
+
+               # now, test the actual redirect
+               $t = $page->getRedirectTarget();
+               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
+       }
+
+       /**
+        * @dataProvider provideGetRedirectTarget
+        * @covers WikiPage::isRedirect
+        */
+       public function testIsRedirect( $title, $model, $text, $target ) {
+               $page = $this->createPage( $title, $text, $model );
+               $this->assertEquals( !is_null( $target ), $page->isRedirect() );
+       }
+
+       public static function provideIsCountable() {
+               return array(
+
+                       // any
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '',
+                               'any',
+                               true
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'any',
+                               true
+                       ),
+
+                       // comma
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'comma',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo, bar',
+                               'comma',
+                               true
+                       ),
+
+                       // link
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'link',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo [[bar]]',
+                               'link',
+                               true
+                       ),
+
+                       // redirects
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '#REDIRECT [[bar]]',
+                               'any',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '#REDIRECT [[bar]]',
+                               'comma',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '#REDIRECT [[bar]]',
+                               'link',
+                               false
+                       ),
+
+                       // not a content namespace
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'any',
+                               false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo, bar',
+                               'comma',
+                               false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo [[bar]]',
+                               'link',
+                               false
+                       ),
+
+                       // not a content namespace, different model
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                               null,
+                               'Foo',
+                               'any',
+                               false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                               null,
+                               'Foo, bar',
+                               'comma',
+                               false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                               null,
+                               'Foo [[bar]]',
+                               'link',
+                               false
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideIsCountable
+        * @covers WikiPage::isCountable
+        */
+       public function testIsCountable( $title, $model, $text, $mode, $expected ) {
+               global $wgContentHandlerUseDB;
+
+               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
+
+               $title = Title::newFromText( $title );
+
+               if ( !$wgContentHandlerUseDB
+                       && $model
+                       && ContentHandler::getDefaultModelFor( $title ) != $model
+               ) {
+                       $this->markTestSkipped( "Can not use non-default content model $model for "
+                               . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
+               }
+
+               $page = $this->createPage( $title, $text, $model );
+
+               $editInfo = $page->prepareContentForEdit( $page->getContent() );
+
+               $v = $page->isCountable();
+               $w = $page->isCountable( $editInfo );
+
+               $this->assertEquals(
+                       $expected,
+                       $v,
+                       "isCountable( null ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
+
+               $this->assertEquals(
+                       $expected,
+                       $w,
+                       "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
+       }
+
+       public static function provideGetParserOutput() {
+               return array(
+                       array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
+                       // @todo more...?
+               );
+       }
+
+       /**
+        * @dataProvider provideGetParserOutput
+        * @covers WikiPage::getParserOutput
+        */
+       public function testGetParserOutput( $model, $text, $expectedHtml ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
+
+               $opt = $page->makeParserOptions( 'canonical' );
+               $po = $page->getParserOutput( $opt );
+               $text = $po->getText();
+
+               $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
+               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
+
+               $this->assertEquals( $expectedHtml, $text );
+
+               return $po;
+       }
+
+       /**
+        * @covers WikiPage::getParserOutput
+        */
+       public function testGetParserOutput_nonexisting() {
+               static $count = 0;
+               $count++;
+
+               $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt );
+
+               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
+       }
+
+       /**
+        * @covers WikiPage::getParserOutput
+        */
+       public function testGetParserOutput_badrev() {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
+
+               // @todo would be neat to also test deleted revision
+
+               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
+       }
+
+       public static $sections =
+
+               "Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+       public function dataReplaceSection() {
+               //NOTE: assume the Help namespace to contain wikitext
+               return array(
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "0",
+                               "No more",
+                               null,
+                               trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "",
+                               "No more",
+                               null,
+                               "No more"
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "2",
+                               "== TEST ==\nmore fun",
+                               null,
+                               trim( preg_replace( '/^== test ==.*== foo ==/sm',
+                                       "== TEST ==\nmore fun\n\n== foo ==",
+                                       WikiPageTest::$sections ) )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "8",
+                               "No more",
+                               null,
+                               trim( WikiPageTest::$sections )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "new",
+                               "No more",
+                               "New",
+                               trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSection
+        */
+       public function testReplaceSection( $title, $model, $text, $section, $with,
+               $sectionTitle, $expected
+       ) {
+               $this->hideDeprecated( "WikiPage::replaceSection" );
+
+               $page = $this->createPage( $title, $text, $model );
+               $text = $page->replaceSection( $section, $with, $sectionTitle );
+               $text = trim( $text );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSectionContent
+        */
+       public function testReplaceSectionContent( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
+               $page = $this->createPage( $title, $text, $model );
+
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSectionAtRev
+        */
+       public function testReplaceSectionAtRev( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
+               $page = $this->createPage( $title, $text, $model );
+               $baseRevId = $page->getLatest();
+
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
+       /* @todo FIXME: fix this!
+       public function testGetUndoText() {
+       $this->checkHasDiff3();
+
+       $text = "one";
+       $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
+       $rev1 = $page->getRevision();
+
+       $text .= "\n\ntwo";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section two"
+       );
+       $rev2 = $page->getRevision();
+
+       $text .= "\n\nthree";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section three"
+       );
+       $rev3 = $page->getRevision();
+
+       $text .= "\n\nfour";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section four"
+       );
+       $rev4 = $page->getRevision();
+
+       $text .= "\n\nfive";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section five"
+       );
+       $rev5 = $page->getRevision();
+
+       $text .= "\n\nsix";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section six"
+       );
+       $rev6 = $page->getRevision();
+
+       $undo6 = $page->getUndoText( $rev6 );
+       if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
+       $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
+
+       $undo3 = $page->getUndoText( $rev4, $rev2 );
+       if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
+       $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
+
+       $undo2 = $page->getUndoText( $rev2 );
+       if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
+       $this->assertEquals( "one\n\nfive", $undo2 );
+       }
+        */
+
+       /**
+        * @todo FIXME: this is a better rollback test than the one below, but it
+        * keeps failing in jenkins for some reason.
+        */
+       public function broken_testDoRollback() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                       "section one", EDIT_NEW, false, $admin );
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                       "adding section two", 0, false, $user1 );
+
+               $user2 = new User();
+               $user2->setName( "127.0.2.13" );
+               $text .= "\n\nthree";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                       "adding section three", 0, false, $user2 );
+
+               # we are having issues with doRollback spuriously failing. Apparently
+               # the last revision somehow goes missing or not committed under some
+               # circumstances. So, make sure the last revision has the right user name.
+               $dbr = wfGetDB( DB_SLAVE );
+               $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
+
+               $page = new WikiPage( $page->getTitle() );
+               $rev3 = $page->getRevision();
+               $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
+
+               $rev2 = $rev3->getPrevious();
+               $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
+
+               $rev1 = $rev2->getPrevious();
+               $this->assertEquals( 'Admin', $rev1->getUserText() );
+
+               # now, try the actual rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user2->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
+       }
+
+       /**
+        * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+        * @covers WikiPage::doRollback
+        */
+       public function testDoRollback() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
+
+               # now, try the rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getContent()->getNativeData() );
+       }
+
+       /**
+        * @covers WikiPage::doRollback
+        */
+       public function testDoRollbackFailureSameContent() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
+
+               # now, do a the rollback from the same user was doing the edit before
+               $resultDetails = array();
+               $token = $user1->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert same user",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
+
+               $this->assertEquals( array(), $errors, "Rollback failed same user" );
+
+               # now, try the rollback
+               $resultDetails = array();
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
+
+               $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
+                       '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getContent()->getNativeData() );
+       }
+
+       public static function provideGetAutosummary() {
+               return array(
+                       array(
+                               'Hello there, world!',
+                               '#REDIRECT [[Foo]]',
+                               0,
+                               '/^Redirected page .*Foo/'
+                       ),
+
+                       array(
+                               null,
+                               'Hello world!',
+                               EDIT_NEW,
+                               '/^Created page .*Hello/'
+                       ),
+
+                       array(
+                               'Hello there, world!',
+                               '',
+                               0,
+                               '/^Blanked/'
+                       ),
+
+                       array(
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
+                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Hello world!',
+                               0,
+                               '/^Replaced .*Hello/'
+                       ),
+
+                       array(
+                               'foo',
+                               'bar',
+                               0,
+                               '/^$/'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetAutoSummary
+        * @covers WikiPage::getAutosummary
+        */
+       public function testGetAutosummary( $old, $new, $flags, $expected ) {
+               $this->hideDeprecated( "WikiPage::getAutosummary" );
+
+               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
+
+               $summary = $page->getAutosummary( $old, $new, $flags );
+
+               $this->assertTrue( (bool)preg_match( $expected, $summary ),
+                       "Autosummary didn't match expected pattern $expected: $summary" );
+       }
+
+       public static function provideGetAutoDeleteReason() {
+               return array(
+                       array(
+                               array(),
+                               false,
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                               ),
+                               "/first edit.*only contributor/",
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                                       array( "second edit", null ),
+                               ),
+                               "/second edit.*only contributor/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "second edit", "127.0.3.33" ),
+                               ),
+                               "/second edit/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array(
+                                               "first edit: "
+                                                       . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                                       . " nonumy eirmod tempor invidunt ut labore et dolore magna "
+                                                       . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
+                                                       . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
+                                                       . "no sea  takimata sanctus est Lorem ipsum dolor sit amet.'",
+                                               null
+                                       ),
+                               ),
+                               '/first edit:.*\.\.\."/',
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "", "127.0.3.33" ),
+                               ),
+                               "/before blanking.*first edit/",
+                               true
+                       ),
+
+               );
+       }
+
+       /**
+        * @dataProvider provideGetAutoDeleteReason
+        * @covers WikiPage::getAutoDeleteReason
+        */
+       public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
+               global $wgUser;
+
+               //NOTE: assume Help namespace to contain wikitext
+               $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
+
+               $c = 1;
+
+               foreach ( $edits as $edit ) {
+                       $user = new User();
+
+                       if ( !empty( $edit[1] ) ) {
+                               $user->setName( $edit[1] );
+                       } else {
+                               $user = $wgUser;
+                       }
+
+                       $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
+
+                       $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
+
+                       $c += 1;
+               }
+
+               $reason = $page->getAutoDeleteReason( $hasHistory );
+
+               if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) {
+                       $this->assertEquals( $expectedResult, $reason );
+               } else {
+                       $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
+                               "Autosummary didn't match expected pattern $expectedResult: $reason" );
+               }
+
+               $this->assertEquals( $expectedHistory, $hasHistory,
+                       "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
+
+               $page->doDeleteArticle( "done" );
+       }
+
+       public static function providePreSaveTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                               "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+                       ),
+                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                               'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider providePreSaveTransform
+        * @covers WikiPage::preSaveTransform
+        */
+       public function testPreSaveTransform( $text, $expected ) {
+               $this->hideDeprecated( 'WikiPage::preSaveTransform' );
+               $user = new User();
+               $user->setName( "127.0.0.1" );
+
+               //NOTE: assume Help namespace to contain wikitext
+               $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
+               $text = $page->preSaveTransform( $text, $user );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       /**
+        * @covers WikiPage::factory
+        */
+       public function testWikiPageFactory() {
+               $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
+
+               $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
+
+               $title = Title::makeTitle( NS_MAIN, 'SomePage' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiPage', get_class( $page ) );
+       }
+}
diff --git a/tests/phpunit/includes/page/WikiPageTestContentHandlerUseDB.php b/tests/phpunit/includes/page/WikiPageTestContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..3db7628
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class WikiPageTestContentHandlerUseDB extends WikiPageTest {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+       }
+
+       /**
+        * @covers WikiPage::getContentModel
+        */
+       public function testGetContentModel() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
+       }
+
+       /**
+        * @covers WikiPage::getContentHandler
+        */
+       public function testGetContentHandler() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
+       }
+}
index 0df52f5..010ae66 100644 (file)
@@ -434,7 +434,7 @@ class NewParserTest extends MediaWikiTestCase {
                $this->savedGlobals = array();
 
                /** @since 1.20 */
-               wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
+               Hooks::run( 'ParserTestGlobals', array( &$settings ) );
 
                $langObj = Language::factory( $lang );
                $settings['wgContLang'] = $langObj;
@@ -939,7 +939,7 @@ class NewParserTest extends MediaWikiTestCase {
                $class = $wgParserConf['class'];
                $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf );
 
-               wfRunHooks( 'ParserTestParser', array( &$parser ) );
+               Hooks::run( 'ParserTestParser', array( &$parser ) );
 
                return $parser;
        }
index c024cee..fe46f2c 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * @group Database
+ *        ^--- trigger DB shadowing because we are using Title magic
+ */
 class ParserOutputTest extends MediaWikiTestCase {
 
        public static function provideIsLinkInternal() {
@@ -84,4 +88,66 @@ class ParserOutputTest extends MediaWikiTestCase {
                $this->assertEquals( $po->getProperty( 'foo' ), false );
                $this->assertArrayNotHasKey( 'foo', $properties );
        }
+
+       /**
+        * @covers ParserOutput::hasCustomDataUpdates
+        * @covers ParserOutput::addSecondaryDataUpdate
+        */
+       public function testHasCustomDataUpdates() {
+               $po = new ParserOutput();
+               $this->assertFalse( $po->hasCustomDataUpdates() );
+
+               $dataUpdate = $this->getMock( 'DataUpdate' );
+               $po->addSecondaryDataUpdate( $dataUpdate );
+               $this->assertTrue( $po->hasCustomDataUpdates() );
+       }
+
+       /**
+        * @covers ParserOutput::getSecondaryDataUpdates
+        * @covers ParserOutput::addSecondaryDataUpdate
+        */
+       public function testGetSecondaryDataUpdates() {
+               // NOTE: getSecondaryDataUpdates always returns a LinksUpdate object
+               // in addition to the DataUpdates registered via addSecondaryDataUpdate().
+
+               $title = Title::makeTitle( NS_MAIN, 'Dummy' );
+               $title->resetArticleID( 7777777 );
+
+               $po = new ParserOutput();
+               $this->assertCount( 1, $po->getSecondaryDataUpdates( $title ) );
+
+               $dataUpdate = $this->getMock( 'DataUpdate' );
+               $po->addSecondaryDataUpdate( $dataUpdate );
+               $this->assertCount( 2, $po->getSecondaryDataUpdates( $title ) );
+
+               // Test Fallback to getTitleText
+               $this->insertPage( 'Project:ParserOutputTestDummyPage' );
+               $po->setTitleText( 'Project:ParserOutputTestDummyPage' );
+               $this->assertCount( 2, $po->getSecondaryDataUpdates() );
+       }
+
+       /**
+        * @covers ParserOutput::getSecondaryDataUpdates
+        * @covers ParserOutput::__sleep
+        */
+       public function testGetSecondaryDataUpdates_serialization() {
+               $title = Title::makeTitle( NS_MAIN, 'Dummy' );
+               $title->resetArticleID( 7777777 );
+
+               $po = new ParserOutput();
+
+               // Serializing is fine with no custom DataUpdates.
+               $po = unserialize( serialize( $po ) );
+               $this->assertCount( 1, $po->getSecondaryDataUpdates( $title ) );
+
+               // If there are custom DataUpdates, getSecondaryDataUpdates
+               // should fail after serialization.
+               $dataUpdate = $this->getMock( 'DataUpdate' );
+               $po->addSecondaryDataUpdate( $dataUpdate );
+               $po = unserialize( serialize( $po ) );
+
+               $this->setExpectedException( 'MWException' );
+               $po->getSecondaryDataUpdates( $title );
+       }
+
 }
diff --git a/tests/phpunit/includes/password/PasswordTest.php b/tests/phpunit/includes/password/PasswordTest.php
new file mode 100644 (file)
index 0000000..5ad8aca
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Testing framework for the Password infrastructure
+ *
+ * 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
+ */
+
+class PasswordTest extends MediaWikiTestCase {
+       /**
+        * @covers InvalidPassword::equals
+        */
+       public function testInvalidUnequalInvalid() {
+               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
+               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
+
+               $this->assertFalse( $invalid1->equals( $invalid2 ) );
+       }
+
+       public function testInvalidPlaintext() {
+               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
+
+               $this->assertInstanceOf( 'InvalidPassword', $invalid );
+       }
+}
index 78fc3ed..9a142cb 100644 (file)
@@ -49,8 +49,8 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
         * An array of tests in the form of (bool, string, string), where the first
         * element is whether the second parameter (a password hash) and the third
         * parameter (a password) should match.
-        *
         * @return array
+        * @throws MWException
         * @abstract
         */
        public static function providePasswordTests() {
diff --git a/tests/phpunit/includes/registration/ExtensionProcessorTest.php b/tests/phpunit/includes/registration/ExtensionProcessorTest.php
new file mode 100644 (file)
index 0000000..221c258
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+
+class ExtensionProcessorTest extends MediaWikiTestCase {
+
+       private $dir;
+
+       public function setUp() {
+               parent::setUp();
+               $this->dir = __DIR__ . '/FooBar/extension.json';
+       }
+
+       /**
+        * 'name' is absolutely required
+        *
+        * @var array
+        */
+       static $default = array(
+               'name' => 'FooBar',
+       );
+
+       public static function provideRegisterHooks() {
+               return array(
+                       // No hooks
+                       array(
+                               array(),
+                               self::$default,
+                               array(),
+                       ),
+                       // No current hooks, adding one for "FooBaz"
+                       array(
+                               array(),
+                               array( 'Hooks' => array( 'FooBaz' => 'FooBazCallback' ) ) + self::$default,
+                               array( 'FooBaz' => array( 'FooBazCallback' ) ),
+                       ),
+                       // Hook for "FooBaz", adding another one
+                       array(
+                               array( 'FooBaz' => array( 'PriorCallback' ) ),
+                               array( 'Hooks' => array( 'FooBaz' => 'FooBazCallback' ) ) + self::$default,
+                               array( 'FooBaz' => array( 'PriorCallback', 'FooBazCallback' ) ),
+                       ),
+                       // Hook for "BarBaz", adding one for "FooBaz"
+                       array(
+                               array( 'BarBaz' => array( 'BarBazCallback' ) ),
+                               array( 'Hooks' => array( 'FooBaz' => 'FooBazCallback' ) ) + self::$default,
+                               array(
+                                       'BarBaz' => array( 'BarBazCallback' ),
+                                       'FooBaz' => array( 'FooBazCallback' ),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @covers ExtensionProcessor::extractHooks
+        * @dataProvider provideRegisterHooks
+        */
+       public function testRegisterHooks( $pre, $info, $expected ) {
+               $processor = new MockExtensionProcessor( array( 'wgHooks' => $pre ) );
+               $processor->extractInfo( $this->dir, $info );
+               $extracted = $processor->getExtractedInfo();
+               $this->assertEquals( $expected, $extracted['globals']['wgHooks'] );
+       }
+
+       /**
+        * @covers ExtensionProcessor::extractConfig
+        */
+       public function testExtractConfig() {
+               $processor = new ExtensionProcessor;
+               $info = array(
+                       'config' => array(
+                               'Bar' => 'somevalue',
+                               'Foo' => 10,
+                       ),
+               ) + self::$default;
+               $processor->extractInfo( $this->dir, $info );
+               $extracted = $processor->getExtractedInfo();
+               $this->assertEquals( 'somevalue', $extracted['globals']['wgBar'] );
+               $this->assertEquals( 10, $extracted['globals']['wgFoo'] );
+       }
+
+       public static function provideSetToGlobal() {
+               return array(
+                       array(
+                               array( 'wgAPIModules', 'wgAvailableRights' ),
+                               array(),
+                               array(
+                                       'APIModules' => array( 'foobar' => 'ApiFooBar' ),
+                                       'AvailableRights' => array( 'foobar', 'unfoobar' ),
+                               ),
+                               array(
+                                       'wgAPIModules' => array( 'foobar' => 'ApiFooBar' ),
+                                       'wgAvailableRights' => array( 'foobar', 'unfoobar' ),
+                               ),
+                       ),
+                       array(
+                               array( 'wgAPIModules', 'wgAvailableRights' ),
+                               array(
+                                       'wgAPIModules' => array( 'barbaz' => 'ApiBarBaz' ),
+                                       'wgAvailableRights' => array( 'barbaz' )
+                               ),
+                               array(
+                                       'APIModules' => array( 'foobar' => 'ApiFooBar' ),
+                                       'AvailableRights' => array( 'foobar', 'unfoobar' ),
+                               ),
+                               array(
+                                       'wgAPIModules' => array( 'barbaz' => 'ApiBarBaz', 'foobar' => 'ApiFooBar' ),
+                                       'wgAvailableRights' => array( 'barbaz', 'foobar', 'unfoobar' ),
+                               ),
+                       ),
+                       array(
+                               array( 'wgGroupPermissions' ),
+                               array(
+                                       'wgGroupPermissions' => array( 'sysop' => array( 'delete' ) ),
+                               ),
+                               array(
+                                       'GroupPermissions' => array( 'sysop' => array( 'undelete' ), 'user' => array( 'edit' ) ),
+                               ),
+                               array(
+                                       'wgGroupPermissions' => array( 'sysop' => array( 'delete', 'undelete' ), 'user' => array( 'edit' ) ),
+                               )
+                       )
+               );
+       }
+}
+
+
+/**
+ * Allow overriding the default value of $this->globals
+ * so we can test merging
+ */
+class MockExtensionProcessor extends ExtensionProcessor {
+       public function __construct( $globals = array() ) {
+               $this->globals = $globals + $this->globals;
+       }
+}
index 95da847..9afc54d 100644 (file)
@@ -148,8 +148,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
         */
        public function testGetModifiedTime( $module, $expected ) {
                $rl = new ResourceLoaderFileModule( $module );
-               $ts = $rl->getModifiedTime( new ResourceLoaderContext(
-                       new ResourceLoader, new FauxRequest() ) );
+               $ts = $rl->getModifiedTime( $this->getResourceLoaderContext() );
                $this->assertEquals( $ts, $expected );
        }
 }
index b25e9b0..6d1ed4e 100644 (file)
@@ -7,7 +7,7 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderFileModule::getDefinitionSummary
         */
        public function testDefinitionSummary() {
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
 
                $baseParams = array(
                        'scripts' => array( 'foo.js', 'bar.js' ),
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
new file mode 100644 (file)
index 0000000..7f3506c
--- /dev/null
@@ -0,0 +1,388 @@
+<?php
+
+class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
+
+       public static function provideGetModuleRegistrations() {
+               return array(
+                       array( array(
+                               'msg' => 'Empty registry',
+                               'modules' => array(),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );mw.loader.register( [] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Basic registry',
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.blank",
+        1388534400
+    ]
+] );',
+                       ) ),
+                       array( array(
+                               'msg' => 'Group signature',
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.group.foo' => new ResourceLoaderTestModule( array( 'group' => 'x-foo' ) ),
+                                       'test.group.bar' => new ResourceLoaderTestModule( array( 'group' => 'x-bar' ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.blank",
+        1388534400
+    ],
+    [
+        "test.group.foo",
+        1388534400,
+        [],
+        "x-foo"
+    ],
+    [
+        "test.group.bar",
+        1388534400,
+        [],
+        "x-bar"
+    ]
+] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Different target (non-test should not be registered)',
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.target.foo' => new ResourceLoaderTestModule( array( 'targets' => array( 'x-foo' ) ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.blank",
+        1388534400
+    ]
+] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Foreign source',
+                               'sources' => array(
+                                       'example' => array(
+                                               'loadScript' => 'http://example.org/w/load.php',
+                                               'apiScript' => 'http://example.org/w/api.php',
+                                       ),
+                               ),
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule( array( 'source' => 'example' ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php",
+    "example": "http://example.org/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.blank",
+        1388534400,
+        [],
+        null,
+        "example"
+    ]
+] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Conditional dependency function',
+                               'modules' => array(
+                                       'test.x.core' => new ResourceLoaderTestModule(),
+                                       'test.x.polyfill' => new ResourceLoaderTestModule( array(
+                                               'skipFunction' => 'return true;'
+                                       ) ),
+                                       'test.y.polyfill' => new ResourceLoaderTestModule( array(
+                                               'skipFunction' =>
+                                                       'return !!(' .
+                                                       '    window.JSON &&' .
+                                                       '    JSON.parse &&' .
+                                                       '    JSON.stringify' .
+                                                       ');'
+                                       ) ),
+                                       'test.z.foo' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                                       'test.x.polyfill',
+                                                       'test.y.polyfill',
+                                               ),
+                                       ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.x.core",
+        1388534400
+    ],
+    [
+        "test.x.polyfill",
+        1388534400,
+        [],
+        null,
+        null,
+        "return true;"
+    ],
+    [
+        "test.y.polyfill",
+        1388534400,
+        [],
+        null,
+        null,
+        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
+    ],
+    [
+        "test.z.foo",
+        1388534400,
+        [
+            0,
+            1,
+            2
+        ]
+    ]
+] );',
+                       ) ),
+                       array( array(
+                               // This may seem like an edge case, but a plain MediaWiki core install
+                               // with a few extensions installed is likely far more complex than this
+                               // even, not to mention an install like Wikipedia.
+                               // TODO: Make this even more realistic.
+                               'msg' => 'Advanced (everything combined)',
+                               'sources' => array(
+                                       'example' => array(
+                                               'loadScript' => 'http://example.org/w/load.php',
+                                               'apiScript' => 'http://example.org/w/api.php',
+                                       ),
+                               ),
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.x.core' => new ResourceLoaderTestModule(),
+                                       'test.x.util' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                               ),
+                                       ) ),
+                                       'test.x.foo' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                               ),
+                                       ) ),
+                                       'test.x.bar' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                                       'test.x.util',
+                                               ),
+                                       ) ),
+                                       'test.x.quux' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.foo',
+                                                       'test.x.bar',
+                                                       'test.x.util',
+                                                       'test.x.unknown',
+                                               ),
+                                       ) ),
+                                       'test.group.foo.1' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-foo',
+                                       ) ),
+                                       'test.group.foo.2' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-foo',
+                                       ) ),
+                                       'test.group.bar.1' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-bar',
+                                       ) ),
+                                       'test.group.bar.2' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-bar',
+                                               'source' => 'example',
+                                       ) ),
+                                       'test.target.foo' => new ResourceLoaderTestModule( array(
+                                               'targets' => array( 'x-foo' ),
+                                       ) ),
+                                       'test.target.bar' => new ResourceLoaderTestModule( array(
+                                               'source' => 'example',
+                                               'targets' => array( 'x-foo' ),
+                                       ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php",
+    "example": "http://example.org/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.blank",
+        1388534400
+    ],
+    [
+        "test.x.core",
+        1388534400
+    ],
+    [
+        "test.x.util",
+        1388534400,
+        [
+            1
+        ]
+    ],
+    [
+        "test.x.foo",
+        1388534400,
+        [
+            1
+        ]
+    ],
+    [
+        "test.x.bar",
+        1388534400,
+        [
+            2
+        ]
+    ],
+    [
+        "test.x.quux",
+        1388534400,
+        [
+            3,
+            4,
+            "test.x.unknown"
+        ]
+    ],
+    [
+        "test.group.foo.1",
+        1388534400,
+        [],
+        "x-foo"
+    ],
+    [
+        "test.group.foo.2",
+        1388534400,
+        [],
+        "x-foo"
+    ],
+    [
+        "test.group.bar.1",
+        1388534400,
+        [],
+        "x-bar"
+    ],
+    [
+        "test.group.bar.2",
+        1388534400,
+        [],
+        "x-bar",
+        "example"
+    ]
+] );'
+                       ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetModuleRegistrations
+        * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies
+        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+        * @covers ResourceLoader::makeLoaderSourcesScript
+        * @covers ResourceLoader::makeLoaderRegisterScript
+        */
+       public function testGetModuleRegistrations( $case ) {
+               if ( isset( $case['sources'] ) ) {
+                       $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
+               }
+
+               $context = $this->getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+
+               $rl->register( $case['modules'] );
+
+               $module = new ResourceLoaderStartUpModule();
+               $this->assertEquals(
+                       ltrim( $case['out'], "\n" ),
+                       $module->getModuleRegistrations( $context ),
+                       $case['msg']
+               );
+       }
+
+       public static function provideRegistrations() {
+               return array(
+                       array( array(
+                               'test.blank' => new ResourceLoaderTestModule(),
+                               'test.min' => new ResourceLoaderTestModule( array(
+                                       'skipFunction' =>
+                                               'return !!(' .
+                                               '    window.JSON &&' .
+                                               '    JSON.parse &&' .
+                                               '    JSON.stringify' .
+                                               ');',
+                                       'dependencies' => array(
+                                               'test.blank',
+                                       ),
+                               ) ),
+                       ) )
+               );
+       }
+       /**
+        * @dataProvider provideRegistrations
+        */
+       public function testRegistrationsMinified( $modules ) {
+               $this->setMwGlobals( 'wgResourceLoaderDebug', false );
+
+               $context = $this->getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+               $rl->register( $modules );
+               $module = new ResourceLoaderStartUpModule();
+               $this->assertEquals(
+'mw.loader.addSource({"local":"/w/load.php"});'
+. 'mw.loader.register(['
+. '["test.blank",1388534400],'
+. '["test.min",1388534400,[0],null,null,'
+. '"return!!(window.JSON\u0026\u0026JSON.parse\u0026\u0026JSON.stringify);"'
+. ']]);',
+                       $module->getModuleRegistrations( $context ),
+                       'Minified output'
+               );
+       }
+
+       /**
+        * @dataProvider provideRegistrations
+        */
+       public function testRegistrationsUnminified( $modules ) {
+               $context = $this->getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+               $rl->register( $modules );
+               $module = new ResourceLoaderStartUpModule();
+               $this->assertEquals(
+'mw.loader.addSource( {
+    "local": "/w/load.php"
+} );mw.loader.register( [
+    [
+        "test.blank",
+        1388534400
+    ],
+    [
+        "test.min",
+        1388534400,
+        [
+            0
+        ],
+        null,
+        null,
+        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
+    ]
+] );',
+                       $module->getModuleRegistrations( $context ),
+                       'Unminified output'
+               );
+       }
+
+}
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
deleted file mode 100644 (file)
index 3fddc1e..0000000
+++ /dev/null
@@ -1,388 +0,0 @@
-<?php
-
-class ResourceLoaderStartupModuleTest extends ResourceLoaderTestCase {
-
-       public static function provideGetModuleRegistrations() {
-               return array(
-                       array( array(
-                               'msg' => 'Empty registry',
-                               'modules' => array(),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php"
-} );mw.loader.register( [] );'
-                       ) ),
-                       array( array(
-                               'msg' => 'Basic registry',
-                               'modules' => array(
-                                       'test.blank' => new ResourceLoaderTestModule(),
-                               ),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.blank",
-        1388534400
-    ]
-] );',
-                       ) ),
-                       array( array(
-                               'msg' => 'Group signature',
-                               'modules' => array(
-                                       'test.blank' => new ResourceLoaderTestModule(),
-                                       'test.group.foo' => new ResourceLoaderTestModule( array( 'group' => 'x-foo' ) ),
-                                       'test.group.bar' => new ResourceLoaderTestModule( array( 'group' => 'x-bar' ) ),
-                               ),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.blank",
-        1388534400
-    ],
-    [
-        "test.group.foo",
-        1388534400,
-        [],
-        "x-foo"
-    ],
-    [
-        "test.group.bar",
-        1388534400,
-        [],
-        "x-bar"
-    ]
-] );'
-                       ) ),
-                       array( array(
-                               'msg' => 'Different target (non-test should not be registered)',
-                               'modules' => array(
-                                       'test.blank' => new ResourceLoaderTestModule(),
-                                       'test.target.foo' => new ResourceLoaderTestModule( array( 'targets' => array( 'x-foo' ) ) ),
-                               ),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.blank",
-        1388534400
-    ]
-] );'
-                       ) ),
-                       array( array(
-                               'msg' => 'Foreign source',
-                               'sources' => array(
-                                       'example' => array(
-                                               'loadScript' => 'http://example.org/w/load.php',
-                                               'apiScript' => 'http://example.org/w/api.php',
-                                       ),
-                               ),
-                               'modules' => array(
-                                       'test.blank' => new ResourceLoaderTestModule( array( 'source' => 'example' ) ),
-                               ),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php",
-    "example": "http://example.org/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.blank",
-        1388534400,
-        [],
-        null,
-        "example"
-    ]
-] );'
-                       ) ),
-                       array( array(
-                               'msg' => 'Conditional dependency function',
-                               'modules' => array(
-                                       'test.x.core' => new ResourceLoaderTestModule(),
-                                       'test.x.polyfill' => new ResourceLoaderTestModule( array(
-                                               'skipFunction' => 'return true;'
-                                       ) ),
-                                       'test.y.polyfill' => new ResourceLoaderTestModule( array(
-                                               'skipFunction' =>
-                                                       'return !!(' .
-                                                       '    window.JSON &&' .
-                                                       '    JSON.parse &&' .
-                                                       '    JSON.stringify' .
-                                                       ');'
-                                       ) ),
-                                       'test.z.foo' => new ResourceLoaderTestModule( array(
-                                               'dependencies' => array(
-                                                       'test.x.core',
-                                                       'test.x.polyfill',
-                                                       'test.y.polyfill',
-                                               ),
-                                       ) ),
-                               ),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.x.core",
-        1388534400
-    ],
-    [
-        "test.x.polyfill",
-        1388534400,
-        [],
-        null,
-        null,
-        "return true;"
-    ],
-    [
-        "test.y.polyfill",
-        1388534400,
-        [],
-        null,
-        null,
-        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
-    ],
-    [
-        "test.z.foo",
-        1388534400,
-        [
-            0,
-            1,
-            2
-        ]
-    ]
-] );',
-                       ) ),
-                       array( array(
-                               // This may seem like an edge case, but a plain MediaWiki core install
-                               // with a few extensions installed is likely far more complex than this
-                               // even, not to mention an install like Wikipedia.
-                               // TODO: Make this even more realistic.
-                               'msg' => 'Advanced (everything combined)',
-                               'sources' => array(
-                                       'example' => array(
-                                               'loadScript' => 'http://example.org/w/load.php',
-                                               'apiScript' => 'http://example.org/w/api.php',
-                                       ),
-                               ),
-                               'modules' => array(
-                                       'test.blank' => new ResourceLoaderTestModule(),
-                                       'test.x.core' => new ResourceLoaderTestModule(),
-                                       'test.x.util' => new ResourceLoaderTestModule( array(
-                                               'dependencies' => array(
-                                                       'test.x.core',
-                                               ),
-                                       ) ),
-                                       'test.x.foo' => new ResourceLoaderTestModule( array(
-                                               'dependencies' => array(
-                                                       'test.x.core',
-                                               ),
-                                       ) ),
-                                       'test.x.bar' => new ResourceLoaderTestModule( array(
-                                               'dependencies' => array(
-                                                       'test.x.core',
-                                                       'test.x.util',
-                                               ),
-                                       ) ),
-                                       'test.x.quux' => new ResourceLoaderTestModule( array(
-                                               'dependencies' => array(
-                                                       'test.x.foo',
-                                                       'test.x.bar',
-                                                       'test.x.util',
-                                                       'test.x.unknown',
-                                               ),
-                                       ) ),
-                                       'test.group.foo.1' => new ResourceLoaderTestModule( array(
-                                               'group' => 'x-foo',
-                                       ) ),
-                                       'test.group.foo.2' => new ResourceLoaderTestModule( array(
-                                               'group' => 'x-foo',
-                                       ) ),
-                                       'test.group.bar.1' => new ResourceLoaderTestModule( array(
-                                               'group' => 'x-bar',
-                                       ) ),
-                                       'test.group.bar.2' => new ResourceLoaderTestModule( array(
-                                               'group' => 'x-bar',
-                                               'source' => 'example',
-                                       ) ),
-                                       'test.target.foo' => new ResourceLoaderTestModule( array(
-                                               'targets' => array( 'x-foo' ),
-                                       ) ),
-                                       'test.target.bar' => new ResourceLoaderTestModule( array(
-                                               'source' => 'example',
-                                               'targets' => array( 'x-foo' ),
-                                       ) ),
-                               ),
-                               'out' => '
-mw.loader.addSource( {
-    "local": "/w/load.php",
-    "example": "http://example.org/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.blank",
-        1388534400
-    ],
-    [
-        "test.x.core",
-        1388534400
-    ],
-    [
-        "test.x.util",
-        1388534400,
-        [
-            1
-        ]
-    ],
-    [
-        "test.x.foo",
-        1388534400,
-        [
-            1
-        ]
-    ],
-    [
-        "test.x.bar",
-        1388534400,
-        [
-            2
-        ]
-    ],
-    [
-        "test.x.quux",
-        1388534400,
-        [
-            3,
-            4,
-            "test.x.unknown"
-        ]
-    ],
-    [
-        "test.group.foo.1",
-        1388534400,
-        [],
-        "x-foo"
-    ],
-    [
-        "test.group.foo.2",
-        1388534400,
-        [],
-        "x-foo"
-    ],
-    [
-        "test.group.bar.1",
-        1388534400,
-        [],
-        "x-bar"
-    ],
-    [
-        "test.group.bar.2",
-        1388534400,
-        [],
-        "x-bar",
-        "example"
-    ]
-] );'
-                       ) ),
-               );
-       }
-
-       /**
-        * @dataProvider provideGetModuleRegistrations
-        * @covers ResourceLoaderStartupModule::compileUnresolvedDependencies
-        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
-        * @covers ResourceLoader::makeLoaderSourcesScript
-        * @covers ResourceLoader::makeLoaderRegisterScript
-        */
-       public function testGetModuleRegistrations( $case ) {
-               if ( isset( $case['sources'] ) ) {
-                       $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
-               }
-
-               $context = self::getResourceLoaderContext();
-               $rl = $context->getResourceLoader();
-
-               $rl->register( $case['modules'] );
-
-               $module = new ResourceLoaderStartUpModule();
-               $this->assertEquals(
-                       ltrim( $case['out'], "\n" ),
-                       $module->getModuleRegistrations( $context ),
-                       $case['msg']
-               );
-       }
-
-       public static function provideRegistrations() {
-               return array(
-                       array( array(
-                               'test.blank' => new ResourceLoaderTestModule(),
-                               'test.min' => new ResourceLoaderTestModule( array(
-                                       'skipFunction' =>
-                                               'return !!(' .
-                                               '    window.JSON &&' .
-                                               '    JSON.parse &&' .
-                                               '    JSON.stringify' .
-                                               ');',
-                                       'dependencies' => array(
-                                               'test.blank',
-                                       ),
-                               ) ),
-                       ) )
-               );
-       }
-       /**
-        * @dataProvider provideRegistrations
-        */
-       public function testRegistrationsMinified( $modules ) {
-               $this->setMwGlobals( 'wgResourceLoaderDebug', false );
-
-               $context = self::getResourceLoaderContext();
-               $rl = $context->getResourceLoader();
-               $rl->register( $modules );
-               $module = new ResourceLoaderStartUpModule();
-               $this->assertEquals(
-'mw.loader.addSource({"local":"/w/load.php"});'
-. 'mw.loader.register(['
-. '["test.blank",1388534400],'
-. '["test.min",1388534400,[0],null,null,'
-. '"return!!(window.JSON\u0026\u0026JSON.parse\u0026\u0026JSON.stringify);"'
-. ']]);',
-                       $module->getModuleRegistrations( $context ),
-                       'Minified output'
-               );
-       }
-
-       /**
-        * @dataProvider provideRegistrations
-        */
-       public function testRegistrationsUnminified( $modules ) {
-               $context = self::getResourceLoaderContext();
-               $rl = $context->getResourceLoader();
-               $rl->register( $modules );
-               $module = new ResourceLoaderStartUpModule();
-               $this->assertEquals(
-'mw.loader.addSource( {
-    "local": "/w/load.php"
-} );mw.loader.register( [
-    [
-        "test.blank",
-        1388534400
-    ],
-    [
-        "test.min",
-        1388534400,
-        [
-            0
-        ],
-        null,
-        null,
-        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
-    ]
-] );',
-                       $module->getModuleRegistrations( $context ),
-                       'Unminified output'
-               );
-       }
-
-}
index 5cdfa77..4fc7378 100644 (file)
@@ -79,7 +79,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderFileModule::compileLessFile
         */
        public function testLessFileCompilation() {
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
                $basePath = __DIR__ . '/../../data/less/module';
                $module = new ResourceLoaderFileModule( array(
                        'localBasePath' => $basePath,
@@ -113,8 +113,8 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                        'styles' => array( 'expected.css' ),
                ) );
 
-               $contextLtr = self::getResourceLoaderContext( 'en' );
-               $contextRtl = self::getResourceLoaderContext( 'he' );
+               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $contextRtl = $this->getResourceLoaderContext( 'he', 'rtl' );
 
                // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
                // the @noflip annotations are always preserved, we need to strip them first.
diff --git a/tests/phpunit/includes/search/SearchUpdateTest.php b/tests/phpunit/includes/search/SearchUpdateTest.php
deleted file mode 100644 (file)
index c627537..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-class MockSearch extends SearchEngine {
-       public static $id;
-       public static $title;
-       public static $text;
-
-       public function __construct( $db ) {
-       }
-
-       public function update( $id, $title, $text ) {
-               self::$id = $id;
-               self::$title = $title;
-               self::$text = $text;
-       }
-}
-
-/**
- * @group Search
- * @group Database
- */
-class SearchUpdateTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
-       }
-
-       public function updateText( $text ) {
-               return trim( SearchUpdate::updateText( $text ) );
-       }
-
-       /**
-        * @covers SearchUpdate::updateText
-        */
-       public function testUpdateText() {
-               $this->assertEquals(
-                       'test',
-                       $this->updateText( '<div>TeSt</div>' ),
-                       'HTML stripped, text lowercased'
-               );
-
-               $this->assertEquals(
-                       'foo bar boz quux',
-                       $this->updateText( <<<EOT
-<table style="color:red; font-size:100px">
-       <tr class="scary"><td><div>foo</div></td><tr>bar</td></tr>
-       <tr><td>boz</td><tr>quux</td></tr>
-</table>
-EOT
-                       ), 'Stripping HTML tables' );
-
-               $this->assertEquals(
-                       'a b',
-                       $this->updateText( 'a > b' ),
-                       'Handle unclosed tags'
-               );
-
-               $text = str_pad( "foo <barbarbar \n", 10000, 'x' );
-
-               $this->assertNotEquals(
-                       '',
-                       $this->updateText( $text ),
-                       'Bug 18609'
-               );
-       }
-
-       /**
-        * @covers SearchUpdate::updateText
-        * @todo give this test a real name explaining what is being tested here
-        */
-       public function testBug32712() {
-               $text = "text „http://example.com“ text";
-               $result = $this->updateText( $text );
-               $processed = preg_replace( '/Q/u', 'Q', $result );
-               $this->assertTrue(
-                       $processed != '',
-                       'Link surrounded by unicode quotes should not fail UTF-8 validation'
-               );
-       }
-}
index af02429..bbe8cc7 100644 (file)
  */
 class SiteListFileCacheBuilderTest extends PHPUnit_Framework_TestCase {
 
-       public function testBuild() {
-               $cacheFile = $this->getCacheFile();
+       protected function setUp() {
+               $this->cacheFile = $this->getCacheFile();
+       }
 
-               $cacheBuilder = $this->newSiteListFileCacheBuilder( $this->getSites(), $cacheFile );
+       protected function tearDown() {
+               unlink( $this->cacheFile );
+       }
+
+       public function testBuild() {
+               $cacheBuilder = $this->newSiteListFileCacheBuilder( $this->getSites() );
                $cacheBuilder->build();
 
-               $contents = file_get_contents( $cacheFile );
+               $contents = file_get_contents( $this->cacheFile );
                $this->assertEquals( json_encode( $this->getExpectedData() ), $contents );
        }
 
@@ -85,10 +91,10 @@ class SiteListFileCacheBuilderTest extends PHPUnit_Framework_TestCase {
                );
        }
 
-       private function newSiteListFileCacheBuilder( SiteList $sites, $cacheFile ) {
+       private function newSiteListFileCacheBuilder( SiteList $sites ) {
                return new SiteListFileCacheBuilder(
                        $this->getSiteSQLStore( $sites ),
-                       $cacheFile
+                       $this->cacheFile
                );
        }
 
@@ -124,7 +130,7 @@ class SiteListFileCacheBuilderTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getCacheFile() {
-               return sys_get_temp_dir() . '/sites-' . time() . '.json';
+               return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
        }
 
 }
index b598eed..05dcd8a 100644 (file)
  */
 class SiteListFileCacheTest extends PHPUnit_Framework_TestCase {
 
-       public function testGetSites() {
-               $cacheFile = $this->getCacheFile();
+       protected function setUp() {
+               $this->cacheFile = $this->getCacheFile();
+       }
+
+       protected function tearDown() {
+               unlink( $this->cacheFile );
+       }
 
+       public function testGetSites() {
                $sites = $this->getSites();
-               $cacheBuilder = $this->newSiteListFileCacheBuilder( $sites, $cacheFile );
+               $cacheBuilder = $this->newSiteListFileCacheBuilder( $sites );
                $cacheBuilder->build();
 
-               $cache = new SiteListFileCache( $cacheFile );
+               $cache = new SiteListFileCache( $this->cacheFile );
                $this->assertEquals( $sites, $cache->getSites() );
        }
 
        public function testGetSite() {
-               $cacheFile = $this->getCacheFile();
-
                $sites = $this->getSites();
-               $cacheBuilder = $this->newSiteListFileCacheBuilder( $sites, $cacheFile );
+               $cacheBuilder = $this->newSiteListFileCacheBuilder( $sites );
                $cacheBuilder->build();
 
-               $cache = new SiteListFileCache( $cacheFile );
+               $cache = new SiteListFileCache( $this->cacheFile );
 
                $this->assertEquals( $sites->getSite( 'enwiktionary' ), $cache->getSite( 'enwiktionary' ) );
        }
 
-       private function newSiteListFileCacheBuilder( SiteList $sites, $cacheFile ) {
+       private function newSiteListFileCacheBuilder( SiteList $sites ) {
                return new SiteListFileCacheBuilder(
                        $this->getSiteSQLStore( $sites ),
-                       $cacheFile
+                       $this->cacheFile
                );
        }
 
@@ -92,7 +96,7 @@ class SiteListFileCacheTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getCacheFile() {
-               return sys_get_temp_dir() . '/sites-' . time() . '.json';
+               return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
        }
 
 }
diff --git a/tests/phpunit/includes/specialpage/SpecialPageTest.php b/tests/phpunit/includes/specialpage/SpecialPageTest.php
new file mode 100644 (file)
index 0000000..245cdff
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @covers SpecialPage
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class SpecialPageTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgScript' => '/index.php',
+                       'wgContLang' => Language::factory( 'en' )
+               ) );
+       }
+
+       /**
+        * @dataProvider getTitleForProvider
+        */
+       public function testGetTitleFor( $expectedName, $name ) {
+               $title = SpecialPage::getTitleFor( $name );
+               $expected = Title::makeTitle( NS_SPECIAL, $expectedName );
+               $this->assertEquals( $expected, $title );
+       }
+
+       public function getTitleForProvider() {
+               return array(
+                       array( 'UserLogin', 'Userlogin' )
+               );
+       }
+
+       /**
+        * @expectedException PHPUnit_Framework_Error_Notice
+        */
+       public function testInvalidGetTitleFor() {
+               $title = SpecialPage::getTitleFor( 'cat' );
+               $expected = Title::makeTitle( NS_SPECIAL, 'Cat' );
+               $this->assertEquals( $expected, $title );
+       }
+
+       /**
+        * @expectedException PHPUnit_Framework_Error_Notice
+        * @dataProvider getTitleForWithWarningProvider
+        */
+       public function testGetTitleForWithWarning( $expected, $name ) {
+               $title = SpecialPage::getTitleFor( $name );
+               $this->assertEquals( $expected, $title );
+       }
+
+       public function getTitleForWithWarningProvider() {
+               return array(
+                       array( Title::makeTitle( NS_SPECIAL, 'UserLogin' ), 'UserLogin' )
+               );
+       }
+
+       /**
+        * @dataProvider requireLoginAnonProvider
+        */
+       public function testRequireLoginAnon( $expected, $reason, $title ) {
+               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
+
+               $user = User::newFromId( 0 );
+               $specialPage->getContext()->setUser( $user );
+               $specialPage->getContext()->setLanguage( Language::factory( 'en' ) );
+
+               $this->setExpectedException( 'UserNotLoggedIn', $expected );
+
+               // $specialPage->requireLogin( [ $reason [, $title ] ] )
+               call_user_func_array(
+                       array( $specialPage, 'requireLogin' ),
+                       array_filter( array( $reason, $title ) )
+               );
+       }
+
+       public function requireLoginAnonProvider() {
+               $lang = 'en';
+
+               $expected1 = wfMessage( 'exception-nologin-text' )->inLanguage( $lang )->text();
+               $expected2 = wfMessage( 'about' )->inLanguage( $lang )->text();
+
+               return array(
+                       array( $expected1, null, null ),
+                       array( $expected2, 'about', null ),
+                       array( $expected2, 'about', 'about' ),
+               );
+       }
+
+       public function testRequireLoginNotAnon() {
+               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
+
+               $user = User::newFromName( "UTSysop" );
+               $specialPage->getContext()->setUser( $user );
+
+               $specialPage->requireLogin();
+
+               // no exception thrown, logged in use can access special page
+               $this->assertTrue( true );
+       }
+
+}
index d341ccf..69485a0 100644 (file)
@@ -27,10 +27,10 @@ class SpecialBooksourcesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers SpecialBooksources::isValidISBN
+        * @covers SpecialBookSources::isValidISBN
         * @dataProvider provideISBNs
         */
        public function testIsValidISBN( $isbn, $isValid ) {
-               $this->assertSame( $isValid, SpecialBooksources::isValidISBN( $isbn ) );
+               $this->assertSame( $isValid, SpecialBookSources::isValidISBN( $isbn ) );
        }
 }
index 14d1968..fe1c9e8 100644 (file)
@@ -5,11 +5,11 @@
 
 class SpecialMIMESearchTest extends MediaWikiTestCase {
 
-       /** @var MIMESearchPage */
+       /** @var MIMEsearchPage */
        private $page;
 
        function setUp() {
-               $this->page = new MIMESearchPage;
+               $this->page = new MIMEsearchPage;
                $context = new RequestContext();
                $context->setTitle( Title::makeTitle( NS_SPECIAL, 'MIMESearch' ) );
                $context->setRequest( new FauxRequest() );
diff --git a/tests/phpunit/includes/title/ForeignTitleTest.php b/tests/phpunit/includes/title/ForeignTitleTest.php
new file mode 100644 (file)
index 0000000..04af871
--- /dev/null
@@ -0,0 +1,104 @@
+<?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
+ * @license GPL 2+
+ * @author This, that and the other
+ */
+
+/**
+ * @covers ForeignTitle
+ *
+ * @group Title
+ */
+class ForeignTitleTest extends MediaWikiTestCase {
+
+       public function basicProvider() {
+               return array(
+                       array(
+                               new ForeignTitle( 20, 'Contributor', 'JohnDoe' ),
+                               20, 'Contributor', 'JohnDoe'
+                       ),
+                       array(
+                               new ForeignTitle( '1', 'Discussion', 'Capital' ),
+                               1, 'Discussion', 'Capital'
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'MainNamespace' ),
+                               0, '', 'MainNamespace'
+                       ),
+                       array(
+                               new ForeignTitle( 4, 'Some ns', 'Article title with spaces' ),
+                               4, 'Some_ns', 'Article_title_with_spaces'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider basicProvider
+        */
+       public function testBasic( ForeignTitle $title, $expectedId, $expectedName,
+               $expectedText ) {
+
+               $this->assertEquals( true, $title->isNamespaceIdKnown() );
+               $this->assertEquals( $expectedId, $title->getNamespaceId() );
+               $this->assertEquals( $expectedName, $title->getNamespaceName() );
+               $this->assertEquals( $expectedText, $title->getText() );
+       }
+
+       public function testUnknownNamespaceCheck( ) {
+               $title = new ForeignTitle( null, 'this', 'that' );
+
+               $this->assertEquals( false, $title->isNamespaceIdKnown() );
+               $this->assertEquals( 'this', $title->getNamespaceName() );
+               $this->assertEquals( 'that', $title->getText() );
+       }
+
+       public function testUnknownNamespaceError( ) {
+               $this->setExpectedException( 'MWException' );
+               $title = new ForeignTitle( null, 'this', 'that' );
+               $title->getNamespaceId();
+       }
+
+       public function fullTextProvider() {
+               return array(
+                       array(
+                               new ForeignTitle( 20, 'Contributor', 'JohnDoe' ),
+                               'Contributor:JohnDoe'
+                       ),
+                       array(
+                               new ForeignTitle( '1', 'Discussion', 'Capital' ),
+                               'Discussion:Capital'
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'MainNamespace' ),
+                               'MainNamespace'
+                       ),
+                       array(
+                               new ForeignTitle( 4, 'Some ns', 'Article title with spaces' ),
+                               'Some_ns:Article_title_with_spaces'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider fullTextProvider
+        */
+       public function testFullText( ForeignTitle $title, $fullText ) {
+               $this->assertEquals( $fullText, $title->getFullText() );
+       }
+}
diff --git a/tests/phpunit/includes/title/NaiveForeignTitleFactoryTest.php b/tests/phpunit/includes/title/NaiveForeignTitleFactoryTest.php
new file mode 100644 (file)
index 0000000..5d613db
--- /dev/null
@@ -0,0 +1,92 @@
+<?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
+ * @license GPL 2+
+ * @author This, that and the other
+ */
+
+/**
+ * @covers NaiveForeignTitleFactory
+ *
+ * @group Title
+ */
+class NaiveForeignTitleFactoryTest extends MediaWikiTestCase {
+
+       public function basicProvider() {
+               return array(
+                       array(
+                               'MainNamespaceArticle', 0,
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                       ),
+                       array(
+                               'MainNamespaceArticle', null,
+                               new ForeignTitle( null, '', 'MainNamespaceArticle' ),
+                       ),
+                       array(
+                               'Talk:Nice_talk', 1,
+                               new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', 0,
+                               new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', 9000, // non-existent local namespace ID
+                               new ForeignTitle( 9000, 'Bogus', 'Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', 4, // existing local namespace ID
+                               new ForeignTitle( 4, 'Bogus', 'Nice_talk' ),
+                       ),
+                       array(
+                               'Talk:Extra:Nice_talk', 1,
+                               new ForeignTitle( 1, 'Talk', 'Extra:Nice_talk' ),
+                       ),
+                       array(
+                               'Talk:Extra:Nice_talk', null,
+                               new ForeignTitle( null, 'Talk', 'Extra:Nice_talk' ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider basicProvider
+        */
+       public function testBasic( $title, $ns, ForeignTitle $foreignTitle ) {
+               $factory = new NaiveForeignTitleFactory();
+               $testTitle = $factory->createForeignTitle( $title, $ns );
+
+               $this->assertEquals( $testTitle->isNamespaceIdKnown(),
+                       $foreignTitle->isNamespaceIdKnown() );
+
+               if (
+                       $testTitle->isNamespaceIdKnown() &&
+                       $foreignTitle->isNamespaceIdKnown()
+               ) {
+                       $this->assertEquals( $testTitle->getNamespaceId(),
+                               $foreignTitle->getNamespaceId() );
+               }
+
+               $this->assertEquals( $testTitle->getNamespaceName(),
+                       $foreignTitle->getNamespaceName() );
+               $this->assertEquals( $testTitle->getText(), $foreignTitle->getText() );
+
+               $this->assertEquals( str_replace( ' ', '_', $title ),
+                       $foreignTitle->getFullText() );
+       }
+}
diff --git a/tests/phpunit/includes/title/NaiveImportTitleFactoryTest.php b/tests/phpunit/includes/title/NaiveImportTitleFactoryTest.php
new file mode 100644 (file)
index 0000000..a46698a
--- /dev/null
@@ -0,0 +1,90 @@
+<?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
+ * @license GPL 2+
+ * @author This, that and the other
+ */
+
+/**
+ * @covers NaiveImportTitleFactory
+ *
+ * @group Title
+ */
+class NaiveImportTitleFactoryTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgExtraNamespaces' => array( 100 => 'Portal' ),
+               ) );
+       }
+
+       public function basicProvider() {
+               return array(
+                       array(
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                               Title::newFromText( 'MainNamespaceArticle' )
+                       ),
+                       array(
+                               new ForeignTitle( null, '', 'MainNamespaceArticle' ),
+                               Title::newFromText( 'MainNamespaceArticle' )
+                       ),
+                       array(
+                               new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
+                               Title::newFromText( 'Talk:Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
+                               Title::newFromText( 'Bogus:Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 100, 'Bogus', 'Nice_talk' ),
+                               Title::newFromText( 'Bogus:Nice_talk' ) // not Portal:Nice_talk
+                       ),
+                       array(
+                               new ForeignTitle( 1, 'Bogus', 'Nice_talk' ),
+                               Title::newFromText( 'Talk:Nice_talk' ) // not Bogus:Nice_talk
+                       ),
+                       array(
+                               new ForeignTitle( 100, 'Portal', 'Nice_talk' ),
+                               Title::newFromText( 'Portal:Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 724, 'Portal', 'Nice_talk' ),
+                               Title::newFromText( 'Portal:Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 2, 'Portal', 'Nice_talk' ),
+                               Title::newFromText( 'User:Nice_talk' )
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider basicProvider
+        */
+       public function testBasic( ForeignTitle $foreignTitle, Title $title ) {
+               $factory = new NaiveImportTitleFactory();
+               $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+
+               $this->assertTrue( $title->equals( $testTitle ) );
+       }
+}
diff --git a/tests/phpunit/includes/title/NamespaceAwareForeignTitleFactoryTest.php b/tests/phpunit/includes/title/NamespaceAwareForeignTitleFactoryTest.php
new file mode 100644 (file)
index 0000000..4d68ab4
--- /dev/null
@@ -0,0 +1,90 @@
+<?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
+ * @license GPL 2+
+ * @author This, that and the other
+ */
+
+/**
+ * @covers NamespaceAwareForeignTitleFactory
+ *
+ * @group Title
+ */
+class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
+
+       public function basicProvider() {
+               return array(
+                       array(
+                               'MainNamespaceArticle', 0,
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                       ),
+                       array(
+                               'MainNamespaceArticle', null,
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                       ),
+                       array(
+                               'Talk:Nice_talk', 1,
+                               new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', 0,
+                               new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', null,
+                               new ForeignTitle( 9000, 'Bogus', 'Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', 4,
+                               new ForeignTitle( 4, 'Bogus', 'Nice_talk' ),
+                       ),
+                       array(
+                               'Bogus:Nice_talk', 1,
+                               new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider basicProvider
+        */
+       public function testBasic( $title, $ns, ForeignTitle $foreignTitle ) {
+
+               $foreignNamespaces = array(
+                       0 => '', 1 => 'Talk', 100 => 'Portal', 9000 => 'Bogus'
+               );
+
+               $factory = new NamespaceAwareForeignTitleFactory( $foreignNamespaces );
+               $testTitle = $factory->createForeignTitle( $title, $ns );
+
+               $this->assertEquals( $testTitle->isNamespaceIdKnown(),
+                       $foreignTitle->isNamespaceIdKnown() );
+
+               if (
+                       $testTitle->isNamespaceIdKnown() &&
+                       $foreignTitle->isNamespaceIdKnown()
+               ) {
+                       $this->assertEquals( $testTitle->getNamespaceId(),
+                               $foreignTitle->getNamespaceId() );
+               }
+
+               $this->assertEquals( $testTitle->getNamespaceName(),
+                       $foreignTitle->getNamespaceName() );
+               $this->assertEquals( $testTitle->getText(), $foreignTitle->getText() );
+       }
+}
diff --git a/tests/phpunit/includes/title/NamespaceImportTitleFactoryTest.php b/tests/phpunit/includes/title/NamespaceImportTitleFactoryTest.php
new file mode 100644 (file)
index 0000000..f0ffdb3
--- /dev/null
@@ -0,0 +1,78 @@
+<?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
+ * @license GPL 2+
+ * @author This, that and the other
+ */
+
+/**
+ * @covers NamespaceImportTitleFactory
+ *
+ * @group Title
+ */
+class NamespaceImportTitleFactoryTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+               ) );
+       }
+
+       public function basicProvider() {
+               return array(
+                       array(
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                               0,
+                               Title::newFromText( 'MainNamespaceArticle' )
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                               2,
+                               Title::newFromText( 'User:MainNamespaceArticle' )
+                       ),
+                       array(
+                               new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
+                               0,
+                               Title::newFromText( 'Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
+                               0,
+                               Title::newFromText( 'Bogus:Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
+                               2,
+                               Title::newFromText( 'User:Bogus:Nice_talk' )
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider basicProvider
+        */
+       public function testBasic( ForeignTitle $foreignTitle, $ns, Title $title ) {
+               $factory = new NamespaceImportTitleFactory( $ns );
+               $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+
+               $this->assertTrue( $title->equals( $testTitle ) );
+       }
+}
diff --git a/tests/phpunit/includes/title/SubpageImportTitleFactoryTest.php b/tests/phpunit/includes/title/SubpageImportTitleFactoryTest.php
new file mode 100644 (file)
index 0000000..71c9c70
--- /dev/null
@@ -0,0 +1,87 @@
+<?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
+ * @license GPL 2+
+ * @author This, that and the other
+ */
+
+/**
+ * @covers SubpageImportTitleFactory
+ *
+ * @group Title
+ */
+class SubpageImportTitleFactoryTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgNamespacesWithSubpages' => array( 0 => false, 2 => true ),
+               ) );
+       }
+
+       public function basicProvider() {
+               return array(
+                       array(
+                               new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
+                               Title::newFromText( 'User:Graham' ),
+                               Title::newFromText( 'User:Graham/MainNamespaceArticle' )
+                       ),
+                       array(
+                               new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
+                               Title::newFromText( 'User:Graham' ),
+                               Title::newFromText( 'User:Graham/Discussion:Nice_talk' )
+                       ),
+                       array(
+                               new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
+                               Title::newFromText( 'User:Graham' ),
+                               Title::newFromText( 'User:Graham/Bogus:Nice_talk' )
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider basicProvider
+        */
+       public function testBasic( ForeignTitle $foreignTitle, Title $rootPage,
+               Title $title ) {
+
+               $factory = new SubpageImportTitleFactory( $rootPage );
+               $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+
+               $this->assertTrue( $testTitle->equals( $title ) );
+       }
+
+       public function failureProvider() {
+               return array(
+                       array(
+                               Title::newFromText( 'Graham' ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider failureProvider
+        */
+       public function testFailures( Title $rootPage ) {
+               $this->setExpectedException( 'MWException' );
+               new SubpageImportTitleFactory( $rootPage );
+       }
+}
index ebe347f..09c1587 100644 (file)
@@ -9,7 +9,7 @@
  * dataprovider.
  */
 
-class IPTest extends MediaWikiTestCase {
+class IPTest extends PHPUnit_Framework_TestCase {
        /**
         *  not sure it should be tested with boolean false. hashar 20100924
         * @covers IP::isIPAddress
diff --git a/tests/phpunit/includes/utils/MWFunctionTest.php b/tests/phpunit/includes/utils/MWFunctionTest.php
new file mode 100644 (file)
index 0000000..f4d1799
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @covers MWFunction
+ */
+class MWFunctionTest extends MediaWikiTestCase {
+       public function testNewObjFunction() {
+               $arg1 = 'Foo';
+               $arg2 = 'Bar';
+               $arg3 = array( 'Baz' );
+               $arg4 = new ExampleObject;
+
+               $args = array( $arg1, $arg2, $arg3, $arg4 );
+
+               $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
+               $this->hideDeprecated( 'MWFunction::newObj' );
+               $this->assertEquals(
+                       MWFunction::newObj( 'MWBlankClass', $args )->args,
+                       $newObject->args
+               );
+       }
+}
+
+class MWBlankClass {
+
+       public $args = array();
+
+       function __construct( $arg1, $arg2, $arg3, $arg4 ) {
+               $this->args = array( $arg1, $arg2, $arg3, $arg4 );
+       }
+}
+
+class ExampleObject {
+}
index 0fdb8e1..7c24fae 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class StringUtilsTest extends MediaWikiTestCase {
+class StringUtilsTest extends PHPUnit_Framework_TestCase {
 
        /**
         * This tests StringUtils::isUtf8 whenever we have the mbstring extension
index 34ffb53..05d07d4 100644 (file)
@@ -4,7 +4,7 @@
  * @covers ZipDirectoryReader
  * NOTE: this test is more like an integration test than a unit test
  */
-class ZipDirectoryReaderTest extends MediaWikiTestCase {
+class ZipDirectoryReaderTest extends PHPUnit_Framework_TestCase {
        protected $zipDir;
        protected $entries;
 
diff --git a/tests/phpunit/languages/LanguageAmTest.php b/tests/phpunit/languages/LanguageAmTest.php
deleted file mode 100644 (file)
index a644f5e..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageAm.php */
-class LanguageAmTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageArTest.php b/tests/phpunit/languages/LanguageArTest.php
deleted file mode 100644 (file)
index 7b48f23..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * Based on LanguagMlTest
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageAr.php */
-class LanguageArTest extends LanguageClassesTestCase {
-       /**
-        * @covers Language::formatNum
-        * @todo split into a test and a dataprovider
-        */
-       public function testFormatNum() {
-               $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
-               $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
-       }
-
-       /**
-        * Mostly to test the raw ascii feature.
-        * @dataProvider providerSprintfDate
-        * @covers Language::sprintfDate
-        */
-       public function testSprintfDate( $format, $date, $expected ) {
-               $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
-       }
-
-       public static function providerSprintfDate() {
-               return array(
-                       array(
-                               'xg "vs" g',
-                               '20120102030410',
-                               'يناير vs ٣'
-                       ),
-                       array(
-                               'xmY',
-                               '20120102030410',
-                               '١٤٣٣'
-                       ),
-                       array(
-                               'xnxmY',
-                               '20120102030410',
-                               '1433'
-                       ),
-                       array(
-                               'xN xmj xmn xN xmY',
-                               '20120102030410',
-                               ' 7 2  ١٤٣٣'
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'zero', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 9 ),
-                       array( 'few', 110 ),
-                       array( 'many', 11 ),
-                       array( 'many', 15 ),
-                       array( 'many', 99 ),
-                       array( 'many', 9999 ),
-                       array( 'other', 100 ),
-                       array( 'other', 102 ),
-                       array( 'other', 1000 ),
-                       array( 'other', 1.7 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageArqTest.php b/tests/phpunit/languages/LanguageArqTest.php
deleted file mode 100644 (file)
index 3fa56d7..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Based on LanguageMlTest
- * @author Joel Sahleen
- * @copyright Copyright © 2014, Joel Sahleen
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageArq.php */
-class LanguageArqTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider provideNumber
-        * @covers Language::formatNum
-        */
-       public function testFormatNum( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
-       }
-
-       public static function provideNumber() {
-               return array(
-                       array( '1.234.567', '1234567'),
-                       array( '-12,89', -12.89 ),
-                       );
-       }
-
-}
diff --git a/tests/phpunit/languages/LanguageBeTest.php b/tests/phpunit/languages/LanguageBeTest.php
deleted file mode 100644 (file)
index 7bd586a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageBe.php */
-class LanguageBeTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'many', 11 ),
-                       array( 'one', 91 ),
-                       array( 'one', 121 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'few', 334 ),
-                       array( 'many', 5 ),
-                       array( 'many', 15 ),
-                       array( 'many', 120 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageBe_taraskTest.php b/tests/phpunit/languages/LanguageBe_taraskTest.php
deleted file mode 100644 (file)
index 4dd5cdd..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-// @codingStandardsIgnoreStart Ignore Squiz.Classes.ValidClassName.NotCamelCaps
-class LanguageBe_taraskTest extends LanguageClassesTestCase {
-       // @codingStandardsIgnoreEnd
-       /**
-        * Make sure the language code we are given is indeed
-        * be-tarask. This is to ensure LanguageClassesTestCase
-        * does not give us the wrong language.
-        */
-       public function testBeTaraskTestsUsesBeTaraskCode() {
-               $this->assertEquals( 'be-tarask',
-                       $this->getLang()->getCode()
-               );
-       }
-
-       /**
-        * @see bug 23156 & r64981
-        * @covers Language::commafy
-        */
-       public function testSearchRightSingleQuotationMarkAsApostroph() {
-               $this->assertEquals(
-                       "'",
-                       $this->getLang()->normalizeForSearch( '’' ),
-                       'bug 23156: U+2019 conversion to U+0027'
-               );
-       }
-
-       /**
-        * @see bug 23156 & r64981
-        * @covers Language::commafy
-        */
-       public function testCommafy() {
-               $this->assertEquals( '1,234,567', $this->getLang()->commafy( '1234567' ) );
-               $this->assertEquals( '12,345', $this->getLang()->commafy( '12345' ) );
-       }
-
-       /**
-        * @see bug 23156 & r64981
-        * @covers Language::commafy
-        */
-       public function testDoesNotCommafyFourDigitsNumber() {
-               $this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'many', 11 ),
-                       array( 'one', 91 ),
-                       array( 'one', 121 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'few', 334 ),
-                       array( 'many', 5 ),
-                       array( 'many', 15 ),
-                       array( 'many', 120 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( '1=one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 11 ),
-                       array( 'other', 91 ),
-                       array( 'other', 121 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageBhoTest.php b/tests/phpunit/languages/LanguageBhoTest.php
deleted file mode 100644 (file)
index 187bfbb..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageBho.php */
-class LanguageBhoTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageBsTest.php b/tests/phpunit/languages/LanguageBsTest.php
deleted file mode 100644 (file)
index 7aca2ab..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for Croatian (hrvatski) */
-class LanguageBsTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 11 ),
-                       array( 'other', 20 ),
-                       array( 'one', 21 ),
-                       array( 'few', 24 ),
-                       array( 'other', 25 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageConverterTest.php b/tests/phpunit/languages/LanguageConverterTest.php
new file mode 100644 (file)
index 0000000..d4ccca9
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+
+class LanguageConverterTest extends MediaWikiLangTestCase {
+       /** @var LanguageToTest */
+       protected $lang = null;
+       /** @var TestConverter */
+       protected $lc = null;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgContLang' => Language::factory( 'tg' ),
+                       'wgLanguageCode' => 'tg',
+                       'wgDefaultLanguageVariant' => false,
+                       'wgMemc' => new EmptyBagOStuff,
+                       'wgRequest' => new FauxRequest( array() ),
+                       'wgUser' => new User,
+               ) );
+
+               $this->lang = new LanguageToTest();
+               $this->lc = new TestConverter(
+                       $this->lang, 'tg',
+                       array( 'tg', 'tg-latn' )
+               );
+       }
+
+       protected function tearDown() {
+               unset( $this->lc );
+               unset( $this->lang );
+
+               parent::tearDown();
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        */
+       public function testGetPreferredVariantDefaults() {
+               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaders() {
+               global $wgRequest;
+               $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
+
+               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaderWeight() {
+               global $wgRequest;
+               $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
+
+               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaderWeight2() {
+               global $wgRequest;
+               $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
+
+               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaderMulti() {
+               global $wgRequest;
+               $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
+
+               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        */
+       public function testGetPreferredVariantUserOption() {
+               global $wgUser;
+
+               $wgUser = new User;
+               $wgUser->load(); // from 'defaults'
+               $wgUser->mId = 1;
+               $wgUser->mDataLoaded = true;
+               $wgUser->mOptionsLoaded = true;
+               $wgUser->setOption( 'variant', 'tg-latn' );
+
+               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getUserVariant
+        */
+       public function testGetPreferredVariantUserOptionForForeignLanguage() {
+               global $wgContLang, $wgUser;
+
+               $wgContLang = Language::factory( 'en' );
+               $wgUser = new User;
+               $wgUser->load(); // from 'defaults'
+               $wgUser->mId = 1;
+               $wgUser->mDataLoaded = true;
+               $wgUser->mOptionsLoaded = true;
+               $wgUser->setOption( 'variant-tg', 'tg-latn' );
+
+               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getUserVariant
+        * @covers LanguageConverter::getURLVariant
+        */
+       public function testGetPreferredVariantHeaderUserVsUrl() {
+               global $wgContLang, $wgRequest, $wgUser;
+
+               $wgContLang = Language::factory( 'tg-latn' );
+               $wgRequest->setVal( 'variant', 'tg' );
+               $wgUser = User::newFromId( "admin" );
+               $wgUser->setId( 1 );
+               $wgUser->mFrom = 'defaults';
+               $wgUser->mOptionsLoaded = true;
+               // The user's data is ignored because the variant is set in the URL.
+               $wgUser->setOption( 'variant', 'tg-latn' );
+               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        */
+       public function testGetPreferredVariantDefaultLanguageVariant() {
+               global $wgDefaultLanguageVariant;
+
+               $wgDefaultLanguageVariant = 'tg-latn';
+               $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+       }
+
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getURLVariant
+        */
+       public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
+               global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
+
+               $wgContLang = Language::factory( 'tg-latn' );
+               $wgDefaultLanguageVariant = 'tg';
+               $wgRequest->setVal( 'variant', null );
+               $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
+       }
+}
+
+/**
+ * Test converter (from Tajiki to latin orthography)
+ */
+class TestConverter extends LanguageConverter {
+       private $table = array(
+               'б' => 'b',
+               'в' => 'v',
+               'г' => 'g',
+       );
+
+       function loadDefaultTables() {
+               $this->mTables = array(
+                       'tg-latn' => new ReplacementArray( $this->table ),
+                       'tg' => new ReplacementArray()
+               );
+       }
+}
+
+class LanguageToTest extends Language {
+       function __construct() {
+               parent::__construct();
+               $variants = array( 'tg', 'tg-latn' );
+               $this->mConverter = new TestConverter( $this, 'tg', $variants );
+       }
+}
diff --git a/tests/phpunit/languages/LanguageCsTest.php b/tests/phpunit/languages/LanguageCsTest.php
deleted file mode 100644 (file)
index da9e6b8..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/Languagecs.php */
-class LanguageCsTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 11 ),
-                       array( 'other', 20 ),
-                       array( 'other', 25 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageCuTest.php b/tests/phpunit/languages/LanguageCuTest.php
deleted file mode 100644 (file)
index 0719317..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageCu.php */
-class LanguageCuTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'one', 11 ),
-                       array( 'other', 20 ),
-                       array( 'two', 22 ),
-                       array( 'few', 223 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageCyTest.php b/tests/phpunit/languages/LanguageCyTest.php
deleted file mode 100644 (file)
index eaf663a..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageCy.php */
-class LanguageCyTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'zero', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'many', 6 ),
-                       array( 'other', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 11 ),
-                       array( 'other', 20 ),
-                       array( 'other', 22 ),
-                       array( 'other', 223 ),
-                       array( 'other', 200.00 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageDsbTest.php b/tests/phpunit/languages/LanguageDsbTest.php
deleted file mode 100644 (file)
index 94c11bc..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageDsb.php */
-class LanguageDsbTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'one', 101 ),
-                       array( 'one', 90001 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 203 ),
-                       array( 'few', 4 ),
-                       array( 'other', 99 ),
-                       array( 'other', 555 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageFrTest.php b/tests/phpunit/languages/LanguageFrTest.php
deleted file mode 100644 (file)
index 46b6501..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageFr.php */
-class LanguageFrTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageGaTest.php b/tests/phpunit/languages/LanguageGaTest.php
deleted file mode 100644 (file)
index c009f56..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageGa.php */
-class LanguageGaTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageGdTest.php b/tests/phpunit/languages/LanguageGdTest.php
deleted file mode 100644 (file)
index b89b4df..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012-2013, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageGd.php */
-class LanguageGdTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providerPlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providerPlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'one', 11 ),
-                       array( 'two', 12 ),
-                       array( 'few', 3 ),
-                       array( 'few', 19 ),
-                       array( 'other', 200 ),
-               );
-       }
-
-       /**
-        * @dataProvider providerPluralExplicit
-        * @covers Language::convertPlural
-        */
-       public function testExplicitPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other', '11=Form11', '12=Form12' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providerPluralExplicit() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'Form11', 11 ),
-                       array( 'Form12', 12 ),
-                       array( 'few', 3 ),
-                       array( 'few', 19 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageGvTest.php b/tests/phpunit/languages/LanguageGvTest.php
deleted file mode 100644 (file)
index e6a0cf0..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Test for Manx (Gaelg) language
- *
- * @author Santhosh Thottingal
- * @copyright Copyright © 2013, Santhosh Thottingal
- * @file
- */
-
-class LanguageGvTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'other', 3 ),
-                       array( 'few', 20 ),
-                       array( 'one', 21 ),
-                       array( 'two', 22 ),
-                       array( 'other', 23 ),
-                       array( 'other', 50 ),
-                       array( 'few', 60 ),
-                       array( 'few', 80 ),
-                       array( 'few', 100 )
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageHeTest.php b/tests/phpunit/languages/LanguageHeTest.php
deleted file mode 100644 (file)
index c382244..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageHe.php */
-class LanguageHeTest extends LanguageClassesTestCase {
-       /**
-        * The most common usage for the plural forms is two forms,
-        * for singular and plural. In this case, the second form
-        * is technically dual, but in practice it's used as plural.
-        * In some cases, usually with expressions of time, three forms
-        * are needed - singular, dual and plural.
-        * CLDR also specifies a fourth form for multiples of 10,
-        * which is very rare. It also has a mistake, because
-        * the number 10 itself is supposed to be just plural,
-        * so currently it's overridden in MediaWiki.
-        */
-
-       // @todo the below test*PluralForms test methods can be refactored
-       //  to use a single test method and data provider..
-
-       /**
-        * @dataProvider provideTwoPluralForms
-        * @covers Language::convertPlural
-        */
-       public function testTwoPluralForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider provideThreePluralForms
-        * @covers Language::convertPlural
-        */
-       public function testThreePluralForms( $result, $value ) {
-               $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider provideFourPluralForms
-        * @covers Language::convertPlural
-        */
-       public function testFourPluralForms( $result, $value ) {
-               $forms = array( 'one', 'two', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider provideFourPluralForms
-        * @covers Language::convertPlural
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function provideTwoPluralForms() {
-               return array(
-                       array( 'other', 0 ), // Zero - plural
-                       array( 'one', 1 ), // Singular
-                       array( 'other', 2 ), // No third form provided, use it as plural
-                       array( 'other', 3 ), // Plural - other
-                       array( 'other', 10 ), // No fourth form provided, use it as plural
-                       array( 'other', 20 ), // No fourth form provided, use it as plural
-               );
-       }
-
-       public static function provideThreePluralForms() {
-               return array(
-                       array( 'other', 0 ), // Zero - plural
-                       array( 'one', 1 ), // Singular
-                       array( 'two', 2 ), // Dual
-                       array( 'other', 3 ), // Plural - other
-                       array( 'other', 10 ), // No fourth form provided, use it as plural
-                       array( 'other', 20 ), // No fourth form provided, use it as plural
-               );
-       }
-
-       public static function provideFourPluralForms() {
-               return array(
-                       array( 'other', 0 ), // Zero - plural
-                       array( 'one', 1 ), // Singular
-                       array( 'two', 2 ), // Dual
-                       array( 'other', 3 ), // Plural - other
-                       array( 'other', 10 ), // 10 is supposed to be plural (other), not "many"
-                       array( 'many', 20 ), // Fourth form provided - rare, but supported by CLDR
-               );
-       }
-
-       /**
-        * @dataProvider provideGrammar
-        * @covers Language::convertGrammar
-        */
-       public function testGrammar( $result, $word, $case ) {
-               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
-       }
-
-       // The comments in the beginning of the line help avoid RTL problems
-       // with text editors.
-       public static function provideGrammar() {
-               return array(
-                       array(
-                               /* result */'וויקיפדיה',
-                               /* word   */'ויקיפדיה',
-                               /* case   */'תחילית',
-                       ),
-                       array(
-                               /* result */'וולפגנג',
-                               /* word   */'וולפגנג',
-                               /* case   */'prefixed',
-                       ),
-                       array(
-                               /* result */'קובץ',
-                               /* word   */'הקובץ',
-                               /* case   */'תחילית',
-                       ),
-                       array(
-                               /* result */'־Wikipedia',
-                               /* word   */'Wikipedia',
-                               /* case   */'תחילית',
-                       ),
-                       array(
-                               /* result */'־1995',
-                               /* word   */'1995',
-                               /* case   */'תחילית',
-                       ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageHiTest.php b/tests/phpunit/languages/LanguageHiTest.php
deleted file mode 100644 (file)
index f6d2c9e..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageHi.php */
-class LanguageHiTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageHrTest.php b/tests/phpunit/languages/LanguageHrTest.php
deleted file mode 100644 (file)
index 644c525..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageHr.php */
-class LanguageHrTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 11 ),
-                       array( 'other', 20 ),
-                       array( 'one', 21 ),
-                       array( 'few', 24 ),
-                       array( 'other', 25 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageHsbTest.php b/tests/phpunit/languages/LanguageHsbTest.php
deleted file mode 100644 (file)
index f95a43b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageHsb.php */
-class LanguageHsbTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'one', 101 ),
-                       array( 'one', 90001 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 203 ),
-                       array( 'few', 4 ),
-                       array( 'other', 99 ),
-                       array( 'other', 555 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageHuTest.php b/tests/phpunit/languages/LanguageHuTest.php
deleted file mode 100644 (file)
index ee9197d..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageHu.php */
-class LanguageHuTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageHyTest.php b/tests/phpunit/languages/LanguageHyTest.php
deleted file mode 100644 (file)
index 92e0ef9..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for Armenian (Հայերեն) */
-class LanguageHyTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageKshTest.php b/tests/phpunit/languages/LanguageKshTest.php
deleted file mode 100644 (file)
index 568a378..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageKsh.php */
-class LanguageKshTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other', 'zero' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'zero', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageLnTest.php b/tests/phpunit/languages/LanguageLnTest.php
deleted file mode 100644 (file)
index 10b3234..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageLn.php */
-class LanguageLnTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageLtTest.php b/tests/phpunit/languages/LanguageLtTest.php
deleted file mode 100644 (file)
index 30642f6..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageLt.php */
-class LanguageLtTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 9 ),
-                       array( 'other', 10 ),
-                       array( 'other', 11 ),
-                       array( 'other', 20 ),
-                       array( 'one', 21 ),
-                       array( 'few', 32 ),
-                       array( 'one', 41 ),
-                       array( 'one', 40001 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testOneFewPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               // This fails for 21, but not sure why.
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 15 ),
-                       array( 'other', 20 ),
-                       array( 'one', 21 ),
-                       array( 'other', 22 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageLvTest.php b/tests/phpunit/languages/LanguageLvTest.php
deleted file mode 100644 (file)
index 7120cfe..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for Latvian */
-class LanguageLvTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'zero', 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'zero', 0 ),
-                       array( 'one', 1 ),
-                       array( 'zero', 11 ),
-                       array( 'one', 21 ),
-                       array( 'zero', 411 ),
-                       array( 'other', 2 ),
-                       array( 'other', 9 ),
-                       array( 'zero', 12 ),
-                       array( 'other', 12.345 ),
-                       array( 'zero', 20 ),
-                       array( 'other', 22 ),
-                       array( 'one', 31 ),
-                       array( 'zero', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageMgTest.php b/tests/phpunit/languages/LanguageMgTest.php
deleted file mode 100644 (file)
index 65e8fd7..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMg.php */
-class LanguageMgTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 200 ),
-                       array( 'other', 123.3434 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageMkTest.php b/tests/phpunit/languages/LanguageMkTest.php
deleted file mode 100644 (file)
index ed15526..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for македонски/Macedonian */
-class LanguageMkTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'one', 11 ),
-                       array( 'one', 21 ),
-                       array( 'one', 411 ),
-                       array( 'other', 12.345 ),
-                       array( 'other', 20 ),
-                       array( 'one', 31 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageMlTest.php b/tests/phpunit/languages/LanguageMlTest.php
deleted file mode 100644 (file)
index 4fa45ce..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2011, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageMl.php */
-class LanguageMlTest extends LanguageClassesTestCase {
-
-       /**
-        * @dataProvider providerFormatNum
-        * @see bug 29495
-        * @covers Language::formatNum
-        */
-       public function testFormatNum( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
-       }
-
-       public static function providerFormatNum() {
-               return array(
-                       array( '12,34,567', '1234567' ),
-                       array( '12,345', '12345' ),
-                       array( '1', '1' ),
-                       array( '123', '123' ),
-                       array( '1,234', '1234' ),
-                       array( '12,345.56', '12345.56' ),
-                       array( '12,34,56,79,81,23,45,678', '12345679812345678' ),
-                       array( '.12345', '.12345' ),
-                       array( '-12,00,000', '-1200000' ),
-                       array( '-98', '-98' ),
-                       array( '-98', -98 ),
-                       array( '-1,23,45,678', -12345678 ),
-                       array( '', '' ),
-                       array( '', null ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageMoTest.php b/tests/phpunit/languages/LanguageMoTest.php
deleted file mode 100644 (file)
index e0e54ca..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMo.php */
-class LanguageMoTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 19 ),
-                       array( 'other', 20 ),
-                       array( 'other', 99 ),
-                       array( 'other', 100 ),
-                       array( 'few', 101 ),
-                       array( 'few', 119 ),
-                       array( 'other', 120 ),
-                       array( 'other', 200 ),
-                       array( 'few', 201 ),
-                       array( 'few', 219 ),
-                       array( 'other', 220 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageMtTest.php b/tests/phpunit/languages/LanguageMtTest.php
deleted file mode 100644 (file)
index 96d2bc9..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMt.php */
-class LanguageMtTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 19 ),
-                       array( 'other', 20 ),
-                       array( 'other', 99 ),
-                       array( 'other', 100 ),
-                       array( 'other', 101 ),
-                       array( 'few', 102 ),
-                       array( 'few', 110 ),
-                       array( 'many', 111 ),
-                       array( 'many', 119 ),
-                       array( 'other', 120 ),
-                       array( 'other', 201 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 10 ),
-                       array( 'other', 11 ),
-                       array( 'other', 19 ),
-                       array( 'other', 20 ),
-                       array( 'other', 99 ),
-                       array( 'other', 100 ),
-                       array( 'other', 101 ),
-                       array( 'other', 102 ),
-                       array( 'other', 110 ),
-                       array( 'other', 111 ),
-                       array( 'other', 119 ),
-                       array( 'other', 120 ),
-                       array( 'other', 201 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageNlTest.php b/tests/phpunit/languages/LanguageNlTest.php
deleted file mode 100644 (file)
index 26bd691..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2011, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageNl.php */
-class LanguageNlTest extends LanguageClassesTestCase {
-
-       /**
-        * @covers Language::formatNum
-        * @todo split into a test and a dataprovider
-        */
-       public function testFormatNum() {
-               $this->assertEquals( '1.234.567', $this->getLang()->formatNum( '1234567' ) );
-               $this->assertEquals( '12.345', $this->getLang()->formatNum( '12345' ) );
-               $this->assertEquals( '1', $this->getLang()->formatNum( '1' ) );
-               $this->assertEquals( '123', $this->getLang()->formatNum( '123' ) );
-               $this->assertEquals( '1.234', $this->getLang()->formatNum( '1234' ) );
-               $this->assertEquals( '12.345,56', $this->getLang()->formatNum( '12345.56' ) );
-               $this->assertEquals( ',1234556', $this->getLang()->formatNum( '.1234556' ) );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageNsoTest.php b/tests/phpunit/languages/LanguageNsoTest.php
deleted file mode 100644 (file)
index 18efd73..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageNso.php */
-class LanguageNsoTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguagePlTest.php b/tests/phpunit/languages/LanguagePlTest.php
deleted file mode 100644 (file)
index d180037..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguagePl.php */
-class LanguagePlTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'many', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'many', 5 ),
-                       array( 'many', 9 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 21 ),
-                       array( 'few', 22 ),
-                       array( 'few', 23 ),
-                       array( 'few', 24 ),
-                       array( 'many', 25 ),
-                       array( 'many', 200 ),
-                       array( 'many', 201 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 3 ),
-                       array( 'other', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 9 ),
-                       array( 'other', 10 ),
-                       array( 'other', 11 ),
-                       array( 'other', 21 ),
-                       array( 'other', 22 ),
-                       array( 'other', 23 ),
-                       array( 'other', 24 ),
-                       array( 'other', 25 ),
-                       array( 'other', 200 ),
-                       array( 'other', 201 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageRoTest.php b/tests/phpunit/languages/LanguageRoTest.php
deleted file mode 100644 (file)
index ae7816b..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageRo.php */
-class LanguageRoTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 19 ),
-                       array( 'other', 20 ),
-                       array( 'other', 99 ),
-                       array( 'other', 100 ),
-                       array( 'few', 101 ),
-                       array( 'few', 119 ),
-                       array( 'other', 120 ),
-                       array( 'other', 200 ),
-                       array( 'few', 201 ),
-                       array( 'few', 219 ),
-                       array( 'other', 220 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageRuTest.php b/tests/phpunit/languages/LanguageRuTest.php
deleted file mode 100644 (file)
index 1381afb..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * based on LanguageBe_tarask.php
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageRu.php */
-class LanguageRuTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * Test explicit plural forms - n=FormN forms
-        * @covers Language::convertPlural
-        */
-       public function testExplicitPlural() {
-               $forms = array( 'one', 'few', 'many', 'other', '12=dozen' );
-               $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) );
-               $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' );
-               $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'many', 11 ),
-                       array( 'one', 91 ),
-                       array( 'one', 121 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'few', 334 ),
-                       array( 'many', 5 ),
-                       array( 'many', 15 ),
-                       array( 'many', 120 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( '1=one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'other', 11 ),
-                       array( 'other', 91 ),
-                       array( 'other', 121 ),
-               );
-       }
-
-       /**
-        * @dataProvider providerGrammar
-        * @covers Language::convertGrammar
-        */
-       public function testGrammar( $result, $word, $case ) {
-               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
-       }
-
-       public static function providerGrammar() {
-               return array(
-                       array(
-                               'Википедии',
-                               'Википедия',
-                               'genitive',
-                       ),
-                       array(
-                               'Викитеки',
-                               'Викитека',
-                               'genitive',
-                       ),
-                       array(
-                               'Викитеке',
-                               'Викитека',
-                               'prepositional',
-                       ),
-                       array(
-                               'Викисклада',
-                               'Викисклад',
-                               'genitive',
-                       ),
-                       array(
-                               'Викискладе',
-                               'Викисклад',
-                               'prepositional',
-                       ),
-                       array(
-                               'Викиданных',
-                               'Викиданные',
-                               'prepositional',
-                       ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageSeTest.php b/tests/phpunit/languages/LanguageSeTest.php
deleted file mode 100644 (file)
index 533aa2b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSe.php */
-class LanguageSeTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'other', 3 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 3 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageSgsTest.php b/tests/phpunit/languages/LanguageSgsTest.php
deleted file mode 100644 (file)
index fa49a4d..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for Samogitian */
-class LanguageSgsTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePluralAllForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralAllForms( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePluralAllForms
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePluralAllForms() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'other', 3 ),
-                       array( 'few', 10 ),
-                       array( 'few', 11 ),
-                       array( 'few', 12 ),
-                       array( 'few', 19 ),
-                       array( 'other', 20 ),
-                       array( 'few', 100 ),
-                       array( 'one', 101 ),
-                       array( 'few', 111 ),
-                       array( 'few', 112 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 3 ),
-                       array( 'other', 10 ),
-                       array( 'other', 11 ),
-                       array( 'other', 12 ),
-                       array( 'other', 19 ),
-                       array( 'other', 20 ),
-                       array( 'other', 100 ),
-                       array( 'one', 101 ),
-                       array( 'other', 111 ),
-                       array( 'other', 112 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageShTest.php b/tests/phpunit/languages/LanguageShTest.php
deleted file mode 100644 (file)
index 1b39087..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for  srpskohrvatski / српскохрватски / Serbocroatian */
-class LanguageShTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 10 ),
-                       array( 'other', 11 ),
-                       array( 'other', 12 ),
-                       array( 'one', 101 ),
-                       array( 'few', 102 ),
-                       array( 'other', 111 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageSkTest.php b/tests/phpunit/languages/LanguageSkTest.php
deleted file mode 100644 (file)
index cb8a13b..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Amir E. Aharoni
- * based on LanguageSkTest.php
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSk.php */
-class LanguageSkTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 11 ),
-                       array( 'other', 20 ),
-                       array( 'other', 25 ),
-                       array( 'other', 200 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageSlTest.php b/tests/phpunit/languages/LanguageSlTest.php
deleted file mode 100644 (file)
index 9783dd8..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Amir E. Aharoni
- * based on LanguageSkTest.php
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSl.php */
-class LanguageSlTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providerPlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providerPlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providerPlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'other', 5 ),
-                       array( 'other', 99 ),
-                       array( 'other', 100 ),
-                       array( 'one', 101 ),
-                       array( 'two', 102 ),
-                       array( 'few', 103 ),
-                       array( 'one', 201 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageSmaTest.php b/tests/phpunit/languages/LanguageSmaTest.php
deleted file mode 100644 (file)
index 95cb333..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSma.php */
-class LanguageSmaTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'other', 3 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-                       array( 'other', 3 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageSrTest.php b/tests/phpunit/languages/LanguageSrTest.php
deleted file mode 100644 (file)
index bfb199f..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-<?php
-/**
- * PHPUnit tests for the Serbian language.
- * The language can be represented using two scripts:
- *  - Latin (SR_el)
- *  - Cyrillic (SR_ec)
- * Both representations seems to be bijective, hence MediaWiki can convert
- * from one script to the other.
- *
- * @author Antoine Musso <hashar at free dot fr>
- * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
- * @file
- *
- * @todo methods in test class should be tidied:
- *  - Should be split into separate test methods and data providers
- *  - Tests for LanguageConverter and Language should probably be separate..
- */
-
-/** Tests for MediaWiki languages/LanguageSr.php */
-class LanguageSrTest extends LanguageClassesTestCase {
-       /**
-        * @covers LanguageConverter::convertTo
-        */
-       public function testEasyConversions() {
-               $this->assertCyrillic(
-                       'шђчћжШЂЧЋЖ',
-                       'Cyrillic guessing characters'
-               );
-               $this->assertLatin(
-                       'šđč枊ĐČĆŽ',
-                       'Latin guessing characters'
-               );
-       }
-
-       /**
-        * @covers LanguageConverter::convertTo
-        */
-       public function testMixedConversions() {
-               $this->assertCyrillic(
-                       'шђчћжШЂЧЋЖ - šđčćž',
-                       'Mostly cyrillic characters'
-               );
-               $this->assertLatin(
-                       'šđč枊ĐČĆŽ - шђчћж',
-                       'Mostly latin characters'
-               );
-       }
-
-       /**
-        * @covers LanguageConverter::convertTo
-        */
-       public function testSameAmountOfLatinAndCyrillicGetConverted() {
-               $this->assertConverted(
-                       '4 latin: šđčć | 4 cyrillic: шђчћ',
-                       'sr-ec'
-               );
-               $this->assertConverted(
-                       '4 latin: šđčć | 4 cyrillic: шђчћ',
-                       'sr-el'
-               );
-       }
-
-       /**
-        * @author Nikola Smolenski
-        * @covers LanguageConverter::convertTo
-        */
-       public function testConversionToCyrillic() {
-               //A simple convertion of Latin to Cyrillic
-               $this->assertEquals( 'абвг',
-                       $this->convertToCyrillic( 'abvg' )
-               );
-               //Same as above, but assert that -{}-s must be removed and not converted
-               $this->assertEquals( 'ljабnjвгdž',
-                       $this->convertToCyrillic( '-{lj}-ab-{nj}-vg-{dž}-' )
-               );
-               //A simple convertion of Cyrillic to Cyrillic
-               $this->assertEquals( 'абвг',
-                       $this->convertToCyrillic( 'абвг' )
-               );
-               //Same as above, but assert that -{}-s must be removed and not converted
-               $this->assertEquals( 'ljабnjвгdž',
-                       $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{dž}-' )
-               );
-               //This text has some Latin, but is recognized as Cyrillic, so it should not be converted
-               $this->assertEquals( 'abvgшђжчћ',
-                       $this->convertToCyrillic( 'abvgшђжчћ' )
-               );
-               //Same as above, but assert that -{}-s must be removed
-               $this->assertEquals( 'љabvgњшђжчћџ',
-                       $this->convertToCyrillic( '-{љ}-abvg-{њ}-шђжчћ-{џ}-' )
-               );
-               //This text has some Cyrillic, but is recognized as Latin, so it should be converted
-               $this->assertEquals( 'абвгшђжчћ',
-                       $this->convertToCyrillic( 'абвгšđžčć' )
-               );
-               //Same as above, but assert that -{}-s must be removed and not converted
-               $this->assertEquals( 'ljабвгnjшђжчћdž',
-                       $this->convertToCyrillic( '-{lj}-абвг-{nj}-šđžčć-{dž}-' )
-               );
-               // Roman numerals are not converted
-               $this->assertEquals( 'а I б II в III г IV шђжчћ',
-                       $this->convertToCyrillic( 'a I b II v III g IV šđžčć' )
-               );
-       }
-
-       /**
-        * @covers LanguageConverter::convertTo
-        */
-       public function testConversionToLatin() {
-               //A simple convertion of Latin to Latin
-               $this->assertEquals( 'abcd',
-                       $this->convertToLatin( 'abcd' )
-               );
-               //A simple convertion of Cyrillic to Latin
-               $this->assertEquals( 'abcd',
-                       $this->convertToLatin( 'абцд' )
-               );
-               //This text has some Latin, but is recognized as Cyrillic, so it should be converted
-               $this->assertEquals( 'abcdšđžčć',
-                       $this->convertToLatin( 'abcdшђжчћ' )
-               );
-               //This text has some Cyrillic, but is recognized as Latin, so it should not be converted
-               $this->assertEquals( 'абцдšđžčć',
-                       $this->convertToLatin( 'абцдšđžčć' )
-               );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'other', 11 ),
-                       array( 'one', 91 ),
-                       array( 'one', 121 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'few', 334 ),
-                       array( 'other', 5 ),
-                       array( 'other', 15 ),
-                       array( 'other', 120 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'other', 11 ),
-                       array( 'other', 4 ),
-                       array( 'one', 91 ),
-                       array( 'one', 121 ),
-               );
-       }
-
-       ##### HELPERS #####################################################
-       /**
-        *Wrapper to verify text stay the same after applying conversion
-        * @param string $text Text to convert
-        * @param string $variant Language variant 'sr-ec' or 'sr-el'
-        * @param string $msg Optional message
-        */
-       protected function assertUnConverted( $text, $variant, $msg = '' ) {
-               $this->assertEquals(
-                       $text,
-                       $this->convertTo( $text, $variant ),
-                       $msg
-               );
-       }
-
-       /**
-        * Wrapper to verify a text is different once converted to a variant.
-        * @param string $text Text to convert
-        * @param string $variant Language variant 'sr-ec' or 'sr-el'
-        * @param string $msg Optional message
-        */
-       protected function assertConverted( $text, $variant, $msg = '' ) {
-               $this->assertNotEquals(
-                       $text,
-                       $this->convertTo( $text, $variant ),
-                       $msg
-               );
-       }
-
-       /**
-        * Verifiy the given Cyrillic text is not converted when using
-        * using the cyrillic variant and converted to Latin when using
-        * the Latin variant.
-        * @param string $text Text to convert
-        * @param string $msg Optional message
-        */
-       protected function assertCyrillic( $text, $msg = '' ) {
-               $this->assertUnConverted( $text, 'sr-ec', $msg );
-               $this->assertConverted( $text, 'sr-el', $msg );
-       }
-
-       /**
-        * Verifiy the given Latin text is not converted when using
-        * using the Latin variant and converted to Cyrillic when using
-        * the Cyrillic variant.
-        * @param string $text Text to convert
-        * @param string $msg Optional message
-        */
-       protected function assertLatin( $text, $msg = '' ) {
-               $this->assertUnConverted( $text, 'sr-el', $msg );
-               $this->assertConverted( $text, 'sr-ec', $msg );
-       }
-
-       /** Wrapper for converter::convertTo() method*/
-       protected function convertTo( $text, $variant ) {
-               return $this->getLang()
-                       ->mConverter
-                       ->convertTo(
-                               $text, $variant
-                       );
-       }
-
-       protected function convertToCyrillic( $text ) {
-               return $this->convertTo( $text, 'sr-ec' );
-       }
-
-       protected function convertToLatin( $text ) {
-               return $this->convertTo( $text, 'sr-el' );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageTiTest.php b/tests/phpunit/languages/LanguageTiTest.php
deleted file mode 100644 (file)
index e225af9..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageTi.php */
-class LanguageTiTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageTlTest.php b/tests/phpunit/languages/LanguageTlTest.php
deleted file mode 100644 (file)
index 20f5bd7..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageTl.php */
-class LanguageTlTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'one', 2 ),
-                       array( 'other', 4 ),
-                       array( 'other', 6 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageTrTest.php b/tests/phpunit/languages/LanguageTrTest.php
deleted file mode 100644 (file)
index 2c9905f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageTr.php */
-class LanguageTrTest extends LanguageClassesTestCase {
-
-       /**
-        * See @bug 28040
-        * Credits to irc://irc.freenode.net/wikipedia-tr users:
-        *  - berm
-        *  - []LuCkY[]
-        *  - Emperyan
-        * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
-        * @dataProvider provideDottedAndDotlessI
-        * @covers Language::ucfirst
-        * @covers Language::lcfirst
-        */
-       public function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
-               if ( $func == 'ucfirst' ) {
-                       $res = $this->getLang()->ucfirst( $input );
-               } elseif ( $func == 'lcfirst' ) {
-                       $res = $this->getLang()->lcfirst( $input );
-               } else {
-                       throw new MWException( __METHOD__ . " given an invalid function name '$func'" );
-               }
-
-               $msg = "Converting $inputCase case '$input' with $func should give '$expected'";
-
-               $this->assertEquals( $expected, $res, $msg );
-       }
-
-       public static function provideDottedAndDotlessI() {
-               return array(
-                       # function, input, input case, expected
-                       # Case changed:
-                       array( 'ucfirst', 'ı', 'lower', 'I' ),
-                       array( 'ucfirst', 'i', 'lower', 'İ' ),
-                       array( 'lcfirst', 'I', 'upper', 'ı' ),
-                       array( 'lcfirst', 'İ', 'upper', 'i' ),
-
-                       # Already using the correct case
-                       array( 'ucfirst', 'I', 'upper', 'I' ),
-                       array( 'ucfirst', 'İ', 'upper', 'İ' ),
-                       array( 'lcfirst', 'ı', 'lower', 'ı' ),
-                       array( 'lcfirst', 'i', 'lower', 'i' ),
-
-                       # A real example taken from bug 28040 using
-                       # http://tr.wikipedia.org/wiki/%C4%B0Phone
-                       array( 'lcfirst', 'iPhone', 'lower', 'iPhone' ),
-
-                       # next case is valid in Turkish but are different words if we
-                       # consider IPhone is English!
-                       array( 'lcfirst', 'IPhone', 'upper', 'ıPhone' ),
-
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageUkTest.php b/tests/phpunit/languages/LanguageUkTest.php
deleted file mode 100644 (file)
index 9051bcf..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * based on LanguageBe_tarask.php
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for Ukrainian */
-class LanguageUkTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * Test explicit plural forms - n=FormN forms
-        * @covers Language::convertPlural
-        */
-       public function testExplicitPlural() {
-               $forms = array( 'one', 'few', 'many', 'other', '12=dozen' );
-               $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) );
-               $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' );
-               $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'many', 11 ),
-                       array( 'one', 91 ),
-                       array( 'one', 121 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'few', 334 ),
-                       array( 'many', 5 ),
-                       array( 'many', 15 ),
-                       array( 'many', 120 ),
-               );
-       }
-
-       /**
-        * @dataProvider providePluralTwoForms
-        * @covers Language::convertPlural
-        */
-       public function testPluralTwoForms( $result, $value ) {
-               $forms = array( '1=one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       public static function providePluralTwoForms() {
-               return array(
-                       array( 'one', 1 ),
-                       array( 'other', 11 ),
-                       array( 'other', 91 ),
-                       array( 'other', 121 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageUzTest.php b/tests/phpunit/languages/LanguageUzTest.php
deleted file mode 100644 (file)
index 4881103..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-/**
- * PHPUnit tests for the Uzbek language.
- * The language can be represented using two scripts:
- *  - Latin (uz-latn)
- *  - Cyrillic (uz-cyrl)
- *
- * @author Robin Pepermans
- * @author Antoine Musso <hashar at free dot fr>
- * @copyright Copyright © 2012, Robin Pepermans
- * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
- * @file
- *
- * @todo methods in test class should be tidied:
- *  - Should be split into separate test methods and data providers
- *  - Tests for LanguageConverter and Language should probably be separate..
- */
-
-/** Tests for MediaWiki languages/LanguageUz.php */
-class LanguageUzTest extends LanguageClassesTestCase {
-
-       /**
-        * @author Nikola Smolenski
-        * @covers LanguageConverter::convertTo
-        */
-       public function testConversionToCyrillic() {
-               // A convertion of Latin to Cyrillic
-               $this->assertEquals( 'абвгғ',
-                       $this->convertToCyrillic( 'abvggʻ' )
-               );
-               // Same as above, but assert that -{}-s must be removed and not converted
-               $this->assertEquals( 'ljабnjвгўоdb',
-                       $this->convertToCyrillic( '-{lj}-ab-{nj}-vgoʻo-{db}-' )
-               );
-               // A simple convertion of Cyrillic to Cyrillic
-               $this->assertEquals( 'абвг',
-                       $this->convertToCyrillic( 'абвг' )
-               );
-               // Same as above, but assert that -{}-s must be removed and not converted
-               $this->assertEquals( 'ljабnjвгdaž',
-                       $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{da}-ž' )
-               );
-       }
-
-       /**
-        * @covers LanguageConverter::convertTo
-        */
-       public function testConversionToLatin() {
-               // A simple convertion of Latin to Latin
-               $this->assertEquals( 'abdef',
-                       $this->convertToLatin( 'abdef' )
-               );
-               // A convertion of Cyrillic to Latin
-               $this->assertEquals( 'gʻabtsdOʻQyo',
-                       $this->convertToLatin( 'ғабцдЎҚё' )
-               );
-       }
-
-       ##### HELPERS #####################################################
-       /**
-        * Wrapper to verify text stay the same after applying conversion
-        * @param string $text Text to convert
-        * @param string $variant Language variant 'uz-cyrl' or 'uz-latn'
-        * @param string $msg Optional message
-        */
-       protected function assertUnConverted( $text, $variant, $msg = '' ) {
-               $this->assertEquals(
-                       $text,
-                       $this->convertTo( $text, $variant ),
-                       $msg
-               );
-       }
-
-       /**
-        * Wrapper to verify a text is different once converted to a variant.
-        * @param string $text Text to convert
-        * @param string $variant Language variant 'uz-cyrl' or 'uz-latn'
-        * @param string $msg Optional message
-        */
-       protected function assertConverted( $text, $variant, $msg = '' ) {
-               $this->assertNotEquals(
-                       $text,
-                       $this->convertTo( $text, $variant ),
-                       $msg
-               );
-       }
-
-       /**
-        * Verifiy the given Cyrillic text is not converted when using
-        * using the cyrillic variant and converted to Latin when using
-        * the Latin variant.
-        * @param string $text Text to convert
-        * @param string $msg Optional message
-        */
-       protected function assertCyrillic( $text, $msg = '' ) {
-               $this->assertUnConverted( $text, 'uz-cyrl', $msg );
-               $this->assertConverted( $text, 'uz-latn', $msg );
-       }
-
-       /**
-        * Verifiy the given Latin text is not converted when using
-        * using the Latin variant and converted to Cyrillic when using
-        * the Cyrillic variant.
-        * @param string $text Text to convert
-        * @param string $msg Optional message
-        */
-       protected function assertLatin( $text, $msg = '' ) {
-               $this->assertUnConverted( $text, 'uz-latn', $msg );
-               $this->assertConverted( $text, 'uz-cyrl', $msg );
-       }
-
-       /** Wrapper for converter::convertTo() method*/
-       protected function convertTo( $text, $variant ) {
-               return $this->getLang()->mConverter->convertTo( $text, $variant );
-       }
-
-       protected function convertToCyrillic( $text ) {
-               return $this->convertTo( $text, 'uz-cyrl' );
-       }
-
-       protected function convertToLatin( $text ) {
-               return $this->convertTo( $text, 'uz-latn' );
-       }
-}
diff --git a/tests/phpunit/languages/LanguageWaTest.php b/tests/phpunit/languages/LanguageWaTest.php
deleted file mode 100644 (file)
index d05196c..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageWa.php */
-class LanguageWaTest extends LanguageClassesTestCase {
-       /**
-        * @dataProvider providePlural
-        * @covers Language::convertPlural
-        */
-       public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
-       }
-
-       /**
-        * @dataProvider providePlural
-        * @covers Language::getPluralRuleType
-        */
-       public function testGetPluralRuleType( $result, $value ) {
-               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
-       }
-
-       public static function providePlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'other', 2 ),
-               );
-       }
-}
diff --git a/tests/phpunit/languages/classes/LanguageAmTest.php b/tests/phpunit/languages/classes/LanguageAmTest.php
new file mode 100644 (file)
index 0000000..a644f5e
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageAm.php */
+class LanguageAmTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageArTest.php b/tests/phpunit/languages/classes/LanguageArTest.php
new file mode 100644 (file)
index 0000000..7b48f23
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Based on LanguagMlTest
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageAr.php */
+class LanguageArTest extends LanguageClassesTestCase {
+       /**
+        * @covers Language::formatNum
+        * @todo split into a test and a dataprovider
+        */
+       public function testFormatNum() {
+               $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
+               $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
+       }
+
+       /**
+        * Mostly to test the raw ascii feature.
+        * @dataProvider providerSprintfDate
+        * @covers Language::sprintfDate
+        */
+       public function testSprintfDate( $format, $date, $expected ) {
+               $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
+       }
+
+       public static function providerSprintfDate() {
+               return array(
+                       array(
+                               'xg "vs" g',
+                               '20120102030410',
+                               'يناير vs ٣'
+                       ),
+                       array(
+                               'xmY',
+                               '20120102030410',
+                               '١٤٣٣'
+                       ),
+                       array(
+                               'xnxmY',
+                               '20120102030410',
+                               '1433'
+                       ),
+                       array(
+                               'xN xmj xmn xN xmY',
+                               '20120102030410',
+                               ' 7 2  ١٤٣٣'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'zero', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 9 ),
+                       array( 'few', 110 ),
+                       array( 'many', 11 ),
+                       array( 'many', 15 ),
+                       array( 'many', 99 ),
+                       array( 'many', 9999 ),
+                       array( 'other', 100 ),
+                       array( 'other', 102 ),
+                       array( 'other', 1000 ),
+                       array( 'other', 1.7 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageArqTest.php b/tests/phpunit/languages/classes/LanguageArqTest.php
new file mode 100644 (file)
index 0000000..3fa56d7
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Based on LanguageMlTest
+ * @author Joel Sahleen
+ * @copyright Copyright © 2014, Joel Sahleen
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageArq.php */
+class LanguageArqTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideNumber
+        * @covers Language::formatNum
+        */
+       public function testFormatNum( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
+       }
+
+       public static function provideNumber() {
+               return array(
+                       array( '1.234.567', '1234567'),
+                       array( '-12,89', -12.89 ),
+                       );
+       }
+
+}
diff --git a/tests/phpunit/languages/classes/LanguageBeTest.php b/tests/phpunit/languages/classes/LanguageBeTest.php
new file mode 100644 (file)
index 0000000..7bd586a
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageBe.php */
+class LanguageBeTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'many', 11 ),
+                       array( 'one', 91 ),
+                       array( 'one', 121 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'few', 334 ),
+                       array( 'many', 5 ),
+                       array( 'many', 15 ),
+                       array( 'many', 120 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageBe_taraskTest.php b/tests/phpunit/languages/classes/LanguageBe_taraskTest.php
new file mode 100644 (file)
index 0000000..4dd5cdd
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+// @codingStandardsIgnoreStart Ignore Squiz.Classes.ValidClassName.NotCamelCaps
+class LanguageBe_taraskTest extends LanguageClassesTestCase {
+       // @codingStandardsIgnoreEnd
+       /**
+        * Make sure the language code we are given is indeed
+        * be-tarask. This is to ensure LanguageClassesTestCase
+        * does not give us the wrong language.
+        */
+       public function testBeTaraskTestsUsesBeTaraskCode() {
+               $this->assertEquals( 'be-tarask',
+                       $this->getLang()->getCode()
+               );
+       }
+
+       /**
+        * @see bug 23156 & r64981
+        * @covers Language::commafy
+        */
+       public function testSearchRightSingleQuotationMarkAsApostroph() {
+               $this->assertEquals(
+                       "'",
+                       $this->getLang()->normalizeForSearch( '’' ),
+                       'bug 23156: U+2019 conversion to U+0027'
+               );
+       }
+
+       /**
+        * @see bug 23156 & r64981
+        * @covers Language::commafy
+        */
+       public function testCommafy() {
+               $this->assertEquals( '1,234,567', $this->getLang()->commafy( '1234567' ) );
+               $this->assertEquals( '12,345', $this->getLang()->commafy( '12345' ) );
+       }
+
+       /**
+        * @see bug 23156 & r64981
+        * @covers Language::commafy
+        */
+       public function testDoesNotCommafyFourDigitsNumber() {
+               $this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'many', 11 ),
+                       array( 'one', 91 ),
+                       array( 'one', 121 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'few', 334 ),
+                       array( 'many', 5 ),
+                       array( 'many', 15 ),
+                       array( 'many', 120 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( '1=one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageBhoTest.php b/tests/phpunit/languages/classes/LanguageBhoTest.php
new file mode 100644 (file)
index 0000000..187bfbb
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageBho.php */
+class LanguageBhoTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageBsTest.php b/tests/phpunit/languages/classes/LanguageBsTest.php
new file mode 100644 (file)
index 0000000..7aca2ab
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for Croatian (hrvatski) */
+class LanguageBsTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 11 ),
+                       array( 'other', 20 ),
+                       array( 'one', 21 ),
+                       array( 'few', 24 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageCsTest.php b/tests/phpunit/languages/classes/LanguageCsTest.php
new file mode 100644 (file)
index 0000000..da9e6b8
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/Languagecs.php */
+class LanguageCsTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 11 ),
+                       array( 'other', 20 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageCuTest.php b/tests/phpunit/languages/classes/LanguageCuTest.php
new file mode 100644 (file)
index 0000000..0719317
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageCu.php */
+class LanguageCuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'one', 11 ),
+                       array( 'other', 20 ),
+                       array( 'two', 22 ),
+                       array( 'few', 223 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageCyTest.php b/tests/phpunit/languages/classes/LanguageCyTest.php
new file mode 100644 (file)
index 0000000..eaf663a
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageCy.php */
+class LanguageCyTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'zero', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'many', 6 ),
+                       array( 'other', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 11 ),
+                       array( 'other', 20 ),
+                       array( 'other', 22 ),
+                       array( 'other', 223 ),
+                       array( 'other', 200.00 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageDsbTest.php b/tests/phpunit/languages/classes/LanguageDsbTest.php
new file mode 100644 (file)
index 0000000..94c11bc
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageDsb.php */
+class LanguageDsbTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'one', 101 ),
+                       array( 'one', 90001 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 203 ),
+                       array( 'few', 4 ),
+                       array( 'other', 99 ),
+                       array( 'other', 555 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageFrTest.php b/tests/phpunit/languages/classes/LanguageFrTest.php
new file mode 100644 (file)
index 0000000..46b6501
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageFr.php */
+class LanguageFrTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageGaTest.php b/tests/phpunit/languages/classes/LanguageGaTest.php
new file mode 100644 (file)
index 0000000..c009f56
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageGa.php */
+class LanguageGaTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageGdTest.php b/tests/phpunit/languages/classes/LanguageGdTest.php
new file mode 100644 (file)
index 0000000..b89b4df
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012-2013, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageGd.php */
+class LanguageGdTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providerPlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providerPlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'one', 11 ),
+                       array( 'two', 12 ),
+                       array( 'few', 3 ),
+                       array( 'few', 19 ),
+                       array( 'other', 200 ),
+               );
+       }
+
+       /**
+        * @dataProvider providerPluralExplicit
+        * @covers Language::convertPlural
+        */
+       public function testExplicitPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other', '11=Form11', '12=Form12' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providerPluralExplicit() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'Form11', 11 ),
+                       array( 'Form12', 12 ),
+                       array( 'few', 3 ),
+                       array( 'few', 19 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageGvTest.php b/tests/phpunit/languages/classes/LanguageGvTest.php
new file mode 100644 (file)
index 0000000..e6a0cf0
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Test for Manx (Gaelg) language
+ *
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2013, Santhosh Thottingal
+ * @file
+ */
+
+class LanguageGvTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'other', 3 ),
+                       array( 'few', 20 ),
+                       array( 'one', 21 ),
+                       array( 'two', 22 ),
+                       array( 'other', 23 ),
+                       array( 'other', 50 ),
+                       array( 'few', 60 ),
+                       array( 'few', 80 ),
+                       array( 'few', 100 )
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageHeTest.php b/tests/phpunit/languages/classes/LanguageHeTest.php
new file mode 100644 (file)
index 0000000..c382244
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageHe.php */
+class LanguageHeTest extends LanguageClassesTestCase {
+       /**
+        * The most common usage for the plural forms is two forms,
+        * for singular and plural. In this case, the second form
+        * is technically dual, but in practice it's used as plural.
+        * In some cases, usually with expressions of time, three forms
+        * are needed - singular, dual and plural.
+        * CLDR also specifies a fourth form for multiples of 10,
+        * which is very rare. It also has a mistake, because
+        * the number 10 itself is supposed to be just plural,
+        * so currently it's overridden in MediaWiki.
+        */
+
+       // @todo the below test*PluralForms test methods can be refactored
+       //  to use a single test method and data provider..
+
+       /**
+        * @dataProvider provideTwoPluralForms
+        * @covers Language::convertPlural
+        */
+       public function testTwoPluralForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider provideThreePluralForms
+        * @covers Language::convertPlural
+        */
+       public function testThreePluralForms( $result, $value ) {
+               $forms = array( 'one', 'two', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider provideFourPluralForms
+        * @covers Language::convertPlural
+        */
+       public function testFourPluralForms( $result, $value ) {
+               $forms = array( 'one', 'two', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider provideFourPluralForms
+        * @covers Language::convertPlural
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function provideTwoPluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'other', 2 ), // No third form provided, use it as plural
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // No fourth form provided, use it as plural
+                       array( 'other', 20 ), // No fourth form provided, use it as plural
+               );
+       }
+
+       public static function provideThreePluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'two', 2 ), // Dual
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // No fourth form provided, use it as plural
+                       array( 'other', 20 ), // No fourth form provided, use it as plural
+               );
+       }
+
+       public static function provideFourPluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'two', 2 ), // Dual
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // 10 is supposed to be plural (other), not "many"
+                       array( 'many', 20 ), // Fourth form provided - rare, but supported by CLDR
+               );
+       }
+
+       /**
+        * @dataProvider provideGrammar
+        * @covers Language::convertGrammar
+        */
+       public function testGrammar( $result, $word, $case ) {
+               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
+       }
+
+       // The comments in the beginning of the line help avoid RTL problems
+       // with text editors.
+       public static function provideGrammar() {
+               return array(
+                       array(
+                               /* result */'וויקיפדיה',
+                               /* word   */'ויקיפדיה',
+                               /* case   */'תחילית',
+                       ),
+                       array(
+                               /* result */'וולפגנג',
+                               /* word   */'וולפגנג',
+                               /* case   */'prefixed',
+                       ),
+                       array(
+                               /* result */'קובץ',
+                               /* word   */'הקובץ',
+                               /* case   */'תחילית',
+                       ),
+                       array(
+                               /* result */'־Wikipedia',
+                               /* word   */'Wikipedia',
+                               /* case   */'תחילית',
+                       ),
+                       array(
+                               /* result */'־1995',
+                               /* word   */'1995',
+                               /* case   */'תחילית',
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageHiTest.php b/tests/phpunit/languages/classes/LanguageHiTest.php
new file mode 100644 (file)
index 0000000..f6d2c9e
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageHi.php */
+class LanguageHiTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageHrTest.php b/tests/phpunit/languages/classes/LanguageHrTest.php
new file mode 100644 (file)
index 0000000..644c525
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageHr.php */
+class LanguageHrTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 11 ),
+                       array( 'other', 20 ),
+                       array( 'one', 21 ),
+                       array( 'few', 24 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageHsbTest.php b/tests/phpunit/languages/classes/LanguageHsbTest.php
new file mode 100644 (file)
index 0000000..f95a43b
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageHsb.php */
+class LanguageHsbTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'one', 101 ),
+                       array( 'one', 90001 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 203 ),
+                       array( 'few', 4 ),
+                       array( 'other', 99 ),
+                       array( 'other', 555 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageHuTest.php b/tests/phpunit/languages/classes/LanguageHuTest.php
new file mode 100644 (file)
index 0000000..ee9197d
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageHu.php */
+class LanguageHuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageHyTest.php b/tests/phpunit/languages/classes/LanguageHyTest.php
new file mode 100644 (file)
index 0000000..92e0ef9
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for Armenian (Հայերեն) */
+class LanguageHyTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageKshTest.php b/tests/phpunit/languages/classes/LanguageKshTest.php
new file mode 100644 (file)
index 0000000..568a378
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageKsh.php */
+class LanguageKshTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other', 'zero' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'zero', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageLnTest.php b/tests/phpunit/languages/classes/LanguageLnTest.php
new file mode 100644 (file)
index 0000000..10b3234
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageLn.php */
+class LanguageLnTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageLtTest.php b/tests/phpunit/languages/classes/LanguageLtTest.php
new file mode 100644 (file)
index 0000000..30642f6
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageLt.php */
+class LanguageLtTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 9 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 20 ),
+                       array( 'one', 21 ),
+                       array( 'few', 32 ),
+                       array( 'one', 41 ),
+                       array( 'one', 40001 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testOneFewPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               // This fails for 21, but not sure why.
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 15 ),
+                       array( 'other', 20 ),
+                       array( 'one', 21 ),
+                       array( 'other', 22 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageLvTest.php b/tests/phpunit/languages/classes/LanguageLvTest.php
new file mode 100644 (file)
index 0000000..7120cfe
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for Latvian */
+class LanguageLvTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'zero', 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'zero', 0 ),
+                       array( 'one', 1 ),
+                       array( 'zero', 11 ),
+                       array( 'one', 21 ),
+                       array( 'zero', 411 ),
+                       array( 'other', 2 ),
+                       array( 'other', 9 ),
+                       array( 'zero', 12 ),
+                       array( 'other', 12.345 ),
+                       array( 'zero', 20 ),
+                       array( 'other', 22 ),
+                       array( 'one', 31 ),
+                       array( 'zero', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageMgTest.php b/tests/phpunit/languages/classes/LanguageMgTest.php
new file mode 100644 (file)
index 0000000..65e8fd7
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMg.php */
+class LanguageMgTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+                       array( 'other', 123.3434 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageMkTest.php b/tests/phpunit/languages/classes/LanguageMkTest.php
new file mode 100644 (file)
index 0000000..ed15526
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for македонски/Macedonian */
+class LanguageMkTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'one', 11 ),
+                       array( 'one', 21 ),
+                       array( 'one', 411 ),
+                       array( 'other', 12.345 ),
+                       array( 'other', 20 ),
+                       array( 'one', 31 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageMlTest.php b/tests/phpunit/languages/classes/LanguageMlTest.php
new file mode 100644 (file)
index 0000000..4fa45ce
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2011, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageMl.php */
+class LanguageMlTest extends LanguageClassesTestCase {
+
+       /**
+        * @dataProvider providerFormatNum
+        * @see bug 29495
+        * @covers Language::formatNum
+        */
+       public function testFormatNum( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
+       }
+
+       public static function providerFormatNum() {
+               return array(
+                       array( '12,34,567', '1234567' ),
+                       array( '12,345', '12345' ),
+                       array( '1', '1' ),
+                       array( '123', '123' ),
+                       array( '1,234', '1234' ),
+                       array( '12,345.56', '12345.56' ),
+                       array( '12,34,56,79,81,23,45,678', '12345679812345678' ),
+                       array( '.12345', '.12345' ),
+                       array( '-12,00,000', '-1200000' ),
+                       array( '-98', '-98' ),
+                       array( '-98', -98 ),
+                       array( '-1,23,45,678', -12345678 ),
+                       array( '', '' ),
+                       array( '', null ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageMoTest.php b/tests/phpunit/languages/classes/LanguageMoTest.php
new file mode 100644 (file)
index 0000000..e0e54ca
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMo.php */
+class LanguageMoTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'few', 101 ),
+                       array( 'few', 119 ),
+                       array( 'other', 120 ),
+                       array( 'other', 200 ),
+                       array( 'few', 201 ),
+                       array( 'few', 219 ),
+                       array( 'other', 220 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageMtTest.php b/tests/phpunit/languages/classes/LanguageMtTest.php
new file mode 100644 (file)
index 0000000..96d2bc9
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMt.php */
+class LanguageMtTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 10 ),
+                       array( 'many', 11 ),
+                       array( 'many', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'other', 101 ),
+                       array( 'few', 102 ),
+                       array( 'few', 110 ),
+                       array( 'many', 111 ),
+                       array( 'many', 119 ),
+                       array( 'other', 120 ),
+                       array( 'other', 201 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'other', 101 ),
+                       array( 'other', 102 ),
+                       array( 'other', 110 ),
+                       array( 'other', 111 ),
+                       array( 'other', 119 ),
+                       array( 'other', 120 ),
+                       array( 'other', 201 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageNlTest.php b/tests/phpunit/languages/classes/LanguageNlTest.php
new file mode 100644 (file)
index 0000000..26bd691
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2011, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageNl.php */
+class LanguageNlTest extends LanguageClassesTestCase {
+
+       /**
+        * @covers Language::formatNum
+        * @todo split into a test and a dataprovider
+        */
+       public function testFormatNum() {
+               $this->assertEquals( '1.234.567', $this->getLang()->formatNum( '1234567' ) );
+               $this->assertEquals( '12.345', $this->getLang()->formatNum( '12345' ) );
+               $this->assertEquals( '1', $this->getLang()->formatNum( '1' ) );
+               $this->assertEquals( '123', $this->getLang()->formatNum( '123' ) );
+               $this->assertEquals( '1.234', $this->getLang()->formatNum( '1234' ) );
+               $this->assertEquals( '12.345,56', $this->getLang()->formatNum( '12345.56' ) );
+               $this->assertEquals( ',1234556', $this->getLang()->formatNum( '.1234556' ) );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageNsoTest.php b/tests/phpunit/languages/classes/LanguageNsoTest.php
new file mode 100644 (file)
index 0000000..18efd73
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageNso.php */
+class LanguageNsoTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguagePlTest.php b/tests/phpunit/languages/classes/LanguagePlTest.php
new file mode 100644 (file)
index 0000000..d180037
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguagePl.php */
+class LanguagePlTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'many' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'many', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'many', 5 ),
+                       array( 'many', 9 ),
+                       array( 'many', 10 ),
+                       array( 'many', 11 ),
+                       array( 'many', 21 ),
+                       array( 'few', 22 ),
+                       array( 'few', 23 ),
+                       array( 'few', 24 ),
+                       array( 'many', 25 ),
+                       array( 'many', 200 ),
+                       array( 'many', 201 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 3 ),
+                       array( 'other', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 9 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 21 ),
+                       array( 'other', 22 ),
+                       array( 'other', 23 ),
+                       array( 'other', 24 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+                       array( 'other', 201 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageRoTest.php b/tests/phpunit/languages/classes/LanguageRoTest.php
new file mode 100644 (file)
index 0000000..ae7816b
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageRo.php */
+class LanguageRoTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'few', 101 ),
+                       array( 'few', 119 ),
+                       array( 'other', 120 ),
+                       array( 'other', 200 ),
+                       array( 'few', 201 ),
+                       array( 'few', 219 ),
+                       array( 'other', 220 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageRuTest.php b/tests/phpunit/languages/classes/LanguageRuTest.php
new file mode 100644 (file)
index 0000000..1381afb
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * based on LanguageBe_tarask.php
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageRu.php */
+class LanguageRuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * Test explicit plural forms - n=FormN forms
+        * @covers Language::convertPlural
+        */
+       public function testExplicitPlural() {
+               $forms = array( 'one', 'few', 'many', 'other', '12=dozen' );
+               $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) );
+               $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' );
+               $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'many', 11 ),
+                       array( 'one', 91 ),
+                       array( 'one', 121 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'few', 334 ),
+                       array( 'many', 5 ),
+                       array( 'many', 15 ),
+                       array( 'many', 120 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( '1=one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
+               );
+       }
+
+       /**
+        * @dataProvider providerGrammar
+        * @covers Language::convertGrammar
+        */
+       public function testGrammar( $result, $word, $case ) {
+               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
+       }
+
+       public static function providerGrammar() {
+               return array(
+                       array(
+                               'Википедии',
+                               'Википедия',
+                               'genitive',
+                       ),
+                       array(
+                               'Викитеки',
+                               'Викитека',
+                               'genitive',
+                       ),
+                       array(
+                               'Викитеке',
+                               'Викитека',
+                               'prepositional',
+                       ),
+                       array(
+                               'Викисклада',
+                               'Викисклад',
+                               'genitive',
+                       ),
+                       array(
+                               'Викискладе',
+                               'Викисклад',
+                               'prepositional',
+                       ),
+                       array(
+                               'Викиданных',
+                               'Викиданные',
+                               'prepositional',
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageSeTest.php b/tests/phpunit/languages/classes/LanguageSeTest.php
new file mode 100644 (file)
index 0000000..533aa2b
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSe.php */
+class LanguageSeTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'other', 3 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 3 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageSgsTest.php b/tests/phpunit/languages/classes/LanguageSgsTest.php
new file mode 100644 (file)
index 0000000..fa49a4d
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for Samogitian */
+class LanguageSgsTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePluralAllForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralAllForms( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePluralAllForms
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePluralAllForms() {
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'other', 3 ),
+                       array( 'few', 10 ),
+                       array( 'few', 11 ),
+                       array( 'few', 12 ),
+                       array( 'few', 19 ),
+                       array( 'other', 20 ),
+                       array( 'few', 100 ),
+                       array( 'one', 101 ),
+                       array( 'few', 111 ),
+                       array( 'few', 112 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 3 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 12 ),
+                       array( 'other', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 100 ),
+                       array( 'one', 101 ),
+                       array( 'other', 111 ),
+                       array( 'other', 112 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageShTest.php b/tests/phpunit/languages/classes/LanguageShTest.php
new file mode 100644 (file)
index 0000000..1b39087
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for  srpskohrvatski / српскохрватски / Serbocroatian */
+class LanguageShTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 12 ),
+                       array( 'one', 101 ),
+                       array( 'few', 102 ),
+                       array( 'other', 111 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageSkTest.php b/tests/phpunit/languages/classes/LanguageSkTest.php
new file mode 100644 (file)
index 0000000..cb8a13b
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * based on LanguageSkTest.php
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSk.php */
+class LanguageSkTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 11 ),
+                       array( 'other', 20 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageSlTest.php b/tests/phpunit/languages/classes/LanguageSlTest.php
new file mode 100644 (file)
index 0000000..9783dd8
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * based on LanguageSkTest.php
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSl.php */
+class LanguageSlTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providerPlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providerPlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providerPlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'one', 101 ),
+                       array( 'two', 102 ),
+                       array( 'few', 103 ),
+                       array( 'one', 201 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageSmaTest.php b/tests/phpunit/languages/classes/LanguageSmaTest.php
new file mode 100644 (file)
index 0000000..95cb333
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSma.php */
+class LanguageSmaTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'two', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'other', 3 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 3 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageSrTest.php b/tests/phpunit/languages/classes/LanguageSrTest.php
new file mode 100644 (file)
index 0000000..bfb199f
--- /dev/null
@@ -0,0 +1,249 @@
+<?php
+/**
+ * PHPUnit tests for the Serbian language.
+ * The language can be represented using two scripts:
+ *  - Latin (SR_el)
+ *  - Cyrillic (SR_ec)
+ * Both representations seems to be bijective, hence MediaWiki can convert
+ * from one script to the other.
+ *
+ * @author Antoine Musso <hashar at free dot fr>
+ * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
+ * @file
+ *
+ * @todo methods in test class should be tidied:
+ *  - Should be split into separate test methods and data providers
+ *  - Tests for LanguageConverter and Language should probably be separate..
+ */
+
+/** Tests for MediaWiki languages/LanguageSr.php */
+class LanguageSrTest extends LanguageClassesTestCase {
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testEasyConversions() {
+               $this->assertCyrillic(
+                       'шђчћжШЂЧЋЖ',
+                       'Cyrillic guessing characters'
+               );
+               $this->assertLatin(
+                       'šđč枊ĐČĆŽ',
+                       'Latin guessing characters'
+               );
+       }
+
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testMixedConversions() {
+               $this->assertCyrillic(
+                       'шђчћжШЂЧЋЖ - šđčćž',
+                       'Mostly cyrillic characters'
+               );
+               $this->assertLatin(
+                       'šđč枊ĐČĆŽ - шђчћж',
+                       'Mostly latin characters'
+               );
+       }
+
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testSameAmountOfLatinAndCyrillicGetConverted() {
+               $this->assertConverted(
+                       '4 latin: šđčć | 4 cyrillic: шђчћ',
+                       'sr-ec'
+               );
+               $this->assertConverted(
+                       '4 latin: šđčć | 4 cyrillic: шђчћ',
+                       'sr-el'
+               );
+       }
+
+       /**
+        * @author Nikola Smolenski
+        * @covers LanguageConverter::convertTo
+        */
+       public function testConversionToCyrillic() {
+               //A simple convertion of Latin to Cyrillic
+               $this->assertEquals( 'абвг',
+                       $this->convertToCyrillic( 'abvg' )
+               );
+               //Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабnjвгdž',
+                       $this->convertToCyrillic( '-{lj}-ab-{nj}-vg-{dž}-' )
+               );
+               //A simple convertion of Cyrillic to Cyrillic
+               $this->assertEquals( 'абвг',
+                       $this->convertToCyrillic( 'абвг' )
+               );
+               //Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабnjвгdž',
+                       $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{dž}-' )
+               );
+               //This text has some Latin, but is recognized as Cyrillic, so it should not be converted
+               $this->assertEquals( 'abvgшђжчћ',
+                       $this->convertToCyrillic( 'abvgшђжчћ' )
+               );
+               //Same as above, but assert that -{}-s must be removed
+               $this->assertEquals( 'љabvgњшђжчћџ',
+                       $this->convertToCyrillic( '-{љ}-abvg-{њ}-шђжчћ-{џ}-' )
+               );
+               //This text has some Cyrillic, but is recognized as Latin, so it should be converted
+               $this->assertEquals( 'абвгшђжчћ',
+                       $this->convertToCyrillic( 'абвгšđžčć' )
+               );
+               //Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабвгnjшђжчћdž',
+                       $this->convertToCyrillic( '-{lj}-абвг-{nj}-šđžčć-{dž}-' )
+               );
+               // Roman numerals are not converted
+               $this->assertEquals( 'а I б II в III г IV шђжчћ',
+                       $this->convertToCyrillic( 'a I b II v III g IV šđžčć' )
+               );
+       }
+
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testConversionToLatin() {
+               //A simple convertion of Latin to Latin
+               $this->assertEquals( 'abcd',
+                       $this->convertToLatin( 'abcd' )
+               );
+               //A simple convertion of Cyrillic to Latin
+               $this->assertEquals( 'abcd',
+                       $this->convertToLatin( 'абцд' )
+               );
+               //This text has some Latin, but is recognized as Cyrillic, so it should be converted
+               $this->assertEquals( 'abcdšđžčć',
+                       $this->convertToLatin( 'abcdшђжчћ' )
+               );
+               //This text has some Cyrillic, but is recognized as Latin, so it should not be converted
+               $this->assertEquals( 'абцдšđžčć',
+                       $this->convertToLatin( 'абцдšđžčć' )
+               );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'other', 11 ),
+                       array( 'one', 91 ),
+                       array( 'one', 121 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'few', 334 ),
+                       array( 'other', 5 ),
+                       array( 'other', 15 ),
+                       array( 'other', 120 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'other', 11 ),
+                       array( 'other', 4 ),
+                       array( 'one', 91 ),
+                       array( 'one', 121 ),
+               );
+       }
+
+       ##### HELPERS #####################################################
+       /**
+        *Wrapper to verify text stay the same after applying conversion
+        * @param string $text Text to convert
+        * @param string $variant Language variant 'sr-ec' or 'sr-el'
+        * @param string $msg Optional message
+        */
+       protected function assertUnConverted( $text, $variant, $msg = '' ) {
+               $this->assertEquals(
+                       $text,
+                       $this->convertTo( $text, $variant ),
+                       $msg
+               );
+       }
+
+       /**
+        * Wrapper to verify a text is different once converted to a variant.
+        * @param string $text Text to convert
+        * @param string $variant Language variant 'sr-ec' or 'sr-el'
+        * @param string $msg Optional message
+        */
+       protected function assertConverted( $text, $variant, $msg = '' ) {
+               $this->assertNotEquals(
+                       $text,
+                       $this->convertTo( $text, $variant ),
+                       $msg
+               );
+       }
+
+       /**
+        * Verifiy the given Cyrillic text is not converted when using
+        * using the cyrillic variant and converted to Latin when using
+        * the Latin variant.
+        * @param string $text Text to convert
+        * @param string $msg Optional message
+        */
+       protected function assertCyrillic( $text, $msg = '' ) {
+               $this->assertUnConverted( $text, 'sr-ec', $msg );
+               $this->assertConverted( $text, 'sr-el', $msg );
+       }
+
+       /**
+        * Verifiy the given Latin text is not converted when using
+        * using the Latin variant and converted to Cyrillic when using
+        * the Cyrillic variant.
+        * @param string $text Text to convert
+        * @param string $msg Optional message
+        */
+       protected function assertLatin( $text, $msg = '' ) {
+               $this->assertUnConverted( $text, 'sr-el', $msg );
+               $this->assertConverted( $text, 'sr-ec', $msg );
+       }
+
+       /** Wrapper for converter::convertTo() method*/
+       protected function convertTo( $text, $variant ) {
+               return $this->getLang()
+                       ->mConverter
+                       ->convertTo(
+                               $text, $variant
+                       );
+       }
+
+       protected function convertToCyrillic( $text ) {
+               return $this->convertTo( $text, 'sr-ec' );
+       }
+
+       protected function convertToLatin( $text ) {
+               return $this->convertTo( $text, 'sr-el' );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageTiTest.php b/tests/phpunit/languages/classes/LanguageTiTest.php
new file mode 100644 (file)
index 0000000..e225af9
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageTi.php */
+class LanguageTiTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageTlTest.php b/tests/phpunit/languages/classes/LanguageTlTest.php
new file mode 100644 (file)
index 0000000..20f5bd7
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageTl.php */
+class LanguageTlTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'one', 2 ),
+                       array( 'other', 4 ),
+                       array( 'other', 6 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageTrTest.php b/tests/phpunit/languages/classes/LanguageTrTest.php
new file mode 100644 (file)
index 0000000..2c9905f
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @author Antoine Musso
+ * @copyright Copyright © 2011, Antoine Musso
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageTr.php */
+class LanguageTrTest extends LanguageClassesTestCase {
+
+       /**
+        * See @bug 28040
+        * Credits to irc://irc.freenode.net/wikipedia-tr users:
+        *  - berm
+        *  - []LuCkY[]
+        *  - Emperyan
+        * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
+        * @dataProvider provideDottedAndDotlessI
+        * @covers Language::ucfirst
+        * @covers Language::lcfirst
+        */
+       public function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
+               if ( $func == 'ucfirst' ) {
+                       $res = $this->getLang()->ucfirst( $input );
+               } elseif ( $func == 'lcfirst' ) {
+                       $res = $this->getLang()->lcfirst( $input );
+               } else {
+                       throw new MWException( __METHOD__ . " given an invalid function name '$func'" );
+               }
+
+               $msg = "Converting $inputCase case '$input' with $func should give '$expected'";
+
+               $this->assertEquals( $expected, $res, $msg );
+       }
+
+       public static function provideDottedAndDotlessI() {
+               return array(
+                       # function, input, input case, expected
+                       # Case changed:
+                       array( 'ucfirst', 'ı', 'lower', 'I' ),
+                       array( 'ucfirst', 'i', 'lower', 'İ' ),
+                       array( 'lcfirst', 'I', 'upper', 'ı' ),
+                       array( 'lcfirst', 'İ', 'upper', 'i' ),
+
+                       # Already using the correct case
+                       array( 'ucfirst', 'I', 'upper', 'I' ),
+                       array( 'ucfirst', 'İ', 'upper', 'İ' ),
+                       array( 'lcfirst', 'ı', 'lower', 'ı' ),
+                       array( 'lcfirst', 'i', 'lower', 'i' ),
+
+                       # A real example taken from bug 28040 using
+                       # http://tr.wikipedia.org/wiki/%C4%B0Phone
+                       array( 'lcfirst', 'iPhone', 'lower', 'iPhone' ),
+
+                       # next case is valid in Turkish but are different words if we
+                       # consider IPhone is English!
+                       array( 'lcfirst', 'IPhone', 'upper', 'ıPhone' ),
+
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageUkTest.php b/tests/phpunit/languages/classes/LanguageUkTest.php
new file mode 100644 (file)
index 0000000..9051bcf
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * based on LanguageBe_tarask.php
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for Ukrainian */
+class LanguageUkTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'few', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * Test explicit plural forms - n=FormN forms
+        * @covers Language::convertPlural
+        */
+       public function testExplicitPlural() {
+               $forms = array( 'one', 'few', 'many', 'other', '12=dozen' );
+               $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) );
+               $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' );
+               $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'many', 11 ),
+                       array( 'one', 91 ),
+                       array( 'one', 121 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'few', 334 ),
+                       array( 'many', 5 ),
+                       array( 'many', 15 ),
+                       array( 'many', 120 ),
+               );
+       }
+
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
+               $forms = array( '1=one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
+               return array(
+                       array( 'one', 1 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageUzTest.php b/tests/phpunit/languages/classes/LanguageUzTest.php
new file mode 100644 (file)
index 0000000..4881103
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+/**
+ * PHPUnit tests for the Uzbek language.
+ * The language can be represented using two scripts:
+ *  - Latin (uz-latn)
+ *  - Cyrillic (uz-cyrl)
+ *
+ * @author Robin Pepermans
+ * @author Antoine Musso <hashar at free dot fr>
+ * @copyright Copyright © 2012, Robin Pepermans
+ * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
+ * @file
+ *
+ * @todo methods in test class should be tidied:
+ *  - Should be split into separate test methods and data providers
+ *  - Tests for LanguageConverter and Language should probably be separate..
+ */
+
+/** Tests for MediaWiki languages/LanguageUz.php */
+class LanguageUzTest extends LanguageClassesTestCase {
+
+       /**
+        * @author Nikola Smolenski
+        * @covers LanguageConverter::convertTo
+        */
+       public function testConversionToCyrillic() {
+               // A convertion of Latin to Cyrillic
+               $this->assertEquals( 'абвгғ',
+                       $this->convertToCyrillic( 'abvggʻ' )
+               );
+               // Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабnjвгўоdb',
+                       $this->convertToCyrillic( '-{lj}-ab-{nj}-vgoʻo-{db}-' )
+               );
+               // A simple convertion of Cyrillic to Cyrillic
+               $this->assertEquals( 'абвг',
+                       $this->convertToCyrillic( 'абвг' )
+               );
+               // Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабnjвгdaž',
+                       $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{da}-ž' )
+               );
+       }
+
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testConversionToLatin() {
+               // A simple convertion of Latin to Latin
+               $this->assertEquals( 'abdef',
+                       $this->convertToLatin( 'abdef' )
+               );
+               // A convertion of Cyrillic to Latin
+               $this->assertEquals( 'gʻabtsdOʻQyo',
+                       $this->convertToLatin( 'ғабцдЎҚё' )
+               );
+       }
+
+       ##### HELPERS #####################################################
+       /**
+        * Wrapper to verify text stay the same after applying conversion
+        * @param string $text Text to convert
+        * @param string $variant Language variant 'uz-cyrl' or 'uz-latn'
+        * @param string $msg Optional message
+        */
+       protected function assertUnConverted( $text, $variant, $msg = '' ) {
+               $this->assertEquals(
+                       $text,
+                       $this->convertTo( $text, $variant ),
+                       $msg
+               );
+       }
+
+       /**
+        * Wrapper to verify a text is different once converted to a variant.
+        * @param string $text Text to convert
+        * @param string $variant Language variant 'uz-cyrl' or 'uz-latn'
+        * @param string $msg Optional message
+        */
+       protected function assertConverted( $text, $variant, $msg = '' ) {
+               $this->assertNotEquals(
+                       $text,
+                       $this->convertTo( $text, $variant ),
+                       $msg
+               );
+       }
+
+       /**
+        * Verifiy the given Cyrillic text is not converted when using
+        * using the cyrillic variant and converted to Latin when using
+        * the Latin variant.
+        * @param string $text Text to convert
+        * @param string $msg Optional message
+        */
+       protected function assertCyrillic( $text, $msg = '' ) {
+               $this->assertUnConverted( $text, 'uz-cyrl', $msg );
+               $this->assertConverted( $text, 'uz-latn', $msg );
+       }
+
+       /**
+        * Verifiy the given Latin text is not converted when using
+        * using the Latin variant and converted to Cyrillic when using
+        * the Cyrillic variant.
+        * @param string $text Text to convert
+        * @param string $msg Optional message
+        */
+       protected function assertLatin( $text, $msg = '' ) {
+               $this->assertUnConverted( $text, 'uz-latn', $msg );
+               $this->assertConverted( $text, 'uz-cyrl', $msg );
+       }
+
+       /** Wrapper for converter::convertTo() method*/
+       protected function convertTo( $text, $variant ) {
+               return $this->getLang()->mConverter->convertTo( $text, $variant );
+       }
+
+       protected function convertToCyrillic( $text ) {
+               return $this->convertTo( $text, 'uz-cyrl' );
+       }
+
+       protected function convertToLatin( $text ) {
+               return $this->convertTo( $text, 'uz-latn' );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageWaTest.php b/tests/phpunit/languages/classes/LanguageWaTest.php
new file mode 100644 (file)
index 0000000..d05196c
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageWa.php */
+class LanguageWaTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+               );
+       }
+}
index 9e62751..8c76397 100644 (file)
@@ -19,7 +19,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
        protected $exceptionFromAddDBData = null;
 
        /**
-        * Holds the xmlreader used for analyzing an xml dump
+        * Holds the XMLReader used for analyzing an XML dump
         *
         * @var XMLReader|null
         */
index 574c11e..860408f 100644 (file)
@@ -39,6 +39,7 @@ phpunit.php enables colors for other OSs at runtime
                        <file>suites/UploadFromUrlTestSuite.php</file>
                </testsuite>
                <testsuite name="extensions">
+                       <directory>structure</directory>
                        <file>suites/ExtensionsTestSuite.php</file>
                        <file>suites/ExtensionsParserTestSuite.php</file>
                        <file>suites/LessTestSuite.php</file>
index 116065f..723328e 100644 (file)
@@ -10,7 +10,7 @@ class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
                parent::__construct();
                $paths = array();
                // Extensions can return a list of files or directories
-               wfRunHooks( 'UnitTestsList', array( &$paths ) );
+               Hooks::run( 'UnitTestsList', array( &$paths ) );
                foreach ( $paths as $path ) {
                        if ( is_dir( $path ) ) {
                                // If the path is a directory, search for test cases.
index a6fbfac..29834c1 100644 (file)
@@ -25,9 +25,9 @@ return array(
                        'tests/qunit/data/testrunner.js',
                ),
                'dependencies' => array(
+                       // Test runner configures QUnit but can't have it as dependency,
+                       // see SpecialJavaScriptTest::viewQUnit.
                        'jquery.getAttrs',
-                       'jquery.qunit',
-                       'jquery.qunit.completenessTest',
                        'mediawiki.page.ready',
                        'mediawiki.page.startup',
                        'test.sinonjs',
index b800bc2..03aaf4a 100644 (file)
        // and assuming failure.
        QUnit.config.testTimeout = 30 * 1000;
 
+       QUnit.config.requireExpects = true;
+
        // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
        QUnit.config.urlConfig.push( {
                id: 'debug',
                label: 'Enable ResourceLoaderDebug',
-               tooltip: 'Enable debug mode in ResourceLoader'
+               tooltip: 'Enable debug mode in ResourceLoader',
+               value: 'true'
        } );
 
-       QUnit.config.requireExpects = true;
-
-       /**
-        * Load TestSwarm agent
-        */
-       // Only if the current url indicates that there is a TestSwarm instance watching us
-       // (TestSwarm appends swarmURL to the test suites url it loads in iframes).
-       // Otherwise this is just a simple view of Special:JavaScriptTest/qunit directly,
-       // no point in loading inject.js in that case. Also, make sure that this instance
-       // of MediaWiki has actually been configured with the required url to that inject.js
-       // script. By default it is false.
-       if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
-               jQuery.getScript( QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) );
-       }
-
        /**
         * CompletenessTest
         *
                };
        }() );
 
+       // Extend QUnit.module to provide a fixture element.
+       ( function () {
+               var orgModule = QUnit.module;
+
+               QUnit.module = function ( name, localEnv ) {
+                       var fixture;
+                       localEnv = localEnv || {};
+                       orgModule( name, {
+                               setup: function () {
+                                       fixture = document.createElement( 'div' );
+                                       fixture.id = 'qunit-fixture';
+                                       document.body.appendChild( fixture );
+
+                                       if ( localEnv.setup ) {
+                                               localEnv.setup.call( this );
+                                       }
+                               },
+                               teardown: function () {
+                                       if ( localEnv.teardown ) {
+                                               localEnv.teardown.call( this );
+                                       }
+
+                                       fixture.parentNode.removeChild( fixture );
+                               }
+                       } );
+               };
+       }() );
+
        // Initiate when enabled
        if ( QUnit.urlParams.completenesstest ) {
 
index 409f3e6..ee33ade 100644 (file)
@@ -1,6 +1,8 @@
 /*jshint -W024 */
 ( function ( mw, $ ) {
-       var specialCharactersPageName;
+       var specialCharactersPageName,
+               // Can't mock SITENAME since jqueryMsg caches it at load
+               siteName = mw.config.get( 'wgSiteName' );
 
        // Since QUnitTestResources.php loads both mediawiki and mediawiki.jqueryMsg as
        // dependencies, this only tests the monkey-patched behavior with the two of them combined.
@@ -55,7 +57,7 @@
                this.restoreWarnings();
        } );
 
-       QUnit.test( 'mw.Map', 28, function ( assert ) {
+       QUnit.test( 'mw.Map', 35, function ( assert ) {
                var arry, conf, funky, globalConf, nummy, someValues;
 
                conf = new mw.Map();
                assert.strictEqual( conf.set( 'constructor', 42 ), true, 'Map.set for key "constructor"' );
                assert.strictEqual( conf.get( 'constructor' ), 42, 'Map.get for key "constructor"' );
 
-               assert.strictEqual( conf.set( 'ImUndefined', undefined ), true, 'Map.set allows setting value to `undefined`' );
-               assert.equal( conf.get( 'ImUndefined', 'fallback' ), undefined, 'Map.get supports retreiving value of `undefined`' );
+               assert.strictEqual( conf.set( 'undef' ), false, 'Map.set requires explicit value (no undefined default)' );
+
+               assert.strictEqual( conf.set( 'undef', undefined ), true, 'Map.set allows setting value to `undefined`' );
+               assert.equal( conf.get( 'undef', 'fallback' ), undefined, 'Map.get supports retreiving value of `undefined`' );
 
                assert.strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
                assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
                conf.set( String( nummy ), 'I used to be a number' );
 
                assert.strictEqual( conf.exists( 'doesNotExist' ), false, 'Map.exists where property does not exist' );
-               assert.strictEqual( conf.exists( 'ImUndefined' ), true, 'Map.exists where value is `undefined`' );
+               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' );
 
                // Multiple values at once
 
                conf.set( 'globalMapChecker', 'Hi' );
 
-               assert.ok( 'globalMapChecker' in window === false, 'new mw.Map did not store its values in the global window object by default' );
+               assert.ok( ( 'globalMapChecker' in window ) === false, 'Map does not its store values in the window object by default' );
 
                globalConf = new mw.Map( true );
                globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
 
-               assert.ok( 'anotherGlobalMapChecker' in window, 'new mw.Map( true ) did store its values in the global window object' );
+               assert.ok( 'anotherGlobalMapChecker' in window, 'global Map stores its values in the window object' );
+
+               assert.equal( globalConf.get( 'anotherGlobalMapChecker' ), 'Hello', 'get value from global Map via get()' );
+               this.suppressWarnings();
+               assert.equal( window.anotherGlobalMapChecker, 'Hello', 'get value from global Map via window object' );
+               this.restoreWarnings();
+
+               // Change value via global Map
+               globalConf.set('anotherGlobalMapChecker', 'Again');
+               assert.equal( globalConf.get( 'anotherGlobalMapChecker' ), 'Again', 'Change in global Map reflected via get()' );
+               this.suppressWarnings();
+               assert.equal( window.anotherGlobalMapChecker, 'Again', 'Change in global Map reflected window object' );
+               this.restoreWarnings();
+
+               // Change value via window object
+               this.suppressWarnings();
+               window.anotherGlobalMapChecker = 'World';
+               assert.equal( window.anotherGlobalMapChecker, 'World', 'Change in window object works' );
+               this.restoreWarnings();
+               assert.equal( globalConf.get( 'anotherGlobalMapChecker' ), 'Again', 'Change in window object not reflected in global Map' );
 
                // Whitelist this global variable for QUnit's 'noglobal' mode
                if ( QUnit.config.noglobals ) {
                assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
                assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message', 'Curly brace format works correctly' );
+               assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + siteName + '" is the home of Other Message', 'Curly brace format works correctly' );
                assert.equal( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
-               assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+               assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + siteName + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
 
                assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
                assertMultipleFormats( ['multiple-square-brackets-and-ampersand'], ['plain', 'text'], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
                assert.equal( mw.message( 'gender-plural-msg', 'male', 1 ).plain(), '{{GENDER:male|he|she|they}} {{PLURAL:1|is|are}} awesome', 'Parameters are substituted, but gender and plural are not resolved in plain mode' );
 
                assert.equal( mw.message( 'grammar-msg' ).plain(), mw.messages.get( 'grammar-msg' ), 'Grammar is not resolved in plain mode' );
-               assertMultipleFormats( ['grammar-msg'], ['text', 'parse'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar is resolved' );
-               assert.equal( mw.message( 'grammar-msg' ).escaped(), 'Przeszukaj ' + mw.html.escape( mw.config.get( 'wgSiteName' ) ), 'Grammar is resolved in escaped mode' );
+               assertMultipleFormats( ['grammar-msg'], ['text', 'parse'], 'Przeszukaj ' + siteName, 'Grammar is resolved' );
+               assert.equal( mw.message( 'grammar-msg' ).escaped(), 'Przeszukaj ' + siteName, 'Grammar is resolved in escaped mode' );
 
                assertMultipleFormats( ['formatnum-msg', '987654321.654321'], ['text', 'parse', 'escaped'], '987,654,321.654', 'formatnum is resolved' );
                assert.equal( mw.message( 'formatnum-msg' ).plain(), mw.messages.get( 'formatnum-msg' ), 'formatnum is not resolved in plain mode' );
                assert.equal( mw.msg( 'gender-plural-msg', 'female', '1' ), 'she is awesome', 'Gender test for female, plural count 1' );
                assert.equal( mw.msg( 'gender-plural-msg', 'unknown', 10 ), 'they are awesome', 'Gender test for neutral, plural count 10' );
 
-               assert.equal( mw.msg( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar is resolved' );
+               assert.equal( mw.msg( 'grammar-msg' ), 'Przeszukaj ' + siteName, 'Grammar is resolved' );
 
                assert.equal( mw.msg( 'formatnum-msg', '987654321.654321' ), '987,654,321.654', 'formatnum is resolved' );
 
 
        } );
 
+       QUnit.test( 'mw.loader.implement( only scripts )', 1, function ( assert ) {
+               mw.loader.implement( 'test.onlyscripts', function () {} );
+               assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
+       } );
+
        QUnit.asyncTest( 'mw.loader.implement( only messages )', 2, function ( assert ) {
                assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
 
index b5fc800..6d3ac2f 100644 (file)
@@ -471,7 +471,7 @@ class TestFileIterator implements Iterator {
                $hooksResult = $this->delayedParserTest->unleash( $this->parserTest );
                if ( !$hooksResult ) {
                        # Some hook reported an issue. Abort.
-                       throw new MWException( "Problem running hook" );
+                       throw new MWException( "Problem running requested parser hook from the test file" );
                }
 
                $this->test = array(
@@ -618,6 +618,7 @@ class TestFileIterator implements Iterator {
         * @param bool $fatal True iff an exception should be thrown if
         * the section is not found.
         * @return bool|string
+        * @throws MWException
         */
        private function checkSection( $tokens, $fatal = true ) {
                if ( is_null( $this->section ) ) {
@@ -691,6 +692,7 @@ class DelayedParserTest {
         * Should be the case if we found the parserTest is not disabled
         * @param ParserTest|NewParserTest $parserTest
         * @return bool
+        * @throws MWException
         */
        public function unleash( &$parserTest ) {
                if ( !( $parserTest instanceof ParserTest || $parserTest instanceof NewParserTest )     ) {
@@ -805,7 +807,7 @@ class TidySupport {
                global $wgTidyBin;
 
                $this->internalTidy = extension_loaded( 'tidy' ) &&
-                       class_exists( 'tidy' );
+                       class_exists( 'tidy' ) && !wfIsHHVM();
 
                $this->externalTidy = is_executable( $wgTidyBin ) ||
                        Installer::locateExecutableInDefaultPaths( array( $wgTidyBin ) )
index 3d8612d..7352dc4 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -92,7 +92,6 @@ function wfThumbHandle404() {
 function wfStreamThumb( array $params ) {
        global $wgVaryOnXFP;
 
-       $section = new ProfileSection( __METHOD__ );
 
        $headers = array(); // HTTP headers to send
 
@@ -135,12 +134,12 @@ function wfStreamThumb( array $params ) {
                // Format is <timestamp>!<name>
                $bits = explode( '!', $fileName, 2 );
                if ( count( $bits ) != 2 ) {
-                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
                        return;
                }
                $title = Title::makeTitleSafe( NS_FILE, $bits[1] );
                if ( !$title ) {
-                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
                        return;
                }
                $img = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $fileName );
@@ -150,7 +149,7 @@ function wfStreamThumb( array $params ) {
 
        // Check the source file title
        if ( !$img ) {
-               wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+               wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
                return;
        }
 
@@ -262,7 +261,7 @@ function wfStreamThumb( array $params ) {
                return;
        }
 
-       // For 404 handled thumbnails, we only use the the base name of the URI
+       // 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).
@@ -310,10 +309,10 @@ function wfStreamThumb( array $params ) {
 
        $user = RequestContext::getMain()->getUser();
        if ( !wfThumbIsStandard( $img, $params ) && $user->pingLimiter( 'renderfile-nonstandard' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        } elseif ( $user->pingLimiter( 'renderfile' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        }
 
@@ -598,7 +597,7 @@ function wfExtractThumbParams( $file, $params ) {
  * Output a thumbnail generation error message
  *
  * @param int $status
- * @param string $msg
+ * @param string $msg HTML
  * @return void
  */
 function wfThumbError( $status, $msg ) {